@rc-tool/unified-auth-hosted-service 0.2.9 → 0.3.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 (124) hide show
  1. package/README.md +109 -114
  2. package/dist/cli/config-file.d.ts +7 -0
  3. package/dist/cli/config-file.d.ts.map +1 -0
  4. package/dist/cli/config-file.js +77 -0
  5. package/dist/cli/config-file.js.map +1 -0
  6. package/dist/cli/config.d.ts +21 -0
  7. package/dist/cli/config.d.ts.map +1 -0
  8. package/dist/cli/config.js +174 -0
  9. package/dist/cli/config.js.map +1 -0
  10. package/dist/cli/database.d.ts +33 -0
  11. package/dist/cli/database.d.ts.map +1 -0
  12. package/dist/cli/database.js +346 -0
  13. package/dist/cli/database.js.map +1 -0
  14. package/dist/cli/index.d.ts +1 -1
  15. package/dist/cli/index.d.ts.map +1 -1
  16. package/dist/cli/index.js +44 -79
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/cli.js +1 -1
  19. package/dist/cli.js.map +1 -1
  20. package/dist/config.d.ts +32 -0
  21. package/dist/config.d.ts.map +1 -0
  22. package/dist/config.js +7 -0
  23. package/dist/config.js.map +1 -0
  24. package/dist/hosted-service/applications.d.ts +0 -6
  25. package/dist/hosted-service/applications.d.ts.map +1 -1
  26. package/dist/hosted-service/applications.js +50 -8
  27. package/dist/hosted-service/applications.js.map +1 -1
  28. package/dist/hosted-service/better-auth.d.ts +10 -0
  29. package/dist/hosted-service/better-auth.d.ts.map +1 -0
  30. package/dist/hosted-service/better-auth.js +213 -0
  31. package/dist/hosted-service/better-auth.js.map +1 -0
  32. package/dist/hosted-service/constants.d.ts +0 -4
  33. package/dist/hosted-service/constants.d.ts.map +1 -1
  34. package/dist/hosted-service/constants.js +0 -4
  35. package/dist/hosted-service/constants.js.map +1 -1
  36. package/dist/hosted-service/http.d.ts.map +1 -1
  37. package/dist/hosted-service/http.js +6 -8
  38. package/dist/hosted-service/http.js.map +1 -1
  39. package/dist/hosted-service/login-page/components.d.ts +0 -1
  40. package/dist/hosted-service/login-page/components.d.ts.map +1 -1
  41. package/dist/hosted-service/login-page/components.js +0 -6
  42. package/dist/hosted-service/login-page/components.js.map +1 -1
  43. package/dist/hosted-service/login-page/index.d.ts.map +1 -1
  44. package/dist/hosted-service/login-page/index.js +2 -18
  45. package/dist/hosted-service/login-page/index.js.map +1 -1
  46. package/dist/hosted-service/login-page/links.d.ts.map +1 -1
  47. package/dist/hosted-service/login-page/links.js +1 -12
  48. package/dist/hosted-service/login-page/links.js.map +1 -1
  49. package/dist/hosted-service/login-page/styles.d.ts +1 -1
  50. package/dist/hosted-service/login-page/styles.d.ts.map +1 -1
  51. package/dist/hosted-service/login-page/styles.js +0 -2
  52. package/dist/hosted-service/login-page/styles.js.map +1 -1
  53. package/dist/hosted-service/login-page/types.d.ts +2 -8
  54. package/dist/hosted-service/login-page/types.d.ts.map +1 -1
  55. package/dist/hosted-service/routes.d.ts.map +1 -1
  56. package/dist/hosted-service/routes.js +3 -12
  57. package/dist/hosted-service/routes.js.map +1 -1
  58. package/dist/hosted-service/service.d.ts +5 -8
  59. package/dist/hosted-service/service.d.ts.map +1 -1
  60. package/dist/hosted-service/service.js +56 -168
  61. package/dist/hosted-service/service.js.map +1 -1
  62. package/dist/hosted-service/types.d.ts +36 -46
  63. package/dist/hosted-service/types.d.ts.map +1 -1
  64. package/dist/index.d.ts +3 -4
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +1 -2
  67. package/dist/index.js.map +1 -1
  68. package/package.json +8 -4
  69. package/dist/cli/env.d.ts +0 -40
  70. package/dist/cli/env.d.ts.map +0 -1
  71. package/dist/cli/env.js +0 -353
  72. package/dist/cli/env.js.map +0 -1
  73. package/dist/hosted-service/cookies.d.ts +0 -17
  74. package/dist/hosted-service/cookies.d.ts.map +0 -1
  75. package/dist/hosted-service/cookies.js +0 -56
  76. package/dist/hosted-service/cookies.js.map +0 -1
  77. package/dist/hosted-service/crypto.d.ts +0 -3
  78. package/dist/hosted-service/crypto.d.ts.map +0 -1
  79. package/dist/hosted-service/crypto.js +0 -39
  80. package/dist/hosted-service/crypto.js.map +0 -1
  81. package/dist/hosted-service/oauth.d.ts +0 -11
  82. package/dist/hosted-service/oauth.d.ts.map +0 -1
  83. package/dist/hosted-service/oauth.js +0 -37
  84. package/dist/hosted-service/oauth.js.map +0 -1
  85. package/dist/hosted-service/providers/feishu.d.ts +0 -4
  86. package/dist/hosted-service/providers/feishu.d.ts.map +0 -1
  87. package/dist/hosted-service/providers/feishu.js +0 -72
  88. package/dist/hosted-service/providers/feishu.js.map +0 -1
  89. package/dist/hosted-service/providers/github.d.ts +0 -4
  90. package/dist/hosted-service/providers/github.d.ts.map +0 -1
  91. package/dist/hosted-service/providers/github.js +0 -73
  92. package/dist/hosted-service/providers/github.js.map +0 -1
  93. package/dist/hosted-service/providers/google.d.ts +0 -4
  94. package/dist/hosted-service/providers/google.d.ts.map +0 -1
  95. package/dist/hosted-service/providers/google.js +0 -54
  96. package/dist/hosted-service/providers/google.js.map +0 -1
  97. package/dist/hosted-service/session.d.ts +0 -11
  98. package/dist/hosted-service/session.d.ts.map +0 -1
  99. package/dist/hosted-service/session.js +0 -54
  100. package/dist/hosted-service/session.js.map +0 -1
  101. package/dist/hosted-service/store/file.d.ts +0 -6
  102. package/dist/hosted-service/store/file.d.ts.map +0 -1
  103. package/dist/hosted-service/store/file.js +0 -63
  104. package/dist/hosted-service/store/file.js.map +0 -1
  105. package/dist/hosted-service/store/index.d.ts +0 -6
  106. package/dist/hosted-service/store/index.d.ts.map +0 -1
  107. package/dist/hosted-service/store/index.js +0 -3
  108. package/dist/hosted-service/store/index.js.map +0 -1
  109. package/dist/hosted-service/store/memory.d.ts +0 -6
  110. package/dist/hosted-service/store/memory.d.ts.map +0 -1
  111. package/dist/hosted-service/store/memory.js +0 -19
  112. package/dist/hosted-service/store/memory.js.map +0 -1
  113. package/dist/hosted-service/store/state.d.ts +0 -9
  114. package/dist/hosted-service/store/state.d.ts.map +0 -1
  115. package/dist/hosted-service/store/state.js +0 -156
  116. package/dist/hosted-service/store/state.js.map +0 -1
  117. package/dist/hosted-service/store/types.d.ts +0 -56
  118. package/dist/hosted-service/store/types.d.ts.map +0 -1
  119. package/dist/hosted-service/store/types.js +0 -2
  120. package/dist/hosted-service/store/types.js.map +0 -1
  121. package/dist/hosted-service-cli.d.ts +0 -2
  122. package/dist/hosted-service-cli.d.ts.map +0 -1
  123. package/dist/hosted-service-cli.js +0 -85
  124. package/dist/hosted-service-cli.js.map +0 -1
@@ -0,0 +1,346 @@
1
+ import { Client } from "pg";
2
+ import { getAuthRealmSchemaName } from "@rc-tool/unified-auth-sdk/schema";
3
+ import { resolveUnifiedAuthConfigValue } from "../config.js";
4
+ const authTableSpecs = [
5
+ {
6
+ columns: [
7
+ column("id", "text", "text NOT NULL"),
8
+ column("name", "text", "text NOT NULL"),
9
+ column("email", "text", "text NOT NULL"),
10
+ column("emailVerified", "boolean", "boolean NOT NULL DEFAULT false"),
11
+ column("image", "text", "text", true),
12
+ column("createdAt", "timestamp with time zone", "timestamp with time zone NOT NULL DEFAULT now()"),
13
+ column("updatedAt", "timestamp with time zone", "timestamp with time zone NOT NULL DEFAULT now()"),
14
+ column("role", "text", "text", true),
15
+ column("banned", "boolean", "boolean DEFAULT false", true),
16
+ column("banReason", "text", "text", true),
17
+ column("banExpires", "timestamp with time zone", "timestamp with time zone", true),
18
+ column("feishuTenantKey", "text", "text", true),
19
+ column("feishuTenantName", "text", "text", true),
20
+ ],
21
+ constraints: [
22
+ primaryKey("user_pkey", "user", ["id"]),
23
+ ],
24
+ indexes: [
25
+ index("user_email_unique", (schemaName) => `CREATE UNIQUE INDEX IF NOT EXISTS "user_email_unique" ON ${tableName(schemaName, "user")} ("email")`),
26
+ ],
27
+ name: "user",
28
+ },
29
+ {
30
+ columns: [
31
+ column("id", "text", "text NOT NULL"),
32
+ column("expiresAt", "timestamp with time zone", "timestamp with time zone NOT NULL"),
33
+ column("token", "text", "text NOT NULL"),
34
+ column("createdAt", "timestamp with time zone", "timestamp with time zone NOT NULL DEFAULT now()"),
35
+ column("updatedAt", "timestamp with time zone", "timestamp with time zone NOT NULL DEFAULT now()"),
36
+ column("ipAddress", "text", "text", true),
37
+ column("userAgent", "text", "text", true),
38
+ column("userId", "text", "text NOT NULL"),
39
+ column("impersonatedBy", "text", "text", true),
40
+ ],
41
+ constraints: [
42
+ primaryKey("session_pkey", "session", ["id"]),
43
+ foreignKey("session_userId_user_id_fk", "session", "userId", "user", "id"),
44
+ ],
45
+ indexes: [
46
+ index("session_token_unique", (schemaName) => `CREATE UNIQUE INDEX IF NOT EXISTS "session_token_unique" ON ${tableName(schemaName, "session")} ("token")`),
47
+ index("session_user_id_idx", (schemaName) => `CREATE INDEX IF NOT EXISTS "session_user_id_idx" ON ${tableName(schemaName, "session")} ("userId")`),
48
+ ],
49
+ name: "session",
50
+ },
51
+ {
52
+ columns: [
53
+ column("id", "text", "text NOT NULL"),
54
+ column("accountId", "text", "text NOT NULL"),
55
+ column("providerId", "text", "text NOT NULL"),
56
+ column("userId", "text", "text NOT NULL"),
57
+ column("accessToken", "text", "text", true),
58
+ column("refreshToken", "text", "text", true),
59
+ column("idToken", "text", "text", true),
60
+ column("accessTokenExpiresAt", "timestamp with time zone", "timestamp with time zone", true),
61
+ column("refreshTokenExpiresAt", "timestamp with time zone", "timestamp with time zone", true),
62
+ column("scope", "text", "text", true),
63
+ column("password", "text", "text", true),
64
+ column("createdAt", "timestamp with time zone", "timestamp with time zone NOT NULL DEFAULT now()"),
65
+ column("updatedAt", "timestamp with time zone", "timestamp with time zone NOT NULL DEFAULT now()"),
66
+ ],
67
+ constraints: [
68
+ primaryKey("account_pkey", "account", ["id"]),
69
+ foreignKey("account_userId_user_id_fk", "account", "userId", "user", "id"),
70
+ ],
71
+ indexes: [
72
+ index("account_provider_account_unique", (schemaName) => `CREATE UNIQUE INDEX IF NOT EXISTS "account_provider_account_unique" ON ${tableName(schemaName, "account")} ("providerId", "accountId")`),
73
+ index("account_user_id_idx", (schemaName) => `CREATE INDEX IF NOT EXISTS "account_user_id_idx" ON ${tableName(schemaName, "account")} ("userId")`),
74
+ ],
75
+ name: "account",
76
+ },
77
+ {
78
+ columns: [
79
+ column("id", "text", "text NOT NULL"),
80
+ column("identifier", "text", "text NOT NULL"),
81
+ column("value", "text", "text NOT NULL"),
82
+ column("expiresAt", "timestamp with time zone", "timestamp with time zone NOT NULL"),
83
+ column("createdAt", "timestamp with time zone", "timestamp with time zone NOT NULL DEFAULT now()"),
84
+ column("updatedAt", "timestamp with time zone", "timestamp with time zone NOT NULL DEFAULT now()"),
85
+ ],
86
+ constraints: [
87
+ primaryKey("verification_pkey", "verification", ["id"]),
88
+ ],
89
+ indexes: [
90
+ index("verification_identifier_idx", (schemaName) => `CREATE INDEX IF NOT EXISTS "verification_identifier_idx" ON ${tableName(schemaName, "verification")} ("identifier")`),
91
+ ],
92
+ name: "verification",
93
+ },
94
+ ];
95
+ export async function migrateUnifiedAuthDatabase(config) {
96
+ const schemaName = resolveAuthSchemaName(config);
97
+ const client = createPgClient(config);
98
+ await client.connect();
99
+ try {
100
+ const inspection = await inspectAuthDatabase(client, schemaName);
101
+ const plan = buildAuthDatabasePlan(schemaName, inspection);
102
+ if (plan.warnings.length) {
103
+ throw new Error(`Auth database has incompatible existing structure:\n${plan.warnings.join("\n")}`);
104
+ }
105
+ for (const action of plan.actions) {
106
+ await client.query(action.sql);
107
+ }
108
+ return {
109
+ ...plan,
110
+ changed: plan.actions.length > 0,
111
+ };
112
+ }
113
+ finally {
114
+ await client.end();
115
+ }
116
+ }
117
+ export async function doctorUnifiedAuthDatabase(config) {
118
+ const checks = [];
119
+ const schemaName = resolveAuthSchemaName(config);
120
+ let client;
121
+ try {
122
+ client = createPgClient(config);
123
+ }
124
+ catch (error) {
125
+ return [fail(error instanceof Error ? error.message : "database config is invalid")];
126
+ }
127
+ try {
128
+ await client.connect();
129
+ checks.push(pass("database connection is usable"));
130
+ const inspection = await inspectAuthDatabase(client, schemaName);
131
+ const plan = buildAuthDatabasePlan(schemaName, inspection);
132
+ if (inspection.schemaExists) {
133
+ checks.push(pass(`auth schema ${schemaName} exists`));
134
+ }
135
+ else {
136
+ checks.push(fail(`auth schema ${schemaName} is missing; run unified-auth db migrate`));
137
+ }
138
+ for (const spec of authTableSpecs) {
139
+ const table = inspection.tables.get(spec.name);
140
+ if (table?.exists) {
141
+ checks.push(pass(`table ${schemaName}.${spec.name} exists`));
142
+ }
143
+ else {
144
+ checks.push(fail(`table ${schemaName}.${spec.name} is missing; run unified-auth db migrate`));
145
+ }
146
+ }
147
+ for (const warning of plan.warnings) {
148
+ checks.push(fail(warning));
149
+ }
150
+ if (plan.actions.length === 0 && plan.warnings.length === 0) {
151
+ checks.push(pass("auth database schema is up to date"));
152
+ }
153
+ else if (plan.actions.length > 0) {
154
+ checks.push(fail(`auth database schema has ${plan.actions.length} pending migration action(s)`));
155
+ for (const action of plan.actions) {
156
+ checks.push(warn(`pending migration: ${action.label}`));
157
+ }
158
+ }
159
+ }
160
+ catch (error) {
161
+ checks.push(fail(error instanceof Error ? error.message : "database check failed"));
162
+ }
163
+ finally {
164
+ await client.end().catch(() => undefined);
165
+ }
166
+ return checks;
167
+ }
168
+ export function buildAuthDatabasePlan(schemaName, inspection) {
169
+ const actions = [];
170
+ const warnings = [];
171
+ if (!inspection.schemaExists) {
172
+ actions.push({
173
+ label: `create schema ${schemaName}`,
174
+ sql: `CREATE SCHEMA IF NOT EXISTS ${quoteIdent(schemaName)}`,
175
+ });
176
+ }
177
+ for (const spec of authTableSpecs) {
178
+ const inspected = inspection.tables.get(spec.name);
179
+ if (!inspected?.exists) {
180
+ actions.push({
181
+ label: `create table ${schemaName}.${spec.name}`,
182
+ sql: createTableSQL(schemaName, spec),
183
+ });
184
+ for (const constraint of spec.constraints?.filter((item) => item.type !== "p") ?? []) {
185
+ actions.push({
186
+ label: `add constraint ${schemaName}.${constraint.name}`,
187
+ sql: constraint.sql(schemaName),
188
+ });
189
+ }
190
+ addIndexes(actions, schemaName, spec, new Set());
191
+ continue;
192
+ }
193
+ for (const expected of spec.columns) {
194
+ const actual = inspected.columns.get(expected.name);
195
+ if (!actual) {
196
+ actions.push({
197
+ label: `add column ${schemaName}.${spec.name}.${expected.name}`,
198
+ sql: `ALTER TABLE ${tableName(schemaName, spec.name)} ADD COLUMN IF NOT EXISTS ${quoteIdent(expected.name)} ${expected.definition}`,
199
+ });
200
+ continue;
201
+ }
202
+ if (!isTypeCompatible(actual.dataType, expected.dataType)) {
203
+ warnings.push(`column ${schemaName}.${spec.name}.${expected.name} has type ${actual.dataType}, expected ${expected.dataType}`);
204
+ }
205
+ if (actual.isNullable !== expected.nullable) {
206
+ warnings.push(`column ${schemaName}.${spec.name}.${expected.name} nullability is ${actual.isNullable ? "nullable" : "not nullable"}, expected ${expected.nullable ? "nullable" : "not nullable"}`);
207
+ }
208
+ }
209
+ for (const constraint of spec.constraints ?? []) {
210
+ if (!inspected.constraints.has(constraint.name)) {
211
+ actions.push({
212
+ label: `add constraint ${schemaName}.${constraint.name}`,
213
+ sql: constraint.sql(schemaName),
214
+ });
215
+ }
216
+ }
217
+ addIndexes(actions, schemaName, spec, inspected.indexes);
218
+ }
219
+ return {
220
+ actions,
221
+ schemaName,
222
+ warnings,
223
+ };
224
+ }
225
+ async function inspectAuthDatabase(client, schemaName) {
226
+ const schemaResult = await client.query("select exists(select 1 from information_schema.schemata where schema_name = $1) as exists", [schemaName]);
227
+ const tableRows = await client.query("select table_name from information_schema.tables where table_schema = $1 and table_type = 'BASE TABLE'", [schemaName]);
228
+ const tables = new Map();
229
+ for (const spec of authTableSpecs) {
230
+ tables.set(spec.name, {
231
+ columns: new Map(),
232
+ constraints: new Set(),
233
+ exists: tableRows.rows.some((row) => row.table_name === spec.name),
234
+ indexes: new Set(),
235
+ });
236
+ }
237
+ const columnRows = await client.query(`select table_name, column_name, data_type, is_nullable
238
+ from information_schema.columns
239
+ where table_schema = $1`, [schemaName]);
240
+ for (const row of columnRows.rows) {
241
+ const table = tables.get(row.table_name);
242
+ if (table) {
243
+ table.columns.set(row.column_name, {
244
+ dataType: row.data_type,
245
+ isNullable: row.is_nullable === "YES",
246
+ });
247
+ }
248
+ }
249
+ const indexRows = await client.query("select tablename, indexname from pg_indexes where schemaname = $1", [schemaName]);
250
+ for (const row of indexRows.rows) {
251
+ tables.get(row.tablename)?.indexes.add(row.indexname);
252
+ }
253
+ const constraintRows = await client.query(`select c.conname, t.relname
254
+ from pg_constraint c
255
+ join pg_class t on t.oid = c.conrelid
256
+ join pg_namespace n on n.oid = t.relnamespace
257
+ where n.nspname = $1`, [schemaName]);
258
+ for (const row of constraintRows.rows) {
259
+ tables.get(row.relname)?.constraints.add(row.conname);
260
+ }
261
+ return {
262
+ schemaExists: Boolean(schemaResult.rows[0]?.exists),
263
+ tables,
264
+ };
265
+ }
266
+ function createPgClient(config) {
267
+ const connectionString = resolveUnifiedAuthConfigValue(config.database?.url);
268
+ if (!connectionString) {
269
+ throw new Error("database.url is missing in unified-auth.config.ts");
270
+ }
271
+ return new Client({
272
+ connectionString,
273
+ ssl: config.database?.ssl,
274
+ });
275
+ }
276
+ function resolveAuthSchemaName(config) {
277
+ return getAuthRealmSchemaName(config.realm ?? config.app?.id);
278
+ }
279
+ function addIndexes(actions, schemaName, spec, existing) {
280
+ for (const item of spec.indexes ?? []) {
281
+ if (!existing.has(item.name)) {
282
+ actions.push({
283
+ label: `create index ${schemaName}.${item.name}`,
284
+ sql: item.sql(schemaName),
285
+ });
286
+ }
287
+ }
288
+ }
289
+ function createTableSQL(schemaName, spec) {
290
+ const lines = spec.columns.map((item) => `${quoteIdent(item.name)} ${item.definition}`);
291
+ const primary = spec.constraints?.find((constraint) => constraint.type === "p");
292
+ if (primary) {
293
+ lines.push(primary.sql(schemaName).replace(/^ALTER TABLE .+ ADD CONSTRAINT /, "CONSTRAINT "));
294
+ }
295
+ return `CREATE TABLE IF NOT EXISTS ${tableName(schemaName, spec.name)} (\n ${lines.join(",\n ")}\n)`;
296
+ }
297
+ function column(name, dataType, definition, nullable = false) {
298
+ return {
299
+ dataType,
300
+ definition,
301
+ name,
302
+ nullable,
303
+ };
304
+ }
305
+ function primaryKey(name, table, columns) {
306
+ return {
307
+ name,
308
+ sql: (schemaName) => `ALTER TABLE ${tableName(schemaName, table)} ADD CONSTRAINT ${quoteIdent(name)} PRIMARY KEY (${columns.map(quoteIdent).join(", ")})`,
309
+ type: "p",
310
+ };
311
+ }
312
+ function foreignKey(name, table, columnName, targetTable, targetColumn) {
313
+ return {
314
+ name,
315
+ sql: (schemaName) => `ALTER TABLE ${tableName(schemaName, table)} ADD CONSTRAINT ${quoteIdent(name)} FOREIGN KEY (${quoteIdent(columnName)}) REFERENCES ${tableName(schemaName, targetTable)} (${quoteIdent(targetColumn)}) ON DELETE CASCADE`,
316
+ type: "f",
317
+ };
318
+ }
319
+ function index(name, sql) {
320
+ return { name, sql };
321
+ }
322
+ function tableName(schemaName, name) {
323
+ return `${quoteIdent(schemaName)}.${quoteIdent(name)}`;
324
+ }
325
+ function quoteIdent(value) {
326
+ return `"${value.replace(/"/g, "\"\"")}"`;
327
+ }
328
+ function isTypeCompatible(actual, expected) {
329
+ if (actual === expected) {
330
+ return true;
331
+ }
332
+ if (expected === "text") {
333
+ return actual === "character varying";
334
+ }
335
+ return false;
336
+ }
337
+ function pass(message) {
338
+ return { message, status: "pass" };
339
+ }
340
+ function warn(message) {
341
+ return { message, status: "warn" };
342
+ }
343
+ function fail(message) {
344
+ return { message, status: "fail" };
345
+ }
346
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/cli/database.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  type Output = Pick<typeof console, "error" | "log">;
2
- export declare function runCli(argv: string[], output?: Output): 0 | 1;
2
+ export declare function runCli(argv: string[], output?: Output): Promise<0 | 1>;
3
3
  export {};
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAGA,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,OAAO,EAAE,OAAO,GAAG,KAAK,CAAC,CAAC;AA2BpD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,MAAgB,SAsC9D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAKA,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,OAAO,EAAE,OAAO,GAAG,KAAK,CAAC,CAAC;AAqBpD,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,MAAgB,kBAgEpE"}
package/dist/cli/index.js CHANGED
@@ -1,24 +1,19 @@
1
- import { doctorAuthEnv, initAuthEnv } from "./env.js";
1
+ import { loadUnifiedAuthConfig } from "./config-file.js";
2
+ import { doctorUnifiedAuthConfig, initUnifiedAuthConfig } from "./config.js";
3
+ import { doctorUnifiedAuthDatabase, migrateUnifiedAuthDatabase } from "./database.js";
2
4
  const helpText = `Unified Auth CLI
3
5
 
4
6
  Usage:
5
7
  unified-auth init [options]
6
8
  unified-auth doctor [options]
9
+ unified-auth db migrate [options]
7
10
 
8
11
  Options:
9
- --app <id> Auth client id. Defaults to the current folder name.
10
- --name <name> Display name for the auth application.
11
- --port <port> Local auth service port. Defaults to 3005.
12
- --service-url <url> Auth service base URL. Defaults to http://localhost:<port>.
13
- --redirect <url> Allowed app redirect URI. Defaults to http://localhost:3004/.
14
- --providers <list> Comma-separated providers: feishu,google,github.
15
- --store <provider> Store provider: file or prisma. Defaults to file.
16
- --env-file <path> Env file to update. Defaults to .env.local.
17
- --example-file <path> Example env file to update. Defaults to .env.example.
12
+ --config <path> Config file. Defaults to unified-auth.config.ts.
18
13
  --cwd <path> Project directory. Defaults to the current directory.
19
14
  --help Show this help message.
20
15
  `;
21
- export function runCli(argv, output = console) {
16
+ export async function runCli(argv, output = console) {
22
17
  const args = parseArgs(argv);
23
18
  try {
24
19
  if (!args.command || args.command === "help" || args.flags.has("help")) {
@@ -26,24 +21,44 @@ export function runCli(argv, output = console) {
26
21
  return 0;
27
22
  }
28
23
  if (args.command === "init") {
29
- const result = initAuthEnv(toInitOptions(args.flags));
30
- output.log("Unified Auth env initialized.");
31
- printWriteSummary(output, ".env.local", result.env);
32
- printWriteSummary(output, ".env.example", result.example);
33
- printWriteSummary(output, ".gitignore", result.gitignore);
34
- output.log("Run unified-auth doctor to verify the project config.");
24
+ const cwd = readString(args.flags, "cwd") ?? process.cwd();
25
+ const result = initUnifiedAuthConfig({
26
+ configPath: readString(args.flags, "config"),
27
+ cwd,
28
+ });
29
+ output.log(result.created ? "Unified Auth config created." : "Unified Auth config already exists.");
30
+ output.log(`Config: ${result.path}`);
31
+ output.log("Optional: run unified-auth doctor to verify the project config.");
35
32
  return 0;
36
33
  }
37
34
  if (args.command === "doctor") {
38
- const result = doctorAuthEnv({
39
- cwd: readString(args.flags, "cwd"),
40
- envFile: readString(args.flags, "env-file"),
41
- });
35
+ const cwd = readString(args.flags, "cwd") ?? process.cwd();
36
+ const loaded = await loadUnifiedAuthConfig(cwd, readString(args.flags, "config"));
37
+ const result = doctorUnifiedAuthConfig(loaded.config, loaded.path);
38
+ if (loaded.config?.database?.url) {
39
+ result.checks.push(...await doctorUnifiedAuthDatabase(loaded.config));
40
+ result.ok = !result.checks.some((check) => check.status === "fail");
41
+ }
42
42
  for (const check of result.checks) {
43
43
  output.log(formatCheck(check));
44
44
  }
45
45
  return result.ok ? 0 : 1;
46
46
  }
47
+ if (args.command === "db" && args.subcommand === "migrate") {
48
+ const cwd = readString(args.flags, "cwd") ?? process.cwd();
49
+ const loaded = await loadUnifiedAuthConfig(cwd, readString(args.flags, "config"));
50
+ if (!loaded.config) {
51
+ output.error("unified-auth.config.ts is missing; run unified-auth init");
52
+ return 1;
53
+ }
54
+ const result = await migrateUnifiedAuthDatabase(loaded.config);
55
+ output.log(result.changed ? "Unified Auth database migrated." : "Unified Auth database already up to date.");
56
+ output.log(`Schema: ${result.schemaName}`);
57
+ for (const action of result.actions) {
58
+ output.log(`- ${action.label}`);
59
+ }
60
+ return 0;
61
+ }
47
62
  output.error(`Unknown command: ${args.command}`);
48
63
  output.error("Run unified-auth --help for usage.");
49
64
  return 1;
@@ -56,10 +71,16 @@ export function runCli(argv, output = console) {
56
71
  function parseArgs(argv) {
57
72
  const flags = new Map();
58
73
  let command = "";
74
+ let subcommand = "";
59
75
  for (let index = 0; index < argv.length; index += 1) {
60
76
  const arg = argv[index];
61
77
  if (!arg.startsWith("--")) {
62
- command ||= arg;
78
+ if (!command) {
79
+ command = arg;
80
+ }
81
+ else if (!subcommand) {
82
+ subcommand = arg;
83
+ }
63
84
  continue;
64
85
  }
65
86
  const inline = /^--([^=]+)=(.*)$/.exec(arg);
@@ -76,68 +97,12 @@ function parseArgs(argv) {
76
97
  flags.set(name, next);
77
98
  index += 1;
78
99
  }
79
- return { command, flags };
80
- }
81
- function toInitOptions(flags) {
82
- return {
83
- app: readString(flags, "app"),
84
- cwd: readString(flags, "cwd"),
85
- envFile: readString(flags, "env-file"),
86
- exampleFile: readString(flags, "example-file"),
87
- name: readString(flags, "name"),
88
- port: readNumber(flags, "port"),
89
- providers: readProviders(flags),
90
- redirectURI: readString(flags, "redirect"),
91
- serviceURL: readString(flags, "service-url"),
92
- store: readStore(flags),
93
- };
100
+ return { command, flags, subcommand };
94
101
  }
95
102
  function readString(flags, name) {
96
103
  const value = flags.get(name);
97
104
  return typeof value === "string" && value.trim() ? value.trim() : undefined;
98
105
  }
99
- function readNumber(flags, name) {
100
- const value = readString(flags, name);
101
- if (!value) {
102
- return undefined;
103
- }
104
- const parsed = Number(value);
105
- if (!Number.isInteger(parsed) || parsed <= 0) {
106
- throw new Error(`--${name} must be a positive integer.`);
107
- }
108
- return parsed;
109
- }
110
- function readProviders(flags) {
111
- const value = readString(flags, "providers");
112
- if (!value) {
113
- return undefined;
114
- }
115
- const providers = value.split(",").map((provider) => provider.trim()).filter(Boolean);
116
- const allowed = new Set(["feishu", "github", "google"]);
117
- for (const provider of providers) {
118
- if (!allowed.has(provider)) {
119
- throw new Error(`Unsupported provider: ${provider}`);
120
- }
121
- }
122
- return providers;
123
- }
124
- function readStore(flags) {
125
- const value = readString(flags, "store");
126
- if (!value) {
127
- return undefined;
128
- }
129
- if (value === "file" || value === "prisma") {
130
- return value;
131
- }
132
- throw new Error(`Unsupported store provider: ${value}`);
133
- }
134
- function printWriteSummary(output, label, summary) {
135
- const changes = [
136
- summary.added.length ? `${summary.added.length} added` : "",
137
- summary.updated.length ? `${summary.updated.length} updated` : "",
138
- ].filter(Boolean).join(", ") || "already up to date";
139
- output.log(`${label}: ${changes} (${summary.path})`);
140
- }
141
106
  function formatCheck(check) {
142
107
  const prefix = check.status === "pass" ? "[ok]" : check.status === "warn" ? "[warn]" : "[fail]";
143
108
  return `${prefix} ${check.message}`;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAWtF,MAAM,QAAQ,GAAG;;;;;;;;;;;CAWhB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAc,EAAE,SAAiB,OAAO;IACnE,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE7B,IAAI,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACvE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/B,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAC3D,MAAM,MAAM,GAAG,qBAAqB,CAAC;gBACnC,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC;gBAC5C,GAAG;aACJ,CAAC,CAAC;YAEH,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC;YACpG,MAAM,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;YAC9E,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAC3D,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;YAClF,MAAM,MAAM,GAAG,uBAAuB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAEnE,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;gBACjC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,yBAAyB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;gBACtE,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;YACtE,CAAC;YAED,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YACjC,CAAC;YAED,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAC3D,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAC3D,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;YAElF,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;gBACzE,OAAO,CAAC,CAAC;YACX,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAE/D,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,2CAA2C,CAAC,CAAC;YAC7G,MAAM,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;YAE3C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpC,MAAM,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAClC,CAAC;YAED,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACnD,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC;QAClF,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC/C,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,UAAU,GAAG,EAAE,CAAC;IAEpB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAExB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,GAAG,CAAC;YAChB,CAAC;iBAAM,IAAI,CAAC,UAAU,EAAE,CAAC;gBACvB,UAAU,GAAG,GAAG,CAAC;YACnB,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE5C,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,SAAS;QACX,CAAC;QAED,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAE7B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACtB,SAAS;QACX,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACtB,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,UAAU,CAAC,KAAiC,EAAE,IAAY;IACjE,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAE9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9E,CAAC;AAED,SAAS,WAAW,CAAC,KAAkB;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEhG,OAAO,GAAG,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;AACtC,CAAC"}
package/dist/cli.js CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
2
  import { runCli } from "./cli/index.js";
3
- process.exitCode = runCli(process.argv.slice(2));
3
+ process.exitCode = await runCli(process.argv.slice(2));
4
4
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,CAAC,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,32 @@
1
+ export type AuthProvider = "feishu" | "github" | "google";
2
+ export type UnifiedAuthConfigValue<T> = T | (() => T | undefined);
3
+ export interface UnifiedAuthAppConfig {
4
+ id?: string;
5
+ name?: string;
6
+ origin?: string;
7
+ redirectURI?: string;
8
+ url?: string;
9
+ }
10
+ export interface UnifiedAuthServiceConfig {
11
+ origin?: string;
12
+ port?: number;
13
+ secret?: UnifiedAuthConfigValue<string>;
14
+ trustedOrigins?: string[];
15
+ url?: string;
16
+ }
17
+ export interface UnifiedAuthDatabaseConfig {
18
+ ssl?: boolean | {
19
+ rejectUnauthorized?: boolean;
20
+ };
21
+ url?: UnifiedAuthConfigValue<string>;
22
+ }
23
+ export interface UnifiedAuthConfig {
24
+ app?: UnifiedAuthAppConfig;
25
+ auth?: UnifiedAuthServiceConfig;
26
+ database?: UnifiedAuthDatabaseConfig;
27
+ providers?: AuthProvider[];
28
+ realm?: string;
29
+ }
30
+ export declare function defineUnifiedAuthConfig(config: UnifiedAuthConfig): UnifiedAuthConfig;
31
+ export declare function resolveUnifiedAuthConfigValue<T>(value: UnifiedAuthConfigValue<T> | undefined): T | undefined;
32
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC1D,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC;AAElE,MAAM,WAAW,oBAAoB;IACnC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACxC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,yBAAyB;IACxC,GAAG,CAAC,EAAE,OAAO,GAAG;QACd,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,CAAC;IACF,GAAG,CAAC,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,oBAAoB,CAAC;IAC3B,IAAI,CAAC,EAAE,wBAAwB,CAAC;IAChC,QAAQ,CAAC,EAAE,yBAAyB,CAAC;IACrC,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,CAEpF;AAED,wBAAgB,6BAA6B,CAAC,CAAC,EAAE,KAAK,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,GAAG,SAAS,CAE5G"}