@uql/core 3.7.13 → 3.8.1
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/CHANGELOG.md +11 -2
- package/README.md +16 -8
- package/dist/browser/uql-browser.min.js +16 -15
- package/dist/browser/uql-browser.min.js.map +1 -1
- package/dist/dialect/abstractDialect.d.ts +7 -2
- package/dist/dialect/abstractDialect.d.ts.map +1 -1
- package/dist/dialect/abstractDialect.js +9 -1
- package/dist/dialect/abstractDialect.js.map +1 -1
- package/dist/dialect/abstractSqlDialect.d.ts +5 -6
- package/dist/dialect/abstractSqlDialect.d.ts.map +1 -1
- package/dist/dialect/abstractSqlDialect.js +14 -13
- package/dist/dialect/abstractSqlDialect.js.map +1 -1
- package/dist/dialect/dialectConfig.d.ts +17 -0
- package/dist/dialect/dialectConfig.d.ts.map +1 -0
- package/dist/dialect/dialectConfig.js +71 -0
- package/dist/dialect/dialectConfig.js.map +1 -0
- package/dist/dialect/index.d.ts +1 -0
- package/dist/dialect/index.d.ts.map +1 -1
- package/dist/dialect/index.js +1 -0
- package/dist/dialect/index.js.map +1 -1
- package/dist/entity/decorator/definition.d.ts.map +1 -1
- package/dist/entity/decorator/definition.js +2 -1
- package/dist/entity/decorator/definition.js.map +1 -1
- package/dist/entity/decorator/index-decorator.d.ts +36 -0
- package/dist/entity/decorator/index-decorator.d.ts.map +1 -0
- package/dist/entity/decorator/index-decorator.js +51 -0
- package/dist/entity/decorator/index-decorator.js.map +1 -0
- package/dist/entity/decorator/index.d.ts +1 -0
- package/dist/entity/decorator/index.d.ts.map +1 -1
- package/dist/entity/decorator/index.js +1 -0
- package/dist/entity/decorator/index.js.map +1 -1
- package/dist/maria/mariaDialect.d.ts +2 -1
- package/dist/maria/mariaDialect.d.ts.map +1 -1
- package/dist/maria/mariaDialect.js +3 -0
- package/dist/maria/mariaDialect.js.map +1 -1
- package/dist/migrate/builder/columnBuilder.d.ts +75 -0
- package/dist/migrate/builder/columnBuilder.d.ts.map +1 -0
- package/dist/migrate/builder/columnBuilder.js +149 -0
- package/dist/migrate/builder/columnBuilder.js.map +1 -0
- package/dist/migrate/builder/expressions.d.ts +87 -0
- package/dist/migrate/builder/expressions.d.ts.map +1 -0
- package/dist/migrate/builder/expressions.js +150 -0
- package/dist/migrate/builder/expressions.js.map +1 -0
- package/dist/migrate/builder/index.d.ts +6 -0
- package/dist/migrate/builder/index.d.ts.map +1 -0
- package/dist/migrate/builder/index.js +6 -0
- package/dist/migrate/builder/index.js.map +1 -0
- package/dist/migrate/builder/migrationBuilder.d.ts +73 -0
- package/dist/migrate/builder/migrationBuilder.d.ts.map +1 -0
- package/dist/migrate/builder/migrationBuilder.js +326 -0
- package/dist/migrate/builder/migrationBuilder.js.map +1 -0
- package/dist/migrate/builder/tableBuilder.d.ts +51 -0
- package/dist/migrate/builder/tableBuilder.d.ts.map +1 -0
- package/dist/migrate/builder/tableBuilder.js +278 -0
- package/dist/migrate/builder/tableBuilder.js.map +1 -0
- package/dist/migrate/builder/types.d.ts +462 -0
- package/dist/migrate/builder/types.d.ts.map +1 -0
- package/dist/migrate/builder/types.js +8 -0
- package/dist/migrate/builder/types.js.map +1 -0
- package/dist/migrate/cli.d.ts +4 -6
- package/dist/migrate/cli.d.ts.map +1 -1
- package/dist/migrate/cli.js +166 -23
- package/dist/migrate/cli.js.map +1 -1
- package/dist/migrate/codegen/entityCodeGenerator.d.ts +137 -0
- package/dist/migrate/codegen/entityCodeGenerator.d.ts.map +1 -0
- package/dist/migrate/codegen/entityCodeGenerator.js +401 -0
- package/dist/migrate/codegen/entityCodeGenerator.js.map +1 -0
- package/dist/migrate/codegen/entityMerger.d.ts +111 -0
- package/dist/migrate/codegen/entityMerger.d.ts.map +1 -0
- package/dist/migrate/codegen/entityMerger.js +291 -0
- package/dist/migrate/codegen/entityMerger.js.map +1 -0
- package/dist/migrate/codegen/index.d.ts +10 -0
- package/dist/migrate/codegen/index.d.ts.map +1 -0
- package/dist/migrate/codegen/index.js +14 -0
- package/dist/migrate/codegen/index.js.map +1 -0
- package/dist/migrate/codegen/migrationCodeGenerator.d.ts +62 -0
- package/dist/migrate/codegen/migrationCodeGenerator.d.ts.map +1 -0
- package/dist/migrate/codegen/migrationCodeGenerator.js +356 -0
- package/dist/migrate/codegen/migrationCodeGenerator.js.map +1 -0
- package/dist/migrate/codegen/smartRelationDetector.d.ts +48 -0
- package/dist/migrate/codegen/smartRelationDetector.d.ts.map +1 -0
- package/dist/migrate/codegen/smartRelationDetector.js +135 -0
- package/dist/migrate/codegen/smartRelationDetector.js.map +1 -0
- package/dist/migrate/drift/driftDetector.d.ts +81 -0
- package/dist/migrate/drift/driftDetector.d.ts.map +1 -0
- package/dist/migrate/drift/driftDetector.js +248 -0
- package/dist/migrate/drift/driftDetector.js.map +1 -0
- package/dist/migrate/drift/index.d.ts +7 -0
- package/dist/migrate/drift/index.d.ts.map +1 -0
- package/dist/migrate/drift/index.js +7 -0
- package/dist/migrate/drift/index.js.map +1 -0
- package/dist/migrate/generator/index.d.ts +1 -3
- package/dist/migrate/generator/index.d.ts.map +1 -1
- package/dist/migrate/generator/index.js +1 -3
- package/dist/migrate/generator/index.js.map +1 -1
- package/dist/migrate/generator/mongoSchemaGenerator.d.ts +29 -3
- package/dist/migrate/generator/mongoSchemaGenerator.d.ts.map +1 -1
- package/dist/migrate/generator/mongoSchemaGenerator.js +86 -4
- package/dist/migrate/generator/mongoSchemaGenerator.js.map +1 -1
- package/dist/migrate/index.d.ts +7 -8
- package/dist/migrate/index.d.ts.map +1 -1
- package/dist/migrate/index.js +11 -9
- package/dist/migrate/index.js.map +1 -1
- package/dist/migrate/introspection/baseSqlIntrospector.d.ts +28 -0
- package/dist/migrate/introspection/baseSqlIntrospector.d.ts.map +1 -0
- package/dist/migrate/introspection/baseSqlIntrospector.js +135 -0
- package/dist/migrate/introspection/baseSqlIntrospector.js.map +1 -0
- package/dist/migrate/introspection/mongoIntrospector.d.ts +6 -0
- package/dist/migrate/introspection/mongoIntrospector.d.ts.map +1 -1
- package/dist/migrate/introspection/mongoIntrospector.js +54 -0
- package/dist/migrate/introspection/mongoIntrospector.js.map +1 -1
- package/dist/migrate/introspection/mysqlIntrospector.d.ts +2 -1
- package/dist/migrate/introspection/mysqlIntrospector.d.ts.map +1 -1
- package/dist/migrate/introspection/mysqlIntrospector.js +8 -6
- package/dist/migrate/introspection/mysqlIntrospector.js.map +1 -1
- package/dist/migrate/introspection/postgresIntrospector.d.ts +2 -1
- package/dist/migrate/introspection/postgresIntrospector.d.ts.map +1 -1
- package/dist/migrate/introspection/postgresIntrospector.js +3 -1
- package/dist/migrate/introspection/postgresIntrospector.js.map +1 -1
- package/dist/migrate/introspection/sqliteIntrospector.d.ts +2 -2
- package/dist/migrate/introspection/sqliteIntrospector.d.ts.map +1 -1
- package/dist/migrate/introspection/sqliteIntrospector.js +3 -4
- package/dist/migrate/introspection/sqliteIntrospector.js.map +1 -1
- package/dist/migrate/migrator.d.ts +29 -0
- package/dist/migrate/migrator.d.ts.map +1 -1
- package/dist/migrate/migrator.js +31 -23
- package/dist/migrate/migrator.js.map +1 -1
- package/dist/migrate/schemaGenerator.d.ts +72 -22
- package/dist/migrate/schemaGenerator.d.ts.map +1 -1
- package/dist/migrate/schemaGenerator.js +385 -153
- package/dist/migrate/schemaGenerator.js.map +1 -1
- package/dist/migrate/sync/index.d.ts +7 -0
- package/dist/migrate/sync/index.d.ts.map +1 -0
- package/dist/migrate/sync/index.js +7 -0
- package/dist/migrate/sync/index.js.map +1 -0
- package/dist/migrate/sync/schemaSync.d.ts +132 -0
- package/dist/migrate/sync/schemaSync.d.ts.map +1 -0
- package/dist/migrate/sync/schemaSync.js +260 -0
- package/dist/migrate/sync/schemaSync.js.map +1 -0
- package/dist/mongo/mongoDialect.d.ts +2 -1
- package/dist/mongo/mongoDialect.d.ts.map +1 -1
- package/dist/mongo/mongoDialect.js +3 -0
- package/dist/mongo/mongoDialect.js.map +1 -1
- package/dist/mysql/mysqlDialect.d.ts +2 -0
- package/dist/mysql/mysqlDialect.d.ts.map +1 -1
- package/dist/mysql/mysqlDialect.js +3 -0
- package/dist/mysql/mysqlDialect.js.map +1 -1
- package/dist/postgres/postgresDialect.js +1 -1
- package/dist/postgres/postgresDialect.js.map +1 -1
- package/dist/schema/canonicalType.d.ts +42 -0
- package/dist/schema/canonicalType.d.ts.map +1 -0
- package/dist/schema/canonicalType.js +524 -0
- package/dist/schema/canonicalType.js.map +1 -0
- package/dist/schema/index.d.ts +28 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +29 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/schemaAST.d.ts +155 -0
- package/dist/schema/schemaAST.d.ts.map +1 -0
- package/dist/schema/schemaAST.js +496 -0
- package/dist/schema/schemaAST.js.map +1 -0
- package/dist/schema/schemaASTBuilder.d.ts +58 -0
- package/dist/schema/schemaASTBuilder.d.ts.map +1 -0
- package/dist/schema/schemaASTBuilder.js +193 -0
- package/dist/schema/schemaASTBuilder.js.map +1 -0
- package/dist/schema/schemaASTDiffer.d.ts +84 -0
- package/dist/schema/schemaASTDiffer.d.ts.map +1 -0
- package/dist/schema/schemaASTDiffer.js +431 -0
- package/dist/schema/schemaASTDiffer.js.map +1 -0
- package/dist/schema/types.d.ts +347 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +11 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/sqlite/sqliteDialect.js +1 -1
- package/dist/sqlite/sqliteDialect.js.map +1 -1
- package/dist/sqlite/sqliteQuerierPool.js.map +1 -1
- package/dist/type/config.d.ts +6 -0
- package/dist/type/config.d.ts.map +1 -1
- package/dist/type/entity.d.ts +24 -0
- package/dist/type/entity.d.ts.map +1 -1
- package/dist/type/migration.d.ts +50 -4
- package/dist/type/migration.d.ts.map +1 -1
- package/dist/util/field.util.d.ts +0 -1
- package/dist/util/field.util.d.ts.map +1 -1
- package/dist/util/field.util.js +8 -2
- package/dist/util/field.util.js.map +1 -1
- package/dist/util/logger.d.ts.map +1 -1
- package/dist/util/logger.js +2 -1
- package/dist/util/logger.js.map +1 -1
- package/dist/util/string.util.d.ts +24 -0
- package/dist/util/string.util.d.ts.map +1 -1
- package/dist/util/string.util.js +57 -0
- package/dist/util/string.util.js.map +1 -1
- package/package.json +2 -2
- package/dist/migrate/generator/mysqlSchemaGenerator.d.ts +0 -15
- package/dist/migrate/generator/mysqlSchemaGenerator.d.ts.map +0 -1
- package/dist/migrate/generator/mysqlSchemaGenerator.js +0 -88
- package/dist/migrate/generator/mysqlSchemaGenerator.js.map +0 -1
- package/dist/migrate/generator/postgresSchemaGenerator.d.ts +0 -19
- package/dist/migrate/generator/postgresSchemaGenerator.d.ts.map +0 -1
- package/dist/migrate/generator/postgresSchemaGenerator.js +0 -115
- package/dist/migrate/generator/postgresSchemaGenerator.js.map +0 -1
- package/dist/migrate/generator/sqliteSchemaGenerator.d.ts +0 -16
- package/dist/migrate/generator/sqliteSchemaGenerator.d.ts.map +0 -1
- package/dist/migrate/generator/sqliteSchemaGenerator.js +0 -74
- package/dist/migrate/generator/sqliteSchemaGenerator.js.map +0 -1
- package/dist/migrate/type.d.ts +0 -2
- package/dist/migrate/type.d.ts.map +0 -1
- package/dist/migrate/type.js +0 -2
- package/dist/migrate/type.js.map +0 -1
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration Code Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates TypeScript migration code from SchemaDiff.
|
|
5
|
+
* This enables auto-generating migrations from entity changes.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Generates TypeScript migration code from schema diffs.
|
|
9
|
+
*/
|
|
10
|
+
export class MigrationCodeGenerator {
|
|
11
|
+
indent;
|
|
12
|
+
includeComments;
|
|
13
|
+
constructor(options = {}) {
|
|
14
|
+
this.indent = options.indent ?? ' ';
|
|
15
|
+
this.includeComments = options.includeComments ?? true;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Generate migration code from a single SchemaDiff.
|
|
19
|
+
*/
|
|
20
|
+
generate(diff) {
|
|
21
|
+
const description = this.generateDescription(diff);
|
|
22
|
+
if (diff.type === 'create') {
|
|
23
|
+
return {
|
|
24
|
+
up: this.generateCreateTable(diff),
|
|
25
|
+
down: this.generateDropTable(diff.tableName),
|
|
26
|
+
description,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
if (diff.type === 'drop') {
|
|
30
|
+
return {
|
|
31
|
+
up: this.generateDropTable(diff.tableName),
|
|
32
|
+
down: '// Cannot auto-generate: original table structure unknown',
|
|
33
|
+
description,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
// alter
|
|
37
|
+
return {
|
|
38
|
+
up: this.generateAlterUp(diff),
|
|
39
|
+
down: this.generateAlterDown(diff),
|
|
40
|
+
description,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Generate migration code from multiple diffs.
|
|
45
|
+
*/
|
|
46
|
+
generateAll(diffs) {
|
|
47
|
+
const ups = [];
|
|
48
|
+
const downs = [];
|
|
49
|
+
const descriptions = [];
|
|
50
|
+
for (const diff of diffs) {
|
|
51
|
+
const result = this.generate(diff);
|
|
52
|
+
ups.push(result.up);
|
|
53
|
+
downs.push(result.down);
|
|
54
|
+
descriptions.push(result.description);
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
up: ups.join('\n\n'),
|
|
58
|
+
down: downs.reverse().join('\n\n'), // Reverse for correct rollback order
|
|
59
|
+
description: descriptions.join('; '),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Generate a complete migration file template.
|
|
64
|
+
*/
|
|
65
|
+
generateFile(diffs, name) {
|
|
66
|
+
const { up, down, description } = this.generateAll(diffs);
|
|
67
|
+
const timestamp = new Date()
|
|
68
|
+
.toISOString()
|
|
69
|
+
.replace(/[-:T.Z]/g, '')
|
|
70
|
+
.slice(0, 14);
|
|
71
|
+
const migrationName = name ?? `migration_${timestamp}`;
|
|
72
|
+
return `/**
|
|
73
|
+
* Migration: ${migrationName}
|
|
74
|
+
* ${description}
|
|
75
|
+
*
|
|
76
|
+
* Generated at: ${new Date().toISOString()}
|
|
77
|
+
*/
|
|
78
|
+
|
|
79
|
+
import type { IMigrationBuilder } from '@uql/core';
|
|
80
|
+
|
|
81
|
+
export async function up(builder: IMigrationBuilder): Promise<void> {
|
|
82
|
+
${this.indentBlock(up, 1)}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export async function down(builder: IMigrationBuilder): Promise<void> {
|
|
86
|
+
${this.indentBlock(down, 1)}
|
|
87
|
+
}
|
|
88
|
+
`;
|
|
89
|
+
}
|
|
90
|
+
// ===========================================================================
|
|
91
|
+
// Private: Code Generation
|
|
92
|
+
// ===========================================================================
|
|
93
|
+
generateCreateTable(diff) {
|
|
94
|
+
const columns = diff.columnsToAdd ?? [];
|
|
95
|
+
const lines = [];
|
|
96
|
+
lines.push(`await builder.createTable('${diff.tableName}', (table) => {`);
|
|
97
|
+
for (const col of columns) {
|
|
98
|
+
lines.push(`${this.indent}${this.generateColumnCall(col)};`);
|
|
99
|
+
}
|
|
100
|
+
// Add indexes if any
|
|
101
|
+
for (const idx of diff.indexesToAdd ?? []) {
|
|
102
|
+
lines.push(`${this.indent}${this.generateIndexCall(idx)};`);
|
|
103
|
+
}
|
|
104
|
+
lines.push('});');
|
|
105
|
+
return lines.join('\n');
|
|
106
|
+
}
|
|
107
|
+
generateDropTable(tableName) {
|
|
108
|
+
return `await builder.dropTable('${tableName}');`;
|
|
109
|
+
}
|
|
110
|
+
generateAlterUp(diff) {
|
|
111
|
+
const lines = [];
|
|
112
|
+
// Add columns
|
|
113
|
+
for (const col of diff.columnsToAdd ?? []) {
|
|
114
|
+
lines.push(this.generateAddColumn(diff.tableName, col));
|
|
115
|
+
}
|
|
116
|
+
// Alter columns
|
|
117
|
+
for (const { to } of diff.columnsToAlter ?? []) {
|
|
118
|
+
lines.push(this.generateAlterColumn(diff.tableName, to));
|
|
119
|
+
}
|
|
120
|
+
// Drop columns
|
|
121
|
+
for (const colName of diff.columnsToDrop ?? []) {
|
|
122
|
+
lines.push(`await builder.dropColumn('${diff.tableName}', '${colName}');`);
|
|
123
|
+
}
|
|
124
|
+
// Add indexes
|
|
125
|
+
for (const idx of diff.indexesToAdd ?? []) {
|
|
126
|
+
lines.push(this.generateCreateIndex(diff.tableName, idx));
|
|
127
|
+
}
|
|
128
|
+
// Drop indexes
|
|
129
|
+
for (const idxName of diff.indexesToDrop ?? []) {
|
|
130
|
+
lines.push(`await builder.dropIndex('${diff.tableName}', '${idxName}');`);
|
|
131
|
+
}
|
|
132
|
+
// Add foreign keys
|
|
133
|
+
for (const fk of diff.foreignKeysToAdd ?? []) {
|
|
134
|
+
lines.push(this.generateAddForeignKey(diff.tableName, fk));
|
|
135
|
+
}
|
|
136
|
+
// Drop foreign keys
|
|
137
|
+
for (const fkName of diff.foreignKeysToDrop ?? []) {
|
|
138
|
+
lines.push(`await builder.dropForeignKey('${diff.tableName}', '${fkName}');`);
|
|
139
|
+
}
|
|
140
|
+
return lines.join('\n');
|
|
141
|
+
}
|
|
142
|
+
generateAlterDown(diff) {
|
|
143
|
+
const lines = [];
|
|
144
|
+
// Reverse: drop added columns
|
|
145
|
+
for (const col of diff.columnsToAdd ?? []) {
|
|
146
|
+
lines.push(`await builder.dropColumn('${diff.tableName}', '${col.name}');`);
|
|
147
|
+
}
|
|
148
|
+
// Reverse: restore altered columns
|
|
149
|
+
for (const { from } of diff.columnsToAlter ?? []) {
|
|
150
|
+
lines.push(this.generateAlterColumn(diff.tableName, from));
|
|
151
|
+
}
|
|
152
|
+
// Reverse: re-add dropped columns (if we have the schema)
|
|
153
|
+
// Note: This requires the original column definition
|
|
154
|
+
if (diff.columnsToDrop?.length) {
|
|
155
|
+
lines.push(`// TODO: Re-add dropped columns: ${diff.columnsToDrop.join(', ')}`);
|
|
156
|
+
}
|
|
157
|
+
// Reverse: drop added indexes
|
|
158
|
+
for (const idx of diff.indexesToAdd ?? []) {
|
|
159
|
+
lines.push(`await builder.dropIndex('${diff.tableName}', '${idx.name}');`);
|
|
160
|
+
}
|
|
161
|
+
// Reverse: re-add dropped indexes
|
|
162
|
+
if (diff.indexesToDrop?.length) {
|
|
163
|
+
lines.push(`// TODO: Re-add dropped indexes: ${diff.indexesToDrop.join(', ')}`);
|
|
164
|
+
}
|
|
165
|
+
// Reverse: drop added foreign keys
|
|
166
|
+
for (const fk of diff.foreignKeysToAdd ?? []) {
|
|
167
|
+
if (fk.name) {
|
|
168
|
+
lines.push(`await builder.dropForeignKey('${diff.tableName}', '${fk.name}');`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Reverse: re-add dropped foreign keys
|
|
172
|
+
if (diff.foreignKeysToDrop?.length) {
|
|
173
|
+
lines.push(`// TODO: Re-add dropped foreign keys: ${diff.foreignKeysToDrop.join(', ')}`);
|
|
174
|
+
}
|
|
175
|
+
return lines.join('\n');
|
|
176
|
+
}
|
|
177
|
+
generateAddColumn(tableName, col) {
|
|
178
|
+
const options = this.generateColumnOptions(col);
|
|
179
|
+
return `await builder.addColumn('${tableName}', '${col.name}', (col) => col${options});`;
|
|
180
|
+
}
|
|
181
|
+
generateAlterColumn(tableName, col) {
|
|
182
|
+
const options = this.generateColumnOptions(col);
|
|
183
|
+
return `await builder.alterColumn('${tableName}', '${col.name}', (col) => col${options});`;
|
|
184
|
+
}
|
|
185
|
+
generateCreateIndex(tableName, idx) {
|
|
186
|
+
const cols = idx.columns.map((c) => `'${c}'`).join(', ');
|
|
187
|
+
const opts = [];
|
|
188
|
+
if (idx.name)
|
|
189
|
+
opts.push(`name: '${idx.name}'`);
|
|
190
|
+
if (idx.unique)
|
|
191
|
+
opts.push('unique: true');
|
|
192
|
+
const optsStr = opts.length ? `, { ${opts.join(', ')} }` : '';
|
|
193
|
+
return `await builder.createIndex('${tableName}', [${cols}]${optsStr});`;
|
|
194
|
+
}
|
|
195
|
+
generateAddForeignKey(tableName, fk) {
|
|
196
|
+
const cols = fk.columns.map((c) => `'${c}'`).join(', ');
|
|
197
|
+
const refCols = fk.referencedColumns.map((c) => `'${c}'`).join(', ');
|
|
198
|
+
const opts = [];
|
|
199
|
+
if (fk.name)
|
|
200
|
+
opts.push(`name: '${fk.name}'`);
|
|
201
|
+
if (fk.onDelete && fk.onDelete !== 'NO ACTION')
|
|
202
|
+
opts.push(`onDelete: '${fk.onDelete}'`);
|
|
203
|
+
if (fk.onUpdate && fk.onUpdate !== 'NO ACTION')
|
|
204
|
+
opts.push(`onUpdate: '${fk.onUpdate}'`);
|
|
205
|
+
const optsStr = opts.length ? `, { ${opts.join(', ')} }` : '';
|
|
206
|
+
return `await builder.addForeignKey('${tableName}', [${cols}], { table: '${fk.referencedTable}', columns: [${refCols}] }${optsStr});`;
|
|
207
|
+
}
|
|
208
|
+
// ===========================================================================
|
|
209
|
+
// Private: Column Call Generation
|
|
210
|
+
// ===========================================================================
|
|
211
|
+
generateColumnCall(col) {
|
|
212
|
+
const method = this.getColumnMethod(col);
|
|
213
|
+
const options = this.generateColumnOptionsObject(col);
|
|
214
|
+
return `table.${method}('${col.name}'${options})`;
|
|
215
|
+
}
|
|
216
|
+
generateIndexCall(idx) {
|
|
217
|
+
const cols = idx.columns.map((c) => `'${c}'`).join(', ');
|
|
218
|
+
if (idx.unique) {
|
|
219
|
+
return `table.unique([${cols}], '${idx.name}')`;
|
|
220
|
+
}
|
|
221
|
+
return `table.index([${cols}], '${idx.name}')`;
|
|
222
|
+
}
|
|
223
|
+
getColumnMethod(col) {
|
|
224
|
+
const type = col.type;
|
|
225
|
+
// Check for auto-increment primary key → id()
|
|
226
|
+
if (col.isPrimaryKey && col.isAutoIncrement) {
|
|
227
|
+
return 'id';
|
|
228
|
+
}
|
|
229
|
+
// Map type string to method name
|
|
230
|
+
const typeMap = {
|
|
231
|
+
integer: 'integer',
|
|
232
|
+
int: 'integer',
|
|
233
|
+
bigint: 'bigint',
|
|
234
|
+
smallint: 'smallint',
|
|
235
|
+
float: 'float',
|
|
236
|
+
double: 'double',
|
|
237
|
+
decimal: 'decimal',
|
|
238
|
+
numeric: 'decimal',
|
|
239
|
+
varchar: 'string',
|
|
240
|
+
char: 'char',
|
|
241
|
+
text: 'text',
|
|
242
|
+
boolean: 'boolean',
|
|
243
|
+
bool: 'boolean',
|
|
244
|
+
date: 'date',
|
|
245
|
+
time: 'time',
|
|
246
|
+
timestamp: 'timestamp',
|
|
247
|
+
timestamptz: 'timestamptz',
|
|
248
|
+
json: 'json',
|
|
249
|
+
jsonb: 'jsonb',
|
|
250
|
+
uuid: 'uuid',
|
|
251
|
+
blob: 'blob',
|
|
252
|
+
bytea: 'blob',
|
|
253
|
+
vector: 'vector',
|
|
254
|
+
};
|
|
255
|
+
const lowerType = type.toLowerCase().replace(/\(.*\)/, ''); // Remove (255) etc
|
|
256
|
+
return typeMap[lowerType] ?? 'string';
|
|
257
|
+
}
|
|
258
|
+
generateColumnOptionsObject(col) {
|
|
259
|
+
const opts = [];
|
|
260
|
+
// Type-specific options
|
|
261
|
+
if (col.length !== undefined && col.length !== 255) {
|
|
262
|
+
opts.push(`length: ${col.length}`);
|
|
263
|
+
}
|
|
264
|
+
if (col.precision !== undefined) {
|
|
265
|
+
opts.push(`precision: ${col.precision}`);
|
|
266
|
+
}
|
|
267
|
+
if (col.scale !== undefined) {
|
|
268
|
+
opts.push(`scale: ${col.scale}`);
|
|
269
|
+
}
|
|
270
|
+
// Common options (only include non-defaults)
|
|
271
|
+
if (col.nullable) {
|
|
272
|
+
opts.push('nullable: true');
|
|
273
|
+
}
|
|
274
|
+
if (col.isUnique && !col.isPrimaryKey) {
|
|
275
|
+
opts.push('unique: true');
|
|
276
|
+
}
|
|
277
|
+
if (col.isPrimaryKey && !col.isAutoIncrement) {
|
|
278
|
+
opts.push('primaryKey: true');
|
|
279
|
+
}
|
|
280
|
+
if (col.defaultValue !== undefined) {
|
|
281
|
+
opts.push(`defaultValue: ${this.formatValue(col.defaultValue)}`);
|
|
282
|
+
}
|
|
283
|
+
if (opts.length === 0)
|
|
284
|
+
return '';
|
|
285
|
+
return `, { ${opts.join(', ')} }`;
|
|
286
|
+
}
|
|
287
|
+
generateColumnOptions(col) {
|
|
288
|
+
const parts = [];
|
|
289
|
+
if (!col.nullable) {
|
|
290
|
+
parts.push('.notNullable()');
|
|
291
|
+
}
|
|
292
|
+
if (col.isUnique) {
|
|
293
|
+
parts.push('.unique()');
|
|
294
|
+
}
|
|
295
|
+
if (col.defaultValue !== undefined) {
|
|
296
|
+
parts.push(`.defaultValue(${this.formatValue(col.defaultValue)})`);
|
|
297
|
+
}
|
|
298
|
+
return parts.join('');
|
|
299
|
+
}
|
|
300
|
+
formatValue(value) {
|
|
301
|
+
if (value === null)
|
|
302
|
+
return 'null';
|
|
303
|
+
if (typeof value === 'string') {
|
|
304
|
+
// Check for SQL expressions
|
|
305
|
+
if (value.toUpperCase().includes('CURRENT_TIMESTAMP') ||
|
|
306
|
+
value.includes('()') ||
|
|
307
|
+
value.toUpperCase().includes('NOW')) {
|
|
308
|
+
return `t.raw('${value}')`;
|
|
309
|
+
}
|
|
310
|
+
return `'${value.replace(/'/g, "\\'")}'`;
|
|
311
|
+
}
|
|
312
|
+
if (typeof value === 'boolean')
|
|
313
|
+
return String(value);
|
|
314
|
+
if (typeof value === 'number')
|
|
315
|
+
return String(value);
|
|
316
|
+
return JSON.stringify(value);
|
|
317
|
+
}
|
|
318
|
+
// ===========================================================================
|
|
319
|
+
// Private: Utilities
|
|
320
|
+
// ===========================================================================
|
|
321
|
+
generateDescription(diff) {
|
|
322
|
+
const parts = [];
|
|
323
|
+
if (diff.type === 'create') {
|
|
324
|
+
parts.push(`Create table '${diff.tableName}'`);
|
|
325
|
+
}
|
|
326
|
+
else if (diff.type === 'drop') {
|
|
327
|
+
parts.push(`Drop table '${diff.tableName}'`);
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
if (diff.columnsToAdd?.length) {
|
|
331
|
+
parts.push(`Add ${diff.columnsToAdd.length} column(s)`);
|
|
332
|
+
}
|
|
333
|
+
if (diff.columnsToAlter?.length) {
|
|
334
|
+
parts.push(`Alter ${diff.columnsToAlter.length} column(s)`);
|
|
335
|
+
}
|
|
336
|
+
if (diff.columnsToDrop?.length) {
|
|
337
|
+
parts.push(`Drop ${diff.columnsToDrop.length} column(s)`);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return parts.join(', ') || `Alter table '${diff.tableName}'`;
|
|
341
|
+
}
|
|
342
|
+
indentBlock(code, level) {
|
|
343
|
+
const prefix = this.indent.repeat(level);
|
|
344
|
+
return code
|
|
345
|
+
.split('\n')
|
|
346
|
+
.map((line) => (line.trim() ? prefix + line : line))
|
|
347
|
+
.join('\n');
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Factory function to create a MigrationCodeGenerator.
|
|
352
|
+
*/
|
|
353
|
+
export function createMigrationCodeGenerator(options) {
|
|
354
|
+
return new MigrationCodeGenerator(options);
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=migrationCodeGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrationCodeGenerator.js","sourceRoot":"","sources":["../../../src/migrate/codegen/migrationCodeGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Relation Detector
|
|
3
|
+
*
|
|
4
|
+
* Uses heuristics and schema analysis to detect relationships between tables:
|
|
5
|
+
* - Explicit foreign keys (highest confidence)
|
|
6
|
+
* - Junction tables for ManyToMany
|
|
7
|
+
* - Unique FK columns for OneToOne
|
|
8
|
+
*/
|
|
9
|
+
import type { SchemaAST } from '../../schema/schemaAST.js';
|
|
10
|
+
import type { DetectedRelation } from '../../schema/types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Configuration for relation detection.
|
|
13
|
+
*/
|
|
14
|
+
export interface RelationDetectorOptions {
|
|
15
|
+
/** Minimum confidence threshold (0-1) to include in results */
|
|
16
|
+
minConfidence?: number;
|
|
17
|
+
/** Custom singularize function */
|
|
18
|
+
singularize?: (name: string) => string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Detects relationships in a SchemaAST using multiple heuristics.
|
|
22
|
+
*/
|
|
23
|
+
export declare class SmartRelationDetector {
|
|
24
|
+
private readonly ast;
|
|
25
|
+
private readonly options;
|
|
26
|
+
constructor(ast: SchemaAST, options?: RelationDetectorOptions);
|
|
27
|
+
/**
|
|
28
|
+
* Detect all relationships in the schema.
|
|
29
|
+
*/
|
|
30
|
+
detectAll(): DetectedRelation[];
|
|
31
|
+
/**
|
|
32
|
+
* Detect junction tables that represent ManyToMany relationships.
|
|
33
|
+
*/
|
|
34
|
+
private detectJunctionTables;
|
|
35
|
+
/**
|
|
36
|
+
* Detect relations where unique FK should upgrade to OneToOne.
|
|
37
|
+
*/
|
|
38
|
+
private detectOneToOneRelations;
|
|
39
|
+
/**
|
|
40
|
+
* Default singularize function (delegates to shared utility).
|
|
41
|
+
*/
|
|
42
|
+
private defaultSingularize;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Create a SmartRelationDetector for the given AST.
|
|
46
|
+
*/
|
|
47
|
+
export declare function createRelationDetector(ast: SchemaAST, options?: RelationDetectorOptions): SmartRelationDetector;
|
|
48
|
+
//# sourceMappingURL=smartRelationDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smartRelationDetector.d.ts","sourceRoot":"","sources":["../../../src/migrate/codegen/smartRelationDetector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG9D;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kCAAkC;IAClC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACxC;AAED;;GAEG;AACH,qBAAa,qBAAqB;IAI9B,OAAO,CAAC,QAAQ,CAAC,GAAG;IAHtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;gBAGzC,GAAG,EAAE,SAAS,EAC/B,OAAO,GAAE,uBAA4B;IAQvC;;OAEG;IACH,SAAS,IAAI,gBAAgB,EAAE;IAiC/B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA+C5B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAuB/B;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAG3B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,qBAAqB,CAE/G"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Relation Detector
|
|
3
|
+
*
|
|
4
|
+
* Uses heuristics and schema analysis to detect relationships between tables:
|
|
5
|
+
* - Explicit foreign keys (highest confidence)
|
|
6
|
+
* - Junction tables for ManyToMany
|
|
7
|
+
* - Unique FK columns for OneToOne
|
|
8
|
+
*/
|
|
9
|
+
import { singularize } from '../../util/string.util.js';
|
|
10
|
+
/**
|
|
11
|
+
* Detects relationships in a SchemaAST using multiple heuristics.
|
|
12
|
+
*/
|
|
13
|
+
export class SmartRelationDetector {
|
|
14
|
+
ast;
|
|
15
|
+
options;
|
|
16
|
+
constructor(ast, options = {}) {
|
|
17
|
+
this.ast = ast;
|
|
18
|
+
this.options = {
|
|
19
|
+
minConfidence: options.minConfidence ?? 0.5,
|
|
20
|
+
singularize: options.singularize ?? this.defaultSingularize.bind(this),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Detect all relationships in the schema.
|
|
25
|
+
*/
|
|
26
|
+
detectAll() {
|
|
27
|
+
const relations = [];
|
|
28
|
+
// 1. Add explicit FK relationships (confidence: 1.0)
|
|
29
|
+
for (const rel of this.ast.relationships) {
|
|
30
|
+
relations.push({
|
|
31
|
+
type: rel.type,
|
|
32
|
+
from: {
|
|
33
|
+
table: rel.from.table,
|
|
34
|
+
columns: rel.from.columns,
|
|
35
|
+
},
|
|
36
|
+
to: {
|
|
37
|
+
table: rel.to.table,
|
|
38
|
+
columns: rel.to.columns,
|
|
39
|
+
},
|
|
40
|
+
through: rel.through,
|
|
41
|
+
confidence: 1.0,
|
|
42
|
+
source: 'explicit_fk',
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
// 2. Detect junction tables (ManyToMany)
|
|
46
|
+
const junctionRelations = this.detectJunctionTables();
|
|
47
|
+
relations.push(...junctionRelations);
|
|
48
|
+
// 3. Detect unique FK -> OneToOne upgrades
|
|
49
|
+
const oneToOneUpgrades = this.detectOneToOneRelations(relations);
|
|
50
|
+
relations.push(...oneToOneUpgrades);
|
|
51
|
+
// Filter by confidence
|
|
52
|
+
return relations.filter((r) => r.confidence >= this.options.minConfidence);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Detect junction tables that represent ManyToMany relationships.
|
|
56
|
+
*/
|
|
57
|
+
detectJunctionTables() {
|
|
58
|
+
const relations = [];
|
|
59
|
+
for (const table of this.ast.tables.values()) {
|
|
60
|
+
if (!this.ast.isJunctionTable(table))
|
|
61
|
+
continue;
|
|
62
|
+
const outgoingRels = table.outgoingRelations;
|
|
63
|
+
if (outgoingRels.length !== 2)
|
|
64
|
+
continue;
|
|
65
|
+
const [rel1, rel2] = outgoingRels;
|
|
66
|
+
// Create ManyToMany relation
|
|
67
|
+
relations.push({
|
|
68
|
+
type: 'ManyToMany',
|
|
69
|
+
from: {
|
|
70
|
+
table: rel1.to.table,
|
|
71
|
+
columns: rel1.to.columns,
|
|
72
|
+
},
|
|
73
|
+
to: {
|
|
74
|
+
table: rel2.to.table,
|
|
75
|
+
columns: rel2.to.columns,
|
|
76
|
+
},
|
|
77
|
+
through: table,
|
|
78
|
+
confidence: 0.95,
|
|
79
|
+
source: 'junction_table',
|
|
80
|
+
});
|
|
81
|
+
// Also create inverse relation
|
|
82
|
+
relations.push({
|
|
83
|
+
type: 'ManyToMany',
|
|
84
|
+
from: {
|
|
85
|
+
table: rel2.to.table,
|
|
86
|
+
columns: rel2.to.columns,
|
|
87
|
+
},
|
|
88
|
+
to: {
|
|
89
|
+
table: rel1.to.table,
|
|
90
|
+
columns: rel1.to.columns,
|
|
91
|
+
},
|
|
92
|
+
through: table,
|
|
93
|
+
confidence: 0.95,
|
|
94
|
+
source: 'junction_table',
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
return relations;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Detect relations where unique FK should upgrade to OneToOne.
|
|
101
|
+
*/
|
|
102
|
+
detectOneToOneRelations(existingRelations) {
|
|
103
|
+
const upgrades = [];
|
|
104
|
+
for (const rel of existingRelations) {
|
|
105
|
+
if (rel.source !== 'explicit_fk')
|
|
106
|
+
continue;
|
|
107
|
+
const fromCol = rel.from.columns[0];
|
|
108
|
+
if (fromCol?.isUnique && rel.type === 'ManyToOne') {
|
|
109
|
+
// Upgrade to OneToOne
|
|
110
|
+
upgrades.push({
|
|
111
|
+
type: 'OneToOne',
|
|
112
|
+
from: rel.from,
|
|
113
|
+
to: rel.to,
|
|
114
|
+
through: rel.through,
|
|
115
|
+
confidence: 0.9,
|
|
116
|
+
source: 'unique_fk',
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return upgrades;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Default singularize function (delegates to shared utility).
|
|
124
|
+
*/
|
|
125
|
+
defaultSingularize(name) {
|
|
126
|
+
return singularize(name);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Create a SmartRelationDetector for the given AST.
|
|
131
|
+
*/
|
|
132
|
+
export function createRelationDetector(ast, options) {
|
|
133
|
+
return new SmartRelationDetector(ast, options);
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=smartRelationDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smartRelationDetector.js","sourceRoot":"","sources":["../../../src/migrate/codegen/smartRelationDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drift Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects schema drift between expected schema (from entities) and
|
|
5
|
+
* actual database schema.
|
|
6
|
+
*/
|
|
7
|
+
import type { SchemaAST } from '../../schema/schemaAST.js';
|
|
8
|
+
import type { DriftReport } from '../../schema/types.js';
|
|
9
|
+
import type { Dialect } from '../../type/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* Options for drift detection.
|
|
12
|
+
*/
|
|
13
|
+
export interface DriftDetectorOptions {
|
|
14
|
+
/** Include column type mismatches */
|
|
15
|
+
checkTypes?: boolean;
|
|
16
|
+
/** Include nullable mismatches */
|
|
17
|
+
checkNullable?: boolean;
|
|
18
|
+
/** Include index differences */
|
|
19
|
+
checkIndexes?: boolean;
|
|
20
|
+
/** Include foreign key differences */
|
|
21
|
+
checkForeignKeys?: boolean;
|
|
22
|
+
/** Include default value differences */
|
|
23
|
+
checkDefaults?: boolean;
|
|
24
|
+
/** SQL dialect for type formatting */
|
|
25
|
+
dialect?: Dialect;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Detects drift between expected and actual database schemas.
|
|
29
|
+
*/
|
|
30
|
+
export declare class DriftDetector {
|
|
31
|
+
private readonly expectedAST;
|
|
32
|
+
private readonly actualAST;
|
|
33
|
+
private readonly options;
|
|
34
|
+
private readonly dialect;
|
|
35
|
+
constructor(expectedAST: SchemaAST, actualAST: SchemaAST, options?: DriftDetectorOptions);
|
|
36
|
+
/**
|
|
37
|
+
* Detect all schema drift.
|
|
38
|
+
*/
|
|
39
|
+
detect(): DriftReport;
|
|
40
|
+
/**
|
|
41
|
+
* Detect table-level drifts (missing/unexpected tables).
|
|
42
|
+
*/
|
|
43
|
+
private detectTableDrifts;
|
|
44
|
+
/**
|
|
45
|
+
* Detect column-level drifts.
|
|
46
|
+
*/
|
|
47
|
+
private detectColumnDrifts;
|
|
48
|
+
/**
|
|
49
|
+
* Add drifts for column alterations (type/nullable mismatches).
|
|
50
|
+
*/
|
|
51
|
+
private addAlterColumnDrifts;
|
|
52
|
+
/**
|
|
53
|
+
* Detect index drifts.
|
|
54
|
+
*/
|
|
55
|
+
private detectIndexDrifts;
|
|
56
|
+
/**
|
|
57
|
+
* Detect relationship/FK drifts.
|
|
58
|
+
*/
|
|
59
|
+
private detectRelationshipDrifts;
|
|
60
|
+
/**
|
|
61
|
+
* Calculate overall status based on drifts.
|
|
62
|
+
*/
|
|
63
|
+
private calculateStatus;
|
|
64
|
+
/**
|
|
65
|
+
* Create a summary of drifts by severity.
|
|
66
|
+
*/
|
|
67
|
+
private createSummary;
|
|
68
|
+
/**
|
|
69
|
+
* Format type for display.
|
|
70
|
+
*/
|
|
71
|
+
private formatType;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Create a DriftDetector for comparing expected vs actual schemas.
|
|
75
|
+
*/
|
|
76
|
+
export declare function createDriftDetector(expectedAST: SchemaAST, actualAST: SchemaAST, options?: DriftDetectorOptions): DriftDetector;
|
|
77
|
+
/**
|
|
78
|
+
* Quick check for schema drift.
|
|
79
|
+
*/
|
|
80
|
+
export declare function detectDrift(expectedAST: SchemaAST, actualAST: SchemaAST, options?: DriftDetectorOptions): DriftReport;
|
|
81
|
+
//# sourceMappingURL=driftDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driftDetector.d.ts","sourceRoot":"","sources":["../../../src/migrate/drift/driftDetector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,KAAK,EAAwB,WAAW,EAAe,MAAM,uBAAuB,CAAC;AAC5F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,qCAAqC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kCAAkC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gCAAgC;IAChC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sCAAsC;IACtC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,wCAAwC;IACxC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sCAAsC;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,aAAa;IAKtB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAL5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;gBAGf,WAAW,EAAE,SAAS,EACtB,SAAS,EAAE,SAAS,EACrC,OAAO,GAAE,oBAAyB;IAapC;;OAEG;IACH,MAAM,IAAI,WAAW;IAmBrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA0BzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8B1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA6C5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA8BzB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA8BhC;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAQrB;;OAEG;IACH,OAAO,CAAC,UAAU;CAInB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,SAAS,EACtB,SAAS,EAAE,SAAS,EACpB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,aAAa,CAEf;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,WAAW,CAGrH"}
|