@uql/core 3.7.14 → 3.8.2
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 +17 -1
- package/README.md +12 -5
- 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 +6 -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 +23 -0
- package/dist/dialect/dialectConfig.d.ts.map +1 -0
- package/dist/dialect/dialectConfig.js +96 -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 +79 -0
- package/dist/migrate/builder/columnBuilder.d.ts.map +1 -0
- package/dist/migrate/builder/columnBuilder.js +159 -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 +109 -0
- package/dist/migrate/builder/migrationBuilder.d.ts.map +1 -0
- package/dist/migrate/builder/migrationBuilder.js +453 -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 +291 -0
- package/dist/migrate/builder/tableBuilder.js.map +1 -0
- package/dist/migrate/builder/types.d.ts +466 -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 +3 -1
- package/dist/migrate/introspection/mysqlIntrospector.d.ts.map +1 -1
- package/dist/migrate/introspection/mysqlIntrospector.js +20 -11
- package/dist/migrate/introspection/mysqlIntrospector.js.map +1 -1
- package/dist/migrate/introspection/postgresIntrospector.d.ts +3 -2
- package/dist/migrate/introspection/postgresIntrospector.d.ts.map +1 -1
- package/dist/migrate/introspection/postgresIntrospector.js +23 -14
- 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 +15 -13
- 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 +389 -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 +54 -4
- package/dist/type/migration.d.ts.map +1 -1
- package/dist/type/querier.d.ts +2 -5
- package/dist/type/querier.d.ts.map +1 -1
- package/dist/type/querier.js.map +1 -1
- package/dist/type/query.d.ts +8 -0
- package/dist/type/query.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,135 @@
|
|
|
1
|
+
import { getDialectConfig } from '../../dialect/index.js';
|
|
2
|
+
import { sqlToCanonical } from '../../schema/canonicalType.js';
|
|
3
|
+
import { SchemaAST } from '../../schema/schemaAST.js';
|
|
4
|
+
import { escapeSqlId } from '../../util/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Base class for SQL introspectors with shared AST building logic.
|
|
7
|
+
*/
|
|
8
|
+
export class BaseSqlIntrospector {
|
|
9
|
+
dialect;
|
|
10
|
+
config;
|
|
11
|
+
constructor(dialect) {
|
|
12
|
+
this.dialect = dialect;
|
|
13
|
+
this.config = getDialectConfig(dialect);
|
|
14
|
+
}
|
|
15
|
+
escapeId(identifier) {
|
|
16
|
+
return escapeSqlId(identifier, this.config.quoteChar);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Introspect entire database schema and return SchemaAST.
|
|
20
|
+
*/
|
|
21
|
+
async introspect() {
|
|
22
|
+
const tableNames = await this.getTableNames();
|
|
23
|
+
const tableSchemas = [];
|
|
24
|
+
for (const tableName of tableNames) {
|
|
25
|
+
const schema = await this.getTableSchema(tableName);
|
|
26
|
+
if (schema) {
|
|
27
|
+
tableSchemas.push(schema);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return this.buildAST(tableSchemas);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Build SchemaAST from table schemas.
|
|
34
|
+
*/
|
|
35
|
+
buildAST(tableSchemas) {
|
|
36
|
+
const ast = new SchemaAST();
|
|
37
|
+
const tableNodes = new Map();
|
|
38
|
+
this.buildTables(ast, tableNodes, tableSchemas);
|
|
39
|
+
this.buildRelationships(ast, tableNodes, tableSchemas);
|
|
40
|
+
this.buildIndexes(ast, tableNodes, tableSchemas);
|
|
41
|
+
return ast;
|
|
42
|
+
}
|
|
43
|
+
buildTables(ast, tableNodes, tableSchemas) {
|
|
44
|
+
for (const schema of tableSchemas) {
|
|
45
|
+
const columns = new Map();
|
|
46
|
+
const table = {
|
|
47
|
+
name: schema.name,
|
|
48
|
+
columns,
|
|
49
|
+
primaryKey: [],
|
|
50
|
+
indexes: [],
|
|
51
|
+
schema: ast,
|
|
52
|
+
incomingRelations: [],
|
|
53
|
+
outgoingRelations: [],
|
|
54
|
+
};
|
|
55
|
+
for (const col of schema.columns) {
|
|
56
|
+
const column = {
|
|
57
|
+
name: col.name,
|
|
58
|
+
type: this.columnSchemaToCanonical(col),
|
|
59
|
+
nullable: col.nullable,
|
|
60
|
+
defaultValue: col.defaultValue,
|
|
61
|
+
isPrimaryKey: col.isPrimaryKey,
|
|
62
|
+
isAutoIncrement: col.isAutoIncrement,
|
|
63
|
+
isUnique: col.isUnique,
|
|
64
|
+
comment: col.comment,
|
|
65
|
+
table,
|
|
66
|
+
referencedBy: [],
|
|
67
|
+
};
|
|
68
|
+
columns.set(col.name, column);
|
|
69
|
+
if (col.isPrimaryKey) {
|
|
70
|
+
table.primaryKey.push(column);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
tableNodes.set(schema.name, table);
|
|
74
|
+
ast.addTable(table);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
buildRelationships(ast, tableNodes, tableSchemas) {
|
|
78
|
+
for (const schema of tableSchemas) {
|
|
79
|
+
if (!schema.foreignKeys)
|
|
80
|
+
continue;
|
|
81
|
+
const fromTable = tableNodes.get(schema.name);
|
|
82
|
+
if (!fromTable)
|
|
83
|
+
continue;
|
|
84
|
+
for (const fk of schema.foreignKeys) {
|
|
85
|
+
const toTable = tableNodes.get(fk.referencedTable);
|
|
86
|
+
if (!toTable)
|
|
87
|
+
continue;
|
|
88
|
+
const fromColumns = fk.columns.map((c) => fromTable.columns.get(c)).filter((c) => !!c);
|
|
89
|
+
const toColumns = fk.referencedColumns.map((c) => toTable.columns.get(c)).filter((c) => !!c);
|
|
90
|
+
if (fromColumns.length > 0 && toColumns.length > 0) {
|
|
91
|
+
const rel = {
|
|
92
|
+
name: fk.name,
|
|
93
|
+
type: fromColumns[0].isUnique ? 'OneToOne' : 'ManyToOne',
|
|
94
|
+
from: { table: fromTable, columns: fromColumns },
|
|
95
|
+
to: { table: toTable, columns: toColumns },
|
|
96
|
+
onDelete: fk.onDelete || 'NO ACTION',
|
|
97
|
+
onUpdate: fk.onUpdate || 'NO ACTION',
|
|
98
|
+
};
|
|
99
|
+
ast.addRelationship(rel);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
buildIndexes(ast, tableNodes, tableSchemas) {
|
|
105
|
+
for (const schema of tableSchemas) {
|
|
106
|
+
if (!schema.indexes)
|
|
107
|
+
continue;
|
|
108
|
+
const table = tableNodes.get(schema.name);
|
|
109
|
+
if (!table)
|
|
110
|
+
continue;
|
|
111
|
+
for (const idx of schema.indexes) {
|
|
112
|
+
const columns = idx.columns.map((c) => table.columns.get(c)).filter((c) => !!c);
|
|
113
|
+
if (columns.length > 0) {
|
|
114
|
+
const index = {
|
|
115
|
+
name: idx.name,
|
|
116
|
+
table,
|
|
117
|
+
columns,
|
|
118
|
+
unique: idx.unique,
|
|
119
|
+
};
|
|
120
|
+
ast.addIndex(index);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
columnSchemaToCanonical(col) {
|
|
126
|
+
const base = sqlToCanonical(col.type);
|
|
127
|
+
return {
|
|
128
|
+
...base,
|
|
129
|
+
length: col.length ?? base.length,
|
|
130
|
+
precision: col.precision ?? base.precision,
|
|
131
|
+
scale: col.scale ?? base.scale,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=baseSqlIntrospector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseSqlIntrospector.js","sourceRoot":"","sources":["../../../src/migrate/introspection/baseSqlIntrospector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
+
import { SchemaAST } from '../../schema/schemaAST.js';
|
|
1
2
|
import type { QuerierPool, SchemaIntrospector, TableSchema } from '../../type/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* MongoDB schema introspector.
|
|
5
|
+
* MongoDB doesn't have a fixed schema, so this primarily focuses on collections and indexes.
|
|
6
|
+
*/
|
|
2
7
|
export declare class MongoSchemaIntrospector implements SchemaIntrospector {
|
|
3
8
|
private readonly pool;
|
|
4
9
|
constructor(pool: QuerierPool);
|
|
10
|
+
introspect(): Promise<SchemaAST>;
|
|
5
11
|
getTableSchema(tableName: string): Promise<TableSchema | undefined>;
|
|
6
12
|
getTableNames(): Promise<string[]>;
|
|
7
13
|
tableExists(tableName: string): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongoIntrospector.d.ts","sourceRoot":"","sources":["../../../src/migrate/introspection/mongoIntrospector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,WAAW,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEtG,qBAAa,uBAAwB,YAAW,kBAAkB;IACpD,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,WAAW;IAExC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IA0BnE,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAWlC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAIvD"}
|
|
1
|
+
{"version":3,"file":"mongoIntrospector.d.ts","sourceRoot":"","sources":["../../../src/migrate/introspection/mongoIntrospector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD,OAAO,KAAK,EAAgB,WAAW,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEtG;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,kBAAkB;IACpD,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,WAAW;IAExC,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC;IAsDhC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IA0BnE,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAWlC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAIvD"}
|
|
@@ -1,8 +1,62 @@
|
|
|
1
|
+
import { SchemaAST } from '../../schema/schemaAST.js';
|
|
2
|
+
/**
|
|
3
|
+
* MongoDB schema introspector.
|
|
4
|
+
* MongoDB doesn't have a fixed schema, so this primarily focuses on collections and indexes.
|
|
5
|
+
*/
|
|
1
6
|
export class MongoSchemaIntrospector {
|
|
2
7
|
pool;
|
|
3
8
|
constructor(pool) {
|
|
4
9
|
this.pool = pool;
|
|
5
10
|
}
|
|
11
|
+
async introspect() {
|
|
12
|
+
const tableNames = await this.getTableNames();
|
|
13
|
+
const ast = new SchemaAST();
|
|
14
|
+
for (const name of tableNames) {
|
|
15
|
+
const schema = await this.getTableSchema(name);
|
|
16
|
+
if (schema) {
|
|
17
|
+
const columns = new Map();
|
|
18
|
+
const table = {
|
|
19
|
+
name,
|
|
20
|
+
columns,
|
|
21
|
+
primaryKey: [],
|
|
22
|
+
indexes: [],
|
|
23
|
+
schema: ast,
|
|
24
|
+
incomingRelations: [],
|
|
25
|
+
outgoingRelations: [],
|
|
26
|
+
};
|
|
27
|
+
if (schema.indexes) {
|
|
28
|
+
for (const idx of schema.indexes) {
|
|
29
|
+
const indexColumns = [];
|
|
30
|
+
for (const colName of idx.columns) {
|
|
31
|
+
let column = columns.get(colName);
|
|
32
|
+
if (!column) {
|
|
33
|
+
column = {
|
|
34
|
+
name: colName,
|
|
35
|
+
type: { category: 'string' }, // MongoDB fields are flexible, but indexes usually target strings/numbers
|
|
36
|
+
nullable: true,
|
|
37
|
+
isPrimaryKey: false,
|
|
38
|
+
isAutoIncrement: false,
|
|
39
|
+
isUnique: false,
|
|
40
|
+
table,
|
|
41
|
+
referencedBy: [],
|
|
42
|
+
};
|
|
43
|
+
columns.set(colName, column);
|
|
44
|
+
}
|
|
45
|
+
indexColumns.push(column);
|
|
46
|
+
}
|
|
47
|
+
table.indexes.push({
|
|
48
|
+
name: idx.name,
|
|
49
|
+
table,
|
|
50
|
+
columns: indexColumns,
|
|
51
|
+
unique: idx.unique,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
ast.addTable(table);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return ast;
|
|
59
|
+
}
|
|
6
60
|
async getTableSchema(tableName) {
|
|
7
61
|
const querier = await this.pool.getQuerier();
|
|
8
62
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongoIntrospector.js","sourceRoot":"","sources":["../../../src/migrate/introspection/mongoIntrospector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mongoIntrospector.js","sourceRoot":"","sources":["../../../src/migrate/introspection/mongoIntrospector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAItD;;;GAGG;AACH,MAAM,OAAO,uBAAuB;IACL;IAA7B,YAA6B,IAAiB;QAAjB,SAAI,GAAJ,IAAI,CAAa;IAAG,CAAC;IAElD,KAAK,CAAC,UAAU;QACd,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC;QAE5B,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC/C,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;gBAC9C,MAAM,KAAK,GAAc;oBACvB,IAAI;oBACJ,OAAO;oBACP,UAAU,EAAE,EAAE;oBACd,OAAO,EAAE,EAAE;oBACX,MAAM,EAAE,GAAG;oBACX,iBAAiB,EAAE,EAAE;oBACrB,iBAAiB,EAAE,EAAE;iBACtB,CAAC;gBAEF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACjC,MAAM,YAAY,GAAiB,EAAE,CAAC;wBACtC,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;4BAClC,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;4BAClC,IAAI,CAAC,MAAM,EAAE,CAAC;gCACZ,MAAM,GAAG;oCACP,IAAI,EAAE,OAAO;oCACb,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,0EAA0E;oCACxG,QAAQ,EAAE,IAAI;oCACd,YAAY,EAAE,KAAK;oCACnB,eAAe,EAAE,KAAK;oCACtB,QAAQ,EAAE,KAAK;oCACf,KAAK;oCACL,YAAY,EAAE,EAAE;iCACjB,CAAC;gCACF,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;4BAC/B,CAAC;4BACD,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBAC5B,CAAC;wBACD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;4BACjB,IAAI,EAAE,GAAG,CAAC,IAAI;4BACd,KAAK;4BACL,OAAO,EAAE,YAAY;4BACrB,MAAM,EAAE,GAAG,CAAC,MAAM;yBACnB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAED,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,SAAiB;QACpC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,EAAE,EAAE,EAAE,GAAG,OAAuB,CAAC;YACvC,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;YAC5E,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7B,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,sEAAsE;YACtE,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;YAEzD,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,EAAE,EAAE,iCAAiC;gBAC9C,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;oBAClC,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBAC7B,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM;iBACrB,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,EAAE,EAAE,EAAE,GAAG,OAAuB,CAAC;YACvC,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,eAAe,EAAE,CAAC,OAAO,EAAE,CAAC;YACzD,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB;QACjC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;CACF"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { ColumnSchema, ForeignKeySchema, IndexSchema, QuerierPool, SchemaIntrospector, SqlQuerier, TableSchema } from '../../type/index.js';
|
|
2
|
+
import { BaseSqlIntrospector } from './baseSqlIntrospector.js';
|
|
2
3
|
/**
|
|
3
4
|
* MySQL/MariaDB schema introspector.
|
|
4
5
|
* Works with both MySQL and MariaDB as they share the same information_schema structure.
|
|
5
6
|
*/
|
|
6
|
-
export declare class MysqlSchemaIntrospector implements SchemaIntrospector {
|
|
7
|
+
export declare class MysqlSchemaIntrospector extends BaseSqlIntrospector implements SchemaIntrospector {
|
|
7
8
|
private readonly pool;
|
|
8
9
|
constructor(pool: QuerierPool);
|
|
9
10
|
getTableSchema(tableName: string): Promise<TableSchema | undefined>;
|
|
@@ -12,6 +13,7 @@ export declare class MysqlSchemaIntrospector implements SchemaIntrospector {
|
|
|
12
13
|
protected tableExistsInternal(querier: SqlQuerier, tableName: string): Promise<boolean>;
|
|
13
14
|
protected getQuerier(): Promise<SqlQuerier>;
|
|
14
15
|
protected getColumns(querier: SqlQuerier, tableName: string): Promise<ColumnSchema[]>;
|
|
16
|
+
protected toNumber(value: number | bigint | null | undefined): number | undefined;
|
|
15
17
|
protected getIndexes(querier: SqlQuerier, tableName: string): Promise<IndexSchema[]>;
|
|
16
18
|
protected getForeignKeys(querier: SqlQuerier, tableName: string): Promise<ForeignKeySchema[]>;
|
|
17
19
|
protected getPrimaryKey(querier: SqlQuerier, tableName: string): Promise<string[] | undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mysqlIntrospector.d.ts","sourceRoot":"","sources":["../../../src/migrate/introspection/mysqlIntrospector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,WAAW,EACZ,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"mysqlIntrospector.d.ts","sourceRoot":"","sources":["../../../src/migrate/introspection/mysqlIntrospector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D;;;GAGG;AACH,qBAAa,uBAAwB,SAAQ,mBAAoB,YAAW,kBAAkB;IAChF,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,WAAW;IAIxC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IA4BnE,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAmBlC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;cAUtC,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;cAY7E,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC;cAWjC,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAiD3F,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS;cAOjE,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;cA2B1E,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;cAuCnF,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC;IAmBpG,SAAS,CAAC,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IA0BjE,SAAS,CAAC,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS;CAcpH;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,gCAA0B,CAAC"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { isSqlQuerier } from '../../type/index.js';
|
|
2
|
+
import { BaseSqlIntrospector } from './baseSqlIntrospector.js';
|
|
2
3
|
/**
|
|
3
4
|
* MySQL/MariaDB schema introspector.
|
|
4
5
|
* Works with both MySQL and MariaDB as they share the same information_schema structure.
|
|
5
6
|
*/
|
|
6
|
-
export class MysqlSchemaIntrospector {
|
|
7
|
+
export class MysqlSchemaIntrospector extends BaseSqlIntrospector {
|
|
7
8
|
pool;
|
|
8
9
|
constructor(pool) {
|
|
10
|
+
super('mysql');
|
|
9
11
|
this.pool = pool;
|
|
10
12
|
}
|
|
11
13
|
async getTableSchema(tableName) {
|
|
@@ -99,18 +101,24 @@ export class MysqlSchemaIntrospector {
|
|
|
99
101
|
const results = await querier.all(sql, [tableName]);
|
|
100
102
|
return results.map((row) => ({
|
|
101
103
|
name: row.column_name,
|
|
102
|
-
type: row.column_type.toUpperCase(),
|
|
104
|
+
type: (row.column_type || '').toUpperCase(),
|
|
103
105
|
nullable: row.is_nullable === 'YES',
|
|
104
106
|
defaultValue: this.parseDefaultValue(row.column_default),
|
|
105
107
|
isPrimaryKey: row.column_key === 'PRI',
|
|
106
|
-
isAutoIncrement: row.extra.toLowerCase().includes('auto_increment'),
|
|
108
|
+
isAutoIncrement: (row.extra || '').toLowerCase().includes('auto_increment'),
|
|
107
109
|
isUnique: row.column_key === 'UNI',
|
|
108
|
-
length: row.character_maximum_length
|
|
109
|
-
precision: row.numeric_precision
|
|
110
|
-
scale: row.numeric_scale
|
|
110
|
+
length: this.toNumber(row.character_maximum_length),
|
|
111
|
+
precision: this.toNumber(row.numeric_precision),
|
|
112
|
+
scale: this.toNumber(row.numeric_scale),
|
|
111
113
|
comment: row.column_comment || undefined,
|
|
112
114
|
}));
|
|
113
115
|
}
|
|
116
|
+
toNumber(value) {
|
|
117
|
+
if (value == null) {
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
return Number(value);
|
|
121
|
+
}
|
|
114
122
|
async getIndexes(querier, tableName) {
|
|
115
123
|
const sql = `
|
|
116
124
|
SELECT
|
|
@@ -127,7 +135,7 @@ export class MysqlSchemaIntrospector {
|
|
|
127
135
|
const results = await querier.all(sql, [tableName]);
|
|
128
136
|
return results.map((row) => ({
|
|
129
137
|
name: row.index_name,
|
|
130
|
-
columns: row.columns.split(','),
|
|
138
|
+
columns: (row.columns || '').split(','),
|
|
131
139
|
unique: Boolean(row.is_unique),
|
|
132
140
|
}));
|
|
133
141
|
}
|
|
@@ -153,9 +161,9 @@ export class MysqlSchemaIntrospector {
|
|
|
153
161
|
const results = await querier.all(sql, [tableName]);
|
|
154
162
|
return results.map((row) => ({
|
|
155
163
|
name: row.constraint_name,
|
|
156
|
-
columns: row.columns.split(','),
|
|
164
|
+
columns: (row.columns || '').split(','),
|
|
157
165
|
referencedTable: row.referenced_table,
|
|
158
|
-
referencedColumns: row.referenced_columns.split(','),
|
|
166
|
+
referencedColumns: (row.referenced_columns || '').split(','),
|
|
159
167
|
onDelete: this.normalizeReferentialAction(row.delete_rule),
|
|
160
168
|
onUpdate: this.normalizeReferentialAction(row.update_rule),
|
|
161
169
|
}));
|
|
@@ -183,8 +191,9 @@ export class MysqlSchemaIntrospector {
|
|
|
183
191
|
if (defaultValue === 'NULL') {
|
|
184
192
|
return null;
|
|
185
193
|
}
|
|
186
|
-
|
|
187
|
-
|
|
194
|
+
// Normalize timestamp defaults (MariaDB uses current_timestamp(), MySQL uses CURRENT_TIMESTAMP)
|
|
195
|
+
if (defaultValue.toLowerCase() === 'current_timestamp' || defaultValue.toLowerCase() === 'current_timestamp()') {
|
|
196
|
+
return 'CURRENT_TIMESTAMP';
|
|
188
197
|
}
|
|
189
198
|
if (/^'.*'$/.test(defaultValue)) {
|
|
190
199
|
return defaultValue.slice(1, -1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mysqlIntrospector.js","sourceRoot":"","sources":["../../../src/migrate/introspection/mysqlIntrospector.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"mysqlIntrospector.js","sourceRoot":"","sources":["../../../src/migrate/introspection/mysqlIntrospector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { ColumnSchema, ForeignKeySchema, IndexSchema, QuerierPool, SchemaIntrospector, SqlQuerier, TableSchema } from '../../type/index.js';
|
|
2
|
+
import { BaseSqlIntrospector } from './baseSqlIntrospector.js';
|
|
2
3
|
/**
|
|
3
4
|
* PostgreSQL schema introspector
|
|
4
5
|
*/
|
|
5
|
-
export declare class PostgresSchemaIntrospector implements SchemaIntrospector {
|
|
6
|
+
export declare class PostgresSchemaIntrospector extends BaseSqlIntrospector implements SchemaIntrospector {
|
|
6
7
|
private readonly pool;
|
|
7
8
|
constructor(pool: QuerierPool);
|
|
8
9
|
getTableSchema(tableName: string): Promise<TableSchema | undefined>;
|
|
@@ -16,7 +17,7 @@ export declare class PostgresSchemaIntrospector implements SchemaIntrospector {
|
|
|
16
17
|
protected getPrimaryKey(querier: SqlQuerier, tableName: string): Promise<string[] | undefined>;
|
|
17
18
|
protected normalizeType(dataType: string, udtName: string): string;
|
|
18
19
|
protected parseDefaultValue(defaultValue: string | null): unknown;
|
|
19
|
-
protected isAutoIncrement(defaultValue: string | null): boolean;
|
|
20
|
+
protected isAutoIncrement(defaultValue: string | null, isIdentity: string): boolean;
|
|
20
21
|
protected normalizeReferentialAction(action: string): 'CASCADE' | 'SET NULL' | 'RESTRICT' | 'NO ACTION' | undefined;
|
|
21
22
|
}
|
|
22
23
|
//# sourceMappingURL=postgresIntrospector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgresIntrospector.d.ts","sourceRoot":"","sources":["../../../src/migrate/introspection/postgresIntrospector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,WAAW,EACZ,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"postgresIntrospector.d.ts","sourceRoot":"","sources":["../../../src/migrate/introspection/postgresIntrospector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D;;GAEG;AACH,qBAAa,0BAA2B,SAAQ,mBAAoB,YAAW,kBAAkB;IACnF,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,WAAW;IAIxC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IA4BnE,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAmBlC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;cAUtC,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;cAa7E,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC;cAWjC,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;cA0E3E,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;cAgC1E,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;cA6CnF,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC;IAsBpG,SAAS,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;IAWlE,SAAS,CAAC,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IA6BjE,SAAS,CAAC,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAYnF,SAAS,CAAC,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS;CAcpH"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { isSqlQuerier } from '../../type/index.js';
|
|
2
|
+
import { BaseSqlIntrospector } from './baseSqlIntrospector.js';
|
|
2
3
|
/**
|
|
3
4
|
* PostgreSQL schema introspector
|
|
4
5
|
*/
|
|
5
|
-
export class PostgresSchemaIntrospector {
|
|
6
|
+
export class PostgresSchemaIntrospector extends BaseSqlIntrospector {
|
|
6
7
|
pool;
|
|
7
8
|
constructor(pool) {
|
|
9
|
+
super('postgres');
|
|
8
10
|
this.pool = pool;
|
|
9
11
|
}
|
|
10
12
|
async getTableSchema(tableName) {
|
|
@@ -88,6 +90,8 @@ export class PostgresSchemaIntrospector {
|
|
|
88
90
|
c.character_maximum_length,
|
|
89
91
|
c.numeric_precision,
|
|
90
92
|
c.numeric_scale,
|
|
93
|
+
c.is_identity,
|
|
94
|
+
c.identity_generation,
|
|
91
95
|
COALESCE(
|
|
92
96
|
(SELECT TRUE FROM information_schema.table_constraints tc
|
|
93
97
|
JOIN information_schema.key_column_usage kcu
|
|
@@ -124,7 +128,7 @@ export class PostgresSchemaIntrospector {
|
|
|
124
128
|
nullable: row.is_nullable === 'YES',
|
|
125
129
|
defaultValue: this.parseDefaultValue(row.column_default),
|
|
126
130
|
isPrimaryKey: row.is_primary_key,
|
|
127
|
-
isAutoIncrement: this.isAutoIncrement(row.column_default),
|
|
131
|
+
isAutoIncrement: this.isAutoIncrement(row.column_default, row.is_identity),
|
|
128
132
|
isUnique: row.is_unique,
|
|
129
133
|
length: row.character_maximum_length ?? undefined,
|
|
130
134
|
precision: row.numeric_precision ?? undefined,
|
|
@@ -136,7 +140,7 @@ export class PostgresSchemaIntrospector {
|
|
|
136
140
|
const sql = /*sql*/ `
|
|
137
141
|
SELECT
|
|
138
142
|
i.relname AS index_name,
|
|
139
|
-
array_agg(a.attname ORDER BY k.n) AS columns,
|
|
143
|
+
array_to_json(array_agg(a.attname ORDER BY k.n)) AS columns,
|
|
140
144
|
ix.indisunique AS is_unique
|
|
141
145
|
FROM pg_class t
|
|
142
146
|
JOIN pg_index ix ON t.oid = ix.indrelid
|
|
@@ -161,9 +165,9 @@ export class PostgresSchemaIntrospector {
|
|
|
161
165
|
const sql = /*sql*/ `
|
|
162
166
|
SELECT
|
|
163
167
|
tc.constraint_name,
|
|
164
|
-
array_agg(kcu.column_name ORDER BY kcu.ordinal_position) AS columns,
|
|
168
|
+
array_to_json(array_agg(kcu.column_name ORDER BY kcu.ordinal_position)) AS columns,
|
|
165
169
|
ccu.table_name AS referenced_table,
|
|
166
|
-
array_agg(ccu.column_name ORDER BY kcu.ordinal_position) AS referenced_columns,
|
|
170
|
+
array_to_json(array_agg(ccu.column_name ORDER BY kcu.ordinal_position)) AS referenced_columns,
|
|
167
171
|
rc.delete_rule,
|
|
168
172
|
rc.update_rule
|
|
169
173
|
FROM information_schema.table_constraints tc
|
|
@@ -216,7 +220,7 @@ export class PostgresSchemaIntrospector {
|
|
|
216
220
|
return udtName.toUpperCase();
|
|
217
221
|
}
|
|
218
222
|
if (dataType === 'ARRAY') {
|
|
219
|
-
return `${udtName.replace(/^_/, '')}[]`;
|
|
223
|
+
return `${udtName.replace(/^_/, '').toUpperCase()}[]`;
|
|
220
224
|
}
|
|
221
225
|
return dataType.toUpperCase();
|
|
222
226
|
}
|
|
@@ -224,8 +228,8 @@ export class PostgresSchemaIntrospector {
|
|
|
224
228
|
if (!defaultValue) {
|
|
225
229
|
return undefined;
|
|
226
230
|
}
|
|
227
|
-
// Remove type casting
|
|
228
|
-
const cleaned = defaultValue.replace(/::[a-z_]+(\[\])?/gi, '').trim();
|
|
231
|
+
// Remove type casting (e.g., ::text, ::character varying, ::text[])
|
|
232
|
+
const cleaned = defaultValue.replace(/::[a-z_]+(\s+[a-z_]+)?(\[\])?/gi, '').trim();
|
|
229
233
|
// Check for common patterns
|
|
230
234
|
if (cleaned.startsWith("'") && cleaned.endsWith("'")) {
|
|
231
235
|
return cleaned.slice(1, -1);
|
|
@@ -242,14 +246,19 @@ export class PostgresSchemaIntrospector {
|
|
|
242
246
|
if (/^-?\d+\.\d+$/.test(cleaned)) {
|
|
243
247
|
return Number.parseFloat(cleaned);
|
|
244
248
|
}
|
|
245
|
-
// Return
|
|
246
|
-
return
|
|
249
|
+
// Return cleaned value for functions like CURRENT_TIMESTAMP, nextval(), etc.
|
|
250
|
+
return cleaned;
|
|
247
251
|
}
|
|
248
|
-
isAutoIncrement(defaultValue) {
|
|
249
|
-
|
|
250
|
-
|
|
252
|
+
isAutoIncrement(defaultValue, isIdentity) {
|
|
253
|
+
// PostgreSQL identity columns (GENERATED ... AS IDENTITY)
|
|
254
|
+
if (isIdentity === 'YES') {
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
// Serial/bigserial columns use nextval()
|
|
258
|
+
if (defaultValue?.includes('nextval(')) {
|
|
259
|
+
return true;
|
|
251
260
|
}
|
|
252
|
-
return
|
|
261
|
+
return false;
|
|
253
262
|
}
|
|
254
263
|
normalizeReferentialAction(action) {
|
|
255
264
|
switch (action.toUpperCase()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgresIntrospector.js","sourceRoot":"","sources":["../../../src/migrate/introspection/postgresIntrospector.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"postgresIntrospector.js","sourceRoot":"","sources":["../../../src/migrate/introspection/postgresIntrospector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { QuerierPool, SchemaIntrospector, TableSchema } from '../../type/index.js';
|
|
2
|
+
import { BaseSqlIntrospector } from './baseSqlIntrospector.js';
|
|
2
3
|
/**
|
|
3
4
|
* SQLite schema introspector
|
|
4
5
|
*/
|
|
5
|
-
export declare class SqliteSchemaIntrospector implements SchemaIntrospector {
|
|
6
|
+
export declare class SqliteSchemaIntrospector extends BaseSqlIntrospector implements SchemaIntrospector {
|
|
6
7
|
private readonly pool;
|
|
7
8
|
constructor(pool: QuerierPool);
|
|
8
9
|
getTableSchema(tableName: string): Promise<TableSchema | undefined>;
|
|
@@ -15,7 +16,6 @@ export declare class SqliteSchemaIntrospector implements SchemaIntrospector {
|
|
|
15
16
|
private getIndexes;
|
|
16
17
|
private getForeignKeys;
|
|
17
18
|
private getPrimaryKey;
|
|
18
|
-
private escapeId;
|
|
19
19
|
protected normalizeType(type: string): string;
|
|
20
20
|
protected extractLength(type: string): number | undefined;
|
|
21
21
|
protected parseDefaultValue(defaultValue: string | null): unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqliteIntrospector.d.ts","sourceRoot":"","sources":["../../../src/migrate/introspection/sqliteIntrospector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,WAAW,EACX,kBAAkB,EAElB,WAAW,EACZ,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"sqliteIntrospector.d.ts","sourceRoot":"","sources":["../../../src/migrate/introspection/sqliteIntrospector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,WAAW,EACX,kBAAkB,EAElB,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,mBAAoB,YAAW,kBAAkB;IACjF,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,WAAW;IAIxC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IA4BnE,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAmBlC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAUxC,mBAAmB;YAYnB,UAAU;YAWV,UAAU;YA+BV,gBAAgB;YA0BhB,UAAU;YAmCV,cAAc;YAmCd,aAAa;IAqB3B,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAM7C,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKzD,SAAS,CAAC,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IAyBjE,SAAS,CAAC,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS;CAcpH"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { isSqlQuerier } from '../../type/index.js';
|
|
2
|
+
import { BaseSqlIntrospector } from './baseSqlIntrospector.js';
|
|
2
3
|
/**
|
|
3
4
|
* SQLite schema introspector
|
|
4
5
|
*/
|
|
5
|
-
export class SqliteSchemaIntrospector {
|
|
6
|
+
export class SqliteSchemaIntrospector extends BaseSqlIntrospector {
|
|
6
7
|
pool;
|
|
7
8
|
constructor(pool) {
|
|
9
|
+
super('sqlite');
|
|
8
10
|
this.pool = pool;
|
|
9
11
|
}
|
|
10
12
|
async getTableSchema(tableName) {
|
|
@@ -116,16 +118,19 @@ export class SqliteSchemaIntrospector {
|
|
|
116
118
|
const indexes = await querier.all(sql);
|
|
117
119
|
const result = [];
|
|
118
120
|
for (const index of indexes) {
|
|
119
|
-
// Skip auto-generated indexes (primary key, unique constraints)
|
|
120
|
-
if (index.origin !== 'c') {
|
|
121
|
-
continue;
|
|
122
|
-
}
|
|
123
121
|
const columns = await querier.all(`PRAGMA index_info(${this.escapeId(index.name)})`);
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
122
|
+
// Include user-created indexes ('c') and multi-column unique constraints ('u')
|
|
123
|
+
// Skip primary key indexes ('pk') and single-column unique constraints
|
|
124
|
+
const isUserCreated = index.origin === 'c';
|
|
125
|
+
const isCompositeUnique = index.origin === 'u' && columns.length > 1;
|
|
126
|
+
const shouldInclude = isUserCreated || isCompositeUnique;
|
|
127
|
+
if (shouldInclude) {
|
|
128
|
+
result.push({
|
|
129
|
+
name: index.name,
|
|
130
|
+
columns: columns.map((c) => c.name),
|
|
131
|
+
unique: Boolean(index.unique),
|
|
132
|
+
});
|
|
133
|
+
}
|
|
129
134
|
}
|
|
130
135
|
return result;
|
|
131
136
|
}
|
|
@@ -160,9 +165,6 @@ export class SqliteSchemaIntrospector {
|
|
|
160
165
|
}
|
|
161
166
|
return pkColumns.map((r) => r.name);
|
|
162
167
|
}
|
|
163
|
-
escapeId(identifier) {
|
|
164
|
-
return `\`${identifier.replace(/`/g, '``')}\``;
|
|
165
|
-
}
|
|
166
168
|
normalizeType(type) {
|
|
167
169
|
// Extract base type without length/precision
|
|
168
170
|
const match = type.match(/^([A-Za-z]+)/);
|