@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.
Files changed (36) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/README.md +1 -0
  3. package/dist/migrate/builder/migrationBuilder.d.ts.map +1 -1
  4. package/dist/migrate/builder/migrationBuilder.js +7 -1
  5. package/dist/migrate/builder/migrationBuilder.js.map +1 -1
  6. package/dist/migrate/codegen/entityCodeGenerator.d.ts.map +1 -1
  7. package/dist/migrate/codegen/entityCodeGenerator.js +12 -8
  8. package/dist/migrate/codegen/entityCodeGenerator.js.map +1 -1
  9. package/dist/migrate/introspection/abstractSqlSchemaIntrospector.d.ts +77 -0
  10. package/dist/migrate/introspection/abstractSqlSchemaIntrospector.d.ts.map +1 -0
  11. package/dist/migrate/introspection/abstractSqlSchemaIntrospector.js +156 -0
  12. package/dist/migrate/introspection/abstractSqlSchemaIntrospector.js.map +1 -0
  13. package/dist/migrate/introspection/index.d.ts +1 -0
  14. package/dist/migrate/introspection/index.d.ts.map +1 -1
  15. package/dist/migrate/introspection/index.js +1 -0
  16. package/dist/migrate/introspection/index.js.map +1 -1
  17. package/dist/migrate/introspection/mysqlIntrospector.d.ts +16 -15
  18. package/dist/migrate/introspection/mysqlIntrospector.d.ts.map +1 -1
  19. package/dist/migrate/introspection/mysqlIntrospector.js +64 -122
  20. package/dist/migrate/introspection/mysqlIntrospector.js.map +1 -1
  21. package/dist/migrate/introspection/postgresIntrospector.d.ts +16 -14
  22. package/dist/migrate/introspection/postgresIntrospector.d.ts.map +1 -1
  23. package/dist/migrate/introspection/postgresIntrospector.js +68 -117
  24. package/dist/migrate/introspection/postgresIntrospector.js.map +1 -1
  25. package/dist/migrate/introspection/sqliteIntrospector.d.ts +20 -14
  26. package/dist/migrate/introspection/sqliteIntrospector.d.ts.map +1 -1
  27. package/dist/migrate/introspection/sqliteIntrospector.js +78 -116
  28. package/dist/migrate/introspection/sqliteIntrospector.js.map +1 -1
  29. package/dist/migrate/schemaGenerator.d.ts +1 -13
  30. package/dist/migrate/schemaGenerator.d.ts.map +1 -1
  31. package/dist/migrate/schemaGenerator.js +9 -72
  32. package/dist/migrate/schemaGenerator.js.map +1 -1
  33. package/dist/schema/schemaASTBuilder.d.ts.map +1 -1
  34. package/dist/schema/schemaASTBuilder.js +31 -0
  35. package/dist/schema/schemaASTBuilder.js.map +1 -1
  36. package/package.json +2 -3
@@ -1,86 +1,39 @@
1
- import { isSqlQuerier } from '../../type/index.js';
2
- import { BaseSqlIntrospector } from './baseSqlIntrospector.js';
1
+ import { AbstractSqlSchemaIntrospector } from './abstractSqlSchemaIntrospector.js';
3
2
  /**
4
3
  * MySQL/MariaDB schema introspector.
5
4
  * Works with both MySQL and MariaDB as they share the same information_schema structure.
6
5
  */
7
- export class MysqlSchemaIntrospector extends BaseSqlIntrospector {
6
+ export class MysqlSchemaIntrospector extends AbstractSqlSchemaIntrospector {
8
7
  pool;
9
8
  constructor(pool) {
10
9
  super('mysql');
11
10
  this.pool = pool;
12
11
  }
13
- async getTableSchema(tableName) {
14
- const querier = await this.getQuerier();
15
- try {
16
- const exists = await this.tableExistsInternal(querier, tableName);
17
- if (!exists) {
18
- return undefined;
19
- }
20
- const [columns, indexes, foreignKeys, primaryKey] = await Promise.all([
21
- this.getColumns(querier, tableName),
22
- this.getIndexes(querier, tableName),
23
- this.getForeignKeys(querier, tableName),
24
- this.getPrimaryKey(querier, tableName),
25
- ]);
26
- return {
27
- name: tableName,
28
- columns,
29
- primaryKey,
30
- indexes,
31
- foreignKeys,
32
- };
33
- }
34
- finally {
35
- await querier.release();
36
- }
37
- }
38
- async getTableNames() {
39
- const querier = await this.getQuerier();
40
- try {
41
- const sql = `
42
- SELECT TABLE_NAME as table_name
43
- FROM information_schema.TABLES
44
- WHERE TABLE_SCHEMA = DATABASE()
45
- AND TABLE_TYPE = 'BASE TABLE'
46
- ORDER BY TABLE_NAME
47
- `;
48
- const results = await querier.all(sql);
49
- return results.map((r) => r.table_name);
50
- }
51
- finally {
52
- await querier.release();
53
- }
54
- }
55
- async tableExists(tableName) {
56
- const querier = await this.getQuerier();
57
- try {
58
- return this.tableExistsInternal(querier, tableName);
59
- }
60
- finally {
61
- await querier.release();
62
- }
12
+ // ============================================================================
13
+ // SQL Queries (dialect-specific)
14
+ // ============================================================================
15
+ getTableNamesQuery() {
16
+ return /*sql*/ `
17
+ SELECT TABLE_NAME as table_name
18
+ FROM information_schema.TABLES
19
+ WHERE TABLE_SCHEMA = DATABASE()
20
+ AND TABLE_TYPE = 'BASE TABLE'
21
+ ORDER BY TABLE_NAME
22
+ `;
63
23
  }
64
- async tableExistsInternal(querier, tableName) {
65
- const sql = `
24
+ tableExistsQuery() {
25
+ return /*sql*/ `
66
26
  SELECT COUNT(*) as count
67
27
  FROM information_schema.TABLES
68
28
  WHERE TABLE_SCHEMA = DATABASE()
69
29
  AND TABLE_NAME = ?
70
30
  `;
71
- const results = await querier.all(sql, [tableName]);
72
- return (results[0]?.count ?? 0) > 0;
73
31
  }
74
- async getQuerier() {
75
- const querier = await this.pool.getQuerier();
76
- if (!isSqlQuerier(querier)) {
77
- await querier.release();
78
- throw new Error('MysqlSchemaIntrospector requires a SQL-based querier');
79
- }
80
- return querier;
32
+ parseTableExistsResult(results) {
33
+ return this.toNumber(results[0]?.count) > 0;
81
34
  }
82
- async getColumns(querier, tableName) {
83
- const sql = `
35
+ getColumnsQuery(_tableName) {
36
+ return /*sql*/ `
84
37
  SELECT
85
38
  COLUMN_NAME as column_name,
86
39
  DATA_TYPE as data_type,
@@ -98,29 +51,9 @@ export class MysqlSchemaIntrospector extends BaseSqlIntrospector {
98
51
  AND TABLE_NAME = ?
99
52
  ORDER BY ORDINAL_POSITION
100
53
  `;
101
- const results = await querier.all(sql, [tableName]);
102
- return results.map((row) => ({
103
- name: row.column_name,
104
- type: (row.column_type || '').toUpperCase(),
105
- nullable: row.is_nullable === 'YES',
106
- defaultValue: this.parseDefaultValue(row.column_default),
107
- isPrimaryKey: row.column_key === 'PRI',
108
- isAutoIncrement: (row.extra || '').toLowerCase().includes('auto_increment'),
109
- isUnique: row.column_key === 'UNI',
110
- length: this.toNumber(row.character_maximum_length),
111
- precision: this.toNumber(row.numeric_precision),
112
- scale: this.toNumber(row.numeric_scale),
113
- comment: row.column_comment || undefined,
114
- }));
115
- }
116
- toNumber(value) {
117
- if (value == null) {
118
- return undefined;
119
- }
120
- return Number(value);
121
54
  }
122
- async getIndexes(querier, tableName) {
123
- const sql = `
55
+ getIndexesQuery(_tableName) {
56
+ return /*sql*/ `
124
57
  SELECT
125
58
  INDEX_NAME as index_name,
126
59
  GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) as columns,
@@ -132,15 +65,9 @@ export class MysqlSchemaIntrospector extends BaseSqlIntrospector {
132
65
  GROUP BY INDEX_NAME, NON_UNIQUE
133
66
  ORDER BY INDEX_NAME
134
67
  `;
135
- const results = await querier.all(sql, [tableName]);
136
- return results.map((row) => ({
137
- name: row.index_name,
138
- columns: (row.columns || '').split(','),
139
- unique: Boolean(row.is_unique),
140
- }));
141
68
  }
142
- async getForeignKeys(querier, tableName) {
143
- const sql = `
69
+ getForeignKeysQuery(_tableName) {
70
+ return /*sql*/ `
144
71
  SELECT
145
72
  kcu.CONSTRAINT_NAME as constraint_name,
146
73
  GROUP_CONCAT(kcu.COLUMN_NAME ORDER BY kcu.ORDINAL_POSITION) as columns,
@@ -158,7 +85,46 @@ export class MysqlSchemaIntrospector extends BaseSqlIntrospector {
158
85
  GROUP BY kcu.CONSTRAINT_NAME, kcu.REFERENCED_TABLE_NAME, rc.DELETE_RULE, rc.UPDATE_RULE
159
86
  ORDER BY kcu.CONSTRAINT_NAME
160
87
  `;
161
- const results = await querier.all(sql, [tableName]);
88
+ }
89
+ getPrimaryKeyQuery(_tableName) {
90
+ return /*sql*/ `
91
+ SELECT COLUMN_NAME as column_name
92
+ FROM information_schema.KEY_COLUMN_USAGE
93
+ WHERE TABLE_SCHEMA = DATABASE()
94
+ AND TABLE_NAME = ?
95
+ AND CONSTRAINT_NAME = 'PRIMARY'
96
+ ORDER BY ORDINAL_POSITION
97
+ `;
98
+ }
99
+ // ============================================================================
100
+ // Row Mapping (dialect-specific)
101
+ // ============================================================================
102
+ mapTableNameRow(row) {
103
+ return row.table_name;
104
+ }
105
+ async mapColumnsResult(_querier, _tableName, results) {
106
+ return results.map((row) => ({
107
+ name: row.column_name,
108
+ type: (row.column_type || '').toUpperCase(),
109
+ nullable: row.is_nullable === 'YES',
110
+ defaultValue: this.parseDefaultValue(row.column_default),
111
+ isPrimaryKey: row.column_key === 'PRI',
112
+ isAutoIncrement: (row.extra || '').toLowerCase().includes('auto_increment'),
113
+ isUnique: row.column_key === 'UNI',
114
+ length: this.toNumber(row.character_maximum_length),
115
+ precision: this.toNumber(row.numeric_precision),
116
+ scale: this.toNumber(row.numeric_scale),
117
+ comment: row.column_comment || undefined,
118
+ }));
119
+ }
120
+ async mapIndexesResult(_querier, _tableName, results) {
121
+ return results.map((row) => ({
122
+ name: row.index_name,
123
+ columns: (row.columns || '').split(','),
124
+ unique: Boolean(row.is_unique),
125
+ }));
126
+ }
127
+ async mapForeignKeysResult(_querier, _tableName, results) {
162
128
  return results.map((row) => ({
163
129
  name: row.constraint_name,
164
130
  columns: (row.columns || '').split(','),
@@ -168,16 +134,7 @@ export class MysqlSchemaIntrospector extends BaseSqlIntrospector {
168
134
  onUpdate: this.normalizeReferentialAction(row.update_rule),
169
135
  }));
170
136
  }
171
- async getPrimaryKey(querier, tableName) {
172
- const sql = `
173
- SELECT COLUMN_NAME as column_name
174
- FROM information_schema.KEY_COLUMN_USAGE
175
- WHERE TABLE_SCHEMA = DATABASE()
176
- AND TABLE_NAME = ?
177
- AND CONSTRAINT_NAME = 'PRIMARY'
178
- ORDER BY ORDINAL_POSITION
179
- `;
180
- const results = await querier.all(sql, [tableName]);
137
+ mapPrimaryKeyResult(results) {
181
138
  if (results.length === 0) {
182
139
  return undefined;
183
140
  }
@@ -187,7 +144,6 @@ export class MysqlSchemaIntrospector extends BaseSqlIntrospector {
187
144
  if (defaultValue === null) {
188
145
  return undefined;
189
146
  }
190
- // Check for common patterns
191
147
  if (defaultValue === 'NULL') {
192
148
  return null;
193
149
  }
@@ -206,20 +162,6 @@ export class MysqlSchemaIntrospector extends BaseSqlIntrospector {
206
162
  }
207
163
  return defaultValue;
208
164
  }
209
- normalizeReferentialAction(action) {
210
- switch (action.toUpperCase()) {
211
- case 'CASCADE':
212
- return 'CASCADE';
213
- case 'SET NULL':
214
- return 'SET NULL';
215
- case 'RESTRICT':
216
- return 'RESTRICT';
217
- case 'NO ACTION':
218
- return 'NO ACTION';
219
- default:
220
- return undefined;
221
- }
222
- }
223
165
  }
224
166
  /**
225
167
  * Alias for MysqlSchemaIntrospector.
@@ -1 +1 @@
1
- {"version":3,"file":"mysqlIntrospector.js","sourceRoot":"","sources":["../../../src/migrate/introspection/mysqlIntrospector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mysqlIntrospector.js","sourceRoot":"","sources":["../../../src/migrate/introspection/mysqlIntrospector.ts"],"names":[],"mappings":"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"}
@@ -1,23 +1,25 @@
1
- import type { ColumnSchema, ForeignKeySchema, IndexSchema, QuerierPool, SchemaIntrospector, SqlQuerier, TableSchema } from '../../type/index.js';
2
- import { BaseSqlIntrospector } from './baseSqlIntrospector.js';
1
+ import type { ColumnSchema, ForeignKeySchema, IndexSchema, QuerierPool, SqlQuerier } from '../../type/index.js';
2
+ import { AbstractSqlSchemaIntrospector } from './abstractSqlSchemaIntrospector.js';
3
3
  /**
4
4
  * PostgreSQL schema introspector
5
5
  */
6
- export declare class PostgresSchemaIntrospector extends BaseSqlIntrospector implements SchemaIntrospector {
7
- private readonly pool;
6
+ export declare class PostgresSchemaIntrospector extends AbstractSqlSchemaIntrospector {
7
+ protected readonly pool: QuerierPool;
8
8
  constructor(pool: QuerierPool);
9
- getTableSchema(tableName: string): Promise<TableSchema | undefined>;
10
- getTableNames(): Promise<string[]>;
11
- tableExists(tableName: string): Promise<boolean>;
12
- protected tableExistsInternal(querier: SqlQuerier, tableName: string): Promise<boolean>;
13
- protected getQuerier(): Promise<SqlQuerier>;
14
- protected getColumns(querier: SqlQuerier, tableName: string): Promise<ColumnSchema[]>;
15
- protected getIndexes(querier: SqlQuerier, tableName: string): Promise<IndexSchema[]>;
16
- protected getForeignKeys(querier: SqlQuerier, tableName: string): Promise<ForeignKeySchema[]>;
17
- protected getPrimaryKey(querier: SqlQuerier, tableName: string): Promise<string[] | undefined>;
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 mapTableNameRow(row: Record<string, unknown>): string;
17
+ protected mapColumnsResult(_querier: SqlQuerier, _tableName: string, results: Record<string, unknown>[]): Promise<ColumnSchema[]>;
18
+ protected mapIndexesResult(_querier: SqlQuerier, _tableName: string, results: Record<string, unknown>[]): Promise<IndexSchema[]>;
19
+ protected mapForeignKeysResult(_querier: SqlQuerier, _tableName: string, results: Record<string, unknown>[]): Promise<ForeignKeySchema[]>;
20
+ protected mapPrimaryKeyResult(results: Record<string, unknown>[]): string[] | undefined;
18
21
  protected normalizeType(dataType: string, udtName: string): string;
19
22
  protected parseDefaultValue(defaultValue: string | null): unknown;
20
23
  protected isAutoIncrement(defaultValue: string | null, isIdentity: string): boolean;
21
- protected normalizeReferentialAction(action: string): 'CASCADE' | 'SET NULL' | 'RESTRICT' | 'NO ACTION' | undefined;
22
24
  }
23
25
  //# 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;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
+ {"version":3,"file":"postgresIntrospector.d.ts","sourceRoot":"","sources":["../../../src/migrate/introspection/postgresIntrospector.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,0BAA2B,SAAQ,6BAA6B;IAC3E,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;gBAEzB,IAAI,EAAE,WAAW;IAS7B,SAAS,CAAC,kBAAkB,IAAI,MAAM;IAUtC,SAAS,CAAC,gBAAgB,IAAI,MAAM;IAUpC,SAAS,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,OAAO;IAI7E,SAAS,CAAC,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IA4CrD,SAAS,CAAC,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAoBrD,SAAS,CAAC,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IA2BzD,SAAS,CAAC,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAkBxD,SAAS,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;cAI/C,gBAAgB,CAC9B,QAAQ,EAAE,UAAU,EACpB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GACjC,OAAO,CAAC,YAAY,EAAE,CAAC;cAgBV,gBAAgB,CAC9B,QAAQ,EAAE,UAAU,EACpB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GACjC,OAAO,CAAC,WAAW,EAAE,CAAC;cAQT,oBAAoB,CAClC,QAAQ,EAAE,UAAU,EACpB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GACjC,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAW9B,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,SAAS;IAWvF,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;IA4BjE,SAAS,CAAC,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;CAWpF"}
@@ -1,86 +1,39 @@
1
- import { isSqlQuerier } from '../../type/index.js';
2
- import { BaseSqlIntrospector } from './baseSqlIntrospector.js';
1
+ import { AbstractSqlSchemaIntrospector } from './abstractSqlSchemaIntrospector.js';
3
2
  /**
4
3
  * PostgreSQL schema introspector
5
4
  */
6
- export class PostgresSchemaIntrospector extends BaseSqlIntrospector {
5
+ export class PostgresSchemaIntrospector extends AbstractSqlSchemaIntrospector {
7
6
  pool;
8
7
  constructor(pool) {
9
8
  super('postgres');
10
9
  this.pool = pool;
11
10
  }
12
- async getTableSchema(tableName) {
13
- const querier = await this.getQuerier();
14
- try {
15
- const exists = await this.tableExistsInternal(querier, tableName);
16
- if (!exists) {
17
- return undefined;
18
- }
19
- const [columns, indexes, foreignKeys, primaryKey] = await Promise.all([
20
- this.getColumns(querier, tableName),
21
- this.getIndexes(querier, tableName),
22
- this.getForeignKeys(querier, tableName),
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 = `
41
- SELECT table_name
42
- FROM information_schema.tables
43
- WHERE table_schema = 'public'
44
- AND table_type = 'BASE TABLE'
45
- ORDER BY table_name
46
- `;
47
- const results = await querier.all(sql);
48
- return results.map((r) => r.table_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 table_name
17
+ FROM information_schema.tables
18
+ WHERE table_schema = 'public'
19
+ AND table_type = 'BASE TABLE'
20
+ ORDER BY table_name
21
+ `;
62
22
  }
63
- async tableExistsInternal(querier, tableName) {
64
- const sql = `
23
+ tableExistsQuery() {
24
+ return /*sql*/ `
65
25
  SELECT EXISTS (
66
26
  SELECT FROM information_schema.tables
67
27
  WHERE table_schema = 'public'
68
28
  AND table_name = $1
69
29
  ) AS exists
70
30
  `;
71
- const results = await querier.all(sql, [tableName]);
72
- return results[0]?.exists ?? false;
73
31
  }
74
- async getQuerier() {
75
- const querier = await this.pool.getQuerier();
76
- if (!isSqlQuerier(querier)) {
77
- await querier.release();
78
- throw new Error('PostgresSchemaIntrospector requires a SQL-based querier');
79
- }
80
- return querier;
32
+ parseTableExistsResult(results) {
33
+ return results[0]?.exists ?? false;
81
34
  }
82
- async getColumns(querier, tableName) {
83
- const sql = /*sql*/ `
35
+ getColumnsQuery(_tableName) {
36
+ return /*sql*/ `
84
37
  SELECT
85
38
  c.column_name,
86
39
  c.data_type,
@@ -121,23 +74,9 @@ export class PostgresSchemaIntrospector extends BaseSqlIntrospector {
121
74
  AND c.table_name = $1
122
75
  ORDER BY c.ordinal_position
123
76
  `;
124
- const results = await querier.all(sql, [tableName]);
125
- return results.map((row) => ({
126
- name: row.column_name,
127
- type: this.normalizeType(row.data_type, row.udt_name),
128
- nullable: row.is_nullable === 'YES',
129
- defaultValue: this.parseDefaultValue(row.column_default),
130
- isPrimaryKey: row.is_primary_key,
131
- isAutoIncrement: this.isAutoIncrement(row.column_default, row.is_identity),
132
- isUnique: row.is_unique,
133
- length: row.character_maximum_length ?? undefined,
134
- precision: row.numeric_precision ?? undefined,
135
- scale: row.numeric_scale ?? undefined,
136
- comment: row.column_comment ?? undefined,
137
- }));
138
77
  }
139
- async getIndexes(querier, tableName) {
140
- const sql = /*sql*/ `
78
+ getIndexesQuery(_tableName) {
79
+ return /*sql*/ `
141
80
  SELECT
142
81
  i.relname AS index_name,
143
82
  array_to_json(array_agg(a.attname ORDER BY k.n)) AS columns,
@@ -154,15 +93,9 @@ export class PostgresSchemaIntrospector extends BaseSqlIntrospector {
154
93
  GROUP BY i.relname, ix.indisunique
155
94
  ORDER BY i.relname
156
95
  `;
157
- const results = await querier.all(sql, [tableName]);
158
- return results.map((row) => ({
159
- name: row.index_name,
160
- columns: row.columns,
161
- unique: row.is_unique,
162
- }));
163
96
  }
164
- async getForeignKeys(querier, tableName) {
165
- const sql = /*sql*/ `
97
+ getForeignKeysQuery(_tableName) {
98
+ return /*sql*/ `
166
99
  SELECT
167
100
  tc.constraint_name,
168
101
  array_to_json(array_agg(kcu.column_name ORDER BY kcu.ordinal_position)) AS columns,
@@ -186,18 +119,9 @@ export class PostgresSchemaIntrospector extends BaseSqlIntrospector {
186
119
  GROUP BY tc.constraint_name, ccu.table_name, rc.delete_rule, rc.update_rule
187
120
  ORDER BY tc.constraint_name
188
121
  `;
189
- const results = await querier.all(sql, [tableName]);
190
- return results.map((row) => ({
191
- name: row.constraint_name,
192
- columns: row.columns,
193
- referencedTable: row.referenced_table,
194
- referencedColumns: row.referenced_columns,
195
- onDelete: this.normalizeReferentialAction(row.delete_rule),
196
- onUpdate: this.normalizeReferentialAction(row.update_rule),
197
- }));
198
122
  }
199
- async getPrimaryKey(querier, tableName) {
200
- const sql = /*sql*/ `
123
+ getPrimaryKeyQuery(_tableName) {
124
+ return /*sql*/ `
201
125
  SELECT kcu.column_name
202
126
  FROM information_schema.table_constraints tc
203
127
  JOIN information_schema.key_column_usage kcu
@@ -208,12 +132,54 @@ export class PostgresSchemaIntrospector extends BaseSqlIntrospector {
208
132
  AND tc.table_schema = 'public'
209
133
  ORDER BY kcu.ordinal_position
210
134
  `;
211
- const results = await querier.all(sql, [tableName]);
135
+ }
136
+ // ============================================================================
137
+ // Row Mapping (dialect-specific)
138
+ // ============================================================================
139
+ mapTableNameRow(row) {
140
+ return row.table_name;
141
+ }
142
+ async mapColumnsResult(_querier, _tableName, results) {
143
+ return results.map((row) => ({
144
+ name: row.column_name,
145
+ type: this.normalizeType(row.data_type, row.udt_name),
146
+ nullable: row.is_nullable === 'YES',
147
+ defaultValue: this.parseDefaultValue(row.column_default),
148
+ isPrimaryKey: row.is_primary_key,
149
+ isAutoIncrement: this.isAutoIncrement(row.column_default, row.is_identity),
150
+ isUnique: row.is_unique,
151
+ length: row.character_maximum_length ?? undefined,
152
+ precision: row.numeric_precision ?? undefined,
153
+ scale: row.numeric_scale ?? undefined,
154
+ comment: row.column_comment ?? undefined,
155
+ }));
156
+ }
157
+ async mapIndexesResult(_querier, _tableName, results) {
158
+ return results.map((row) => ({
159
+ name: row.index_name,
160
+ columns: row.columns,
161
+ unique: row.is_unique,
162
+ }));
163
+ }
164
+ async mapForeignKeysResult(_querier, _tableName, results) {
165
+ return results.map((row) => ({
166
+ name: row.constraint_name,
167
+ columns: row.columns,
168
+ referencedTable: row.referenced_table,
169
+ referencedColumns: row.referenced_columns,
170
+ onDelete: this.normalizeReferentialAction(row.delete_rule),
171
+ onUpdate: this.normalizeReferentialAction(row.update_rule),
172
+ }));
173
+ }
174
+ mapPrimaryKeyResult(results) {
212
175
  if (results.length === 0) {
213
176
  return undefined;
214
177
  }
215
178
  return results.map((r) => r.column_name);
216
179
  }
180
+ // ============================================================================
181
+ // PostgreSQL-specific helpers
182
+ // ============================================================================
217
183
  normalizeType(dataType, udtName) {
218
184
  // Handle user-defined types and arrays
219
185
  if (dataType === 'USER-DEFINED') {
@@ -230,7 +196,6 @@ export class PostgresSchemaIntrospector extends BaseSqlIntrospector {
230
196
  }
231
197
  // Remove type casting (e.g., ::text, ::character varying, ::text[])
232
198
  const cleaned = defaultValue.replace(/::[a-z_]+(\s+[a-z_]+)?(\[\])?/gi, '').trim();
233
- // Check for common patterns
234
199
  if (cleaned.startsWith("'") && cleaned.endsWith("'")) {
235
200
  return cleaned.slice(1, -1);
236
201
  }
@@ -260,19 +225,5 @@ export class PostgresSchemaIntrospector extends BaseSqlIntrospector {
260
225
  }
261
226
  return false;
262
227
  }
263
- normalizeReferentialAction(action) {
264
- switch (action.toUpperCase()) {
265
- case 'CASCADE':
266
- return 'CASCADE';
267
- case 'SET NULL':
268
- return 'SET NULL';
269
- case 'RESTRICT':
270
- return 'RESTRICT';
271
- case 'NO ACTION':
272
- return 'NO ACTION';
273
- default:
274
- return undefined;
275
- }
276
- }
277
228
  }
278
229
  //# sourceMappingURL=postgresIntrospector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"postgresIntrospector.js","sourceRoot":"","sources":["../../../src/migrate/introspection/postgresIntrospector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"postgresIntrospector.js","sourceRoot":"","sources":["../../../src/migrate/introspection/postgresIntrospector.ts"],"names":[],"mappings":"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"}