@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.
Files changed (54) hide show
  1. package/README.md +248 -0
  2. package/dist/cli.d.ts +6 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +114 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/generate.d.ts +5 -0
  7. package/dist/commands/generate.d.ts.map +1 -0
  8. package/dist/commands/generate.js +233 -0
  9. package/dist/commands/generate.js.map +1 -0
  10. package/dist/commands/status.d.ts +5 -0
  11. package/dist/commands/status.d.ts.map +1 -0
  12. package/dist/commands/status.js +148 -0
  13. package/dist/commands/status.js.map +1 -0
  14. package/dist/index.d.ts +39 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +9 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/types/library-schema.d.ts +24 -0
  19. package/dist/types/library-schema.d.ts.map +1 -0
  20. package/dist/types/library-schema.js +2 -0
  21. package/dist/types/library-schema.js.map +1 -0
  22. package/dist/utils/adapter-helper.d.ts +21 -0
  23. package/dist/utils/adapter-helper.d.ts.map +1 -0
  24. package/dist/utils/adapter-helper.js +217 -0
  25. package/dist/utils/adapter-helper.js.map +1 -0
  26. package/dist/utils/config.d.ts +4 -0
  27. package/dist/utils/config.d.ts.map +1 -0
  28. package/dist/utils/config.js +31 -0
  29. package/dist/utils/config.js.map +1 -0
  30. package/dist/utils/discover-configs.d.ts +11 -0
  31. package/dist/utils/discover-configs.d.ts.map +1 -0
  32. package/dist/utils/discover-configs.js +76 -0
  33. package/dist/utils/discover-configs.js.map +1 -0
  34. package/dist/utils/generators.d.ts +31 -0
  35. package/dist/utils/generators.d.ts.map +1 -0
  36. package/dist/utils/generators.js +302 -0
  37. package/dist/utils/generators.js.map +1 -0
  38. package/dist/utils/introspection.d.ts +55 -0
  39. package/dist/utils/introspection.d.ts.map +1 -0
  40. package/dist/utils/introspection.js +263 -0
  41. package/dist/utils/introspection.js.map +1 -0
  42. package/dist/utils/libraries.d.ts +7 -0
  43. package/dist/utils/libraries.d.ts.map +1 -0
  44. package/dist/utils/libraries.js +28 -0
  45. package/dist/utils/libraries.js.map +1 -0
  46. package/dist/utils/load-library-config.d.ts +6 -0
  47. package/dist/utils/load-library-config.d.ts.map +1 -0
  48. package/dist/utils/load-library-config.js +34 -0
  49. package/dist/utils/load-library-config.js.map +1 -0
  50. package/dist/utils/schema-diff.d.ts +48 -0
  51. package/dist/utils/schema-diff.d.ts.map +1 -0
  52. package/dist/utils/schema-diff.js +105 -0
  53. package/dist/utils/schema-diff.js.map +1 -0
  54. 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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"}
@@ -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,9 @@
1
+ /**
2
+ * @superfunctions/cli
3
+ *
4
+ * CLI tool for schema management and migrations
5
+ */
6
+ export function defineConfig(config) {
7
+ return config;
8
+ }
9
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=library-schema.js.map
@@ -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,4 @@
1
+ import type { SuperfunctionsConfig } from '../index.js';
2
+ export declare function loadConfig(configPath: string): Promise<SuperfunctionsConfig | null>;
3
+ export declare function ensureConfigPath(p?: string): string;
4
+ //# sourceMappingURL=config.d.ts.map
@@ -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"}