@uql/core 3.8.1 → 3.8.3
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 +16 -1
- package/README.md +1 -0
- package/dist/dialect/abstractSqlDialect.d.ts +2 -1
- package/dist/dialect/abstractSqlDialect.d.ts.map +1 -1
- package/dist/dialect/abstractSqlDialect.js.map +1 -1
- package/dist/dialect/dialectConfig.d.ts +9 -3
- package/dist/dialect/dialectConfig.d.ts.map +1 -1
- package/dist/dialect/dialectConfig.js +50 -25
- package/dist/dialect/dialectConfig.js.map +1 -1
- package/dist/migrate/builder/columnBuilder.d.ts +4 -0
- package/dist/migrate/builder/columnBuilder.d.ts.map +1 -1
- package/dist/migrate/builder/columnBuilder.js +10 -0
- package/dist/migrate/builder/columnBuilder.js.map +1 -1
- package/dist/migrate/builder/expressions.js +1 -1
- package/dist/migrate/builder/expressions.js.map +1 -1
- package/dist/migrate/builder/migrationBuilder.d.ts +64 -28
- package/dist/migrate/builder/migrationBuilder.d.ts.map +1 -1
- package/dist/migrate/builder/migrationBuilder.js +200 -67
- package/dist/migrate/builder/migrationBuilder.js.map +1 -1
- package/dist/migrate/builder/tableBuilder.d.ts.map +1 -1
- package/dist/migrate/builder/tableBuilder.js +13 -0
- package/dist/migrate/builder/tableBuilder.js.map +1 -1
- package/dist/migrate/builder/types.d.ts +4 -0
- package/dist/migrate/builder/types.d.ts.map +1 -1
- package/dist/migrate/codegen/entityCodeGenerator.d.ts.map +1 -1
- package/dist/migrate/codegen/entityCodeGenerator.js +12 -8
- package/dist/migrate/codegen/entityCodeGenerator.js.map +1 -1
- package/dist/migrate/introspection/abstractSqlSchemaIntrospector.d.ts +77 -0
- package/dist/migrate/introspection/abstractSqlSchemaIntrospector.d.ts.map +1 -0
- package/dist/migrate/introspection/abstractSqlSchemaIntrospector.js +156 -0
- package/dist/migrate/introspection/abstractSqlSchemaIntrospector.js.map +1 -0
- package/dist/migrate/introspection/index.d.ts +1 -0
- package/dist/migrate/introspection/index.d.ts.map +1 -1
- package/dist/migrate/introspection/index.js +1 -0
- package/dist/migrate/introspection/index.js.map +1 -1
- package/dist/migrate/introspection/mysqlIntrospector.d.ts +16 -14
- package/dist/migrate/introspection/mysqlIntrospector.d.ts.map +1 -1
- package/dist/migrate/introspection/mysqlIntrospector.js +68 -118
- package/dist/migrate/introspection/mysqlIntrospector.js.map +1 -1
- package/dist/migrate/introspection/postgresIntrospector.d.ts +17 -15
- package/dist/migrate/introspection/postgresIntrospector.d.ts.map +1 -1
- package/dist/migrate/introspection/postgresIntrospector.js +86 -128
- package/dist/migrate/introspection/postgresIntrospector.js.map +1 -1
- package/dist/migrate/introspection/sqliteIntrospector.d.ts +20 -14
- package/dist/migrate/introspection/sqliteIntrospector.d.ts.map +1 -1
- package/dist/migrate/introspection/sqliteIntrospector.js +88 -122
- package/dist/migrate/introspection/sqliteIntrospector.js.map +1 -1
- package/dist/migrate/schemaGenerator.d.ts +1 -13
- package/dist/migrate/schemaGenerator.d.ts.map +1 -1
- package/dist/migrate/schemaGenerator.js +17 -76
- package/dist/migrate/schemaGenerator.js.map +1 -1
- package/dist/schema/schemaASTBuilder.d.ts.map +1 -1
- package/dist/schema/schemaASTBuilder.js +31 -0
- package/dist/schema/schemaASTBuilder.js.map +1 -1
- package/dist/type/migration.d.ts +4 -0
- 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/package.json +2 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgresIntrospector.js","sourceRoot":"","sources":["../../../src/migrate/introspection/postgresIntrospector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"postgresIntrospector.js","sourceRoot":"","sources":["../../../src/migrate/introspection/postgresIntrospector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +1,30 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import {
|
|
1
|
+
import type { ColumnSchema, ForeignKeySchema, IndexSchema, QuerierPool, SqlQuerier } from '../../type/index.js';
|
|
2
|
+
import { AbstractSqlSchemaIntrospector } from './abstractSqlSchemaIntrospector.js';
|
|
3
3
|
/**
|
|
4
4
|
* SQLite schema introspector
|
|
5
5
|
*/
|
|
6
|
-
export declare class SqliteSchemaIntrospector extends
|
|
7
|
-
|
|
6
|
+
export declare class SqliteSchemaIntrospector extends AbstractSqlSchemaIntrospector {
|
|
7
|
+
protected readonly pool: QuerierPool;
|
|
8
8
|
constructor(pool: QuerierPool);
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
protected getTableNamesQuery(): string;
|
|
10
|
+
protected tableExistsQuery(): string;
|
|
11
|
+
protected parseTableExistsResult(results: Record<string, unknown>[]): boolean;
|
|
12
|
+
protected getColumnsQuery(tableName: string): string;
|
|
13
|
+
protected getIndexesQuery(tableName: string): string;
|
|
14
|
+
protected getForeignKeysQuery(tableName: string): string;
|
|
15
|
+
protected getPrimaryKeyQuery(tableName: string): string;
|
|
16
|
+
protected getColumnsParams(_tableName: string): any[];
|
|
17
|
+
protected getIndexesParams(_tableName: string): any[];
|
|
18
|
+
protected getForeignKeysParams(_tableName: string): any[];
|
|
19
|
+
protected getPrimaryKeyParams(_tableName: string): any[];
|
|
20
|
+
protected mapTableNameRow(row: Record<string, unknown>): string;
|
|
21
|
+
protected mapColumnsResult(querier: SqlQuerier, tableName: string, results: Record<string, unknown>[]): Promise<ColumnSchema[]>;
|
|
22
|
+
protected mapIndexesResult(querier: SqlQuerier, _tableName: string, results: Record<string, unknown>[]): Promise<IndexSchema[]>;
|
|
23
|
+
protected mapForeignKeysResult(_querier: SqlQuerier, tableName: string, results: Record<string, unknown>[]): Promise<ForeignKeySchema[]>;
|
|
24
|
+
protected mapPrimaryKeyResult(results: Record<string, unknown>[]): string[] | undefined;
|
|
15
25
|
private getUniqueColumns;
|
|
16
|
-
private getIndexes;
|
|
17
|
-
private getForeignKeys;
|
|
18
|
-
private getPrimaryKey;
|
|
19
26
|
protected normalizeType(type: string): string;
|
|
20
27
|
protected extractLength(type: string): number | undefined;
|
|
21
28
|
protected parseDefaultValue(defaultValue: string | null): unknown;
|
|
22
|
-
protected normalizeReferentialAction(action: string): 'CASCADE' | 'SET NULL' | 'RESTRICT' | 'NO ACTION' | undefined;
|
|
23
29
|
}
|
|
24
30
|
//# sourceMappingURL=sqliteIntrospector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqliteIntrospector.d.ts","sourceRoot":"","sources":["../../../src/migrate/introspection/sqliteIntrospector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"sqliteIntrospector.d.ts","sourceRoot":"","sources":["../../../src/migrate/introspection/sqliteIntrospector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChH,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAEnF;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,6BAA6B;IACzE,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;gBAEzB,IAAI,EAAE,WAAW;IAS7B,SAAS,CAAC,kBAAkB,IAAI,MAAM;IAUtC,SAAS,CAAC,gBAAgB,IAAI,MAAM;IASpC,SAAS,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,OAAO;IAM7E,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIpD,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIpD,SAAS,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIxD,SAAS,CAAC,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;cAIpC,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,EAAE;cAI3C,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,EAAE;cAI3C,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,EAAE;cAI/C,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,EAAE;IAQjE,SAAS,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;cAI/C,gBAAgB,CAC9B,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GACjC,OAAO,CAAC,YAAY,EAAE,CAAC;cAmBV,gBAAgB,CAC9B,OAAO,EAAE,UAAU,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GACjC,OAAO,CAAC,WAAW,EAAE,CAAC;cAuBT,oBAAoB,CAClC,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GACjC,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAuB9B,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,SAAS;YAczE,gBAAgB;IAwB9B,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;CAuBlE"}
|
|
@@ -1,87 +1,69 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { BaseSqlIntrospector } from './baseSqlIntrospector.js';
|
|
1
|
+
import { AbstractSqlSchemaIntrospector } from './abstractSqlSchemaIntrospector.js';
|
|
3
2
|
/**
|
|
4
3
|
* SQLite schema introspector
|
|
5
4
|
*/
|
|
6
|
-
export class SqliteSchemaIntrospector extends
|
|
5
|
+
export class SqliteSchemaIntrospector extends AbstractSqlSchemaIntrospector {
|
|
7
6
|
pool;
|
|
8
7
|
constructor(pool) {
|
|
9
8
|
super('sqlite');
|
|
10
9
|
this.pool = pool;
|
|
11
10
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
this.getPrimaryKey(querier, tableName),
|
|
24
|
-
]);
|
|
25
|
-
return {
|
|
26
|
-
name: tableName,
|
|
27
|
-
columns,
|
|
28
|
-
primaryKey,
|
|
29
|
-
indexes,
|
|
30
|
-
foreignKeys,
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
finally {
|
|
34
|
-
await querier.release();
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
async getTableNames() {
|
|
38
|
-
const querier = await this.getQuerier();
|
|
39
|
-
try {
|
|
40
|
-
const sql = /*sql*/ `
|
|
41
|
-
SELECT name
|
|
42
|
-
FROM sqlite_master
|
|
43
|
-
WHERE type = 'table'
|
|
44
|
-
AND name NOT LIKE 'sqlite_%'
|
|
45
|
-
ORDER BY name
|
|
46
|
-
`;
|
|
47
|
-
const results = await querier.all(sql);
|
|
48
|
-
return results.map((r) => r.name);
|
|
49
|
-
}
|
|
50
|
-
finally {
|
|
51
|
-
await querier.release();
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
async tableExists(tableName) {
|
|
55
|
-
const querier = await this.getQuerier();
|
|
56
|
-
try {
|
|
57
|
-
return this.tableExistsInternal(querier, tableName);
|
|
58
|
-
}
|
|
59
|
-
finally {
|
|
60
|
-
await querier.release();
|
|
61
|
-
}
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// SQL Queries (dialect-specific)
|
|
13
|
+
// ============================================================================
|
|
14
|
+
getTableNamesQuery() {
|
|
15
|
+
return /*sql*/ `
|
|
16
|
+
SELECT name
|
|
17
|
+
FROM sqlite_master
|
|
18
|
+
WHERE type = 'table'
|
|
19
|
+
AND name NOT LIKE 'sqlite_%'
|
|
20
|
+
ORDER BY name
|
|
21
|
+
`;
|
|
62
22
|
}
|
|
63
|
-
|
|
64
|
-
|
|
23
|
+
tableExistsQuery() {
|
|
24
|
+
return /*sql*/ `
|
|
65
25
|
SELECT COUNT(*) as count
|
|
66
26
|
FROM sqlite_master
|
|
67
27
|
WHERE type = 'table'
|
|
68
28
|
AND name = ?
|
|
69
29
|
`;
|
|
70
|
-
const results = await querier.all(sql, [tableName]);
|
|
71
|
-
return (results[0]?.count ?? 0) > 0;
|
|
72
|
-
}
|
|
73
|
-
async getQuerier() {
|
|
74
|
-
const querier = await this.pool.getQuerier();
|
|
75
|
-
if (!isSqlQuerier(querier)) {
|
|
76
|
-
await querier.release();
|
|
77
|
-
throw new Error('SqliteSchemaIntrospector requires a SQL-based querier');
|
|
78
|
-
}
|
|
79
|
-
return querier;
|
|
80
30
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
31
|
+
parseTableExistsResult(results) {
|
|
32
|
+
const count = results[0]?.count;
|
|
33
|
+
return (typeof count === 'number' || typeof count === 'bigint' ? Number(count) : 0) > 0;
|
|
34
|
+
}
|
|
35
|
+
// SQLite uses PRAGMA which doesn't use parameterized queries in the same way
|
|
36
|
+
getColumnsQuery(tableName) {
|
|
37
|
+
return `PRAGMA table_info(${this.escapeId(tableName)})`;
|
|
38
|
+
}
|
|
39
|
+
getIndexesQuery(tableName) {
|
|
40
|
+
return `PRAGMA index_list(${this.escapeId(tableName)})`;
|
|
41
|
+
}
|
|
42
|
+
getForeignKeysQuery(tableName) {
|
|
43
|
+
return `PRAGMA foreign_key_list(${this.escapeId(tableName)})`;
|
|
44
|
+
}
|
|
45
|
+
getPrimaryKeyQuery(tableName) {
|
|
46
|
+
return `PRAGMA table_info(${this.escapeId(tableName)})`;
|
|
47
|
+
}
|
|
48
|
+
getColumnsParams(_tableName) {
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
getIndexesParams(_tableName) {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
getForeignKeysParams(_tableName) {
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
getPrimaryKeyParams(_tableName) {
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
// ============================================================================
|
|
61
|
+
// Row Mapping (dialect-specific)
|
|
62
|
+
// ============================================================================
|
|
63
|
+
mapTableNameRow(row) {
|
|
64
|
+
return row.name;
|
|
65
|
+
}
|
|
66
|
+
async mapColumnsResult(querier, tableName, results) {
|
|
85
67
|
// Get unique columns from indexes
|
|
86
68
|
const uniqueColumns = await this.getUniqueColumns(querier, tableName);
|
|
87
69
|
return results.map((row) => ({
|
|
@@ -98,48 +80,32 @@ export class SqliteSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
98
80
|
comment: undefined, // SQLite doesn't support column comments
|
|
99
81
|
}));
|
|
100
82
|
}
|
|
101
|
-
async
|
|
102
|
-
const
|
|
103
|
-
const
|
|
104
|
-
const uniqueColumns = new Set();
|
|
105
|
-
for (const index of indexes) {
|
|
106
|
-
if (index.unique && index.origin === 'u') {
|
|
107
|
-
const indexInfo = await querier.all(`PRAGMA index_info(${this.escapeId(index.name)})`);
|
|
108
|
-
// Only single-column unique constraints
|
|
109
|
-
if (indexInfo.length === 1) {
|
|
110
|
-
uniqueColumns.add(indexInfo[0].name);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
return uniqueColumns;
|
|
115
|
-
}
|
|
116
|
-
async getIndexes(querier, tableName) {
|
|
117
|
-
const sql = `PRAGMA index_list(${this.escapeId(tableName)})`;
|
|
118
|
-
const indexes = await querier.all(sql);
|
|
119
|
-
const result = [];
|
|
120
|
-
for (const index of indexes) {
|
|
121
|
-
// Skip auto-generated indexes (primary key, unique constraints)
|
|
122
|
-
if (index.origin !== 'c') {
|
|
123
|
-
continue;
|
|
124
|
-
}
|
|
83
|
+
async mapIndexesResult(querier, _tableName, results) {
|
|
84
|
+
const indexSchemas = [];
|
|
85
|
+
for (const index of results) {
|
|
125
86
|
const columns = await querier.all(`PRAGMA index_info(${this.escapeId(index.name)})`);
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
87
|
+
// Include user-created indexes ('c') and multi-column unique constraints ('u')
|
|
88
|
+
// Skip primary key indexes ('pk') and single-column unique constraints
|
|
89
|
+
const isUserCreated = index.origin === 'c';
|
|
90
|
+
const isCompositeUnique = index.origin === 'u' && columns.length > 1;
|
|
91
|
+
if (isUserCreated || isCompositeUnique) {
|
|
92
|
+
indexSchemas.push({
|
|
93
|
+
name: index.name,
|
|
94
|
+
columns: columns.map((c) => c.name),
|
|
95
|
+
unique: Boolean(index.unique),
|
|
96
|
+
});
|
|
97
|
+
}
|
|
131
98
|
}
|
|
132
|
-
return
|
|
99
|
+
return indexSchemas;
|
|
133
100
|
}
|
|
134
|
-
async
|
|
135
|
-
const sql = `PRAGMA foreign_key_list(${this.escapeId(tableName)})`;
|
|
136
|
-
const results = await querier.all(sql);
|
|
101
|
+
async mapForeignKeysResult(_querier, tableName, results) {
|
|
137
102
|
// Group by id to handle composite foreign keys
|
|
138
103
|
const grouped = new Map();
|
|
139
104
|
for (const row of results) {
|
|
140
|
-
const
|
|
105
|
+
const id = row.id;
|
|
106
|
+
const existing = grouped.get(id) ?? [];
|
|
141
107
|
existing.push(row);
|
|
142
|
-
grouped.set(
|
|
108
|
+
grouped.set(id, existing);
|
|
143
109
|
}
|
|
144
110
|
return Array.from(grouped.entries()).map(([id, rows]) => {
|
|
145
111
|
const first = rows[0];
|
|
@@ -153,15 +119,30 @@ export class SqliteSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
153
119
|
};
|
|
154
120
|
});
|
|
155
121
|
}
|
|
156
|
-
|
|
157
|
-
const sql = `PRAGMA table_info(${this.escapeId(tableName)})`;
|
|
158
|
-
const results = await querier.all(sql);
|
|
122
|
+
mapPrimaryKeyResult(results) {
|
|
159
123
|
const pkColumns = results.filter((r) => r.pk > 0).sort((a, b) => a.pk - b.pk);
|
|
160
124
|
if (pkColumns.length === 0) {
|
|
161
125
|
return undefined;
|
|
162
126
|
}
|
|
163
127
|
return pkColumns.map((r) => r.name);
|
|
164
128
|
}
|
|
129
|
+
// ============================================================================
|
|
130
|
+
// SQLite-specific helpers
|
|
131
|
+
// ============================================================================
|
|
132
|
+
async getUniqueColumns(querier, tableName) {
|
|
133
|
+
const indexes = await querier.all(`PRAGMA index_list(${this.escapeId(tableName)})`);
|
|
134
|
+
const uniqueColumns = new Set();
|
|
135
|
+
for (const index of indexes) {
|
|
136
|
+
if (index.unique && index.origin === 'u') {
|
|
137
|
+
const indexInfo = await querier.all(`PRAGMA index_info(${this.escapeId(index.name)})`);
|
|
138
|
+
// Only single-column unique constraints
|
|
139
|
+
if (indexInfo.length === 1) {
|
|
140
|
+
uniqueColumns.add(indexInfo[0].name);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return uniqueColumns;
|
|
145
|
+
}
|
|
165
146
|
normalizeType(type) {
|
|
166
147
|
// Extract base type without length/precision
|
|
167
148
|
const match = type.match(/^([A-Za-z]+)/);
|
|
@@ -175,7 +156,6 @@ export class SqliteSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
175
156
|
if (defaultValue === null) {
|
|
176
157
|
return undefined;
|
|
177
158
|
}
|
|
178
|
-
// Check for common patterns
|
|
179
159
|
if (defaultValue === 'NULL') {
|
|
180
160
|
return null;
|
|
181
161
|
}
|
|
@@ -193,19 +173,5 @@ export class SqliteSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
193
173
|
}
|
|
194
174
|
return defaultValue;
|
|
195
175
|
}
|
|
196
|
-
normalizeReferentialAction(action) {
|
|
197
|
-
switch (action.toUpperCase()) {
|
|
198
|
-
case 'CASCADE':
|
|
199
|
-
return 'CASCADE';
|
|
200
|
-
case 'SET NULL':
|
|
201
|
-
return 'SET NULL';
|
|
202
|
-
case 'RESTRICT':
|
|
203
|
-
return 'RESTRICT';
|
|
204
|
-
case 'NO ACTION':
|
|
205
|
-
return 'NO ACTION';
|
|
206
|
-
default:
|
|
207
|
-
return undefined;
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
176
|
}
|
|
211
177
|
//# sourceMappingURL=sqliteIntrospector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqliteIntrospector.js","sourceRoot":"","sources":["../../../src/migrate/introspection/sqliteIntrospector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sqliteIntrospector.js","sourceRoot":"","sources":["../../../src/migrate/introspection/sqliteIntrospector.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,14 +32,6 @@ export declare class SqlSchemaGenerator extends AbstractDialect implements Schem
|
|
|
32
32
|
generateAlterTableDown(diff: SchemaDiff): string[];
|
|
33
33
|
generateCreateIndex(tableName: string, index: IndexSchema): string;
|
|
34
34
|
generateDropIndex(tableName: string, indexName: string): string;
|
|
35
|
-
/**
|
|
36
|
-
* Generate column definitions from entity metadata
|
|
37
|
-
*/
|
|
38
|
-
generateColumnDefinitions<E>(meta: EntityMeta<E>): string[];
|
|
39
|
-
/**
|
|
40
|
-
* Generate a single column definition
|
|
41
|
-
*/
|
|
42
|
-
generateColumnDefinition<E>(fieldKey: string, field: FieldOptions, meta: EntityMeta<E>): string;
|
|
43
35
|
/**
|
|
44
36
|
* Generate column definition from a ColumnSchema object
|
|
45
37
|
*/
|
|
@@ -47,10 +39,6 @@ export declare class SqlSchemaGenerator extends AbstractDialect implements Schem
|
|
|
47
39
|
includePrimaryKey?: boolean;
|
|
48
40
|
includeUnique?: boolean;
|
|
49
41
|
}): string;
|
|
50
|
-
/**
|
|
51
|
-
* Generate table constraints (indexes, foreign keys, etc.)
|
|
52
|
-
*/
|
|
53
|
-
generateTableConstraints<E>(meta: EntityMeta<E>): string[];
|
|
54
42
|
getSqlType(field: FieldOptions, fieldType?: unknown): string;
|
|
55
43
|
/**
|
|
56
44
|
* Get the boolean type for this database
|
|
@@ -63,7 +51,7 @@ export declare class SqlSchemaGenerator extends AbstractDialect implements Schem
|
|
|
63
51
|
/**
|
|
64
52
|
* Get table options (e.g., ENGINE for MySQL)
|
|
65
53
|
*/
|
|
66
|
-
getTableOptions<E>(
|
|
54
|
+
getTableOptions<E>(_meta: EntityMeta<E>): string;
|
|
67
55
|
/**
|
|
68
56
|
* Generate column comment clause (if supported)
|
|
69
57
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemaGenerator.d.ts","sourceRoot":"","sources":["../../src/migrate/schemaGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"schemaGenerator.d.ts","sourceRoot":"","sources":["../../src/migrate/schemaGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { AbstractDialect } from '../dialect/index.js';
|
|
2
2
|
import { getMeta } from '../entity/index.js';
|
|
3
3
|
import { areTypesEqual, canonicalToSql, fieldOptionsToCanonical, sqlToCanonical } from '../schema/canonicalType.js';
|
|
4
|
+
import { SchemaASTBuilder } from '../schema/schemaASTBuilder.js';
|
|
4
5
|
import { escapeSqlId, getKeys, isAutoIncrement } from '../util/index.js';
|
|
5
6
|
import { formatDefaultValue } from './builder/expressions.js';
|
|
6
7
|
/**
|
|
@@ -44,21 +45,13 @@ export class SqlSchemaGenerator extends AbstractDialect {
|
|
|
44
45
|
// SchemaGenerator Implementation
|
|
45
46
|
// ============================================================================
|
|
46
47
|
generateCreateTable(entity, options = {}) {
|
|
47
|
-
const
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
if (constraints.length > 0) {
|
|
55
|
-
sql += ',\n';
|
|
56
|
-
sql += constraints.map((c) => ` ${c}`).join(',\n');
|
|
57
|
-
}
|
|
58
|
-
sql += '\n)';
|
|
59
|
-
sql += this.getTableOptions(meta);
|
|
60
|
-
sql += ';';
|
|
61
|
-
return sql;
|
|
48
|
+
const builder = new SchemaASTBuilder(this.namingStrategy);
|
|
49
|
+
const ast = builder.fromEntities([entity], {
|
|
50
|
+
resolveTableName: this.resolveTableName.bind(this),
|
|
51
|
+
resolveColumnName: this.resolveColumnName.bind(this),
|
|
52
|
+
});
|
|
53
|
+
const tableNode = ast.getTables()[0];
|
|
54
|
+
return this.generateCreateTableFromNode(tableNode, options);
|
|
62
55
|
}
|
|
63
56
|
generateDropTable(entity) {
|
|
64
57
|
const meta = getMeta(entity);
|
|
@@ -134,7 +127,7 @@ export class SqlSchemaGenerator extends AbstractDialect {
|
|
|
134
127
|
generateCreateIndex(tableName, index) {
|
|
135
128
|
const unique = index.unique ? 'UNIQUE ' : '';
|
|
136
129
|
const columns = index.columns.map((c) => this.escapeId(c)).join(', ');
|
|
137
|
-
const ifNotExists = this.config.
|
|
130
|
+
const ifNotExists = this.config.features.indexIfNotExists ? 'IF NOT EXISTS ' : '';
|
|
138
131
|
return `CREATE ${unique}INDEX ${ifNotExists}${this.escapeId(index.name)} ON ${this.escapeId(tableName)} (${columns});`;
|
|
139
132
|
}
|
|
140
133
|
generateDropIndex(tableName, indexName) {
|
|
@@ -143,28 +136,6 @@ export class SqlSchemaGenerator extends AbstractDialect {
|
|
|
143
136
|
}
|
|
144
137
|
return `DROP INDEX IF EXISTS ${this.escapeId(indexName)};`;
|
|
145
138
|
}
|
|
146
|
-
/**
|
|
147
|
-
* Generate column definitions from entity metadata
|
|
148
|
-
*/
|
|
149
|
-
generateColumnDefinitions(meta) {
|
|
150
|
-
const columns = [];
|
|
151
|
-
const fieldKeys = getKeys(meta.fields);
|
|
152
|
-
for (const key of fieldKeys) {
|
|
153
|
-
const field = meta.fields[key];
|
|
154
|
-
if (field?.virtual)
|
|
155
|
-
continue;
|
|
156
|
-
const colDef = this.generateColumnDefinition(key, field, meta);
|
|
157
|
-
columns.push(colDef);
|
|
158
|
-
}
|
|
159
|
-
return columns;
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Generate a single column definition
|
|
163
|
-
*/
|
|
164
|
-
generateColumnDefinition(fieldKey, field, meta) {
|
|
165
|
-
const column = this.fieldToColumnSchema(fieldKey, field, meta);
|
|
166
|
-
return this.generateColumnDefinitionFromSchema(column);
|
|
167
|
-
}
|
|
168
139
|
/**
|
|
169
140
|
* Generate column definition from a ColumnSchema object
|
|
170
141
|
*/
|
|
@@ -205,40 +176,6 @@ export class SqlSchemaGenerator extends AbstractDialect {
|
|
|
205
176
|
}
|
|
206
177
|
return definition;
|
|
207
178
|
}
|
|
208
|
-
/**
|
|
209
|
-
* Generate table constraints (indexes, foreign keys, etc.)
|
|
210
|
-
*/
|
|
211
|
-
generateTableConstraints(meta) {
|
|
212
|
-
const constraints = [];
|
|
213
|
-
const fieldKeys = getKeys(meta.fields);
|
|
214
|
-
const tableName = this.resolveTableName(meta.entity, meta);
|
|
215
|
-
// Generate indexes from field options
|
|
216
|
-
for (const key of fieldKeys) {
|
|
217
|
-
const field = meta.fields[key];
|
|
218
|
-
if (field?.index) {
|
|
219
|
-
const columnName = this.resolveColumnName(key, field);
|
|
220
|
-
const indexName = typeof field.index === 'string' ? field.index : `idx_${tableName}_${columnName}`;
|
|
221
|
-
constraints.push(`INDEX ${this.escapeId(indexName)} (${this.escapeId(columnName)})`);
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
// Generate foreign key constraints from references
|
|
225
|
-
for (const key of fieldKeys) {
|
|
226
|
-
const field = meta.fields[key];
|
|
227
|
-
const reference = field?.references ?? field?.reference;
|
|
228
|
-
if (reference && field.foreignKey !== false) {
|
|
229
|
-
const refEntity = reference();
|
|
230
|
-
const refMeta = getMeta(refEntity);
|
|
231
|
-
const refIdField = refMeta.fields[refMeta.id];
|
|
232
|
-
const columnName = this.resolveColumnName(key, field);
|
|
233
|
-
const refTableName = this.resolveTableName(refEntity, refMeta);
|
|
234
|
-
const refColumnName = this.resolveColumnName(refMeta.id, refIdField);
|
|
235
|
-
const fkName = typeof field.foreignKey === 'string' ? field.foreignKey : `fk_${tableName}_${columnName}`;
|
|
236
|
-
constraints.push(`CONSTRAINT ${this.escapeId(fkName)} FOREIGN KEY (${this.escapeId(columnName)}) ` +
|
|
237
|
-
`REFERENCES ${this.escapeId(refTableName)} (${this.escapeId(refColumnName)})`);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
return constraints;
|
|
241
|
-
}
|
|
242
179
|
getSqlType(field, fieldType) {
|
|
243
180
|
// If field has a reference, inherit type from the target primary key
|
|
244
181
|
const reference = field.references ?? field.reference;
|
|
@@ -298,7 +235,7 @@ export class SqlSchemaGenerator extends AbstractDialect {
|
|
|
298
235
|
/**
|
|
299
236
|
* Get table options (e.g., ENGINE for MySQL)
|
|
300
237
|
*/
|
|
301
|
-
getTableOptions(
|
|
238
|
+
getTableOptions(_meta) {
|
|
302
239
|
return this.config.tableOptions ? ` ${this.config.tableOptions}` : '';
|
|
303
240
|
}
|
|
304
241
|
/**
|
|
@@ -475,7 +412,7 @@ export class SqlSchemaGenerator extends AbstractDialect {
|
|
|
475
412
|
` ON DELETE ${rel.onDelete ?? this.defaultForeignKeyAction} ON UPDATE ${rel.onUpdate ?? this.defaultForeignKeyAction}`);
|
|
476
413
|
}
|
|
477
414
|
}
|
|
478
|
-
const ifNotExists = options.ifNotExists && this.config.
|
|
415
|
+
const ifNotExists = options.ifNotExists && this.config.features.ifNotExists ? 'IF NOT EXISTS ' : '';
|
|
479
416
|
let sql = `CREATE TABLE ${ifNotExists}${this.escapeId(table.name)} (\n`;
|
|
480
417
|
sql += columns.map((col) => ` ${col}`).join(',\n');
|
|
481
418
|
if (constraints.length > 0) {
|
|
@@ -525,7 +462,7 @@ export class SqlSchemaGenerator extends AbstractDialect {
|
|
|
525
462
|
const uniqueStr = index.unique ? 'UNIQUE ' : '';
|
|
526
463
|
const columns = index.columns.map((c) => this.escapeId(c.name)).join(', ');
|
|
527
464
|
const tableName = this.escapeId(index.table.name);
|
|
528
|
-
const ifNotExists = options.ifNotExists && this.config.
|
|
465
|
+
const ifNotExists = options.ifNotExists && this.config.features.indexIfNotExists ? 'IF NOT EXISTS ' : '';
|
|
529
466
|
return `CREATE ${uniqueStr}INDEX ${ifNotExists}${this.escapeId(index.name)} ON ${tableName} (${columns});`;
|
|
530
467
|
}
|
|
531
468
|
/**
|
|
@@ -544,7 +481,8 @@ export class SqlSchemaGenerator extends AbstractDialect {
|
|
|
544
481
|
}
|
|
545
482
|
generateDropTableSql(tableName, options) {
|
|
546
483
|
const ifExists = options?.ifExists ? 'IF EXISTS ' : '';
|
|
547
|
-
|
|
484
|
+
// Use dialect-specific cascade support from config
|
|
485
|
+
const cascade = options?.cascade && this.config.features.dropTableCascade ? ' CASCADE' : '';
|
|
548
486
|
return `DROP TABLE ${ifExists}${this.escapeId(tableName)}${cascade};`;
|
|
549
487
|
}
|
|
550
488
|
generateRenameTableSql(oldName, newName) {
|
|
@@ -579,6 +517,9 @@ export class SqlSchemaGenerator extends AbstractDialect {
|
|
|
579
517
|
const constraintName = foreignKey.name
|
|
580
518
|
? this.escapeId(foreignKey.name)
|
|
581
519
|
: this.escapeId(`fk_${tableName}_${foreignKey.columns.join('_')}`);
|
|
520
|
+
if (!this.config.features.foreignKeyAlter) {
|
|
521
|
+
throw new Error(`Dialect ${this.dialect} does not support adding foreign keys to existing tables`);
|
|
522
|
+
}
|
|
582
523
|
return (`ALTER TABLE ${this.escapeId(tableName)} ADD CONSTRAINT ${constraintName} ` +
|
|
583
524
|
`FOREIGN KEY (${fkCols}) REFERENCES ${this.escapeId(foreignKey.referencesTable)} (${refCols}) ` +
|
|
584
525
|
`ON DELETE ${foreignKey.onDelete ?? this.defaultForeignKeyAction} ON UPDATE ${foreignKey.onUpdate ?? this.defaultForeignKeyAction};`);
|