@uql/core 3.8.2 → 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 +9 -1
- package/README.md +1 -0
- package/dist/migrate/builder/migrationBuilder.d.ts.map +1 -1
- package/dist/migrate/builder/migrationBuilder.js +7 -1
- package/dist/migrate/builder/migrationBuilder.js.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 -15
- package/dist/migrate/introspection/mysqlIntrospector.d.ts.map +1 -1
- package/dist/migrate/introspection/mysqlIntrospector.js +65 -122
- package/dist/migrate/introspection/mysqlIntrospector.js.map +1 -1
- package/dist/migrate/introspection/postgresIntrospector.d.ts +16 -14
- package/dist/migrate/introspection/postgresIntrospector.d.ts.map +1 -1
- package/dist/migrate/introspection/postgresIntrospector.js +68 -117
- 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 +79 -116
- 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 +9 -72
- 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/package.json +2 -3
|
@@ -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,51 +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) {
|
|
83
|
+
async mapIndexesResult(querier, _tableName, results) {
|
|
84
|
+
const indexSchemas = [];
|
|
85
|
+
for (const index of results) {
|
|
121
86
|
const columns = await querier.all(`PRAGMA index_info(${this.escapeId(index.name)})`);
|
|
122
87
|
// Include user-created indexes ('c') and multi-column unique constraints ('u')
|
|
123
88
|
// Skip primary key indexes ('pk') and single-column unique constraints
|
|
124
89
|
const isUserCreated = index.origin === 'c';
|
|
125
90
|
const isCompositeUnique = index.origin === 'u' && columns.length > 1;
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
result.push({
|
|
91
|
+
if (isUserCreated || isCompositeUnique) {
|
|
92
|
+
indexSchemas.push({
|
|
129
93
|
name: index.name,
|
|
130
94
|
columns: columns.map((c) => c.name),
|
|
131
95
|
unique: Boolean(index.unique),
|
|
132
96
|
});
|
|
133
97
|
}
|
|
134
98
|
}
|
|
135
|
-
return
|
|
99
|
+
return indexSchemas;
|
|
136
100
|
}
|
|
137
|
-
async
|
|
138
|
-
const sql = `PRAGMA foreign_key_list(${this.escapeId(tableName)})`;
|
|
139
|
-
const results = await querier.all(sql);
|
|
101
|
+
async mapForeignKeysResult(_querier, tableName, results) {
|
|
140
102
|
// Group by id to handle composite foreign keys
|
|
141
103
|
const grouped = new Map();
|
|
142
104
|
for (const row of results) {
|
|
143
|
-
const
|
|
105
|
+
const id = row.id;
|
|
106
|
+
const existing = grouped.get(id) ?? [];
|
|
144
107
|
existing.push(row);
|
|
145
|
-
grouped.set(
|
|
108
|
+
grouped.set(id, existing);
|
|
146
109
|
}
|
|
147
110
|
return Array.from(grouped.entries()).map(([id, rows]) => {
|
|
148
111
|
const first = rows[0];
|
|
@@ -156,15 +119,30 @@ export class SqliteSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
156
119
|
};
|
|
157
120
|
});
|
|
158
121
|
}
|
|
159
|
-
|
|
160
|
-
const sql = `PRAGMA table_info(${this.escapeId(tableName)})`;
|
|
161
|
-
const results = await querier.all(sql);
|
|
122
|
+
mapPrimaryKeyResult(results) {
|
|
162
123
|
const pkColumns = results.filter((r) => r.pk > 0).sort((a, b) => a.pk - b.pk);
|
|
163
124
|
if (pkColumns.length === 0) {
|
|
164
125
|
return undefined;
|
|
165
126
|
}
|
|
166
127
|
return pkColumns.map((r) => r.name);
|
|
167
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
|
+
}
|
|
168
146
|
normalizeType(type) {
|
|
169
147
|
// Extract base type without length/precision
|
|
170
148
|
const match = type.match(/^([A-Za-z]+)/);
|
|
@@ -178,7 +156,6 @@ export class SqliteSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
178
156
|
if (defaultValue === null) {
|
|
179
157
|
return undefined;
|
|
180
158
|
}
|
|
181
|
-
// Check for common patterns
|
|
182
159
|
if (defaultValue === 'NULL') {
|
|
183
160
|
return null;
|
|
184
161
|
}
|
|
@@ -196,19 +173,5 @@ export class SqliteSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
196
173
|
}
|
|
197
174
|
return defaultValue;
|
|
198
175
|
}
|
|
199
|
-
normalizeReferentialAction(action) {
|
|
200
|
-
switch (action.toUpperCase()) {
|
|
201
|
-
case 'CASCADE':
|
|
202
|
-
return 'CASCADE';
|
|
203
|
-
case 'SET NULL':
|
|
204
|
-
return 'SET NULL';
|
|
205
|
-
case 'RESTRICT':
|
|
206
|
-
return 'RESTRICT';
|
|
207
|
-
case 'NO ACTION':
|
|
208
|
-
return 'NO ACTION';
|
|
209
|
-
default:
|
|
210
|
-
return undefined;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
176
|
}
|
|
214
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);
|
|
@@ -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
|
/**
|