@superfunctions/cli 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.
- package/README.md +248 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +114 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/generate.d.ts +5 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +233 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +148 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/types/library-schema.d.ts +24 -0
- package/dist/types/library-schema.d.ts.map +1 -0
- package/dist/types/library-schema.js +2 -0
- package/dist/types/library-schema.js.map +1 -0
- package/dist/utils/adapter-helper.d.ts +21 -0
- package/dist/utils/adapter-helper.d.ts.map +1 -0
- package/dist/utils/adapter-helper.js +217 -0
- package/dist/utils/adapter-helper.js.map +1 -0
- package/dist/utils/config.d.ts +4 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +31 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/discover-configs.d.ts +11 -0
- package/dist/utils/discover-configs.d.ts.map +1 -0
- package/dist/utils/discover-configs.js +76 -0
- package/dist/utils/discover-configs.js.map +1 -0
- package/dist/utils/generators.d.ts +31 -0
- package/dist/utils/generators.d.ts.map +1 -0
- package/dist/utils/generators.js +302 -0
- package/dist/utils/generators.js.map +1 -0
- package/dist/utils/introspection.d.ts +55 -0
- package/dist/utils/introspection.d.ts.map +1 -0
- package/dist/utils/introspection.js +263 -0
- package/dist/utils/introspection.js.map +1 -0
- package/dist/utils/libraries.d.ts +7 -0
- package/dist/utils/libraries.d.ts.map +1 -0
- package/dist/utils/libraries.js +28 -0
- package/dist/utils/libraries.js.map +1 -0
- package/dist/utils/load-library-config.d.ts +6 -0
- package/dist/utils/load-library-config.d.ts.map +1 -0
- package/dist/utils/load-library-config.js +34 -0
- package/dist/utils/load-library-config.js.map +1 -0
- package/dist/utils/schema-diff.d.ts +48 -0
- package/dist/utils/schema-diff.d.ts.map +1 -0
- package/dist/utils/schema-diff.js +105 -0
- package/dist/utils/schema-diff.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Status command - show current schema versions and migration status
|
|
3
|
+
*/
|
|
4
|
+
import { loadConfig } from '../utils/config.js';
|
|
5
|
+
import { detectInstalledLibraries } from '../utils/libraries.js';
|
|
6
|
+
import { createAdapterFromConfig } from '../utils/adapter-helper.js';
|
|
7
|
+
import { diffSchemas } from '../utils/schema-diff.js';
|
|
8
|
+
import { discoverLibraryConfigs } from '../utils/discover-configs.js';
|
|
9
|
+
import { loadLibraryConfig } from '../utils/load-library-config.js';
|
|
10
|
+
export async function showStatus(configPath) {
|
|
11
|
+
console.log('š Superfunctions Schema Status\n');
|
|
12
|
+
// Load config
|
|
13
|
+
const config = await loadConfig(configPath);
|
|
14
|
+
if (!config) {
|
|
15
|
+
console.log('ā No config found. Create one with: superfunctions init');
|
|
16
|
+
process.exitCode = 1;
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
console.log('ā
Config loaded');
|
|
20
|
+
console.log(` Adapter: ${config.adapter?.type ?? 'unknown'}`);
|
|
21
|
+
console.log(` Migrations dir: ${config.migrationsDir ?? 'not set'}\n`);
|
|
22
|
+
// Detect libraries
|
|
23
|
+
const libraries = detectInstalledLibraries();
|
|
24
|
+
console.log(`š¦ Detected ${libraries.length} Superfunctions libraries:`);
|
|
25
|
+
for (const lib of libraries) {
|
|
26
|
+
console.log(` - ${lib.name}${lib.version ? ` (v${lib.version})` : ''}`);
|
|
27
|
+
}
|
|
28
|
+
console.log('');
|
|
29
|
+
if (libraries.length === 0) {
|
|
30
|
+
console.log('ā ļø No Superfunctions libraries found in node_modules');
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// Connect to database
|
|
34
|
+
let connection;
|
|
35
|
+
try {
|
|
36
|
+
console.log('š Connecting to database...');
|
|
37
|
+
connection = await createAdapterFromConfig(config);
|
|
38
|
+
console.log('ā
Connected\n');
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
console.error('ā Failed to connect to database:', e.message);
|
|
42
|
+
console.log('\nš” Tip: Make sure your database is running and connection details are correct');
|
|
43
|
+
process.exitCode = 1;
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
// Initialize adapter (creates schema versions table if needed)
|
|
48
|
+
await connection.adapter.initialize();
|
|
49
|
+
// Check if schema versions table exists
|
|
50
|
+
const isHealthy = await connection.adapter.isHealthy();
|
|
51
|
+
if (!isHealthy.healthy) {
|
|
52
|
+
console.warn('ā ļø Database health check failed');
|
|
53
|
+
if (isHealthy.lastError) {
|
|
54
|
+
console.warn(` ${isHealthy.lastError.message}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Get current schema versions from database
|
|
58
|
+
console.log('š Current schema versions:');
|
|
59
|
+
const currentVersions = {};
|
|
60
|
+
for (const lib of libraries) {
|
|
61
|
+
try {
|
|
62
|
+
const version = await connection.adapter.getSchemaVersion(lib.name);
|
|
63
|
+
currentVersions[lib.name] = version;
|
|
64
|
+
console.log(` ${lib.name}: ${version === 0 ? 'not installed' : `v${version}`}`);
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
console.log(` ${lib.name}: error (${e.message})`);
|
|
68
|
+
currentVersions[lib.name] = 0;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
console.log('');
|
|
72
|
+
// Discover library config files
|
|
73
|
+
console.log('š Discovering library configurations...');
|
|
74
|
+
const discoveredConfigs = await discoverLibraryConfigs(process.cwd(), config.discoverConfigs);
|
|
75
|
+
if (discoveredConfigs.length === 0) {
|
|
76
|
+
console.log('ā ļø No library configurations found');
|
|
77
|
+
console.log(' Create config files: <library-name>.config.ts');
|
|
78
|
+
console.log(' Example: conduct.config.ts, authfn.config.ts');
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
console.log(`š¦ Found ${discoveredConfigs.length} library config(s):`);
|
|
82
|
+
for (const cfg of discoveredConfigs) {
|
|
83
|
+
console.log(` - ${cfg.libraryName} (${cfg.configPath})`);
|
|
84
|
+
}
|
|
85
|
+
console.log('');
|
|
86
|
+
// Load library schemas from discovered configs
|
|
87
|
+
const librarySchemas = [];
|
|
88
|
+
for (const discovered of discoveredConfigs) {
|
|
89
|
+
try {
|
|
90
|
+
// Load the config file
|
|
91
|
+
const libraryConfig = await loadLibraryConfig(discovered.configPath);
|
|
92
|
+
// Import library package
|
|
93
|
+
const libraryPackage = await import(discovered.packageName);
|
|
94
|
+
// Get schema from library
|
|
95
|
+
if (typeof libraryPackage.getSchema !== 'function') {
|
|
96
|
+
console.warn(`ā ļø ${discovered.packageName} does not export getSchema function, skipping`);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const schemaResult = libraryPackage.getSchema(libraryConfig);
|
|
100
|
+
librarySchemas.push({
|
|
101
|
+
namespace: discovered.libraryName,
|
|
102
|
+
version: schemaResult.version,
|
|
103
|
+
tables: schemaResult.schemas,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
console.warn(`ā ļø Failed to load schema for ${discovered.libraryName}: ${e.message}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (librarySchemas.length === 0) {
|
|
111
|
+
console.log('ā ļø No library schemas could be loaded');
|
|
112
|
+
console.log(' Make sure your library config files are valid and libraries export getSchema');
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
// Compare required vs current
|
|
116
|
+
console.log('š Schema analysis:');
|
|
117
|
+
const diff = diffSchemas(librarySchemas, currentVersions);
|
|
118
|
+
let hasOutdated = false;
|
|
119
|
+
let hasNotInstalled = false;
|
|
120
|
+
for (const [namespace, info] of Object.entries(diff)) {
|
|
121
|
+
const statusEmoji = info.status === 'up-to-date'
|
|
122
|
+
? 'ā
'
|
|
123
|
+
: info.status === 'outdated'
|
|
124
|
+
? 'ā ļø '
|
|
125
|
+
: 'ā';
|
|
126
|
+
console.log(` ${statusEmoji} ${namespace}: ${info.current} / ${info.required} (${info.status})`);
|
|
127
|
+
if (info.status === 'outdated')
|
|
128
|
+
hasOutdated = true;
|
|
129
|
+
if (info.status === 'not-installed')
|
|
130
|
+
hasNotInstalled = true;
|
|
131
|
+
}
|
|
132
|
+
console.log('');
|
|
133
|
+
// Show recommendations
|
|
134
|
+
if (hasNotInstalled) {
|
|
135
|
+
console.log('š” Run `superfunctions generate` to create initial migrations');
|
|
136
|
+
}
|
|
137
|
+
else if (hasOutdated) {
|
|
138
|
+
console.log('š” Run `superfunctions generate` to create migration files for updates');
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
console.log('⨠All schemas are up-to-date!');
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
await connection.close();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @superfunctions/cli
|
|
3
|
+
*
|
|
4
|
+
* CLI tool for schema management and migrations
|
|
5
|
+
*/
|
|
6
|
+
export type { TableSchema, TableSchemaMap, FieldSchema, IndexSchema, } from '@superfunctions/db';
|
|
7
|
+
export interface SuperfunctionsConfig {
|
|
8
|
+
adapter: AdapterConfig;
|
|
9
|
+
migrationsDir?: string;
|
|
10
|
+
discoverConfigs?: string[];
|
|
11
|
+
}
|
|
12
|
+
export interface AdapterConfig {
|
|
13
|
+
type: 'drizzle' | 'prisma' | 'kysely' | 'mongodb';
|
|
14
|
+
drizzle?: DrizzleConfig;
|
|
15
|
+
prisma?: PrismaConfig;
|
|
16
|
+
kysely?: KyselyConfig;
|
|
17
|
+
}
|
|
18
|
+
export interface DrizzleConfig {
|
|
19
|
+
dialect: 'postgres' | 'mysql' | 'sqlite';
|
|
20
|
+
connectionString?: string;
|
|
21
|
+
filename?: string;
|
|
22
|
+
poolConfig?: any;
|
|
23
|
+
schema?: Record<string, any>;
|
|
24
|
+
schemaVersionsTable?: any;
|
|
25
|
+
}
|
|
26
|
+
export interface PrismaConfig {
|
|
27
|
+
prisma: any;
|
|
28
|
+
modelMap?: Record<string, string>;
|
|
29
|
+
schemaVersionsTable?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface KyselyConfig {
|
|
32
|
+
dialect: 'postgres' | 'mysql' | 'sqlite';
|
|
33
|
+
connectionString?: string;
|
|
34
|
+
filename?: string;
|
|
35
|
+
poolConfig?: any;
|
|
36
|
+
schemaVersionsTable?: string;
|
|
37
|
+
}
|
|
38
|
+
export declare function defineConfig(config: SuperfunctionsConfig): SuperfunctionsConfig;
|
|
39
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,WAAW,EACX,cAAc,EACd,WAAW,EACX,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,aAAa,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAClD,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;IACzC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,mBAAmB,CAAC,EAAE,GAAG,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,GAAG,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;IACzC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,oBAAoB,GAAG,oBAAoB,CAE/E"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiDH,MAAM,UAAU,YAAY,CAAC,MAA4B;IACvD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { TableSchema } from '@superfunctions/db';
|
|
2
|
+
/**
|
|
3
|
+
* What each library must export for CLI schema generation
|
|
4
|
+
*/
|
|
5
|
+
export interface LibrarySchemaGenerator {
|
|
6
|
+
name: string;
|
|
7
|
+
version: number;
|
|
8
|
+
getSchema(config: any): LibrarySchema;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Schema format returned by library's getSchema() function
|
|
12
|
+
*/
|
|
13
|
+
export interface LibrarySchema {
|
|
14
|
+
version: number;
|
|
15
|
+
schemas: TableSchema[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Config file structure (library-specific)
|
|
19
|
+
* Each library defines its own config structure
|
|
20
|
+
*/
|
|
21
|
+
export interface LibraryConfig {
|
|
22
|
+
[key: string]: any;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=library-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"library-schema.d.ts","sourceRoot":"","sources":["../../src/types/library-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IAErC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAGhB,SAAS,CAAC,MAAM,EAAE,GAAG,GAAG,aAAa,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAE5B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"library-schema.js","sourceRoot":"","sources":["../../src/types/library-schema.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper to create adapters from CLI config for database operations
|
|
3
|
+
*/
|
|
4
|
+
import type { Adapter } from '@superfunctions/db';
|
|
5
|
+
import type { SuperfunctionsConfig } from '../index.js';
|
|
6
|
+
export interface AdapterConnection {
|
|
7
|
+
adapter: Adapter;
|
|
8
|
+
dialect: 'postgres' | 'mysql' | 'sqlite';
|
|
9
|
+
rawConnection: any;
|
|
10
|
+
close: () => Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Create an adapter instance from config
|
|
14
|
+
* This connects to the actual database for introspection and migrations
|
|
15
|
+
*/
|
|
16
|
+
export declare function createAdapterFromConfig(config: SuperfunctionsConfig): Promise<AdapterConnection>;
|
|
17
|
+
/**
|
|
18
|
+
* Get raw database connection for introspection
|
|
19
|
+
*/
|
|
20
|
+
export declare function getRawConnection(connection: AdapterConnection): any;
|
|
21
|
+
//# sourceMappingURL=adapter-helper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-helper.d.ts","sourceRoot":"","sources":["../../src/utils/adapter-helper.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;IACzC,aAAa,EAAE,GAAG,CAAC;IACnB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,CAiB5B;AAoND;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,iBAAiB,GAAG,GAAG,CAEnE"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper to create adapters from CLI config for database operations
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Create an adapter instance from config
|
|
6
|
+
* This connects to the actual database for introspection and migrations
|
|
7
|
+
*/
|
|
8
|
+
export async function createAdapterFromConfig(config) {
|
|
9
|
+
const adapterType = config.adapter?.type;
|
|
10
|
+
if (!adapterType) {
|
|
11
|
+
throw new Error('adapter.type is required in config');
|
|
12
|
+
}
|
|
13
|
+
switch (adapterType) {
|
|
14
|
+
case 'drizzle':
|
|
15
|
+
return await createDrizzleAdapter(config);
|
|
16
|
+
case 'prisma':
|
|
17
|
+
return await createPrismaAdapter(config);
|
|
18
|
+
case 'kysely':
|
|
19
|
+
return await createKyselyAdapter(config);
|
|
20
|
+
default:
|
|
21
|
+
throw new Error(`Unsupported adapter type: ${adapterType}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async function createDrizzleAdapter(config) {
|
|
25
|
+
// Import drizzle dynamically
|
|
26
|
+
const drizzleConfig = config.adapter?.drizzle;
|
|
27
|
+
if (!drizzleConfig) {
|
|
28
|
+
throw new Error('adapter.drizzle config is required for Drizzle adapter');
|
|
29
|
+
}
|
|
30
|
+
const dialect = drizzleConfig.dialect;
|
|
31
|
+
if (!dialect) {
|
|
32
|
+
throw new Error('adapter.drizzle.dialect is required');
|
|
33
|
+
}
|
|
34
|
+
let db;
|
|
35
|
+
let pool;
|
|
36
|
+
// Connect based on dialect
|
|
37
|
+
try {
|
|
38
|
+
if (dialect === 'postgres') {
|
|
39
|
+
const pg = await import('pg');
|
|
40
|
+
pool = new pg.Pool({
|
|
41
|
+
connectionString: drizzleConfig.connectionString,
|
|
42
|
+
...drizzleConfig.poolConfig,
|
|
43
|
+
});
|
|
44
|
+
const { drizzle } = await import('drizzle-orm/node-postgres');
|
|
45
|
+
db = drizzle(pool);
|
|
46
|
+
}
|
|
47
|
+
else if (dialect === 'mysql') {
|
|
48
|
+
const mysql = await import('mysql2/promise');
|
|
49
|
+
pool = mysql.createPool({
|
|
50
|
+
uri: drizzleConfig.connectionString,
|
|
51
|
+
...drizzleConfig.poolConfig,
|
|
52
|
+
});
|
|
53
|
+
const { drizzle } = await import('drizzle-orm/mysql2');
|
|
54
|
+
db = drizzle(pool);
|
|
55
|
+
}
|
|
56
|
+
else if (dialect === 'sqlite') {
|
|
57
|
+
const Database = await import('better-sqlite3');
|
|
58
|
+
const sqlite = new (Database.default || Database)(drizzleConfig.filename ?? ':memory:');
|
|
59
|
+
const { drizzle } = await import('drizzle-orm/better-sqlite3');
|
|
60
|
+
db = drizzle(sqlite);
|
|
61
|
+
pool = sqlite;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
throw new Error(`Unsupported Drizzle dialect: ${dialect}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
if (e.code === 'MODULE_NOT_FOUND' || e.code === 'ERR_MODULE_NOT_FOUND') {
|
|
69
|
+
throw new Error(`Required dependencies not found for Drizzle ${dialect}. Install: npm install ${dialect === 'postgres' ? 'pg' : dialect === 'mysql' ? 'mysql2' : 'better-sqlite3'}`);
|
|
70
|
+
}
|
|
71
|
+
throw e;
|
|
72
|
+
}
|
|
73
|
+
// Import adapter factory
|
|
74
|
+
const { drizzleAdapter } = await import('@superfunctions/db/adapters');
|
|
75
|
+
const adapter = drizzleAdapter({
|
|
76
|
+
db,
|
|
77
|
+
schema: drizzleConfig.schema ?? {},
|
|
78
|
+
dialect,
|
|
79
|
+
schemaVersionsTable: drizzleConfig.schemaVersionsTable,
|
|
80
|
+
});
|
|
81
|
+
return {
|
|
82
|
+
adapter,
|
|
83
|
+
dialect,
|
|
84
|
+
rawConnection: dialect === 'sqlite' ? pool : pool,
|
|
85
|
+
close: async () => {
|
|
86
|
+
if (dialect === 'sqlite') {
|
|
87
|
+
pool.close();
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
await pool.end();
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
async function createPrismaAdapter(config) {
|
|
96
|
+
const prismaConfig = config.adapter?.prisma;
|
|
97
|
+
if (!prismaConfig) {
|
|
98
|
+
throw new Error('adapter.prisma config is required for Prisma adapter');
|
|
99
|
+
}
|
|
100
|
+
// User must provide their PrismaClient
|
|
101
|
+
if (!prismaConfig.prisma) {
|
|
102
|
+
throw new Error('adapter.prisma.prisma (PrismaClient instance) is required. Import and instantiate it in your config.');
|
|
103
|
+
}
|
|
104
|
+
const { prismaAdapter } = await import('@superfunctions/db/adapters');
|
|
105
|
+
const adapter = prismaAdapter({
|
|
106
|
+
prisma: prismaConfig.prisma,
|
|
107
|
+
modelMap: prismaConfig.modelMap ?? {},
|
|
108
|
+
schemaVersionsTable: prismaConfig.schemaVersionsTable,
|
|
109
|
+
});
|
|
110
|
+
// Determine dialect from datasource
|
|
111
|
+
const datasourceUrl = process.env.DATABASE_URL ?? '';
|
|
112
|
+
let dialect = 'postgres';
|
|
113
|
+
if (datasourceUrl.startsWith('mysql:')) {
|
|
114
|
+
dialect = 'mysql';
|
|
115
|
+
}
|
|
116
|
+
else if (datasourceUrl.startsWith('file:') || datasourceUrl.includes('sqlite')) {
|
|
117
|
+
dialect = 'sqlite';
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
adapter,
|
|
121
|
+
dialect,
|
|
122
|
+
rawConnection: prismaConfig.prisma,
|
|
123
|
+
close: async () => {
|
|
124
|
+
await prismaConfig.prisma.$disconnect();
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
async function createKyselyAdapter(config) {
|
|
129
|
+
const kyselyConfig = config.adapter?.kysely;
|
|
130
|
+
if (!kyselyConfig) {
|
|
131
|
+
throw new Error('adapter.kysely config is required for Kysely adapter');
|
|
132
|
+
}
|
|
133
|
+
const dialect = kyselyConfig.dialect;
|
|
134
|
+
if (!dialect) {
|
|
135
|
+
throw new Error('adapter.kysely.dialect is required');
|
|
136
|
+
}
|
|
137
|
+
// Import Kysely dynamically
|
|
138
|
+
let Kysely;
|
|
139
|
+
try {
|
|
140
|
+
const kyselyModule = await import('kysely');
|
|
141
|
+
Kysely = kyselyModule.Kysely;
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
throw new Error('kysely is required as a peer dependency for Kysely adapter');
|
|
145
|
+
}
|
|
146
|
+
let db;
|
|
147
|
+
let pool;
|
|
148
|
+
try {
|
|
149
|
+
if (dialect === 'postgres') {
|
|
150
|
+
const kyselyModule = await import('kysely');
|
|
151
|
+
const pg = await import('pg');
|
|
152
|
+
pool = new pg.Pool({
|
|
153
|
+
connectionString: kyselyConfig.connectionString,
|
|
154
|
+
...kyselyConfig.poolConfig,
|
|
155
|
+
});
|
|
156
|
+
db = new Kysely({
|
|
157
|
+
dialect: new kyselyModule.PostgresDialect({ pool }),
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
else if (dialect === 'mysql') {
|
|
161
|
+
const kyselyModule = await import('kysely');
|
|
162
|
+
const mysql = await import('mysql2');
|
|
163
|
+
pool = mysql.createPool({
|
|
164
|
+
uri: kyselyConfig.connectionString,
|
|
165
|
+
...kyselyConfig.poolConfig,
|
|
166
|
+
});
|
|
167
|
+
db = new Kysely({
|
|
168
|
+
dialect: new kyselyModule.MysqlDialect({ pool }),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
else if (dialect === 'sqlite') {
|
|
172
|
+
const kyselyModule = await import('kysely');
|
|
173
|
+
const Database = await import('better-sqlite3');
|
|
174
|
+
const sqlite = new (Database.default || Database)(kyselyConfig.filename ?? ':memory:');
|
|
175
|
+
db = new Kysely({
|
|
176
|
+
dialect: new kyselyModule.SqliteDialect({ database: sqlite }),
|
|
177
|
+
});
|
|
178
|
+
pool = sqlite;
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
throw new Error(`Unsupported Kysely dialect: ${dialect}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
catch (e) {
|
|
185
|
+
if (e.code === 'MODULE_NOT_FOUND' || e.code === 'ERR_MODULE_NOT_FOUND') {
|
|
186
|
+
throw new Error(`Required dependencies not found for Kysely ${dialect}. Install: npm install kysely ${dialect === 'postgres' ? 'pg' : dialect === 'mysql' ? 'mysql2' : 'better-sqlite3'}`);
|
|
187
|
+
}
|
|
188
|
+
throw e;
|
|
189
|
+
}
|
|
190
|
+
const { kyselyAdapter } = await import('@superfunctions/db/adapters');
|
|
191
|
+
const adapter = kyselyAdapter({
|
|
192
|
+
db,
|
|
193
|
+
dialect,
|
|
194
|
+
schema: {}, // Empty schema map for CLI use
|
|
195
|
+
schemaVersionsTable: kyselyConfig.schemaVersionsTable ?? '_superfunctions_schema_versions',
|
|
196
|
+
});
|
|
197
|
+
return {
|
|
198
|
+
adapter,
|
|
199
|
+
dialect,
|
|
200
|
+
rawConnection: pool,
|
|
201
|
+
close: async () => {
|
|
202
|
+
if (dialect === 'sqlite') {
|
|
203
|
+
pool.close();
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
await pool.end();
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Get raw database connection for introspection
|
|
213
|
+
*/
|
|
214
|
+
export function getRawConnection(connection) {
|
|
215
|
+
return connection.rawConnection;
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=adapter-helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-helper.js","sourceRoot":"","sources":["../../src/utils/adapter-helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAkBzF;AAED,wBAAgB,gBAAgB,CAAC,CAAC,CAAC,EAAE,MAAM,UAE1C"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
export async function loadConfig(configPath) {
|
|
4
|
+
const resolved = path.resolve(process.cwd(), configPath);
|
|
5
|
+
if (!fs.existsSync(resolved))
|
|
6
|
+
return null;
|
|
7
|
+
const ext = path.extname(resolved);
|
|
8
|
+
if (ext === '.js' || ext === '.mjs' || ext === '.cjs') {
|
|
9
|
+
const mod = await import(pathToFileUrl(resolved));
|
|
10
|
+
return (mod.default ?? mod)?.adapter ? (mod.default ?? mod) : (mod.default ?? mod).config ?? (mod.default ?? mod);
|
|
11
|
+
}
|
|
12
|
+
if (ext === '.json') {
|
|
13
|
+
const raw = fs.readFileSync(resolved, 'utf8');
|
|
14
|
+
return JSON.parse(raw);
|
|
15
|
+
}
|
|
16
|
+
if (ext === '.ts') {
|
|
17
|
+
// We don't ship a TS runtime loader to keep deps slim. Suggest using JS for now.
|
|
18
|
+
throw new Error('TypeScript config is not supported at runtime. Use superfunctions.config.js or JSON, or precompile your TS config.');
|
|
19
|
+
}
|
|
20
|
+
throw new Error(`Unsupported config extension: ${ext}`);
|
|
21
|
+
}
|
|
22
|
+
export function ensureConfigPath(p) {
|
|
23
|
+
return p ?? 'superfunctions.config.js';
|
|
24
|
+
}
|
|
25
|
+
function pathToFileUrl(p) {
|
|
26
|
+
const u = new URL('file://');
|
|
27
|
+
// On Windows path.resolve returns backslashes; URL needs forward slashes
|
|
28
|
+
u.pathname = p.split(path.sep).join(path.posix.sep);
|
|
29
|
+
return u.href;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAkB;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;IACzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACtD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAyB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC;IAC5I,CAAC;IACD,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;IACjD,CAAC;IACD,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,iFAAiF;QACjF,MAAM,IAAI,KAAK,CAAC,oHAAoH,CAAC,CAAC;IACxI,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAU;IACzC,OAAO,CAAC,IAAI,0BAA0B,CAAC;AACzC,CAAC;AAED,SAAS,aAAa,CAAC,CAAS;IAC9B,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAC7B,yEAAyE;IACzE,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpD,OAAO,CAAC,CAAC,IAAI,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface DiscoveredConfig {
|
|
2
|
+
libraryName: string;
|
|
3
|
+
configPath: string;
|
|
4
|
+
packageName: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Discover library config files
|
|
8
|
+
* Pattern: <library-name>.config.{ts,js,mjs}
|
|
9
|
+
*/
|
|
10
|
+
export declare function discoverLibraryConfigs(cwd: string, manualPaths?: string[]): Promise<DiscoveredConfig[]>;
|
|
11
|
+
//# sourceMappingURL=discover-configs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover-configs.d.ts","sourceRoot":"","sources":["../../src/utils/discover-configs.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,MAAM,EACX,WAAW,CAAC,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA2D7B"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { glob } from 'glob';
|
|
4
|
+
import { detectInstalledLibraries } from './libraries.js';
|
|
5
|
+
/**
|
|
6
|
+
* Discover library config files
|
|
7
|
+
* Pattern: <library-name>.config.{ts,js,mjs}
|
|
8
|
+
*/
|
|
9
|
+
export async function discoverLibraryConfigs(cwd, manualPaths) {
|
|
10
|
+
const discovered = [];
|
|
11
|
+
// 1. Auto-discovery using glob pattern
|
|
12
|
+
const patterns = [
|
|
13
|
+
'*.config.{ts,js,mjs}',
|
|
14
|
+
'src/**/*.config.{ts,js,mjs}',
|
|
15
|
+
'lib/**/*.config.{ts,js,mjs}',
|
|
16
|
+
'server/**/*.config.{ts,js,mjs}',
|
|
17
|
+
];
|
|
18
|
+
const files = await glob(patterns, {
|
|
19
|
+
cwd,
|
|
20
|
+
ignore: ['node_modules/**', 'dist/**', 'build/**'],
|
|
21
|
+
absolute: true,
|
|
22
|
+
});
|
|
23
|
+
for (const file of files) {
|
|
24
|
+
const basename = path.basename(file);
|
|
25
|
+
const match = basename.match(/^([^.]+)\.config\.(ts|js|mjs)$/);
|
|
26
|
+
if (match) {
|
|
27
|
+
const libraryName = match[1]; // 'conduct', 'authfn', etc
|
|
28
|
+
// Check if library is installed
|
|
29
|
+
const installedLibs = detectInstalledLibraries(cwd);
|
|
30
|
+
const isInstalled = installedLibs.some(lib => lib.name.includes(libraryName));
|
|
31
|
+
if (isInstalled) {
|
|
32
|
+
discovered.push({
|
|
33
|
+
libraryName,
|
|
34
|
+
configPath: file,
|
|
35
|
+
packageName: `@superfunctions/${libraryName}`,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// 2. Manual paths from config (fallback)
|
|
41
|
+
if (manualPaths) {
|
|
42
|
+
for (const manualPath of manualPaths) {
|
|
43
|
+
const resolved = path.resolve(cwd, manualPath);
|
|
44
|
+
if (fs.existsSync(resolved)) {
|
|
45
|
+
// Extract library name from path or file content
|
|
46
|
+
const libraryName = await extractLibraryName(resolved);
|
|
47
|
+
if (libraryName) {
|
|
48
|
+
discovered.push({
|
|
49
|
+
libraryName,
|
|
50
|
+
configPath: resolved,
|
|
51
|
+
packageName: `@superfunctions/${libraryName}`,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return discovered;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Helper to extract library name from config file
|
|
61
|
+
*/
|
|
62
|
+
async function extractLibraryName(configPath) {
|
|
63
|
+
try {
|
|
64
|
+
// Try reading first few lines to find library import
|
|
65
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
66
|
+
const importMatch = content.match(/import.*from ['"](@superfunctions\/)?(\w+)['"]/);
|
|
67
|
+
if (importMatch) {
|
|
68
|
+
return importMatch[2]; // authfn, conduct, etc
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=discover-configs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover-configs.js","sourceRoot":"","sources":["../../src/utils/discover-configs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAQ1D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,GAAW,EACX,WAAsB;IAEtB,MAAM,UAAU,GAAuB,EAAE,CAAC;IAE1C,uCAAuC;IACvC,MAAM,QAAQ,GAAG;QACf,sBAAsB;QACtB,6BAA6B;QAC7B,6BAA6B;QAC7B,gCAAgC;KACjC,CAAC;IAEF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE;QACjC,GAAG;QACH,MAAM,EAAE,CAAC,iBAAiB,EAAE,SAAS,EAAE,UAAU,CAAC;QAClD,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IAEH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAE/D,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,2BAA2B;YAEzD,gCAAgC;YAChC,MAAM,aAAa,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;YACpD,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CACpC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CACtC,CAAC;YAEF,IAAI,WAAW,EAAE,CAAC;gBAChB,UAAU,CAAC,IAAI,CAAC;oBACd,WAAW;oBACX,UAAU,EAAE,IAAI;oBAChB,WAAW,EAAE,mBAAmB,WAAW,EAAE;iBAC9C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YAC/C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,iDAAiD;gBACjD,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;gBACvD,IAAI,WAAW,EAAE,CAAC;oBAChB,UAAU,CAAC,IAAI,CAAC;wBACd,WAAW;wBACX,UAAU,EAAE,QAAQ;wBACpB,WAAW,EAAE,mBAAmB,WAAW,EAAE;qBAC9C,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAAC,UAAkB;IAClD,IAAI,CAAC;QACH,qDAAqD;QACrD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAC/B,gDAAgD,CACjD,CAAC;QAEF,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;QAChD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|