@uql/core 3.8.2 → 3.8.5
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 +13 -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 +64 -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 +78 -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): unknown[];
|
|
17
|
+
protected getIndexesParams(_tableName: string): unknown[];
|
|
18
|
+
protected getForeignKeysParams(_tableName: string): unknown[];
|
|
19
|
+
protected getPrimaryKeyParams(_tableName: string): unknown[];
|
|
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;IAK7E,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,OAAO,EAAE;cAI/C,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,EAAE;cAI/C,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,EAAE;cAInD,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,EAAE;IAQrE,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,68 @@
|
|
|
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
|
+
return this.toNumber(results[0]?.count) > 0;
|
|
33
|
+
}
|
|
34
|
+
// SQLite uses PRAGMA which doesn't use parameterized queries in the same way
|
|
35
|
+
getColumnsQuery(tableName) {
|
|
36
|
+
return `PRAGMA table_info(${this.escapeId(tableName)})`;
|
|
37
|
+
}
|
|
38
|
+
getIndexesQuery(tableName) {
|
|
39
|
+
return `PRAGMA index_list(${this.escapeId(tableName)})`;
|
|
40
|
+
}
|
|
41
|
+
getForeignKeysQuery(tableName) {
|
|
42
|
+
return `PRAGMA foreign_key_list(${this.escapeId(tableName)})`;
|
|
43
|
+
}
|
|
44
|
+
getPrimaryKeyQuery(tableName) {
|
|
45
|
+
return `PRAGMA table_info(${this.escapeId(tableName)})`;
|
|
46
|
+
}
|
|
47
|
+
getColumnsParams(_tableName) {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
getIndexesParams(_tableName) {
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
getForeignKeysParams(_tableName) {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
getPrimaryKeyParams(_tableName) {
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
// ============================================================================
|
|
60
|
+
// Row Mapping (dialect-specific)
|
|
61
|
+
// ============================================================================
|
|
62
|
+
mapTableNameRow(row) {
|
|
63
|
+
return row.name;
|
|
64
|
+
}
|
|
65
|
+
async mapColumnsResult(querier, tableName, results) {
|
|
85
66
|
// Get unique columns from indexes
|
|
86
67
|
const uniqueColumns = await this.getUniqueColumns(querier, tableName);
|
|
87
68
|
return results.map((row) => ({
|
|
@@ -98,51 +79,32 @@ export class SqliteSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
98
79
|
comment: undefined, // SQLite doesn't support column comments
|
|
99
80
|
}));
|
|
100
81
|
}
|
|
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) {
|
|
82
|
+
async mapIndexesResult(querier, _tableName, results) {
|
|
83
|
+
const indexSchemas = [];
|
|
84
|
+
for (const index of results) {
|
|
121
85
|
const columns = await querier.all(`PRAGMA index_info(${this.escapeId(index.name)})`);
|
|
122
86
|
// Include user-created indexes ('c') and multi-column unique constraints ('u')
|
|
123
87
|
// Skip primary key indexes ('pk') and single-column unique constraints
|
|
124
88
|
const isUserCreated = index.origin === 'c';
|
|
125
89
|
const isCompositeUnique = index.origin === 'u' && columns.length > 1;
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
result.push({
|
|
90
|
+
if (isUserCreated || isCompositeUnique) {
|
|
91
|
+
indexSchemas.push({
|
|
129
92
|
name: index.name,
|
|
130
93
|
columns: columns.map((c) => c.name),
|
|
131
94
|
unique: Boolean(index.unique),
|
|
132
95
|
});
|
|
133
96
|
}
|
|
134
97
|
}
|
|
135
|
-
return
|
|
98
|
+
return indexSchemas;
|
|
136
99
|
}
|
|
137
|
-
async
|
|
138
|
-
const sql = `PRAGMA foreign_key_list(${this.escapeId(tableName)})`;
|
|
139
|
-
const results = await querier.all(sql);
|
|
100
|
+
async mapForeignKeysResult(_querier, tableName, results) {
|
|
140
101
|
// Group by id to handle composite foreign keys
|
|
141
102
|
const grouped = new Map();
|
|
142
103
|
for (const row of results) {
|
|
143
|
-
const
|
|
104
|
+
const id = row.id;
|
|
105
|
+
const existing = grouped.get(id) ?? [];
|
|
144
106
|
existing.push(row);
|
|
145
|
-
grouped.set(
|
|
107
|
+
grouped.set(id, existing);
|
|
146
108
|
}
|
|
147
109
|
return Array.from(grouped.entries()).map(([id, rows]) => {
|
|
148
110
|
const first = rows[0];
|
|
@@ -156,15 +118,30 @@ export class SqliteSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
156
118
|
};
|
|
157
119
|
});
|
|
158
120
|
}
|
|
159
|
-
|
|
160
|
-
const sql = `PRAGMA table_info(${this.escapeId(tableName)})`;
|
|
161
|
-
const results = await querier.all(sql);
|
|
121
|
+
mapPrimaryKeyResult(results) {
|
|
162
122
|
const pkColumns = results.filter((r) => r.pk > 0).sort((a, b) => a.pk - b.pk);
|
|
163
123
|
if (pkColumns.length === 0) {
|
|
164
124
|
return undefined;
|
|
165
125
|
}
|
|
166
126
|
return pkColumns.map((r) => r.name);
|
|
167
127
|
}
|
|
128
|
+
// ============================================================================
|
|
129
|
+
// SQLite-specific helpers
|
|
130
|
+
// ============================================================================
|
|
131
|
+
async getUniqueColumns(querier, tableName) {
|
|
132
|
+
const indexes = await querier.all(`PRAGMA index_list(${this.escapeId(tableName)})`);
|
|
133
|
+
const uniqueColumns = new Set();
|
|
134
|
+
for (const index of indexes) {
|
|
135
|
+
if (index.unique && index.origin === 'u') {
|
|
136
|
+
const indexInfo = await querier.all(`PRAGMA index_info(${this.escapeId(index.name)})`);
|
|
137
|
+
// Only single-column unique constraints
|
|
138
|
+
if (indexInfo.length === 1) {
|
|
139
|
+
uniqueColumns.add(indexInfo[0].name);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return uniqueColumns;
|
|
144
|
+
}
|
|
168
145
|
normalizeType(type) {
|
|
169
146
|
// Extract base type without length/precision
|
|
170
147
|
const match = type.match(/^([A-Za-z]+)/);
|
|
@@ -178,7 +155,6 @@ export class SqliteSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
178
155
|
if (defaultValue === null) {
|
|
179
156
|
return undefined;
|
|
180
157
|
}
|
|
181
|
-
// Check for common patterns
|
|
182
158
|
if (defaultValue === 'NULL') {
|
|
183
159
|
return null;
|
|
184
160
|
}
|
|
@@ -196,19 +172,5 @@ export class SqliteSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
196
172
|
}
|
|
197
173
|
return defaultValue;
|
|
198
174
|
}
|
|
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
175
|
}
|
|
214
176
|
//# 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
|
/**
|