@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,139 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseOAuthProvider = void 0;
4
+ const pkce_js_1 = require("./pkce.js");
5
+ class BaseOAuthProvider {
6
+ options;
7
+ constructor(options) {
8
+ this.options = { ...options };
9
+ }
10
+ get name() {
11
+ return this.constructor.name.replace(/Provider$/, '').toLowerCase();
12
+ }
13
+ /**
14
+ * Generates the authorization URL with PKCE (S256) and CSRF protection.
15
+ */
16
+ createAuthorizationUrl(options = {}) {
17
+ if (!this.options.authorizationUrl) {
18
+ throw new Error(`Provider "${this.name}" does not have an authorizationUrl configured`);
19
+ }
20
+ const pkce = options.codeVerifier
21
+ ? {
22
+ codeVerifier: options.codeVerifier,
23
+ codeChallenge: options.codeVerifier,
24
+ codeChallengeMethod: 'S256',
25
+ }
26
+ : (0, pkce_js_1.generatePkcePair)();
27
+ const state = options.state || (0, pkce_js_1.generateState)(undefined, this.options.stateSecret);
28
+ const scopes = options.scopes || this.options.scopes || [];
29
+ const url = new URL(this.options.authorizationUrl);
30
+ url.searchParams.set('client_id', this.options.clientId);
31
+ url.searchParams.set('redirect_uri', this.options.redirectUri);
32
+ url.searchParams.set('response_type', 'code');
33
+ if (scopes.length > 0) {
34
+ url.searchParams.set('scope', scopes.join(' '));
35
+ }
36
+ url.searchParams.set('state', state);
37
+ url.searchParams.set('code_challenge', pkce.codeChallenge);
38
+ url.searchParams.set('code_challenge_method', pkce.codeChallengeMethod);
39
+ if (options.prompt) {
40
+ url.searchParams.set('prompt', options.prompt);
41
+ }
42
+ if (options.accessType) {
43
+ url.searchParams.set('access_type', options.accessType);
44
+ }
45
+ if (options.extraParams) {
46
+ for (const [k, v] of Object.entries(options.extraParams)) {
47
+ url.searchParams.set(k, v);
48
+ }
49
+ }
50
+ return {
51
+ url: url.toString(),
52
+ state,
53
+ codeVerifier: pkce.codeVerifier,
54
+ codeChallenge: pkce.codeChallenge,
55
+ };
56
+ }
57
+ /**
58
+ * Exchanges an authorization code for access and refresh tokens.
59
+ */
60
+ async exchangeCodeForTokens(code, codeVerifier) {
61
+ if (!this.options.tokenUrl) {
62
+ throw new Error(`Provider "${this.name}" does not have a tokenUrl configured`);
63
+ }
64
+ const bodyParams = new URLSearchParams({
65
+ client_id: this.options.clientId,
66
+ code,
67
+ grant_type: 'authorization_code',
68
+ redirect_uri: this.options.redirectUri,
69
+ });
70
+ if (this.options.clientSecret) {
71
+ bodyParams.set('client_secret', this.options.clientSecret);
72
+ }
73
+ if (codeVerifier) {
74
+ bodyParams.set('code_verifier', codeVerifier);
75
+ }
76
+ const headers = {
77
+ 'content-type': 'application/x-www-form-urlencoded',
78
+ accept: 'application/json',
79
+ };
80
+ const response = await fetch(this.options.tokenUrl, {
81
+ method: 'POST',
82
+ headers,
83
+ body: bodyParams.toString(),
84
+ });
85
+ if (!response.ok) {
86
+ const errorText = await response.text();
87
+ throw new Error(`OAuth token request failed (${response.status}): ${errorText}`);
88
+ }
89
+ const data = (await response.json());
90
+ const expiresIn = typeof data.expires_in === 'number' ? data.expires_in : undefined;
91
+ const expiresAt = expiresIn ? new Date(Date.now() + expiresIn * 1000) : undefined;
92
+ return {
93
+ accessToken: data.access_token,
94
+ refreshToken: data.refresh_token,
95
+ idToken: data.id_token,
96
+ tokenType: data.token_type || 'Bearer',
97
+ expiresIn,
98
+ expiresAt,
99
+ scope: data.scope,
100
+ raw: data,
101
+ };
102
+ }
103
+ /**
104
+ * Fetches the raw user profile from userinfo endpoint.
105
+ */
106
+ async fetchUserInfo(accessToken) {
107
+ if (!this.options.userInfoUrl) {
108
+ throw new Error(`Provider "${this.name}" does not have a userInfoUrl configured`);
109
+ }
110
+ const response = await fetch(this.options.userInfoUrl, {
111
+ headers: {
112
+ authorization: `Bearer ${accessToken}`,
113
+ accept: 'application/json',
114
+ },
115
+ });
116
+ if (!response.ok) {
117
+ const errorText = await response.text();
118
+ throw new Error(`Failed to fetch OAuth user info (${response.status}): ${errorText}`);
119
+ }
120
+ return (await response.json());
121
+ }
122
+ /**
123
+ * High-level flow: validates CSRF state, exchanges code for tokens, and returns mapped user.
124
+ */
125
+ async getUser(options) {
126
+ if (options.savedState || this.options.stateSecret) {
127
+ const expected = options.savedState || this.options.stateSecret;
128
+ const isValid = (0, pkce_js_1.verifyState)(options.state || '', expected);
129
+ if (!isValid) {
130
+ throw new Error('OAuth state mismatch: potential CSRF attack detected');
131
+ }
132
+ }
133
+ const tokens = await this.exchangeCodeForTokens(options.code, options.codeVerifier);
134
+ const rawProfile = await this.fetchUserInfo(tokens.accessToken);
135
+ return this.mapUser(rawProfile, tokens);
136
+ }
137
+ }
138
+ exports.BaseOAuthProvider = BaseOAuthProvider;
139
+ //# sourceMappingURL=base.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.provider.js","sourceRoot":"","sources":["../../src/oauth/base.provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from './oauth.types.js';
2
+ export * from './pkce.js';
3
+ export * from './base.provider.js';
4
+ export * from './providers/index.js';
5
+ export * from './oauth-manager.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/oauth/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,22 @@
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("./oauth.types.js"), exports);
18
+ __exportStar(require("./pkce.js"), exports);
19
+ __exportStar(require("./base.provider.js"), exports);
20
+ __exportStar(require("./providers/index.js"), exports);
21
+ __exportStar(require("./oauth-manager.js"), exports);
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/oauth/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,4CAA0B;AAC1B,qDAAmC;AACnC,uDAAqC;AACrC,qDAAmC"}
@@ -0,0 +1,41 @@
1
+ import { BaseOAuthProvider } from './base.provider.js';
2
+ import { GoogleProvider, type GoogleProviderOptions } from './providers/google.provider.js';
3
+ import { GitHubProvider, type GitHubProviderOptions } from './providers/github.provider.js';
4
+ import { MicrosoftProvider, type MicrosoftProviderOptions } from './providers/microsoft.provider.js';
5
+ import { GenericOidcProvider, type GenericOidcProviderOptions } from './providers/generic-oidc.provider.js';
6
+ export type SupportedOAuthProvider = 'google' | 'github' | 'microsoft' | 'oidc';
7
+ export type OAuthProviderOptionsMap = {
8
+ google: GoogleProviderOptions;
9
+ github: GitHubProviderOptions;
10
+ microsoft: MicrosoftProviderOptions;
11
+ oidc: GenericOidcProviderOptions;
12
+ };
13
+ /**
14
+ * Registers an OAuth provider instance under a given name.
15
+ */
16
+ export declare function registerOAuthProvider(name: string, provider: BaseOAuthProvider): void;
17
+ /**
18
+ * Gets a registered OAuth provider.
19
+ */
20
+ export declare function getOAuthProvider(name: string): BaseOAuthProvider | undefined;
21
+ /**
22
+ * Fluent factory to instantiate or retrieve an OAuth2 / OIDC provider.
23
+ *
24
+ * Example:
25
+ * ```ts
26
+ * const google = oauth('google', {
27
+ * clientId: process.env.GOOGLE_CLIENT_ID!,
28
+ * clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
29
+ * redirectUri: 'https://api.myapp.com/auth/google/callback',
30
+ * });
31
+ *
32
+ * const { url, state, codeVerifier } = google.createAuthorizationUrl();
33
+ * const user = await google.getUser({ code, codeVerifier, state, savedState });
34
+ * ```
35
+ */
36
+ export declare function oauth(provider: 'google', options: GoogleProviderOptions): GoogleProvider;
37
+ export declare function oauth(provider: 'github', options: GitHubProviderOptions): GitHubProvider;
38
+ export declare function oauth(provider: 'microsoft', options: MicrosoftProviderOptions): MicrosoftProvider;
39
+ export declare function oauth(provider: 'oidc', options: GenericOidcProviderOptions): GenericOidcProvider;
40
+ export declare function oauth(provider: string, options?: any): BaseOAuthProvider;
41
+ //# sourceMappingURL=oauth-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-manager.d.ts","sourceRoot":"","sources":["../../src/oauth/oauth-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,KAAK,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AACrG,OAAO,EAAE,mBAAmB,EAAE,KAAK,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAE5G,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;AAEhF,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,qBAAqB,CAAC;IAC9B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,SAAS,EAAE,wBAAwB,CAAC;IACpC,IAAI,EAAE,0BAA0B,CAAC;CAClC,CAAC;AAIF;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAErF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAE5E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,KAAK,CACnB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,qBAAqB,GAC7B,cAAc,CAAC;AAClB,wBAAgB,KAAK,CACnB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,qBAAqB,GAC7B,cAAc,CAAC;AAClB,wBAAgB,KAAK,CACnB,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,wBAAwB,GAChC,iBAAiB,CAAC;AACrB,wBAAgB,KAAK,CACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,0BAA0B,GAClC,mBAAmB,CAAC;AACvB,wBAAgB,KAAK,CACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,GAAG,GACZ,iBAAiB,CAAC"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerOAuthProvider = registerOAuthProvider;
4
+ exports.getOAuthProvider = getOAuthProvider;
5
+ exports.oauth = oauth;
6
+ const base_provider_js_1 = require("./base.provider.js");
7
+ const google_provider_js_1 = require("./providers/google.provider.js");
8
+ const github_provider_js_1 = require("./providers/github.provider.js");
9
+ const microsoft_provider_js_1 = require("./providers/microsoft.provider.js");
10
+ const generic_oidc_provider_js_1 = require("./providers/generic-oidc.provider.js");
11
+ const registeredProviders = new Map();
12
+ /**
13
+ * Registers an OAuth provider instance under a given name.
14
+ */
15
+ function registerOAuthProvider(name, provider) {
16
+ registeredProviders.set(name.toLowerCase(), provider);
17
+ }
18
+ /**
19
+ * Gets a registered OAuth provider.
20
+ */
21
+ function getOAuthProvider(name) {
22
+ return registeredProviders.get(name.toLowerCase());
23
+ }
24
+ function oauth(provider, options) {
25
+ const normalized = provider.toLowerCase();
26
+ if (!options) {
27
+ const existing = registeredProviders.get(normalized);
28
+ if (existing)
29
+ return existing;
30
+ throw new Error(`Provider "${provider}" is not registered. Pass configuration options to instantiate it.`);
31
+ }
32
+ let instance;
33
+ switch (normalized) {
34
+ case 'google':
35
+ instance = new google_provider_js_1.GoogleProvider(options);
36
+ break;
37
+ case 'github':
38
+ instance = new github_provider_js_1.GitHubProvider(options);
39
+ break;
40
+ case 'microsoft':
41
+ instance = new microsoft_provider_js_1.MicrosoftProvider(options);
42
+ break;
43
+ case 'oidc':
44
+ instance = new generic_oidc_provider_js_1.GenericOidcProvider(options);
45
+ break;
46
+ default:
47
+ if (options instanceof base_provider_js_1.BaseOAuthProvider) {
48
+ instance = options;
49
+ }
50
+ else {
51
+ instance = new generic_oidc_provider_js_1.GenericOidcProvider(options);
52
+ }
53
+ break;
54
+ }
55
+ registeredProviders.set(normalized, instance);
56
+ return instance;
57
+ }
58
+ //# sourceMappingURL=oauth-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-manager.js","sourceRoot":"","sources":["../../src/oauth/oauth-manager.ts"],"names":[],"mappings":";;AAoBA,sDAEC;AAKD,4CAEC;AAqCD,sBAqCC;AAvGD,yDAAuD;AACvD,uEAA4F;AAC5F,uEAA4F;AAC5F,6EAAqG;AACrG,mFAA4G;AAW5G,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAA6B,CAAC;AAEjE;;GAEG;AACH,SAAgB,qBAAqB,CAAC,IAAY,EAAE,QAA2B;IAC7E,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,IAAY;IAC3C,OAAO,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AACrD,CAAC;AAqCD,SAAgB,KAAK,CACnB,QAAgB,EAChB,OAAa;IAEb,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAE1C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,aAAa,QAAQ,oEAAoE,CAAC,CAAC;IAC7G,CAAC;IAED,IAAI,QAA2B,CAAC;IAChC,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,QAAQ;YACX,QAAQ,GAAG,IAAI,mCAAc,CAAC,OAAO,CAAC,CAAC;YACvC,MAAM;QACR,KAAK,QAAQ;YACX,QAAQ,GAAG,IAAI,mCAAc,CAAC,OAAO,CAAC,CAAC;YACvC,MAAM;QACR,KAAK,WAAW;YACd,QAAQ,GAAG,IAAI,yCAAiB,CAAC,OAAO,CAAC,CAAC;YAC1C,MAAM;QACR,KAAK,MAAM;YACT,QAAQ,GAAG,IAAI,8CAAmB,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM;QACR;YACE,IAAI,OAAO,YAAY,oCAAiB,EAAE,CAAC;gBACzC,QAAQ,GAAG,OAAO,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,IAAI,8CAAmB,CAAC,OAAO,CAAC,CAAC;YAC9C,CAAC;YACD,MAAM;IACV,CAAC;IAED,mBAAmB,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC9C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,55 @@
1
+ export interface OAuthTokens {
2
+ accessToken: string;
3
+ refreshToken?: string;
4
+ idToken?: string;
5
+ tokenType: string;
6
+ expiresIn?: number;
7
+ expiresAt?: Date;
8
+ scope?: string;
9
+ raw?: Record<string, unknown>;
10
+ }
11
+ export interface OAuthUser {
12
+ id: string;
13
+ email?: string;
14
+ emailVerified?: boolean;
15
+ name?: string;
16
+ username?: string;
17
+ avatar?: string;
18
+ raw: Record<string, unknown>;
19
+ }
20
+ export interface BaseOAuthProviderOptions {
21
+ clientId: string;
22
+ clientSecret?: string;
23
+ redirectUri: string;
24
+ scopes?: string[];
25
+ authorizationUrl?: string;
26
+ tokenUrl?: string;
27
+ userInfoUrl?: string;
28
+ stateSecret?: string;
29
+ }
30
+ export interface CreateAuthorizationUrlOptions {
31
+ scopes?: string[];
32
+ state?: string;
33
+ codeVerifier?: string;
34
+ prompt?: string;
35
+ accessType?: string;
36
+ extraParams?: Record<string, string>;
37
+ }
38
+ export interface AuthorizationUrlResult {
39
+ url: string;
40
+ state: string;
41
+ codeVerifier: string;
42
+ codeChallenge: string;
43
+ }
44
+ export interface GetUserOptions {
45
+ code: string;
46
+ codeVerifier?: string;
47
+ state?: string;
48
+ savedState?: string;
49
+ }
50
+ export interface PkcePair {
51
+ codeVerifier: string;
52
+ codeChallenge: string;
53
+ codeChallengeMethod: 'S256';
54
+ }
55
+ //# sourceMappingURL=oauth.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.types.d.ts","sourceRoot":"","sources":["../../src/oauth/oauth.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,6BAA6B;IAC5C,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,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,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;CAC7B"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=oauth.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.types.js","sourceRoot":"","sources":["../../src/oauth/oauth.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import type { PkcePair } from './oauth.types.js';
2
+ /**
3
+ * Generates an RFC 7636 compliant PKCE code_verifier and code_challenge (S256).
4
+ */
5
+ export declare function generatePkcePair(byteLength?: number): PkcePair;
6
+ /**
7
+ * Computes the S256 code_challenge for a given code_verifier.
8
+ */
9
+ export declare function computeCodeChallenge(codeVerifier: string): string;
10
+ export interface StateMetadata {
11
+ returnTo?: string;
12
+ timestamp?: number;
13
+ [key: string]: unknown;
14
+ }
15
+ /**
16
+ * Generates a cryptographically random, CSRF-resistant state parameter.
17
+ * If a secret is provided, creates a signed and tamper-evident state token.
18
+ */
19
+ export declare function generateState(metadata?: StateMetadata, secret?: string): string;
20
+ /**
21
+ * Validates a state token against an expected string or verifies its HMAC signature.
22
+ */
23
+ export declare function verifyState(receivedState: string, expectedStateOrSecret: string, options?: {
24
+ maxAgeMs?: number;
25
+ }): boolean;
26
+ //# sourceMappingURL=pkce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.d.ts","sourceRoot":"","sources":["../../src/oauth/pkce.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,SAAK,GAAG,QAAQ,CAc1D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAKjE;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAmB/E;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,aAAa,EAAE,MAAM,EACrB,qBAAqB,EAAE,MAAM,EAC7B,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9B,OAAO,CAoDT"}
@@ -0,0 +1,136 @@
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.generatePkcePair = generatePkcePair;
37
+ exports.computeCodeChallenge = computeCodeChallenge;
38
+ exports.generateState = generateState;
39
+ exports.verifyState = verifyState;
40
+ const crypto = __importStar(require("node:crypto"));
41
+ /**
42
+ * Generates an RFC 7636 compliant PKCE code_verifier and code_challenge (S256).
43
+ */
44
+ function generatePkcePair(byteLength = 48) {
45
+ // 48 random bytes yields 64 base64url characters (within the 43-128 range)
46
+ const codeVerifier = crypto.randomBytes(byteLength).toString('base64url');
47
+ const codeChallenge = crypto
48
+ .createHash('sha256')
49
+ .update(codeVerifier, 'ascii')
50
+ .digest('base64url');
51
+ return {
52
+ codeVerifier,
53
+ codeChallenge,
54
+ codeChallengeMethod: 'S256',
55
+ };
56
+ }
57
+ /**
58
+ * Computes the S256 code_challenge for a given code_verifier.
59
+ */
60
+ function computeCodeChallenge(codeVerifier) {
61
+ return crypto
62
+ .createHash('sha256')
63
+ .update(codeVerifier, 'ascii')
64
+ .digest('base64url');
65
+ }
66
+ /**
67
+ * Generates a cryptographically random, CSRF-resistant state parameter.
68
+ * If a secret is provided, creates a signed and tamper-evident state token.
69
+ */
70
+ function generateState(metadata, secret) {
71
+ const randomEntropy = crypto.randomBytes(24).toString('base64url');
72
+ if (!secret) {
73
+ if (!metadata || Object.keys(metadata).length === 0) {
74
+ return randomEntropy;
75
+ }
76
+ const payload = JSON.stringify({ rnd: randomEntropy, ...metadata, ts: Date.now() });
77
+ return Buffer.from(payload, 'utf-8').toString('base64url');
78
+ }
79
+ const payload = JSON.stringify({ rnd: randomEntropy, ...metadata, ts: Date.now() });
80
+ const payloadB64 = Buffer.from(payload, 'utf-8').toString('base64url');
81
+ const signature = crypto
82
+ .createHmac('sha256', secret)
83
+ .update(payloadB64)
84
+ .digest('base64url');
85
+ return `${payloadB64}.${signature}`;
86
+ }
87
+ /**
88
+ * Validates a state token against an expected string or verifies its HMAC signature.
89
+ */
90
+ function verifyState(receivedState, expectedStateOrSecret, options) {
91
+ if (!receivedState || !expectedStateOrSecret) {
92
+ return false;
93
+ }
94
+ // 1. Direct match comparison (constant-time)
95
+ const bufReceived = Buffer.from(receivedState);
96
+ const bufExpected = Buffer.from(expectedStateOrSecret);
97
+ if (bufReceived.length === bufExpected.length) {
98
+ if (crypto.timingSafeEqual(bufReceived, bufExpected)) {
99
+ return true;
100
+ }
101
+ }
102
+ // 2. Signed State verification (if expectedStateOrSecret is a signing secret)
103
+ if (receivedState.includes('.')) {
104
+ const parts = receivedState.split('.');
105
+ if (parts.length !== 2)
106
+ return false;
107
+ const [payloadB64, signature] = parts;
108
+ const computedSignature = crypto
109
+ .createHmac('sha256', expectedStateOrSecret)
110
+ .update(payloadB64)
111
+ .digest('base64url');
112
+ const sigBuf = Buffer.from(signature);
113
+ const compBuf = Buffer.from(computedSignature);
114
+ if (sigBuf.length !== compBuf.length || !crypto.timingSafeEqual(sigBuf, compBuf)) {
115
+ return false;
116
+ }
117
+ // Check age if requested
118
+ if (options?.maxAgeMs) {
119
+ try {
120
+ const parsed = JSON.parse(Buffer.from(payloadB64, 'base64url').toString('utf-8'));
121
+ if (typeof parsed.ts === 'number') {
122
+ const age = Date.now() - parsed.ts;
123
+ if (age > options.maxAgeMs || age < 0) {
124
+ return false;
125
+ }
126
+ }
127
+ }
128
+ catch {
129
+ return false;
130
+ }
131
+ }
132
+ return true;
133
+ }
134
+ return false;
135
+ }
136
+ //# sourceMappingURL=pkce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../src/oauth/pkce.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { BaseOAuthProvider } from '../base.provider.js';
2
+ import type { BaseOAuthProviderOptions, OAuthTokens, OAuthUser } from '../oauth.types.js';
3
+ export interface GenericOidcProviderOptions extends BaseOAuthProviderOptions {
4
+ issuer?: string;
5
+ discoveryUrl?: string;
6
+ }
7
+ export interface OidcDiscoveryDocument {
8
+ issuer: string;
9
+ authorization_endpoint: string;
10
+ token_endpoint: string;
11
+ userinfo_endpoint?: string;
12
+ jwks_uri?: string;
13
+ [key: string]: unknown;
14
+ }
15
+ export declare class GenericOidcProvider extends BaseOAuthProvider {
16
+ constructor(options: GenericOidcProviderOptions);
17
+ /**
18
+ * Initializes a GenericOidcProvider by auto-discovering endpoints via .well-known/openid-configuration.
19
+ */
20
+ static fromDiscovery(options: GenericOidcProviderOptions & {
21
+ issuer: string;
22
+ }): Promise<GenericOidcProvider>;
23
+ mapUser(rawProfile: Record<string, unknown>, _tokens: OAuthTokens): OAuthUser;
24
+ }
25
+ //# sourceMappingURL=generic-oidc.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic-oidc.provider.d.ts","sourceRoot":"","sources":["../../../src/oauth/providers/generic-oidc.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,0BAA2B,SAAQ,wBAAwB;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB,EAAE,MAAM,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qBAAa,mBAAoB,SAAQ,iBAAiB;gBAC5C,OAAO,EAAE,0BAA0B;IAO/C;;OAEG;WACiB,aAAa,CAC/B,OAAO,EAAE,0BAA0B,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GACvD,OAAO,CAAC,mBAAmB,CAAC;IAmBxB,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,SAAS;CAWrF"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GenericOidcProvider = void 0;
4
+ const base_provider_js_1 = require("../base.provider.js");
5
+ class GenericOidcProvider extends base_provider_js_1.BaseOAuthProvider {
6
+ constructor(options) {
7
+ super({
8
+ scopes: ['openid', 'profile', 'email'],
9
+ ...options,
10
+ });
11
+ }
12
+ /**
13
+ * Initializes a GenericOidcProvider by auto-discovering endpoints via .well-known/openid-configuration.
14
+ */
15
+ static async fromDiscovery(options) {
16
+ const issuer = options.issuer.replace(/\/$/, '');
17
+ const discoveryUrl = options.discoveryUrl || `${issuer}/.well-known/openid-configuration`;
18
+ const res = await fetch(discoveryUrl);
19
+ if (!res.ok) {
20
+ throw new Error(`Failed to fetch OIDC discovery document from ${discoveryUrl}: HTTP ${res.status}`);
21
+ }
22
+ const doc = (await res.json());
23
+ return new GenericOidcProvider({
24
+ ...options,
25
+ authorizationUrl: doc.authorization_endpoint,
26
+ tokenUrl: doc.token_endpoint,
27
+ userInfoUrl: doc.userinfo_endpoint,
28
+ });
29
+ }
30
+ mapUser(rawProfile, _tokens) {
31
+ return {
32
+ id: String(rawProfile.sub ?? rawProfile.id ?? ''),
33
+ email: rawProfile.email,
34
+ emailVerified: Boolean(rawProfile.email_verified),
35
+ name: rawProfile.name ?? rawProfile.preferred_username,
36
+ username: rawProfile.preferred_username,
37
+ avatar: rawProfile.picture ?? undefined,
38
+ raw: rawProfile,
39
+ };
40
+ }
41
+ }
42
+ exports.GenericOidcProvider = GenericOidcProvider;
43
+ //# sourceMappingURL=generic-oidc.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic-oidc.provider.js","sourceRoot":"","sources":["../../../src/oauth/providers/generic-oidc.provider.ts"],"names":[],"mappings":";;;AAAA,0DAAwD;AAiBxD,MAAa,mBAAoB,SAAQ,oCAAiB;IACxD,YAAY,OAAmC;QAC7C,KAAK,CAAC;YACJ,MAAM,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC;YACtC,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,KAAK,CAAC,aAAa,CAC/B,OAAwD;QAExD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,GAAG,MAAM,mCAAmC,CAAC;QAE1F,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,gDAAgD,YAAY,UAAU,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACtG,CAAC;QAED,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA0B,CAAC;QAExD,OAAO,IAAI,mBAAmB,CAAC;YAC7B,GAAG,OAAO;YACV,gBAAgB,EAAE,GAAG,CAAC,sBAAsB;YAC5C,QAAQ,EAAE,GAAG,CAAC,cAAc;YAC5B,WAAW,EAAE,GAAG,CAAC,iBAAiB;SACnC,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,EAAG,UAAU,CAAC,IAAe,IAAK,UAAU,CAAC,kBAA6B;YAC9E,QAAQ,EAAE,UAAU,CAAC,kBAAwC;YAC7D,MAAM,EAAG,UAAU,CAAC,OAAkB,IAAI,SAAS;YACnD,GAAG,EAAE,UAAU;SAChB,CAAC;IACJ,CAAC;CACF;AA3CD,kDA2CC"}
@@ -0,0 +1,15 @@
1
+ import { BaseOAuthProvider } from '../base.provider.js';
2
+ import type { BaseOAuthProviderOptions, OAuthTokens, OAuthUser } from '../oauth.types.js';
3
+ export interface GitHubProviderOptions extends Omit<BaseOAuthProviderOptions, 'authorizationUrl' | 'tokenUrl'> {
4
+ authorizationUrl?: string;
5
+ tokenUrl?: string;
6
+ userInfoUrl?: string;
7
+ emailsUrl?: string;
8
+ }
9
+ export declare class GitHubProvider extends BaseOAuthProvider {
10
+ private emailsUrl;
11
+ constructor(options: GitHubProviderOptions);
12
+ fetchUserInfo(accessToken: string): Promise<Record<string, unknown>>;
13
+ mapUser(rawProfile: Record<string, unknown>, _tokens: OAuthTokens): OAuthUser;
14
+ }
15
+ //# sourceMappingURL=github.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.provider.d.ts","sourceRoot":"","sources":["../../../src/oauth/providers/github.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;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAe,SAAQ,iBAAiB;IACnD,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,qBAAqB;IAWpB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IA4CnF,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,SAAS;CAWrF"}