@argos-js/auth 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +13 -2
  3. package/dist/certificates/cert-parser.d.ts +19 -0
  4. package/dist/certificates/cert-parser.d.ts.map +1 -0
  5. package/dist/certificates/cert-parser.js +192 -0
  6. package/dist/certificates/cert-parser.js.map +1 -0
  7. package/dist/certificates/cert.types.d.ts +60 -0
  8. package/dist/certificates/cert.types.d.ts.map +1 -0
  9. package/dist/certificates/cert.types.js +3 -0
  10. package/dist/certificates/cert.types.js.map +1 -0
  11. package/dist/certificates/index.d.ts +5 -0
  12. package/dist/certificates/index.d.ts.map +1 -0
  13. package/dist/certificates/index.js +21 -0
  14. package/dist/certificates/index.js.map +1 -0
  15. package/dist/certificates/jwks.d.ts +90 -0
  16. package/dist/certificates/jwks.d.ts.map +1 -0
  17. package/dist/certificates/jwks.js +180 -0
  18. package/dist/certificates/jwks.js.map +1 -0
  19. package/dist/certificates/mtls.guard.d.ts +10 -0
  20. package/dist/certificates/mtls.guard.d.ts.map +1 -0
  21. package/dist/certificates/mtls.guard.js +156 -0
  22. package/dist/certificates/mtls.guard.js.map +1 -0
  23. package/dist/config.d.ts +33 -0
  24. package/dist/config.d.ts.map +1 -0
  25. package/dist/config.js +10 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/guards/api-key.guard.d.ts +21 -0
  28. package/dist/guards/api-key.guard.d.ts.map +1 -0
  29. package/dist/guards/api-key.guard.js +106 -0
  30. package/dist/guards/api-key.guard.js.map +1 -0
  31. package/dist/guards/basic.d.ts +6 -0
  32. package/dist/guards/basic.d.ts.map +1 -0
  33. package/dist/guards/basic.guard.d.ts +26 -0
  34. package/dist/guards/basic.guard.d.ts.map +1 -0
  35. package/dist/guards/basic.guard.js +123 -0
  36. package/dist/guards/basic.guard.js.map +1 -0
  37. package/dist/guards/basic.js +42 -0
  38. package/dist/guards/basic.js.map +1 -0
  39. package/dist/guards/guard.interface.d.ts +21 -0
  40. package/dist/guards/guard.interface.d.ts.map +1 -0
  41. package/dist/guards/guard.interface.js +3 -0
  42. package/dist/guards/guard.interface.js.map +1 -0
  43. package/dist/guards/hmac.guard.d.ts +18 -0
  44. package/dist/guards/hmac.guard.d.ts.map +1 -0
  45. package/dist/guards/hmac.guard.js +111 -0
  46. package/dist/guards/hmac.guard.js.map +1 -0
  47. package/dist/guards/index.d.ts +8 -0
  48. package/dist/guards/index.d.ts.map +1 -0
  49. package/dist/guards/index.js +24 -0
  50. package/dist/guards/index.js.map +1 -0
  51. package/dist/guards/jwt.guard.d.ts +17 -0
  52. package/dist/guards/jwt.guard.d.ts.map +1 -0
  53. package/dist/guards/jwt.guard.js +92 -0
  54. package/dist/guards/jwt.guard.js.map +1 -0
  55. package/dist/hasher/argon2-hasher.d.ts +31 -0
  56. package/dist/hasher/argon2-hasher.d.ts.map +1 -0
  57. package/dist/hasher/argon2-hasher.js +114 -0
  58. package/dist/hasher/argon2-hasher.js.map +1 -0
  59. package/dist/hasher/hasher.interface.d.ts +22 -0
  60. package/dist/hasher/hasher.interface.d.ts.map +1 -0
  61. package/dist/hasher/hasher.interface.js +3 -0
  62. package/dist/hasher/hasher.interface.js.map +1 -0
  63. package/dist/hasher/index.d.ts +5 -0
  64. package/dist/hasher/index.d.ts.map +1 -0
  65. package/dist/hasher/index.js +21 -0
  66. package/dist/hasher/index.js.map +1 -0
  67. package/dist/hasher/password-manager.d.ts +52 -0
  68. package/dist/hasher/password-manager.d.ts.map +1 -0
  69. package/dist/hasher/password-manager.js +126 -0
  70. package/dist/hasher/password-manager.js.map +1 -0
  71. package/dist/hasher/scrypt-hasher.d.ts +30 -0
  72. package/dist/hasher/scrypt-hasher.d.ts.map +1 -0
  73. package/dist/hasher/scrypt-hasher.js +158 -0
  74. package/dist/hasher/scrypt-hasher.js.map +1 -0
  75. package/dist/index.d.ts +9 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +32 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/middleware/auth.middleware.d.ts +42 -0
  80. package/dist/middleware/auth.middleware.d.ts.map +1 -0
  81. package/dist/middleware/auth.middleware.js +142 -0
  82. package/dist/middleware/auth.middleware.js.map +1 -0
  83. package/dist/middleware/index.d.ts +2 -0
  84. package/dist/middleware/index.d.ts.map +1 -0
  85. package/dist/middleware/index.js +18 -0
  86. package/dist/middleware/index.js.map +1 -0
  87. package/dist/oauth/base.provider.d.ts +27 -0
  88. package/dist/oauth/base.provider.d.ts.map +1 -0
  89. package/dist/oauth/base.provider.js +139 -0
  90. package/dist/oauth/base.provider.js.map +1 -0
  91. package/dist/oauth/index.d.ts +6 -0
  92. package/dist/oauth/index.d.ts.map +1 -0
  93. package/dist/oauth/index.js +22 -0
  94. package/dist/oauth/index.js.map +1 -0
  95. package/dist/oauth/oauth-manager.d.ts +41 -0
  96. package/dist/oauth/oauth-manager.d.ts.map +1 -0
  97. package/dist/oauth/oauth-manager.js +58 -0
  98. package/dist/oauth/oauth-manager.js.map +1 -0
  99. package/dist/oauth/oauth.types.d.ts +55 -0
  100. package/dist/oauth/oauth.types.d.ts.map +1 -0
  101. package/dist/oauth/oauth.types.js +3 -0
  102. package/dist/oauth/oauth.types.js.map +1 -0
  103. package/dist/oauth/pkce.d.ts +26 -0
  104. package/dist/oauth/pkce.d.ts.map +1 -0
  105. package/dist/oauth/pkce.js +136 -0
  106. package/dist/oauth/pkce.js.map +1 -0
  107. package/dist/oauth/providers/generic-oidc.provider.d.ts +25 -0
  108. package/dist/oauth/providers/generic-oidc.provider.d.ts.map +1 -0
  109. package/dist/oauth/providers/generic-oidc.provider.js +43 -0
  110. package/dist/oauth/providers/generic-oidc.provider.js.map +1 -0
  111. package/dist/oauth/providers/github.provider.d.ts +15 -0
  112. package/dist/oauth/providers/github.provider.d.ts.map +1 -0
  113. package/dist/oauth/providers/github.provider.js +70 -0
  114. package/dist/oauth/providers/github.provider.js.map +1 -0
  115. package/dist/oauth/providers/google.provider.d.ts +12 -0
  116. package/dist/oauth/providers/google.provider.d.ts.map +1 -0
  117. package/dist/oauth/providers/google.provider.js +27 -0
  118. package/dist/oauth/providers/google.provider.js.map +1 -0
  119. package/dist/oauth/providers/index.d.ts +5 -0
  120. package/dist/oauth/providers/index.d.ts.map +1 -0
  121. package/dist/oauth/providers/index.js +21 -0
  122. package/dist/oauth/providers/index.js.map +1 -0
  123. package/dist/oauth/providers/microsoft.provider.d.ts +13 -0
  124. package/dist/oauth/providers/microsoft.provider.d.ts.map +1 -0
  125. package/dist/oauth/providers/microsoft.provider.js +28 -0
  126. package/dist/oauth/providers/microsoft.provider.js.map +1 -0
  127. package/dist/oauth2/client.d.ts +63 -0
  128. package/dist/oauth2/client.d.ts.map +1 -0
  129. package/dist/oauth2/client.js +150 -0
  130. package/dist/oauth2/client.js.map +1 -0
  131. package/dist/oauth2/index.d.ts +2 -0
  132. package/dist/oauth2/index.d.ts.map +1 -0
  133. package/dist/oauth2/index.js +18 -0
  134. package/dist/oauth2/index.js.map +1 -0
  135. package/dist/tokens/api-key.d.ts +26 -0
  136. package/dist/tokens/api-key.d.ts.map +1 -0
  137. package/dist/tokens/api-key.js +84 -0
  138. package/dist/tokens/api-key.js.map +1 -0
  139. package/dist/tokens/index.d.ts +3 -0
  140. package/dist/tokens/index.d.ts.map +1 -0
  141. package/dist/tokens/index.js +19 -0
  142. package/dist/tokens/index.js.map +1 -0
  143. package/dist/tokens/jwt.d.ts +93 -0
  144. package/dist/tokens/jwt.d.ts.map +1 -0
  145. package/dist/tokens/jwt.js +327 -0
  146. package/dist/tokens/jwt.js.map +1 -0
  147. package/package.json +38 -3
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GitHubProvider = void 0;
4
+ const base_provider_js_1 = require("../base.provider.js");
5
+ class GitHubProvider extends base_provider_js_1.BaseOAuthProvider {
6
+ emailsUrl;
7
+ constructor(options) {
8
+ super({
9
+ authorizationUrl: 'https://github.com/login/oauth/authorize',
10
+ tokenUrl: 'https://github.com/login/oauth/access_token',
11
+ userInfoUrl: 'https://api.github.com/user',
12
+ scopes: ['read:user', 'user:email'],
13
+ ...options,
14
+ });
15
+ this.emailsUrl = options.emailsUrl || 'https://api.github.com/user/emails';
16
+ }
17
+ async fetchUserInfo(accessToken) {
18
+ const userResponse = await fetch(this.options.userInfoUrl, {
19
+ headers: {
20
+ authorization: `Bearer ${accessToken}`,
21
+ accept: 'application/json',
22
+ 'user-agent': 'Argos-JS-Auth',
23
+ },
24
+ });
25
+ if (!userResponse.ok) {
26
+ const errorText = await userResponse.text();
27
+ throw new Error(`Failed to fetch GitHub user info (${userResponse.status}): ${errorText}`);
28
+ }
29
+ const profile = (await userResponse.json());
30
+ // If public email is empty, fetch private verified email from /user/emails
31
+ if (!profile.email) {
32
+ try {
33
+ const emailsResponse = await fetch(this.emailsUrl, {
34
+ headers: {
35
+ authorization: `Bearer ${accessToken}`,
36
+ accept: 'application/json',
37
+ 'user-agent': 'Argos-JS-Auth',
38
+ },
39
+ });
40
+ if (emailsResponse.ok) {
41
+ const emails = (await emailsResponse.json());
42
+ if (Array.isArray(emails)) {
43
+ const primary = emails.find((e) => e.primary && e.verified) || emails.find((e) => e.verified) || emails[0];
44
+ if (primary) {
45
+ profile.email = primary.email;
46
+ profile.email_verified = primary.verified;
47
+ }
48
+ }
49
+ }
50
+ }
51
+ catch {
52
+ // non-blocking
53
+ }
54
+ }
55
+ return profile;
56
+ }
57
+ mapUser(rawProfile, _tokens) {
58
+ return {
59
+ id: String(rawProfile.id ?? rawProfile.node_id ?? ''),
60
+ username: rawProfile.login,
61
+ email: rawProfile.email,
62
+ emailVerified: Boolean(rawProfile.email_verified ?? (rawProfile.email ? true : false)),
63
+ name: rawProfile.name ?? rawProfile.login,
64
+ avatar: rawProfile.avatar_url ?? undefined,
65
+ raw: rawProfile,
66
+ };
67
+ }
68
+ }
69
+ exports.GitHubProvider = GitHubProvider;
70
+ //# sourceMappingURL=github.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.provider.js","sourceRoot":"","sources":["../../../src/oauth/providers/github.provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { BaseOAuthProvider } from '../base.provider.js';
2
+ import type { BaseOAuthProviderOptions, OAuthTokens, OAuthUser } from '../oauth.types.js';
3
+ export interface GoogleProviderOptions extends Omit<BaseOAuthProviderOptions, 'authorizationUrl' | 'tokenUrl'> {
4
+ authorizationUrl?: string;
5
+ tokenUrl?: string;
6
+ userInfoUrl?: string;
7
+ }
8
+ export declare class GoogleProvider extends BaseOAuthProvider {
9
+ constructor(options: GoogleProviderOptions);
10
+ mapUser(rawProfile: Record<string, unknown>, _tokens: OAuthTokens): OAuthUser;
11
+ }
12
+ //# sourceMappingURL=google.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.provider.d.ts","sourceRoot":"","sources":["../../../src/oauth/providers/google.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,wBAAwB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE1F,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,wBAAwB,EAAE,kBAAkB,GAAG,UAAU,CAAC;IAC5G,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,cAAe,SAAQ,iBAAiB;gBACvC,OAAO,EAAE,qBAAqB;IAUnC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,SAAS;CAUrF"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GoogleProvider = void 0;
4
+ const base_provider_js_1 = require("../base.provider.js");
5
+ class GoogleProvider extends base_provider_js_1.BaseOAuthProvider {
6
+ constructor(options) {
7
+ super({
8
+ authorizationUrl: 'https://accounts.google.com/o/oauth2/v2/auth',
9
+ tokenUrl: 'https://oauth2.googleapis.com/token',
10
+ userInfoUrl: 'https://openidconnect.googleapis.com/v1/userinfo',
11
+ scopes: ['openid', 'email', 'profile'],
12
+ ...options,
13
+ });
14
+ }
15
+ mapUser(rawProfile, _tokens) {
16
+ return {
17
+ id: String(rawProfile.sub ?? rawProfile.id ?? ''),
18
+ email: rawProfile.email,
19
+ emailVerified: Boolean(rawProfile.email_verified),
20
+ name: rawProfile.name,
21
+ avatar: rawProfile.picture ?? undefined,
22
+ raw: rawProfile,
23
+ };
24
+ }
25
+ }
26
+ exports.GoogleProvider = GoogleProvider;
27
+ //# sourceMappingURL=google.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.provider.js","sourceRoot":"","sources":["../../../src/oauth/providers/google.provider.ts"],"names":[],"mappings":";;;AAAA,0DAAwD;AASxD,MAAa,cAAe,SAAQ,oCAAiB;IACnD,YAAY,OAA8B;QACxC,KAAK,CAAC;YACJ,gBAAgB,EAAE,8CAA8C;YAChE,QAAQ,EAAE,qCAAqC;YAC/C,WAAW,EAAE,kDAAkD;YAC/D,MAAM,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC;YACtC,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;IAEM,OAAO,CAAC,UAAmC,EAAE,OAAoB;QACtE,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC;YACjD,KAAK,EAAE,UAAU,CAAC,KAA2B;YAC7C,aAAa,EAAE,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC;YACjD,IAAI,EAAE,UAAU,CAAC,IAA0B;YAC3C,MAAM,EAAG,UAAU,CAAC,OAAkB,IAAI,SAAS;YACnD,GAAG,EAAE,UAAU;SAChB,CAAC;IACJ,CAAC;CACF;AArBD,wCAqBC"}
@@ -0,0 +1,5 @@
1
+ export * from './google.provider.js';
2
+ export * from './github.provider.js';
3
+ export * from './microsoft.provider.js';
4
+ export * from './generic-oidc.provider.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/oauth/providers/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./google.provider.js"), exports);
18
+ __exportStar(require("./github.provider.js"), exports);
19
+ __exportStar(require("./microsoft.provider.js"), exports);
20
+ __exportStar(require("./generic-oidc.provider.js"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/oauth/providers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,uDAAqC;AACrC,0DAAwC;AACxC,6DAA2C"}
@@ -0,0 +1,13 @@
1
+ import { BaseOAuthProvider } from '../base.provider.js';
2
+ import type { BaseOAuthProviderOptions, OAuthTokens, OAuthUser } from '../oauth.types.js';
3
+ export interface MicrosoftProviderOptions extends Omit<BaseOAuthProviderOptions, 'authorizationUrl' | 'tokenUrl'> {
4
+ tenant?: string;
5
+ authorizationUrl?: string;
6
+ tokenUrl?: string;
7
+ userInfoUrl?: string;
8
+ }
9
+ export declare class MicrosoftProvider extends BaseOAuthProvider {
10
+ constructor(options: MicrosoftProviderOptions);
11
+ mapUser(rawProfile: Record<string, unknown>, _tokens: OAuthTokens): OAuthUser;
12
+ }
13
+ //# sourceMappingURL=microsoft.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"microsoft.provider.d.ts","sourceRoot":"","sources":["../../../src/oauth/providers/microsoft.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,wBAAwB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE1F,MAAM,WAAW,wBAAyB,SAAQ,IAAI,CAAC,wBAAwB,EAAE,kBAAkB,GAAG,UAAU,CAAC;IAC/G,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,iBAAkB,SAAQ,iBAAiB;gBAC1C,OAAO,EAAE,wBAAwB;IAWtC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,SAAS;CAUrF"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MicrosoftProvider = void 0;
4
+ const base_provider_js_1 = require("../base.provider.js");
5
+ class MicrosoftProvider extends base_provider_js_1.BaseOAuthProvider {
6
+ constructor(options) {
7
+ const tenant = options.tenant || 'common';
8
+ super({
9
+ authorizationUrl: `https://login.microsoftonline.com/${tenant}/oauth2/v2.0/authorize`,
10
+ tokenUrl: `https://login.microsoftonline.com/${tenant}/oauth2/v2.0/token`,
11
+ userInfoUrl: 'https://graph.microsoft.com/oidc/userinfo',
12
+ scopes: ['openid', 'profile', 'email'],
13
+ ...options,
14
+ });
15
+ }
16
+ mapUser(rawProfile, _tokens) {
17
+ return {
18
+ id: String(rawProfile.sub ?? rawProfile.id ?? ''),
19
+ email: rawProfile.email ?? rawProfile.preferred_username,
20
+ emailVerified: true,
21
+ name: rawProfile.name ?? undefined,
22
+ avatar: rawProfile.picture ?? undefined,
23
+ raw: rawProfile,
24
+ };
25
+ }
26
+ }
27
+ exports.MicrosoftProvider = MicrosoftProvider;
28
+ //# sourceMappingURL=microsoft.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"microsoft.provider.js","sourceRoot":"","sources":["../../../src/oauth/providers/microsoft.provider.ts"],"names":[],"mappings":";;;AAAA,0DAAwD;AAUxD,MAAa,iBAAkB,SAAQ,oCAAiB;IACtD,YAAY,OAAiC;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC;QAC1C,KAAK,CAAC;YACJ,gBAAgB,EAAE,qCAAqC,MAAM,wBAAwB;YACrF,QAAQ,EAAE,qCAAqC,MAAM,oBAAoB;YACzE,WAAW,EAAE,2CAA2C;YACxD,MAAM,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC;YACtC,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;IAEM,OAAO,CAAC,UAAmC,EAAE,OAAoB;QACtE,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC;YACjD,KAAK,EAAG,UAAU,CAAC,KAAgB,IAAK,UAAU,CAAC,kBAA6B;YAChF,aAAa,EAAE,IAAI;YACnB,IAAI,EAAG,UAAU,CAAC,IAAe,IAAI,SAAS;YAC9C,MAAM,EAAG,UAAU,CAAC,OAAkB,IAAI,SAAS;YACnD,GAAG,EAAE,UAAU;SAChB,CAAC;IACJ,CAAC;CACF;AAtBD,8CAsBC"}
@@ -0,0 +1,63 @@
1
+ import type { OAuthTokens } from '../oauth/oauth.types.js';
2
+ export interface OAuth2ClientOptions {
3
+ clientId: string;
4
+ clientSecret?: string;
5
+ authorizationUrl?: string;
6
+ tokenUrl?: string;
7
+ userInfoUrl?: string;
8
+ redirectUri?: string;
9
+ scopes?: string[];
10
+ }
11
+ export interface GenerateAuthorizationUrlOptions {
12
+ state?: string;
13
+ scope?: string | string[];
14
+ clientId?: string;
15
+ redirectUri?: string;
16
+ codeVerifier?: string;
17
+ prompt?: string;
18
+ accessType?: string;
19
+ extraParams?: Record<string, string>;
20
+ }
21
+ export interface ExchangeCodeOptions {
22
+ code: string;
23
+ redirectUri?: string;
24
+ clientId?: string;
25
+ clientSecret?: string;
26
+ tokenUrl?: string;
27
+ codeVerifier?: string;
28
+ }
29
+ export declare class OAuth2Client {
30
+ private options;
31
+ constructor(options: OAuth2ClientOptions);
32
+ /**
33
+ * Generates authorization URL with state, scope, client_id, and PKCE code_challenge support.
34
+ */
35
+ generateAuthorizationUrl(options?: GenerateAuthorizationUrlOptions): {
36
+ url: string;
37
+ state: string;
38
+ codeVerifier: string;
39
+ codeChallenge: string;
40
+ };
41
+ /**
42
+ * Alias for generateAuthorizationUrl conforming to common naming conventions.
43
+ */
44
+ authorizationUrl(options?: GenerateAuthorizationUrlOptions): {
45
+ url: string;
46
+ state: string;
47
+ codeVerifier: string;
48
+ codeChallenge: string;
49
+ };
50
+ /**
51
+ * Exchanges an authorization code for access & refresh tokens.
52
+ */
53
+ exchangeCodeForToken(options: ExchangeCodeOptions): Promise<OAuthTokens>;
54
+ /**
55
+ * Fetches user info profile from userInfoUrl using bearer accessToken.
56
+ */
57
+ fetchUserInfo(accessToken: string, userInfoUrl?: string): Promise<Record<string, unknown>>;
58
+ }
59
+ /**
60
+ * Creates an OAuth2 client instance.
61
+ */
62
+ export declare function createOAuth2Client(options: OAuth2ClientOptions): OAuth2Client;
63
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/oauth2/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,+BAA+B;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAsB;gBAEzB,OAAO,EAAE,mBAAmB;IAIxC;;OAEG;IACI,wBAAwB,CAAC,OAAO,GAAE,+BAAoC,GAAG;QAC9E,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;KACvB;IA0DD;;OAEG;IACI,gBAAgB,CAAC,OAAO,GAAE,+BAAoC;aAjE9D,MAAM;eACJ,MAAM;sBACC,MAAM;uBACL,MAAM;;IAkEvB;;OAEG;IACU,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC;IAwDrF;;OAEG;IACU,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAoBxG;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAE7E"}
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OAuth2Client = void 0;
4
+ exports.createOAuth2Client = createOAuth2Client;
5
+ const pkce_js_1 = require("../oauth/pkce.js");
6
+ class OAuth2Client {
7
+ options;
8
+ constructor(options) {
9
+ this.options = { ...options };
10
+ }
11
+ /**
12
+ * Generates authorization URL with state, scope, client_id, and PKCE code_challenge support.
13
+ */
14
+ generateAuthorizationUrl(options = {}) {
15
+ const authUrl = this.options.authorizationUrl;
16
+ if (!authUrl) {
17
+ throw new Error('authorizationUrl is required to generate authorization URL');
18
+ }
19
+ const clientId = options.clientId || this.options.clientId;
20
+ if (!clientId) {
21
+ throw new Error('clientId is required to generate authorization URL');
22
+ }
23
+ const redirectUri = options.redirectUri || this.options.redirectUri;
24
+ const pkce = options.codeVerifier
25
+ ? {
26
+ codeVerifier: options.codeVerifier,
27
+ codeChallenge: options.codeVerifier,
28
+ codeChallengeMethod: 'S256',
29
+ }
30
+ : (0, pkce_js_1.generatePkcePair)();
31
+ const state = options.state || (0, pkce_js_1.generateState)();
32
+ const scopes = options.scope
33
+ ? (Array.isArray(options.scope) ? options.scope.join(' ') : options.scope)
34
+ : (this.options.scopes ? this.options.scopes.join(' ') : '');
35
+ const url = new URL(authUrl);
36
+ url.searchParams.set('response_type', 'code');
37
+ url.searchParams.set('client_id', clientId);
38
+ if (redirectUri) {
39
+ url.searchParams.set('redirect_uri', redirectUri);
40
+ }
41
+ if (scopes) {
42
+ url.searchParams.set('scope', scopes);
43
+ }
44
+ url.searchParams.set('state', state);
45
+ url.searchParams.set('code_challenge', pkce.codeChallenge);
46
+ url.searchParams.set('code_challenge_method', pkce.codeChallengeMethod);
47
+ if (options.prompt) {
48
+ url.searchParams.set('prompt', options.prompt);
49
+ }
50
+ if (options.accessType) {
51
+ url.searchParams.set('access_type', options.accessType);
52
+ }
53
+ if (options.extraParams) {
54
+ for (const [k, v] of Object.entries(options.extraParams)) {
55
+ url.searchParams.set(k, v);
56
+ }
57
+ }
58
+ return {
59
+ url: url.toString(),
60
+ state,
61
+ codeVerifier: pkce.codeVerifier,
62
+ codeChallenge: pkce.codeChallenge,
63
+ };
64
+ }
65
+ /**
66
+ * Alias for generateAuthorizationUrl conforming to common naming conventions.
67
+ */
68
+ authorizationUrl(options = {}) {
69
+ return this.generateAuthorizationUrl(options);
70
+ }
71
+ /**
72
+ * Exchanges an authorization code for access & refresh tokens.
73
+ */
74
+ async exchangeCodeForToken(options) {
75
+ const tokenUrl = options.tokenUrl || this.options.tokenUrl;
76
+ if (!tokenUrl) {
77
+ throw new Error('tokenUrl is required to exchange code for token');
78
+ }
79
+ const clientId = options.clientId || this.options.clientId;
80
+ const clientSecret = options.clientSecret || this.options.clientSecret;
81
+ const redirectUri = options.redirectUri || this.options.redirectUri;
82
+ const bodyParams = new URLSearchParams({
83
+ grant_type: 'authorization_code',
84
+ code: options.code,
85
+ client_id: clientId,
86
+ });
87
+ if (redirectUri) {
88
+ bodyParams.set('redirect_uri', redirectUri);
89
+ }
90
+ if (clientSecret) {
91
+ bodyParams.set('client_secret', clientSecret);
92
+ }
93
+ if (options.codeVerifier) {
94
+ bodyParams.set('code_verifier', options.codeVerifier);
95
+ }
96
+ const response = await fetch(tokenUrl, {
97
+ method: 'POST',
98
+ headers: {
99
+ 'content-type': 'application/x-www-form-urlencoded',
100
+ accept: 'application/json',
101
+ },
102
+ body: bodyParams.toString(),
103
+ });
104
+ if (!response.ok) {
105
+ const errorText = await response.text();
106
+ throw new Error(`OAuth token exchange failed (${response.status}): ${errorText}`);
107
+ }
108
+ const data = (await response.json());
109
+ const expiresIn = typeof data.expires_in === 'number' ? data.expires_in : undefined;
110
+ const expiresAt = expiresIn ? new Date(Date.now() + expiresIn * 1000) : undefined;
111
+ return {
112
+ accessToken: data.access_token,
113
+ refreshToken: data.refresh_token,
114
+ idToken: data.id_token,
115
+ tokenType: data.token_type || 'Bearer',
116
+ expiresIn,
117
+ expiresAt,
118
+ scope: data.scope,
119
+ raw: data,
120
+ };
121
+ }
122
+ /**
123
+ * Fetches user info profile from userInfoUrl using bearer accessToken.
124
+ */
125
+ async fetchUserInfo(accessToken, userInfoUrl) {
126
+ const url = userInfoUrl || this.options.userInfoUrl;
127
+ if (!url) {
128
+ throw new Error('userInfoUrl is required to fetch user info');
129
+ }
130
+ const response = await fetch(url, {
131
+ headers: {
132
+ authorization: `Bearer ${accessToken}`,
133
+ accept: 'application/json',
134
+ },
135
+ });
136
+ if (!response.ok) {
137
+ const errorText = await response.text();
138
+ throw new Error(`OAuth fetchUserInfo failed (${response.status}): ${errorText}`);
139
+ }
140
+ return (await response.json());
141
+ }
142
+ }
143
+ exports.OAuth2Client = OAuth2Client;
144
+ /**
145
+ * Creates an OAuth2 client instance.
146
+ */
147
+ function createOAuth2Client(options) {
148
+ return new OAuth2Client(options);
149
+ }
150
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/oauth2/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './client.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/oauth2/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./client.js"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/oauth2/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B"}
@@ -0,0 +1,26 @@
1
+ export interface CreateApiKeyOptions {
2
+ prefix?: string;
3
+ bytes?: number;
4
+ name?: string;
5
+ }
6
+ export interface GeneratedApiKey {
7
+ key: string;
8
+ hash: string;
9
+ preview: string;
10
+ name?: string;
11
+ }
12
+ /**
13
+ * Creates a cryptographically secure API key formatted in the style of Stripe / Laravel Sanctum.
14
+ * The plaintext key must be presented to the user immediately; only the SHA-256 hash is saved in storage.
15
+ */
16
+ export declare function createApiKey(options?: CreateApiKeyOptions): GeneratedApiKey;
17
+ /**
18
+ * Computes the SHA-256 hex digest of an API key for indexed database storage.
19
+ */
20
+ export declare function hashApiKey(key: string): string;
21
+ /**
22
+ * Constant-time comparison verifying a provided API key against a stored SHA-256 hash.
23
+ * Protects against side-channel timing attacks.
24
+ */
25
+ export declare function verifyApiKey(providedKey: string, storedHash: string): boolean;
26
+ //# sourceMappingURL=api-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-key.d.ts","sourceRoot":"","sources":["../../src/tokens/api-key.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,eAAe,CAiB/E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAc7E"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createApiKey = createApiKey;
37
+ exports.hashApiKey = hashApiKey;
38
+ exports.verifyApiKey = verifyApiKey;
39
+ const crypto = __importStar(require("node:crypto"));
40
+ /**
41
+ * Creates a cryptographically secure API key formatted in the style of Stripe / Laravel Sanctum.
42
+ * The plaintext key must be presented to the user immediately; only the SHA-256 hash is saved in storage.
43
+ */
44
+ function createApiKey(options = {}) {
45
+ const prefix = options.prefix ?? 'argos_live_';
46
+ const bytes = options.bytes ?? 32;
47
+ const randomPart = crypto.randomBytes(bytes).toString('base64url');
48
+ const key = `${prefix}${randomPart}`;
49
+ const hash = hashApiKey(key);
50
+ const suffix = randomPart.length > 4 ? randomPart.slice(-4) : randomPart;
51
+ const preview = `${prefix}...${suffix}`;
52
+ return {
53
+ key,
54
+ hash,
55
+ preview,
56
+ ...(options.name ? { name: options.name } : {}),
57
+ };
58
+ }
59
+ /**
60
+ * Computes the SHA-256 hex digest of an API key for indexed database storage.
61
+ */
62
+ function hashApiKey(key) {
63
+ if (!key || typeof key !== 'string') {
64
+ throw new Error('API key must be a valid non-empty string');
65
+ }
66
+ return crypto.createHash('sha256').update(key.trim(), 'utf-8').digest('hex');
67
+ }
68
+ /**
69
+ * Constant-time comparison verifying a provided API key against a stored SHA-256 hash.
70
+ * Protects against side-channel timing attacks.
71
+ */
72
+ function verifyApiKey(providedKey, storedHash) {
73
+ if (!providedKey || !storedHash || typeof providedKey !== 'string' || typeof storedHash !== 'string') {
74
+ return false;
75
+ }
76
+ const computedHash = hashApiKey(providedKey);
77
+ const computedBuffer = Buffer.from(computedHash, 'utf-8');
78
+ const storedBuffer = Buffer.from(storedHash.trim(), 'utf-8');
79
+ if (computedBuffer.length !== storedBuffer.length) {
80
+ return false;
81
+ }
82
+ return crypto.timingSafeEqual(computedBuffer, storedBuffer);
83
+ }
84
+ //# sourceMappingURL=api-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-key.js","sourceRoot":"","sources":["../../src/tokens/api-key.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,oCAiBC;AAKD,gCAKC;AAMD,oCAcC;AAlED,oDAAsC;AAetC;;;GAGG;AACH,SAAgB,YAAY,CAAC,UAA+B,EAAE;IAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;IAElC,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,GAAG,MAAM,GAAG,UAAU,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAE7B,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IACzE,MAAM,OAAO,GAAG,GAAG,MAAM,MAAM,MAAM,EAAE,CAAC;IAExC,OAAO;QACL,GAAG;QACH,IAAI;QACJ,OAAO;QACP,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,GAAW;IACpC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/E,CAAC;AAED;;;GAGG;AACH,SAAgB,YAAY,CAAC,WAAmB,EAAE,UAAkB;IAClE,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACrG,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,YAAY,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;IAE7D,IAAI,cAAc,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,EAAE,CAAC;QAClD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,MAAM,CAAC,eAAe,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './jwt';
2
+ export * from './api-key';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tokens/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,WAAW,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./jwt"), exports);
18
+ __exportStar(require("./api-key"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tokens/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wCAAsB;AACtB,4CAA0B"}