exisjs 0.5.10 → 0.5.11

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 (157) hide show
  1. package/dist/auth/index.d.ts +3 -1
  2. package/dist/auth/index.d.ts.map +1 -1
  3. package/dist/auth/index.js +4 -1
  4. package/dist/auth/index.js.map +1 -1
  5. package/dist/auth/oauth/core.d.ts +96 -0
  6. package/dist/auth/oauth/core.d.ts.map +1 -0
  7. package/dist/auth/oauth/core.js +203 -0
  8. package/dist/auth/oauth/core.js.map +1 -0
  9. package/dist/auth/oauth/index.d.ts +45 -0
  10. package/dist/auth/oauth/index.d.ts.map +1 -0
  11. package/dist/auth/oauth/index.js +64 -0
  12. package/dist/auth/oauth/index.js.map +1 -0
  13. package/dist/auth/oauth/middleware.d.ts +63 -0
  14. package/dist/auth/oauth/middleware.d.ts.map +1 -0
  15. package/dist/auth/oauth/middleware.js +164 -0
  16. package/dist/auth/oauth/middleware.js.map +1 -0
  17. package/dist/auth/oauth/providers/custom.d.ts +41 -0
  18. package/dist/auth/oauth/providers/custom.d.ts.map +1 -0
  19. package/dist/auth/oauth/providers/custom.js +204 -0
  20. package/dist/auth/oauth/providers/custom.js.map +1 -0
  21. package/dist/auth/oauth/providers/discord.d.ts +23 -0
  22. package/dist/auth/oauth/providers/discord.d.ts.map +1 -0
  23. package/dist/auth/oauth/providers/discord.js +130 -0
  24. package/dist/auth/oauth/providers/discord.js.map +1 -0
  25. package/dist/auth/oauth/providers/facebook.d.ts +28 -0
  26. package/dist/auth/oauth/providers/facebook.d.ts.map +1 -0
  27. package/dist/auth/oauth/providers/facebook.js +124 -0
  28. package/dist/auth/oauth/providers/facebook.js.map +1 -0
  29. package/dist/auth/oauth/providers/github.d.ts +25 -0
  30. package/dist/auth/oauth/providers/github.d.ts.map +1 -0
  31. package/dist/auth/oauth/providers/github.js +132 -0
  32. package/dist/auth/oauth/providers/github.js.map +1 -0
  33. package/dist/auth/oauth/providers/google.d.ts +23 -0
  34. package/dist/auth/oauth/providers/google.d.ts.map +1 -0
  35. package/dist/auth/oauth/providers/google.js +134 -0
  36. package/dist/auth/oauth/providers/google.js.map +1 -0
  37. package/dist/auth/oauth/providers/microsoft.d.ts +28 -0
  38. package/dist/auth/oauth/providers/microsoft.d.ts.map +1 -0
  39. package/dist/auth/oauth/providers/microsoft.js +136 -0
  40. package/dist/auth/oauth/providers/microsoft.js.map +1 -0
  41. package/dist/auth/oauth/types.d.ts +158 -0
  42. package/dist/auth/oauth/types.d.ts.map +1 -0
  43. package/dist/auth/oauth/types.js +4 -0
  44. package/dist/auth/oauth/types.js.map +1 -0
  45. package/dist/cli/commands/dev.d.ts.map +1 -1
  46. package/dist/cli/commands/dev.js +0 -1
  47. package/dist/cli/commands/dev.js.map +1 -1
  48. package/dist/database/adapters/mongodb.d.ts +58 -0
  49. package/dist/database/adapters/mongodb.d.ts.map +1 -0
  50. package/dist/database/adapters/mongodb.js +264 -0
  51. package/dist/database/adapters/mongodb.js.map +1 -0
  52. package/dist/database/adapters/mysql.d.ts +27 -0
  53. package/dist/database/adapters/mysql.d.ts.map +1 -0
  54. package/dist/database/adapters/mysql.js +188 -0
  55. package/dist/database/adapters/mysql.js.map +1 -0
  56. package/dist/database/adapters/postgres.d.ts +28 -0
  57. package/dist/database/adapters/postgres.d.ts.map +1 -0
  58. package/dist/database/adapters/postgres.js +174 -0
  59. package/dist/database/adapters/postgres.js.map +1 -0
  60. package/dist/database/adapters/sqlite.d.ts +27 -0
  61. package/dist/database/adapters/sqlite.d.ts.map +1 -0
  62. package/dist/database/adapters/sqlite.js +149 -0
  63. package/dist/database/adapters/sqlite.js.map +1 -0
  64. package/dist/database/index.d.ts +42 -0
  65. package/dist/database/index.d.ts.map +1 -0
  66. package/dist/database/index.js +58 -0
  67. package/dist/database/index.js.map +1 -0
  68. package/dist/database/manager.d.ts +114 -0
  69. package/dist/database/manager.d.ts.map +1 -0
  70. package/dist/database/manager.js +269 -0
  71. package/dist/database/manager.js.map +1 -0
  72. package/dist/database/migration.d.ts +57 -0
  73. package/dist/database/migration.d.ts.map +1 -0
  74. package/dist/database/migration.js +329 -0
  75. package/dist/database/migration.js.map +1 -0
  76. package/dist/database/query-builder.d.ts +89 -0
  77. package/dist/database/query-builder.d.ts.map +1 -0
  78. package/dist/database/query-builder.js +353 -0
  79. package/dist/database/query-builder.js.map +1 -0
  80. package/dist/database/types.d.ts +184 -0
  81. package/dist/database/types.d.ts.map +1 -0
  82. package/dist/database/types.js +4 -0
  83. package/dist/database/types.js.map +1 -0
  84. package/dist/docs/ARCHITECTURE.md +349 -0
  85. package/dist/docs/BENCHMARKS.md +36 -0
  86. package/dist/docs/README.md +34 -0
  87. package/dist/docs/content/README.md +44 -0
  88. package/dist/docs/content/adapters.mdx +199 -0
  89. package/dist/docs/content/cache.mdx +239 -0
  90. package/dist/docs/content/circuit-breaker.mdx +130 -0
  91. package/dist/docs/content/cli/commands.mdx +214 -0
  92. package/dist/docs/content/cli/overview.mdx +92 -0
  93. package/dist/docs/content/cli/usage.mdx +61 -0
  94. package/dist/docs/content/config.mdx +214 -0
  95. package/dist/docs/content/controllers.mdx +241 -0
  96. package/dist/docs/content/cron.mdx +109 -0
  97. package/dist/docs/content/database.mdx +209 -0
  98. package/dist/docs/content/dataloader.mdx +170 -0
  99. package/dist/docs/content/decorators.mdx +204 -0
  100. package/dist/docs/content/errors.mdx +344 -0
  101. package/dist/docs/content/gateways.mdx +376 -0
  102. package/dist/docs/content/installation.mdx +210 -0
  103. package/dist/docs/content/introduction.mdx +96 -0
  104. package/dist/docs/content/middleware.mdx +441 -0
  105. package/dist/docs/content/modules.mdx +144 -0
  106. package/dist/docs/content/oauth.mdx +179 -0
  107. package/dist/docs/content/providers.mdx +147 -0
  108. package/dist/docs/content/queues.mdx +177 -0
  109. package/dist/docs/content/requests.mdx +293 -0
  110. package/dist/docs/content/responses.mdx +271 -0
  111. package/dist/docs/content/routing.mdx +541 -0
  112. package/dist/docs/content/rpc.mdx +146 -0
  113. package/dist/docs/content/security.mdx +294 -0
  114. package/dist/docs/content/sse.mdx +159 -0
  115. package/dist/docs/content/structure.mdx +116 -0
  116. package/dist/docs/content/testing.mdx +139 -0
  117. package/dist/docs/content/validation.mdx +249 -0
  118. package/dist/docs/content/websockets.mdx +289 -0
  119. package/dist/docs/integrations/README.md +23 -0
  120. package/dist/docs/integrations/jwt.mdx +151 -0
  121. package/dist/docs/integrations/mongo.mdx +183 -0
  122. package/dist/docs/integrations/observability.mdx +125 -0
  123. package/dist/docs/integrations/openai.mdx +108 -0
  124. package/dist/docs/integrations/postgres.mdx +190 -0
  125. package/dist/docs/integrations/posthog.mdx +122 -0
  126. package/dist/docs/integrations/redis.mdx +141 -0
  127. package/dist/docs/integrations/resend.mdx +117 -0
  128. package/dist/docs/integrations/s3.mdx +122 -0
  129. package/dist/docs/integrations/swagger.mdx +113 -0
  130. package/dist/docs/reference/README.md +3 -0
  131. package/dist/docs/reference/adapters.mdx +130 -0
  132. package/dist/docs/reference/auth.mdx +183 -0
  133. package/dist/docs/reference/cache.mdx +132 -0
  134. package/dist/docs/reference/circuit-breaker.mdx +71 -0
  135. package/dist/docs/reference/config.mdx +118 -0
  136. package/dist/docs/reference/context.mdx +168 -0
  137. package/dist/docs/reference/dataloader.mdx +91 -0
  138. package/dist/docs/reference/decorators.mdx +293 -0
  139. package/dist/docs/reference/di.mdx +123 -0
  140. package/dist/docs/reference/error.mdx +170 -0
  141. package/dist/docs/reference/exis.mdx +124 -0
  142. package/dist/docs/reference/middleware.mdx +304 -0
  143. package/dist/docs/reference/plugin.mdx +113 -0
  144. package/dist/docs/reference/queue.mdx +155 -0
  145. package/dist/docs/reference/router.mdx +248 -0
  146. package/dist/docs/reference/sanitize.mdx +130 -0
  147. package/dist/docs/reference/storage.mdx +116 -0
  148. package/dist/docs/reference/swagger.mdx +132 -0
  149. package/dist/docs/reference/testing.mdx +145 -0
  150. package/dist/docs/reference/validator.mdx +186 -0
  151. package/dist/index.d.ts +4 -0
  152. package/dist/index.d.ts.map +1 -1
  153. package/dist/index.js +10 -1
  154. package/dist/index.js.map +1 -1
  155. package/dist/server/bootstrapper.js +1 -1
  156. package/dist/server/bootstrapper.js.map +1 -1
  157. package/package.json +8 -1
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ /**
3
+ * Facebook OAuth Provider.
4
+ *
5
+ * Endpoints:
6
+ * Auth: https://www.facebook.com/v19.0/dialog/oauth
7
+ * Token: https://graph.facebook.com/v19.0/oauth/access_token
8
+ * UserInfo: https://graph.facebook.com/v19.0/me
9
+ *
10
+ * Default scopes: email, public_profile
11
+ *
12
+ * Note: Facebook uses Graph API versioning. This implementation uses v19.0.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.FacebookProvider = void 0;
16
+ const GRAPH_VERSION = 'v19.0';
17
+ const AUTH_URL = `https://www.facebook.com/${GRAPH_VERSION}/dialog/oauth`;
18
+ const TOKEN_URL = `https://graph.facebook.com/${GRAPH_VERSION}/oauth/access_token`;
19
+ const USERINFO_URL = `https://graph.facebook.com/${GRAPH_VERSION}/me`;
20
+ const DEFAULT_SCOPES = ['email', 'public_profile'];
21
+ class FacebookProvider {
22
+ constructor(config) {
23
+ this.name = 'facebook';
24
+ this.config = config;
25
+ }
26
+ getAuthorizationUrl(state, _codeVerifier) {
27
+ const scopes = this.config.scopes || DEFAULT_SCOPES;
28
+ const params = new URLSearchParams({
29
+ client_id: this.config.clientId,
30
+ redirect_uri: this.config.redirectUri,
31
+ response_type: 'code',
32
+ scope: scopes.join(','),
33
+ state,
34
+ });
35
+ return `${AUTH_URL}?${params.toString()}`;
36
+ }
37
+ async exchangeCode(code, _codeVerifier) {
38
+ const params = new URLSearchParams({
39
+ client_id: this.config.clientId,
40
+ client_secret: this.config.clientSecret,
41
+ code,
42
+ redirect_uri: this.config.redirectUri,
43
+ });
44
+ const response = await fetch(`${TOKEN_URL}?${params.toString()}`, {
45
+ method: 'GET',
46
+ });
47
+ if (!response.ok) {
48
+ const error = await response.text();
49
+ throw new Error(`Facebook token exchange failed: ${error}`);
50
+ }
51
+ const data = (await response.json());
52
+ if (data.error) {
53
+ throw new Error(`Facebook token exchange failed: ${data.error.message || data.error}`);
54
+ }
55
+ return {
56
+ accessToken: data.access_token,
57
+ expiresIn: data.expires_in,
58
+ tokenType: data.token_type || 'Bearer',
59
+ };
60
+ }
61
+ async getUserProfile(tokens) {
62
+ const fields = 'id,name,email,first_name,last_name,picture.type(large)';
63
+ const response = await fetch(`${USERINFO_URL}?fields=${encodeURIComponent(fields)}&access_token=${encodeURIComponent(tokens.accessToken)}`);
64
+ if (!response.ok) {
65
+ throw new Error(`Facebook user info request failed: ${response.statusText}`);
66
+ }
67
+ const data = (await response.json());
68
+ if (data.error) {
69
+ throw new Error(`Facebook user info request failed: ${data.error.message || data.error}`);
70
+ }
71
+ // Extract profile picture URL
72
+ const avatar = data.picture?.data?.url || undefined;
73
+ return {
74
+ id: data.id,
75
+ email: data.email || '',
76
+ emailVerified: !!data.email, // Facebook only returns email if verified
77
+ name: data.name || '',
78
+ firstName: data.first_name,
79
+ lastName: data.last_name,
80
+ avatar,
81
+ provider: 'facebook',
82
+ raw: data,
83
+ };
84
+ }
85
+ async refreshToken(_refreshToken) {
86
+ // Facebook uses long-lived tokens instead of refresh tokens
87
+ // To extend a token, exchange a short-lived token for a long-lived one
88
+ throw new Error('Facebook does not support standard refresh tokens. ' +
89
+ 'Use the long-lived token exchange endpoint instead: ' +
90
+ `${TOKEN_URL}?grant_type=fb_exchange_token&client_id=...&client_secret=...&fb_exchange_token=...`);
91
+ }
92
+ /**
93
+ * Exchange a short-lived token for a long-lived token (~60 days).
94
+ */
95
+ async exchangeForLongLived(shortLivedToken) {
96
+ const params = new URLSearchParams({
97
+ grant_type: 'fb_exchange_token',
98
+ client_id: this.config.clientId,
99
+ client_secret: this.config.clientSecret,
100
+ fb_exchange_token: shortLivedToken,
101
+ });
102
+ const response = await fetch(`${TOKEN_URL}?${params.toString()}`);
103
+ if (!response.ok) {
104
+ const error = await response.text();
105
+ throw new Error(`Facebook long-lived token exchange failed: ${error}`);
106
+ }
107
+ const data = (await response.json());
108
+ return {
109
+ accessToken: data.access_token,
110
+ expiresIn: data.expires_in,
111
+ tokenType: data.token_type || 'Bearer',
112
+ };
113
+ }
114
+ async revokeToken(token) {
115
+ // Facebook uses a DELETE request to revoke permissions
116
+ const response = await fetch(`https://graph.facebook.com/${GRAPH_VERSION}/me/permissions?access_token=${encodeURIComponent(token)}`, { method: 'DELETE' });
117
+ if (!response.ok) {
118
+ const error = await response.text();
119
+ throw new Error(`Facebook token revocation failed: ${error}`);
120
+ }
121
+ }
122
+ }
123
+ exports.FacebookProvider = FacebookProvider;
124
+ //# sourceMappingURL=facebook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facebook.js","sourceRoot":"","sources":["../../../../src/auth/oauth/providers/facebook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * GitHub OAuth Provider.
3
+ *
4
+ * Endpoints:
5
+ * Auth: https://github.com/login/oauth/authorize
6
+ * Token: https://github.com/login/oauth/access_token
7
+ * UserInfo: https://api.github.com/user
8
+ * Emails: https://api.github.com/user/emails
9
+ *
10
+ * Default scopes: user:email, read:user
11
+ *
12
+ * Note: GitHub does not support PKCE or refresh tokens in the standard OAuth flow.
13
+ */
14
+ import type { OAuthProviderAdapter, OAuthProviderConfig, OAuthTokens, OAuthUserProfile } from '../types';
15
+ export declare class GithubProvider implements OAuthProviderAdapter {
16
+ readonly name: "github";
17
+ private config;
18
+ constructor(config: OAuthProviderConfig);
19
+ getAuthorizationUrl(state: string, _codeVerifier?: string): string;
20
+ exchangeCode(code: string, _codeVerifier?: string): Promise<OAuthTokens>;
21
+ getUserProfile(tokens: OAuthTokens): Promise<OAuthUserProfile>;
22
+ refreshToken(_refreshToken: string): Promise<OAuthTokens>;
23
+ revokeToken(token: string): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../../src/auth/oauth/providers/github.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EACjB,MAAM,UAAU,CAAA;AASjB,qBAAa,cAAe,YAAW,oBAAoB;IACzD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAS;IAEjC,OAAO,CAAC,MAAM,CAAqB;gBAEvB,MAAM,EAAE,mBAAmB;IAIvC,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM;IAY5D,YAAY,CAChB,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,WAAW,CAAC;IAmCjB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoD9D,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAOzD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAuBhD"}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ /**
3
+ * GitHub OAuth Provider.
4
+ *
5
+ * Endpoints:
6
+ * Auth: https://github.com/login/oauth/authorize
7
+ * Token: https://github.com/login/oauth/access_token
8
+ * UserInfo: https://api.github.com/user
9
+ * Emails: https://api.github.com/user/emails
10
+ *
11
+ * Default scopes: user:email, read:user
12
+ *
13
+ * Note: GitHub does not support PKCE or refresh tokens in the standard OAuth flow.
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.GithubProvider = void 0;
17
+ const AUTH_URL = 'https://github.com/login/oauth/authorize';
18
+ const TOKEN_URL = 'https://github.com/login/oauth/access_token';
19
+ const USERINFO_URL = 'https://api.github.com/user';
20
+ const EMAILS_URL = 'https://api.github.com/user/emails';
21
+ const DEFAULT_SCOPES = ['user:email', 'read:user'];
22
+ class GithubProvider {
23
+ constructor(config) {
24
+ this.name = 'github';
25
+ this.config = config;
26
+ }
27
+ getAuthorizationUrl(state, _codeVerifier) {
28
+ const scopes = this.config.scopes || DEFAULT_SCOPES;
29
+ const params = new URLSearchParams({
30
+ client_id: this.config.clientId,
31
+ redirect_uri: this.config.redirectUri,
32
+ scope: scopes.join(' '),
33
+ state,
34
+ });
35
+ return `${AUTH_URL}?${params.toString()}`;
36
+ }
37
+ async exchangeCode(code, _codeVerifier) {
38
+ const response = await fetch(TOKEN_URL, {
39
+ method: 'POST',
40
+ headers: {
41
+ 'Content-Type': 'application/json',
42
+ Accept: 'application/json',
43
+ },
44
+ body: JSON.stringify({
45
+ client_id: this.config.clientId,
46
+ client_secret: this.config.clientSecret,
47
+ code,
48
+ redirect_uri: this.config.redirectUri,
49
+ }),
50
+ });
51
+ if (!response.ok) {
52
+ const error = await response.text();
53
+ throw new Error(`GitHub token exchange failed: ${error}`);
54
+ }
55
+ const data = (await response.json());
56
+ if (data.error) {
57
+ throw new Error(`GitHub token exchange failed: ${data.error_description || data.error}`);
58
+ }
59
+ return {
60
+ accessToken: data.access_token,
61
+ tokenType: data.token_type || 'Bearer',
62
+ scope: data.scope,
63
+ };
64
+ }
65
+ async getUserProfile(tokens) {
66
+ const headers = {
67
+ Authorization: `Bearer ${tokens.accessToken}`,
68
+ Accept: 'application/json',
69
+ };
70
+ // Fetch user info
71
+ const userResponse = await fetch(USERINFO_URL, { headers });
72
+ if (!userResponse.ok) {
73
+ throw new Error(`GitHub user info request failed: ${userResponse.statusText}`);
74
+ }
75
+ const userData = (await userResponse.json());
76
+ // Fetch emails (since the user endpoint might not include email)
77
+ let email = userData.email || '';
78
+ let emailVerified = false;
79
+ if (!email || tokens.scope?.includes('user:email')) {
80
+ try {
81
+ const emailsResponse = await fetch(EMAILS_URL, { headers });
82
+ if (emailsResponse.ok) {
83
+ const emails = (await emailsResponse.json());
84
+ const primaryEmail = emails.find((e) => e.primary) || emails[0];
85
+ if (primaryEmail) {
86
+ email = primaryEmail.email;
87
+ emailVerified = primaryEmail.verified ?? false;
88
+ }
89
+ }
90
+ }
91
+ catch {
92
+ // Non-critical: proceed with whatever email we have
93
+ }
94
+ }
95
+ // Parse name
96
+ const fullName = userData.name || userData.login || '';
97
+ const nameParts = fullName.split(' ');
98
+ return {
99
+ id: String(userData.id),
100
+ email,
101
+ emailVerified,
102
+ name: fullName,
103
+ firstName: nameParts[0] || undefined,
104
+ lastName: nameParts.length > 1 ? nameParts.slice(1).join(' ') : undefined,
105
+ avatar: userData.avatar_url,
106
+ provider: 'github',
107
+ raw: userData,
108
+ };
109
+ }
110
+ async refreshToken(_refreshToken) {
111
+ throw new Error('GitHub OAuth does not support refresh tokens in the standard flow. ' +
112
+ 'The user must re-authenticate.');
113
+ }
114
+ async revokeToken(token) {
115
+ // GitHub uses the application API to revoke tokens
116
+ const response = await fetch(`https://api.github.com/applications/${this.config.clientId}/token`, {
117
+ method: 'DELETE',
118
+ headers: {
119
+ Authorization: 'Basic ' +
120
+ Buffer.from(`${this.config.clientId}:${this.config.clientSecret}`).toString('base64'),
121
+ Accept: 'application/vnd.github+json',
122
+ },
123
+ body: JSON.stringify({ access_token: token }),
124
+ });
125
+ if (!response.ok && response.status !== 404) {
126
+ const error = await response.text();
127
+ throw new Error(`GitHub token revocation failed: ${error}`);
128
+ }
129
+ }
130
+ }
131
+ exports.GithubProvider = GithubProvider;
132
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../../../src/auth/oauth/providers/github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Google OAuth 2.0 + OpenID Connect Provider.
3
+ *
4
+ * Endpoints:
5
+ * Auth: https://accounts.google.com/o/oauth2/v2/auth
6
+ * Token: https://oauth2.googleapis.com/token
7
+ * UserInfo: https://www.googleapis.com/oauth2/v3/userinfo
8
+ * Revoke: https://oauth2.googleapis.com/revoke
9
+ *
10
+ * Default scopes: openid, email, profile
11
+ */
12
+ import type { OAuthProviderAdapter, OAuthProviderConfig, OAuthTokens, OAuthUserProfile } from '../types';
13
+ export declare class GoogleProvider implements OAuthProviderAdapter {
14
+ readonly name: "google";
15
+ private config;
16
+ constructor(config: OAuthProviderConfig);
17
+ getAuthorizationUrl(state: string, codeVerifier?: string): string;
18
+ exchangeCode(code: string, codeVerifier?: string): Promise<OAuthTokens>;
19
+ getUserProfile(tokens: OAuthTokens): Promise<OAuthUserProfile>;
20
+ refreshToken(refreshToken: string): Promise<OAuthTokens>;
21
+ revokeToken(token: string): Promise<void>;
22
+ }
23
+ //# sourceMappingURL=google.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../../../src/auth/oauth/providers/google.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EACjB,MAAM,UAAU,CAAA;AASjB,qBAAa,cAAe,YAAW,oBAAoB;IACzD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAS;IAEjC,OAAO,CAAC,MAAM,CAAqB;gBAEvB,MAAM,EAAE,mBAAmB;IAIvC,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM;IAuB3D,YAAY,CAChB,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,CAAC;IAoCjB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA0B9D,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA6BxD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAchD"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ /**
3
+ * Google OAuth 2.0 + OpenID Connect Provider.
4
+ *
5
+ * Endpoints:
6
+ * Auth: https://accounts.google.com/o/oauth2/v2/auth
7
+ * Token: https://oauth2.googleapis.com/token
8
+ * UserInfo: https://www.googleapis.com/oauth2/v3/userinfo
9
+ * Revoke: https://oauth2.googleapis.com/revoke
10
+ *
11
+ * Default scopes: openid, email, profile
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.GoogleProvider = void 0;
15
+ const node_crypto_1 = require("node:crypto");
16
+ const AUTH_URL = 'https://accounts.google.com/o/oauth2/v2/auth';
17
+ const TOKEN_URL = 'https://oauth2.googleapis.com/token';
18
+ const USERINFO_URL = 'https://www.googleapis.com/oauth2/v3/userinfo';
19
+ const REVOKE_URL = 'https://oauth2.googleapis.com/revoke';
20
+ const DEFAULT_SCOPES = ['openid', 'email', 'profile'];
21
+ class GoogleProvider {
22
+ constructor(config) {
23
+ this.name = 'google';
24
+ this.config = config;
25
+ }
26
+ getAuthorizationUrl(state, codeVerifier) {
27
+ const scopes = this.config.scopes || DEFAULT_SCOPES;
28
+ const params = new URLSearchParams({
29
+ client_id: this.config.clientId,
30
+ redirect_uri: this.config.redirectUri,
31
+ response_type: 'code',
32
+ scope: scopes.join(' '),
33
+ state,
34
+ access_type: 'offline', // Request refresh token
35
+ prompt: 'consent',
36
+ });
37
+ if (codeVerifier) {
38
+ const challenge = (0, node_crypto_1.createHash)('sha256')
39
+ .update(codeVerifier)
40
+ .digest('base64url');
41
+ params.set('code_challenge', challenge);
42
+ params.set('code_challenge_method', 'S256');
43
+ }
44
+ return `${AUTH_URL}?${params.toString()}`;
45
+ }
46
+ async exchangeCode(code, codeVerifier) {
47
+ const body = {
48
+ client_id: this.config.clientId,
49
+ client_secret: this.config.clientSecret,
50
+ code,
51
+ grant_type: 'authorization_code',
52
+ redirect_uri: this.config.redirectUri,
53
+ };
54
+ if (codeVerifier) {
55
+ body.code_verifier = codeVerifier;
56
+ }
57
+ const response = await fetch(TOKEN_URL, {
58
+ method: 'POST',
59
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
60
+ body: new URLSearchParams(body),
61
+ });
62
+ if (!response.ok) {
63
+ const error = await response.text();
64
+ throw new Error(`Google token exchange failed: ${error}`);
65
+ }
66
+ const data = (await response.json());
67
+ return {
68
+ accessToken: data.access_token,
69
+ refreshToken: data.refresh_token,
70
+ expiresIn: data.expires_in,
71
+ tokenType: data.token_type || 'Bearer',
72
+ idToken: data.id_token,
73
+ scope: data.scope,
74
+ };
75
+ }
76
+ async getUserProfile(tokens) {
77
+ const response = await fetch(USERINFO_URL, {
78
+ headers: { Authorization: `Bearer ${tokens.accessToken}` },
79
+ });
80
+ if (!response.ok) {
81
+ throw new Error(`Google user info request failed: ${response.statusText}`);
82
+ }
83
+ const data = (await response.json());
84
+ return {
85
+ id: data.sub,
86
+ email: data.email,
87
+ emailVerified: data.email_verified ?? false,
88
+ name: data.name ||
89
+ `${data.given_name || ''} ${data.family_name || ''}`.trim(),
90
+ firstName: data.given_name,
91
+ lastName: data.family_name,
92
+ avatar: data.picture,
93
+ provider: 'google',
94
+ raw: data,
95
+ };
96
+ }
97
+ async refreshToken(refreshToken) {
98
+ const response = await fetch(TOKEN_URL, {
99
+ method: 'POST',
100
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
101
+ body: new URLSearchParams({
102
+ client_id: this.config.clientId,
103
+ client_secret: this.config.clientSecret,
104
+ refresh_token: refreshToken,
105
+ grant_type: 'refresh_token',
106
+ }),
107
+ });
108
+ if (!response.ok) {
109
+ const error = await response.text();
110
+ throw new Error(`Google token refresh failed: ${error}`);
111
+ }
112
+ const data = (await response.json());
113
+ return {
114
+ accessToken: data.access_token,
115
+ refreshToken: data.refresh_token || refreshToken,
116
+ expiresIn: data.expires_in,
117
+ tokenType: data.token_type || 'Bearer',
118
+ idToken: data.id_token,
119
+ scope: data.scope,
120
+ };
121
+ }
122
+ async revokeToken(token) {
123
+ const response = await fetch(`${REVOKE_URL}?token=${encodeURIComponent(token)}`, {
124
+ method: 'POST',
125
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
126
+ });
127
+ if (!response.ok) {
128
+ const error = await response.text();
129
+ throw new Error(`Google token revocation failed: ${error}`);
130
+ }
131
+ }
132
+ }
133
+ exports.GoogleProvider = GoogleProvider;
134
+ //# sourceMappingURL=google.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.js","sourceRoot":"","sources":["../../../../src/auth/oauth/providers/google.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Microsoft Entra ID (Azure AD) OAuth Provider.
3
+ *
4
+ * Endpoints:
5
+ * Auth: https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize
6
+ * Token: https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token
7
+ * UserInfo: https://graph.microsoft.com/v1.0/me
8
+ *
9
+ * Supports multi-tenant ('common'), organizations-only ('organizations'),
10
+ * or a specific tenant ID.
11
+ *
12
+ * Default scopes: openid, email, profile, User.Read
13
+ */
14
+ import type { OAuthProviderAdapter, OAuthProviderConfig, OAuthTokens, OAuthUserProfile } from '../types';
15
+ export declare class MicrosoftProvider implements OAuthProviderAdapter {
16
+ readonly name: "microsoft";
17
+ private config;
18
+ private tenant;
19
+ constructor(config: OAuthProviderConfig);
20
+ private get authUrl();
21
+ private get tokenUrl();
22
+ getAuthorizationUrl(state: string, codeVerifier?: string): string;
23
+ exchangeCode(code: string, codeVerifier?: string): Promise<OAuthTokens>;
24
+ getUserProfile(tokens: OAuthTokens): Promise<OAuthUserProfile>;
25
+ refreshToken(refreshToken: string): Promise<OAuthTokens>;
26
+ revokeToken(_token: string): Promise<void>;
27
+ }
28
+ //# sourceMappingURL=microsoft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"microsoft.d.ts","sourceRoot":"","sources":["../../../../src/auth/oauth/providers/microsoft.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EACjB,MAAM,UAAU,CAAA;AAKjB,qBAAa,iBAAkB,YAAW,oBAAoB;IAC5D,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAS;IAEpC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,MAAM,CAAQ;gBAEV,MAAM,EAAE,mBAAmB;IAKvC,OAAO,KAAK,OAAO,GAElB;IAED,OAAO,KAAK,QAAQ,GAEnB;IAED,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM;IAsB3D,YAAY,CAChB,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,CAAC;IAoCjB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA0B9D,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA6BxD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAUjD"}
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ /**
3
+ * Microsoft Entra ID (Azure AD) OAuth Provider.
4
+ *
5
+ * Endpoints:
6
+ * Auth: https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize
7
+ * Token: https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token
8
+ * UserInfo: https://graph.microsoft.com/v1.0/me
9
+ *
10
+ * Supports multi-tenant ('common'), organizations-only ('organizations'),
11
+ * or a specific tenant ID.
12
+ *
13
+ * Default scopes: openid, email, profile, User.Read
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.MicrosoftProvider = void 0;
17
+ const node_crypto_1 = require("node:crypto");
18
+ const USERINFO_URL = 'https://graph.microsoft.com/v1.0/me';
19
+ const DEFAULT_SCOPES = ['openid', 'email', 'profile', 'User.Read'];
20
+ class MicrosoftProvider {
21
+ constructor(config) {
22
+ this.name = 'microsoft';
23
+ this.config = config;
24
+ this.tenant = config.tenant || 'common';
25
+ }
26
+ get authUrl() {
27
+ return `https://login.microsoftonline.com/${this.tenant}/oauth2/v2.0/authorize`;
28
+ }
29
+ get tokenUrl() {
30
+ return `https://login.microsoftonline.com/${this.tenant}/oauth2/v2.0/token`;
31
+ }
32
+ getAuthorizationUrl(state, codeVerifier) {
33
+ const scopes = this.config.scopes || DEFAULT_SCOPES;
34
+ const params = new URLSearchParams({
35
+ client_id: this.config.clientId,
36
+ redirect_uri: this.config.redirectUri,
37
+ response_type: 'code',
38
+ scope: scopes.join(' '),
39
+ state,
40
+ response_mode: 'query',
41
+ });
42
+ if (codeVerifier) {
43
+ const challenge = (0, node_crypto_1.createHash)('sha256')
44
+ .update(codeVerifier)
45
+ .digest('base64url');
46
+ params.set('code_challenge', challenge);
47
+ params.set('code_challenge_method', 'S256');
48
+ }
49
+ return `${this.authUrl}?${params.toString()}`;
50
+ }
51
+ async exchangeCode(code, codeVerifier) {
52
+ const body = {
53
+ client_id: this.config.clientId,
54
+ client_secret: this.config.clientSecret,
55
+ code,
56
+ grant_type: 'authorization_code',
57
+ redirect_uri: this.config.redirectUri,
58
+ };
59
+ if (codeVerifier) {
60
+ body.code_verifier = codeVerifier;
61
+ }
62
+ const response = await fetch(this.tokenUrl, {
63
+ method: 'POST',
64
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
65
+ body: new URLSearchParams(body),
66
+ });
67
+ if (!response.ok) {
68
+ const error = await response.text();
69
+ throw new Error(`Microsoft token exchange failed: ${error}`);
70
+ }
71
+ const data = (await response.json());
72
+ return {
73
+ accessToken: data.access_token,
74
+ refreshToken: data.refresh_token,
75
+ expiresIn: data.expires_in,
76
+ tokenType: data.token_type || 'Bearer',
77
+ idToken: data.id_token,
78
+ scope: data.scope,
79
+ };
80
+ }
81
+ async getUserProfile(tokens) {
82
+ const response = await fetch(USERINFO_URL, {
83
+ headers: { Authorization: `Bearer ${tokens.accessToken}` },
84
+ });
85
+ if (!response.ok) {
86
+ throw new Error(`Microsoft user info request failed: ${response.statusText}`);
87
+ }
88
+ const data = (await response.json());
89
+ return {
90
+ id: data.id,
91
+ email: data.mail || data.userPrincipalName || '',
92
+ emailVerified: true, // Microsoft verifies emails by default
93
+ name: data.displayName || '',
94
+ firstName: data.givenName,
95
+ lastName: data.surname,
96
+ avatar: undefined, // Graph API requires a separate photo request
97
+ provider: 'microsoft',
98
+ raw: data,
99
+ };
100
+ }
101
+ async refreshToken(refreshToken) {
102
+ const response = await fetch(this.tokenUrl, {
103
+ method: 'POST',
104
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
105
+ body: new URLSearchParams({
106
+ client_id: this.config.clientId,
107
+ client_secret: this.config.clientSecret,
108
+ refresh_token: refreshToken,
109
+ grant_type: 'refresh_token',
110
+ }),
111
+ });
112
+ if (!response.ok) {
113
+ const error = await response.text();
114
+ throw new Error(`Microsoft token refresh failed: ${error}`);
115
+ }
116
+ const data = (await response.json());
117
+ return {
118
+ accessToken: data.access_token,
119
+ refreshToken: data.refresh_token || refreshToken,
120
+ expiresIn: data.expires_in,
121
+ tokenType: data.token_type || 'Bearer',
122
+ idToken: data.id_token,
123
+ scope: data.scope,
124
+ };
125
+ }
126
+ async revokeToken(_token) {
127
+ // Microsoft's v2.0 endpoint does not have a standard revocation endpoint.
128
+ // Token revocation is handled via the admin portal or by signing the user out.
129
+ // The logout URL can be used instead:
130
+ // https://login.microsoftonline.com/{tenant}/oauth2/v2.0/logout
131
+ throw new Error('Microsoft does not provide a standard token revocation endpoint. ' +
132
+ 'Use the logout endpoint or revoke via the Azure admin portal.');
133
+ }
134
+ }
135
+ exports.MicrosoftProvider = MicrosoftProvider;
136
+ //# sourceMappingURL=microsoft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"microsoft.js","sourceRoot":"","sources":["../../../../src/auth/oauth/providers/microsoft.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;AAEH,6CAAwC;AAQxC,MAAM,YAAY,GAAG,qCAAqC,CAAA;AAC1D,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,CAAA;AAElE,MAAa,iBAAiB;IAM5B,YAAY,MAA2B;QAL9B,SAAI,GAAG,WAAoB,CAAA;QAMlC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAA;IACzC,CAAC;IAED,IAAY,OAAO;QACjB,OAAO,qCAAqC,IAAI,CAAC,MAAM,wBAAwB,CAAA;IACjF,CAAC;IAED,IAAY,QAAQ;QAClB,OAAO,qCAAqC,IAAI,CAAC,MAAM,oBAAoB,CAAA;IAC7E,CAAC;IAED,mBAAmB,CAAC,KAAa,EAAE,YAAqB;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,cAAc,CAAA;QACnD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC/B,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACrC,aAAa,EAAE,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YACvB,KAAK;YACL,aAAa,EAAE,OAAO;SACvB,CAAC,CAAA;QAEF,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,IAAA,wBAAU,EAAC,QAAQ,CAAC;iBACnC,MAAM,CAAC,YAAY,CAAC;iBACpB,MAAM,CAAC,WAAW,CAAC,CAAA;YACtB,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAA;YACvC,MAAM,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAA;QAC7C,CAAC;QAED,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAA;IAC/C,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,IAAY,EACZ,YAAqB;QAErB,MAAM,IAAI,GAA2B;YACnC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC/B,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;YACvC,IAAI;YACJ,UAAU,EAAE,oBAAoB;YAChC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;SACtC,CAAA;QAED,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,aAAa,GAAG,YAAY,CAAA;QACnC,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI,EAAE,IAAI,eAAe,CAAC,IAAI,CAAC;SAChC,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YACnC,MAAM,IAAI,KAAK,CAAC,oCAAoC,KAAK,EAAE,CAAC,CAAA;QAC9D,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAQ,CAAA;QAE3C,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,YAAY,EAAE,IAAI,CAAC,aAAa;YAChC,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,QAAQ;YACtC,OAAO,EAAE,IAAI,CAAC,QAAQ;YACtB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAA;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAmB;QACtC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE;YACzC,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,WAAW,EAAE,EAAE;SAC3D,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,uCAAuC,QAAQ,CAAC,UAAU,EAAE,CAC7D,CAAA;QACH,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAQ,CAAA;QAE3C,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,iBAAiB,IAAI,EAAE;YAChD,aAAa,EAAE,IAAI,EAAE,uCAAuC;YAC5D,IAAI,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;YAC5B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,OAAO;YACtB,MAAM,EAAE,SAAS,EAAE,8CAA8C;YACjE,QAAQ,EAAE,WAAW;YACrB,GAAG,EAAE,IAAI;SACV,CAAA;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,YAAoB;QACrC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI,EAAE,IAAI,eAAe,CAAC;gBACxB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC/B,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;gBACvC,aAAa,EAAE,YAAY;gBAC3B,UAAU,EAAE,eAAe;aAC5B,CAAC;SACH,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAA;QAC7D,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAQ,CAAA;QAE3C,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,YAAY,EAAE,IAAI,CAAC,aAAa,IAAI,YAAY;YAChD,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,QAAQ;YACtC,OAAO,EAAE,IAAI,CAAC,QAAQ;YACtB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAA;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAc;QAC9B,0EAA0E;QAC1E,+EAA+E;QAC/E,sCAAsC;QACtC,kEAAkE;QAClE,MAAM,IAAI,KAAK,CACb,mEAAmE;YACjE,+DAA+D,CAClE,CAAA;IACH,CAAC;CACF;AAjJD,8CAiJC"}