@edgebasejs/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/dist/cli/src/cli.d.ts +3 -0
- package/dist/cli/src/cli.d.ts.map +1 -0
- package/dist/cli/src/cli.js +58 -0
- package/dist/cli/src/cli.js.map +1 -0
- package/dist/cli/src/commands/generate.d.ts +5 -0
- package/dist/cli/src/commands/generate.d.ts.map +1 -0
- package/dist/cli/src/commands/generate.js +89 -0
- package/dist/cli/src/commands/generate.js.map +1 -0
- package/dist/cli/src/commands/index.d.ts +4 -0
- package/dist/cli/src/commands/index.d.ts.map +1 -0
- package/dist/cli/src/commands/index.js +4 -0
- package/dist/cli/src/commands/index.js.map +1 -0
- package/dist/cli/src/commands/init.d.ts +5 -0
- package/dist/cli/src/commands/init.d.ts.map +1 -0
- package/dist/cli/src/commands/init.js +96 -0
- package/dist/cli/src/commands/init.js.map +1 -0
- package/dist/cli/src/commands/migrate.d.ts +5 -0
- package/dist/cli/src/commands/migrate.d.ts.map +1 -0
- package/dist/cli/src/commands/migrate.js +114 -0
- package/dist/cli/src/commands/migrate.js.map +1 -0
- package/dist/cli/src/generators/index.d.ts +4 -0
- package/dist/cli/src/generators/index.d.ts.map +1 -0
- package/dist/cli/src/generators/index.js +4 -0
- package/dist/cli/src/generators/index.js.map +1 -0
- package/dist/cli/src/generators/migration-generator.d.ts +16 -0
- package/dist/cli/src/generators/migration-generator.d.ts.map +1 -0
- package/dist/cli/src/generators/migration-generator.js +118 -0
- package/dist/cli/src/generators/migration-generator.js.map +1 -0
- package/dist/cli/src/generators/migration-sql-generator.d.ts +26 -0
- package/dist/cli/src/generators/migration-sql-generator.d.ts.map +1 -0
- package/dist/cli/src/generators/migration-sql-generator.js +253 -0
- package/dist/cli/src/generators/migration-sql-generator.js.map +1 -0
- package/dist/cli/src/generators/schema-loader.d.ts +22 -0
- package/dist/cli/src/generators/schema-loader.d.ts.map +1 -0
- package/dist/cli/src/generators/schema-loader.js +72 -0
- package/dist/cli/src/generators/schema-loader.js.map +1 -0
- package/dist/cli/src/generators/sdk-generator.d.ts +10 -0
- package/dist/cli/src/generators/sdk-generator.d.ts.map +1 -0
- package/dist/cli/src/generators/sdk-generator.js +185 -0
- package/dist/cli/src/generators/sdk-generator.js.map +1 -0
- package/dist/cli/src/generators/sdk-ts-generator.d.ts +6 -0
- package/dist/cli/src/generators/sdk-ts-generator.d.ts.map +1 -0
- package/dist/cli/src/generators/sdk-ts-generator.js +105 -0
- package/dist/cli/src/generators/sdk-ts-generator.js.map +1 -0
- package/dist/cli/src/index.d.ts +3 -0
- package/dist/cli/src/index.d.ts.map +1 -0
- package/dist/cli/src/index.js +3 -0
- package/dist/cli/src/index.js.map +1 -0
- package/dist/schema/src/builder/index.d.ts +3 -0
- package/dist/schema/src/builder/index.d.ts.map +1 -0
- package/dist/schema/src/builder/index.js +3 -0
- package/dist/schema/src/builder/index.js.map +1 -0
- package/dist/schema/src/builder/schema-builder.d.ts +54 -0
- package/dist/schema/src/builder/schema-builder.d.ts.map +1 -0
- package/dist/schema/src/builder/schema-builder.js +144 -0
- package/dist/schema/src/builder/schema-builder.js.map +1 -0
- package/dist/schema/src/index.d.ts +3 -0
- package/dist/schema/src/index.d.ts.map +1 -0
- package/dist/schema/src/index.js +3 -0
- package/dist/schema/src/index.js.map +1 -0
- package/dist/shared-types/src/admin.d.ts +101 -0
- package/dist/shared-types/src/admin.d.ts.map +1 -0
- package/dist/shared-types/src/admin.js +3 -0
- package/dist/shared-types/src/admin.js.map +1 -0
- package/dist/shared-types/src/auth.d.ts +27 -0
- package/dist/shared-types/src/auth.d.ts.map +1 -0
- package/dist/shared-types/src/auth.js +2 -0
- package/dist/shared-types/src/auth.js.map +1 -0
- package/dist/shared-types/src/index.d.ts +5 -0
- package/dist/shared-types/src/index.d.ts.map +1 -0
- package/dist/shared-types/src/index.js +5 -0
- package/dist/shared-types/src/index.js.map +1 -0
- package/dist/shared-types/src/schema.d.ts +34 -0
- package/dist/shared-types/src/schema.d.ts.map +1 -0
- package/dist/shared-types/src/schema.js +2 -0
- package/dist/shared-types/src/schema.js.map +1 -0
- package/dist/shared-types/src/sync.d.ts +37 -0
- package/dist/shared-types/src/sync.d.ts.map +1 -0
- package/dist/shared-types/src/sync.js +2 -0
- package/dist/shared-types/src/sync.js.map +1 -0
- package/package.json +31 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/cli.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { initProject } from './commands/init.js';
|
|
3
|
+
import { generate } from './commands/generate.js';
|
|
4
|
+
import { migrate } from './commands/migrate.js';
|
|
5
|
+
const args = process.argv.slice(2);
|
|
6
|
+
const command = args[0];
|
|
7
|
+
const projectDir = process.cwd();
|
|
8
|
+
async function main() {
|
|
9
|
+
try {
|
|
10
|
+
switch (command) {
|
|
11
|
+
case 'init':
|
|
12
|
+
await initProject(projectDir);
|
|
13
|
+
break;
|
|
14
|
+
case 'generate':
|
|
15
|
+
await generate(projectDir);
|
|
16
|
+
break;
|
|
17
|
+
case 'migrate':
|
|
18
|
+
await migrate(projectDir);
|
|
19
|
+
break;
|
|
20
|
+
case '--version':
|
|
21
|
+
case '-v':
|
|
22
|
+
console.log('EdgeBase CLI v0.1.0');
|
|
23
|
+
break;
|
|
24
|
+
case '--help':
|
|
25
|
+
case '-h':
|
|
26
|
+
case undefined:
|
|
27
|
+
console.log(`
|
|
28
|
+
EdgeBase CLI v0.1.0
|
|
29
|
+
|
|
30
|
+
Usage: edgebase <command>
|
|
31
|
+
|
|
32
|
+
Commands:
|
|
33
|
+
init Initialize a new EdgeBase project
|
|
34
|
+
generate Generate migrations and SDK from schema
|
|
35
|
+
migrate Run pending database migrations
|
|
36
|
+
|
|
37
|
+
Options:
|
|
38
|
+
-h, --help Show this help message
|
|
39
|
+
-v, --version Show version
|
|
40
|
+
|
|
41
|
+
Examples:
|
|
42
|
+
edgebase init
|
|
43
|
+
edgebase generate
|
|
44
|
+
edgebase migrate
|
|
45
|
+
`);
|
|
46
|
+
break;
|
|
47
|
+
default:
|
|
48
|
+
console.error(`Unknown command: ${command}`);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
main();
|
|
58
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACxB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAEjC,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,MAAM;gBACT,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC;gBAC9B,MAAM;YACR,KAAK,UAAU;gBACb,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAC3B,MAAM;YACR,KAAK,SAAS;gBACZ,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;gBAC1B,MAAM;YACR,KAAK,WAAW,CAAC;YACjB,KAAK,IAAI;gBACP,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI,CAAC;YACV,KAAK,SAAS;gBACZ,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;CAkBnB,CAAC,CAAC;gBACK,MAAM;YACR;gBACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;gBAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../../src/commands/generate.ts"],"names":[],"mappings":"AAaA;;GAEG;AACH,wBAAsB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8FhE"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// Generate migrations and SDK from schema
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { loadSchema, loadSchemaHistory, saveSchemaHistory } from '../generators/schema-loader.js';
|
|
5
|
+
import { diffSchemas, generateMigrationSQL, generateMigrationFilename, } from '../generators/migration-sql-generator.js';
|
|
6
|
+
import { generateSDK } from '../generators/sdk-ts-generator.js';
|
|
7
|
+
import { validateSchema } from '@edgebasejs/schema';
|
|
8
|
+
/**
|
|
9
|
+
* Generate migrations and SDK from schema
|
|
10
|
+
*/
|
|
11
|
+
export async function generate(projectDir) {
|
|
12
|
+
console.log('📝 Generating migrations and SDK...');
|
|
13
|
+
try {
|
|
14
|
+
const schemaFile = path.join(projectDir, 'edgebase.schema.ts');
|
|
15
|
+
if (!fs.existsSync(schemaFile)) {
|
|
16
|
+
throw new Error('edgebase.schema.ts not found. Run: npx edgebase init');
|
|
17
|
+
}
|
|
18
|
+
// Step 1: Load current schema
|
|
19
|
+
console.log(' • Loading schema...');
|
|
20
|
+
const currentSchema = await loadSchema(projectDir);
|
|
21
|
+
// Step 2: Validate schema
|
|
22
|
+
console.log(' • Validating schema...');
|
|
23
|
+
validateSchema(currentSchema);
|
|
24
|
+
// Step 3: Load schema history
|
|
25
|
+
const history = loadSchemaHistory(projectDir);
|
|
26
|
+
const previousSchema = history.schema;
|
|
27
|
+
// Step 4: Diff schemas
|
|
28
|
+
console.log(' • Comparing with previous schema...');
|
|
29
|
+
const diff = diffSchemas(previousSchema, currentSchema);
|
|
30
|
+
const hasChanges = Object.keys(diff.newEntities).length > 0 ||
|
|
31
|
+
Object.keys(diff.modifiedEntities).length > 0 ||
|
|
32
|
+
Object.keys(diff.deletedEntities).length > 0;
|
|
33
|
+
if (!hasChanges) {
|
|
34
|
+
console.log('✓ Schema validation passed');
|
|
35
|
+
console.log('✓ No schema changes detected');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// Step 5: Generate migration
|
|
39
|
+
console.log(' • Generating migration SQL...');
|
|
40
|
+
const { up, down } = generateMigrationSQL(diff);
|
|
41
|
+
const nextVersion = history.version + 1;
|
|
42
|
+
const migrationFilename = generateMigrationFilename('schema changes', nextVersion);
|
|
43
|
+
const migrationsDir = path.join(projectDir, 'migrations');
|
|
44
|
+
if (!fs.existsSync(migrationsDir)) {
|
|
45
|
+
fs.mkdirSync(migrationsDir, { recursive: true });
|
|
46
|
+
}
|
|
47
|
+
const migrationPath = path.join(migrationsDir, migrationFilename);
|
|
48
|
+
fs.writeFileSync(migrationPath, up);
|
|
49
|
+
console.log(` ✓ Generated migration: ${migrationFilename}`);
|
|
50
|
+
// Step 6: Generate SDK
|
|
51
|
+
console.log(' • Generating TypeScript SDK...');
|
|
52
|
+
const sdk = generateSDK(currentSchema);
|
|
53
|
+
const generatedDir = path.join(projectDir, '.edgebase', 'generated');
|
|
54
|
+
if (!fs.existsSync(generatedDir)) {
|
|
55
|
+
fs.mkdirSync(generatedDir, { recursive: true });
|
|
56
|
+
}
|
|
57
|
+
const sdkPath = path.join(generatedDir, 'sdk.ts');
|
|
58
|
+
fs.writeFileSync(sdkPath, sdk);
|
|
59
|
+
console.log(' ✓ Generated SDK: .edgebase/generated/sdk.ts');
|
|
60
|
+
// Step 7: Update schema history
|
|
61
|
+
console.log(' • Updating schema history...');
|
|
62
|
+
saveSchemaHistory(projectDir, {
|
|
63
|
+
version: nextVersion,
|
|
64
|
+
timestamp: Date.now(),
|
|
65
|
+
schema: currentSchema,
|
|
66
|
+
});
|
|
67
|
+
console.log('');
|
|
68
|
+
console.log('✅ Generation complete!');
|
|
69
|
+
console.log('');
|
|
70
|
+
console.log('Generated files:');
|
|
71
|
+
console.log(` - migrations/${migrationFilename}`);
|
|
72
|
+
console.log(' - .edgebase/generated/sdk.ts');
|
|
73
|
+
console.log('');
|
|
74
|
+
console.log('Summary of changes:');
|
|
75
|
+
console.log(` • New entities: ${Object.keys(diff.newEntities).length}`);
|
|
76
|
+
console.log(` • Modified entities: ${Object.keys(diff.modifiedEntities).length}`);
|
|
77
|
+
console.log(` • Deleted entities: ${Object.keys(diff.deletedEntities).length}`);
|
|
78
|
+
console.log('');
|
|
79
|
+
console.log('Next steps:');
|
|
80
|
+
console.log(' 1. Review the generated migration file');
|
|
81
|
+
console.log(' 2. Run: npx edgebase migrate');
|
|
82
|
+
console.log(' 3. Commit generated files to git');
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.error('❌ Generation failed:', error instanceof Error ? error.message : error);
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAE1C,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAClG,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,UAAkB;IAC/C,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;QAC/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QAED,8BAA8B;QAC9B,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;QAEnD,0BAA0B;QAC1B,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,cAAc,CAAC,aAAa,CAAC,CAAC;QAE9B,8BAA8B;QAC9B,MAAM,OAAO,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;QAEtC,uBAAuB;QACvB,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,WAAW,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;QAExD,MAAM,UAAU,GACd,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,GAAG,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAE/C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,6BAA6B;QAC7B,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC;QACxC,MAAM,iBAAiB,GAAG,yBAAyB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;QACnF,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAE1D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAClC,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;QAClE,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QAEpC,OAAO,CAAC,GAAG,CAAC,4BAA4B,iBAAiB,EAAE,CAAC,CAAC;QAE7D,uBAAuB;QACvB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAErE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAClD,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAE/B,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAE7D,gCAAgC;QAChC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,iBAAiB,CAAC,UAAU,EAAE;YAC5B,OAAO,EAAE,WAAW;YACpB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,kBAAkB,iBAAiB,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,yBAAyB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACtF,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../src/commands/init.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4GnE"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// Initialize new EdgeBase project
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
/**
|
|
5
|
+
* Initialize a new EdgeBase project
|
|
6
|
+
*/
|
|
7
|
+
export async function initProject(projectDir) {
|
|
8
|
+
console.log('🚀 Initializing EdgeBase project...');
|
|
9
|
+
// Create .edgebase directory
|
|
10
|
+
const edgebaseDir = path.join(projectDir, '.edgebase');
|
|
11
|
+
if (!fs.existsSync(edgebaseDir)) {
|
|
12
|
+
fs.mkdirSync(edgebaseDir, { recursive: true });
|
|
13
|
+
console.log(`✓ Created .edgebase directory`);
|
|
14
|
+
}
|
|
15
|
+
// Create migrations directory
|
|
16
|
+
const migrationsDir = path.join(projectDir, 'migrations');
|
|
17
|
+
if (!fs.existsSync(migrationsDir)) {
|
|
18
|
+
fs.mkdirSync(migrationsDir, { recursive: true });
|
|
19
|
+
console.log(`✓ Created migrations directory`);
|
|
20
|
+
}
|
|
21
|
+
// Create schema template if doesn't exist
|
|
22
|
+
const schemaFile = path.join(projectDir, 'edgebase.schema.ts');
|
|
23
|
+
if (!fs.existsSync(schemaFile)) {
|
|
24
|
+
const schemaTemplate = `// EdgeBase schema definition
|
|
25
|
+
import type { DatabaseSchema } from '@edgebasejs/types';
|
|
26
|
+
|
|
27
|
+
const schema: DatabaseSchema = {
|
|
28
|
+
entities: {
|
|
29
|
+
todos: {
|
|
30
|
+
fields: {
|
|
31
|
+
id: {
|
|
32
|
+
type: 'string',
|
|
33
|
+
required: true,
|
|
34
|
+
primary: true,
|
|
35
|
+
description: 'Unique identifier for todo',
|
|
36
|
+
},
|
|
37
|
+
title: {
|
|
38
|
+
type: 'string',
|
|
39
|
+
required: true,
|
|
40
|
+
description: 'Todo title',
|
|
41
|
+
},
|
|
42
|
+
completed: {
|
|
43
|
+
type: 'boolean',
|
|
44
|
+
required: true,
|
|
45
|
+
default: false,
|
|
46
|
+
description: 'Whether todo is completed',
|
|
47
|
+
},
|
|
48
|
+
createdAt: {
|
|
49
|
+
type: 'timestamp',
|
|
50
|
+
required: true,
|
|
51
|
+
description: 'When todo was created',
|
|
52
|
+
},
|
|
53
|
+
updatedAt: {
|
|
54
|
+
type: 'timestamp',
|
|
55
|
+
required: true,
|
|
56
|
+
description: 'When todo was last updated',
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export default schema;
|
|
64
|
+
`;
|
|
65
|
+
fs.writeFileSync(schemaFile, schemaTemplate);
|
|
66
|
+
console.log(`✓ Created edgebase.schema.ts template`);
|
|
67
|
+
}
|
|
68
|
+
// Create schema history
|
|
69
|
+
const historyFile = path.join(edgebaseDir, 'schema-history.json');
|
|
70
|
+
if (!fs.existsSync(historyFile)) {
|
|
71
|
+
fs.writeFileSync(historyFile, JSON.stringify({
|
|
72
|
+
version: 0,
|
|
73
|
+
timestamp: Date.now(),
|
|
74
|
+
schema: { entities: {} },
|
|
75
|
+
}, null, 2));
|
|
76
|
+
console.log(`✓ Created schema-history.json`);
|
|
77
|
+
}
|
|
78
|
+
// Create config file
|
|
79
|
+
const configFile = path.join(edgebaseDir, 'config.json');
|
|
80
|
+
if (!fs.existsSync(configFile)) {
|
|
81
|
+
fs.writeFileSync(configFile, JSON.stringify({
|
|
82
|
+
projectName: 'my-project',
|
|
83
|
+
version: '0.1.0',
|
|
84
|
+
createdAt: new Date().toISOString(),
|
|
85
|
+
}, null, 2));
|
|
86
|
+
console.log(`✓ Created config.json`);
|
|
87
|
+
}
|
|
88
|
+
console.log('');
|
|
89
|
+
console.log('✅ EdgeBase project initialized!');
|
|
90
|
+
console.log('');
|
|
91
|
+
console.log('Next steps:');
|
|
92
|
+
console.log(' 1. Update edgebase.schema.ts with your entities');
|
|
93
|
+
console.log(' 2. Run: npx edgebase generate');
|
|
94
|
+
console.log(' 3. Commit generated files to git');
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../../src/commands/migrate.ts"],"names":[],"mappings":"AA0CA;;GAEG;AACH,wBAAsB,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiG/D"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// Run database migrations
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { execSync } from 'child_process';
|
|
5
|
+
/**
|
|
6
|
+
* Load applied migrations
|
|
7
|
+
*/
|
|
8
|
+
function loadAppliedMigrations(projectDir) {
|
|
9
|
+
const historyPath = path.join(projectDir, '.edgebase', 'migrations-applied.json');
|
|
10
|
+
if (!fs.existsSync(historyPath)) {
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
const content = fs.readFileSync(historyPath, 'utf-8');
|
|
14
|
+
return JSON.parse(content);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Save applied migrations
|
|
18
|
+
*/
|
|
19
|
+
function saveAppliedMigrations(projectDir, migrations) {
|
|
20
|
+
const historyPath = path.join(projectDir, '.edgebase', 'migrations-applied.json');
|
|
21
|
+
fs.writeFileSync(historyPath, JSON.stringify(migrations, null, 2));
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Extract version from migration filename
|
|
25
|
+
*/
|
|
26
|
+
function extractVersion(filename) {
|
|
27
|
+
const match = filename.match(/^(\d+)_/);
|
|
28
|
+
return match ? parseInt(match[1], 10) : 0;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Run pending migrations
|
|
32
|
+
*/
|
|
33
|
+
export async function migrate(projectDir) {
|
|
34
|
+
console.log('🗄️ Running migrations...');
|
|
35
|
+
try {
|
|
36
|
+
const migrationsDir = path.join(projectDir, 'migrations');
|
|
37
|
+
if (!fs.existsSync(migrationsDir)) {
|
|
38
|
+
throw new Error('migrations directory not found. Run: npx edgebase init');
|
|
39
|
+
}
|
|
40
|
+
// Get all migration files
|
|
41
|
+
const migrationFiles = fs
|
|
42
|
+
.readdirSync(migrationsDir)
|
|
43
|
+
.filter((f) => f.endsWith('.sql'))
|
|
44
|
+
.sort();
|
|
45
|
+
if (migrationFiles.length === 0) {
|
|
46
|
+
console.log('ℹ️ No migrations found');
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// Load applied migrations
|
|
50
|
+
const appliedMigrations = loadAppliedMigrations(projectDir);
|
|
51
|
+
const appliedVersions = new Set(appliedMigrations.map((m) => m.version));
|
|
52
|
+
// Find pending migrations
|
|
53
|
+
const pendingMigrations = migrationFiles.filter((file) => {
|
|
54
|
+
const version = extractVersion(file);
|
|
55
|
+
return !appliedVersions.has(version);
|
|
56
|
+
});
|
|
57
|
+
if (pendingMigrations.length === 0) {
|
|
58
|
+
console.log('✓ All migrations already applied');
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
console.log(`Found ${pendingMigrations.length} pending migration(s):`);
|
|
62
|
+
for (const migration of pendingMigrations) {
|
|
63
|
+
console.log(` - ${migration}`);
|
|
64
|
+
}
|
|
65
|
+
// Find worker directory
|
|
66
|
+
const workerDir = path.join(projectDir, 'apps', 'worker');
|
|
67
|
+
if (!fs.existsSync(workerDir)) {
|
|
68
|
+
console.log('');
|
|
69
|
+
console.log('⚠️ Worker directory not found. Please run migrations manually:');
|
|
70
|
+
console.log('');
|
|
71
|
+
for (const migration of pendingMigrations) {
|
|
72
|
+
const migrationPath = path.join('migrations', migration);
|
|
73
|
+
console.log(` wrangler d1 execute edgebase --file="${migrationPath}"`);
|
|
74
|
+
}
|
|
75
|
+
console.log('');
|
|
76
|
+
console.log('Then update .edgebase/migrations-applied.json with applied migrations.');
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Run migrations
|
|
80
|
+
console.log('');
|
|
81
|
+
console.log('Running migrations...');
|
|
82
|
+
for (const migration of pendingMigrations) {
|
|
83
|
+
try {
|
|
84
|
+
const migrationPath = path.relative(workerDir, path.join(migrationsDir, migration));
|
|
85
|
+
console.log(` • Applying: ${migration}`);
|
|
86
|
+
// Execute migration via wrangler
|
|
87
|
+
execSync(`cd "${workerDir}" && npx wrangler d1 execute edgebase --file="${migrationPath}"`, {
|
|
88
|
+
stdio: 'pipe',
|
|
89
|
+
});
|
|
90
|
+
// Record as applied
|
|
91
|
+
const version = extractVersion(migration);
|
|
92
|
+
appliedMigrations.push({
|
|
93
|
+
version,
|
|
94
|
+
name: migration,
|
|
95
|
+
appliedAt: Date.now(),
|
|
96
|
+
});
|
|
97
|
+
console.log(` ✓ Applied`);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
console.error(` ✗ Failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Save applied migrations
|
|
105
|
+
saveAppliedMigrations(projectDir, appliedMigrations);
|
|
106
|
+
console.log('');
|
|
107
|
+
console.log('✅ All migrations applied successfully!');
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
console.error('❌ Migration failed:', error instanceof Error ? error.message : error);
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/generators/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/generators/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { DatabaseSchema } from '@edgebasejs/types';
|
|
2
|
+
export interface GeneratedMigration {
|
|
3
|
+
version: number;
|
|
4
|
+
name: string;
|
|
5
|
+
up: string;
|
|
6
|
+
down: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Generate migration from schema
|
|
10
|
+
*/
|
|
11
|
+
export declare function generateMigration(schema: DatabaseSchema, version: number, name: string): GeneratedMigration;
|
|
12
|
+
/**
|
|
13
|
+
* Format migration for file output
|
|
14
|
+
*/
|
|
15
|
+
export declare function formatMigrationFile(migration: GeneratedMigration): string;
|
|
16
|
+
//# sourceMappingURL=migration-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-generator.d.ts","sourceRoot":"","sources":["../../../../src/generators/migration-generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,mBAAmB,CAAC;AAEtE,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAuGD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,kBAAkB,CAsBpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,kBAAkB,GAAG,MAAM,CASzE"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// SQL Migration generator from schema definitions
|
|
2
|
+
/**
|
|
3
|
+
* Convert field type to SQL type
|
|
4
|
+
*/
|
|
5
|
+
function getSQLType(fieldType) {
|
|
6
|
+
switch (fieldType) {
|
|
7
|
+
case 'string':
|
|
8
|
+
return 'TEXT';
|
|
9
|
+
case 'integer':
|
|
10
|
+
return 'INTEGER';
|
|
11
|
+
case 'number':
|
|
12
|
+
return 'REAL';
|
|
13
|
+
case 'boolean':
|
|
14
|
+
return 'INTEGER'; // SQLite uses 0/1 for boolean
|
|
15
|
+
case 'text':
|
|
16
|
+
return 'TEXT';
|
|
17
|
+
case 'timestamp':
|
|
18
|
+
return 'INTEGER'; // Unix timestamp in milliseconds
|
|
19
|
+
case 'json':
|
|
20
|
+
return 'TEXT'; // JSON stored as text
|
|
21
|
+
case 'reference':
|
|
22
|
+
return 'TEXT'; // Foreign key ID
|
|
23
|
+
default:
|
|
24
|
+
return 'TEXT';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Generate CREATE TABLE statement
|
|
29
|
+
*/
|
|
30
|
+
function generateCreateTableSQL(entityName, schema, includeConstraints = true) {
|
|
31
|
+
const columns = [];
|
|
32
|
+
for (const [fieldName, field] of Object.entries(schema.fields)) {
|
|
33
|
+
let column = `${fieldName} ${getSQLType(field.type)}`;
|
|
34
|
+
if (field.primary) {
|
|
35
|
+
column += ' PRIMARY KEY';
|
|
36
|
+
}
|
|
37
|
+
if (field.required && !field.primary) {
|
|
38
|
+
column += ' NOT NULL';
|
|
39
|
+
}
|
|
40
|
+
if (field.default !== undefined) {
|
|
41
|
+
if (typeof field.default === 'string') {
|
|
42
|
+
column += ` DEFAULT '${field.default.replace(/'/g, "''")}'`;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
column += ` DEFAULT ${field.default}`;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (field.reference && includeConstraints) {
|
|
49
|
+
column += ` REFERENCES ${field.reference}(id) ON DELETE CASCADE`;
|
|
50
|
+
}
|
|
51
|
+
columns.push(column);
|
|
52
|
+
}
|
|
53
|
+
// Add composite primary key if needed
|
|
54
|
+
const primaryKeys = Object.entries(schema.fields)
|
|
55
|
+
.filter(([, f]) => f.primary)
|
|
56
|
+
.map(([name]) => name);
|
|
57
|
+
if (primaryKeys.length > 1) {
|
|
58
|
+
columns.push(`PRIMARY KEY (${primaryKeys.join(', ')})`);
|
|
59
|
+
}
|
|
60
|
+
return `CREATE TABLE IF NOT EXISTS ${entityName} (\n ${columns.join(',\n ')}\n);`;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Generate indexes
|
|
64
|
+
*/
|
|
65
|
+
function generateIndexesSQL(entityName, schema) {
|
|
66
|
+
const sqls = [];
|
|
67
|
+
if (schema.indexes) {
|
|
68
|
+
for (const index of schema.indexes) {
|
|
69
|
+
const indexName = `idx_${entityName}_${index.fields.join('_')}`;
|
|
70
|
+
const uniqueKeyword = index.unique ? 'UNIQUE' : '';
|
|
71
|
+
sqls.push(`CREATE ${uniqueKeyword} INDEX IF NOT EXISTS ${indexName} ON ${entityName}(${index.fields.join(', ')});`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Add default indexes for foreign keys
|
|
75
|
+
for (const [fieldName, field] of Object.entries(schema.fields)) {
|
|
76
|
+
if (field.reference && !schema.indexes?.some((idx) => idx.fields.includes(fieldName))) {
|
|
77
|
+
const indexName = `idx_${entityName}_${fieldName}`;
|
|
78
|
+
sqls.push(`CREATE INDEX IF NOT EXISTS ${indexName} ON ${entityName}(${fieldName});`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return sqls;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Generate migration from schema
|
|
85
|
+
*/
|
|
86
|
+
export function generateMigration(schema, version, name) {
|
|
87
|
+
const upStatements = [];
|
|
88
|
+
const downStatements = [];
|
|
89
|
+
// Generate CREATE TABLE statements
|
|
90
|
+
for (const [entityName, entitySchema] of Object.entries(schema.entities)) {
|
|
91
|
+
upStatements.push(generateCreateTableSQL(entityName, entitySchema));
|
|
92
|
+
// Generate indexes
|
|
93
|
+
const indexes = generateIndexesSQL(entityName, entitySchema);
|
|
94
|
+
upStatements.push(...indexes);
|
|
95
|
+
// Generate DROP TABLE for down migration
|
|
96
|
+
downStatements.unshift(`DROP TABLE IF EXISTS ${entityName};`);
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
version,
|
|
100
|
+
name,
|
|
101
|
+
up: upStatements.join('\n\n'),
|
|
102
|
+
down: downStatements.join('\n'),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Format migration for file output
|
|
107
|
+
*/
|
|
108
|
+
export function formatMigrationFile(migration) {
|
|
109
|
+
return `-- Migration ${migration.version}: ${migration.name}
|
|
110
|
+
|
|
111
|
+
-- Up migration
|
|
112
|
+
${migration.up}
|
|
113
|
+
|
|
114
|
+
-- Down migration (for rollback)
|
|
115
|
+
-- ${migration.down}
|
|
116
|
+
`;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=migration-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-generator.js","sourceRoot":"","sources":["../../../../src/generators/migration-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { DatabaseSchema, EntitySchema } from '@edgebasejs/types';
|
|
2
|
+
interface SchemaDiff {
|
|
3
|
+
newEntities: Record<string, EntitySchema>;
|
|
4
|
+
modifiedEntities: Record<string, {
|
|
5
|
+
oldSchema: EntitySchema;
|
|
6
|
+
newSchema: EntitySchema;
|
|
7
|
+
}>;
|
|
8
|
+
deletedEntities: Record<string, EntitySchema>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Compare two schemas and generate diff
|
|
12
|
+
*/
|
|
13
|
+
export declare function diffSchemas(oldSchema: DatabaseSchema, newSchema: DatabaseSchema): SchemaDiff;
|
|
14
|
+
/**
|
|
15
|
+
* Generate migration SQL
|
|
16
|
+
*/
|
|
17
|
+
export declare function generateMigrationSQL(diff: SchemaDiff): {
|
|
18
|
+
up: string;
|
|
19
|
+
down: string;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Generate migration filename
|
|
23
|
+
*/
|
|
24
|
+
export declare function generateMigrationFilename(description: string, version: number): string;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=migration-sql-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-sql-generator.d.ts","sourceRoot":"","sources":["../../../../src/generators/migration-sql-generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAa,MAAM,mBAAmB,CAAC;AAEjF,UAAU,UAAU;IAClB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC1C,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,YAAY,CAAC;QAAC,SAAS,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;IACvF,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAC/C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,GAAG,UAAU,CA6B5F;AA6ND;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAyCnF;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAStF"}
|