@codemastersolutions/db-utility 0.0.1

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 (143) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSE.es +21 -0
  3. package/LICENSE.pt-BR +21 -0
  4. package/README.es.md +155 -0
  5. package/README.md +155 -0
  6. package/README.pt-BR.md +155 -0
  7. package/dist/cli/index.d.ts +3 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +314 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/config/AppConfig.d.ts +19 -0
  12. package/dist/config/AppConfig.d.ts.map +1 -0
  13. package/dist/config/AppConfig.js +142 -0
  14. package/dist/config/AppConfig.js.map +1 -0
  15. package/dist/config/ConfigInitializer.d.ts +10 -0
  16. package/dist/config/ConfigInitializer.d.ts.map +1 -0
  17. package/dist/config/ConfigInitializer.js +37 -0
  18. package/dist/config/ConfigInitializer.js.map +1 -0
  19. package/dist/config/ConfigLoader.d.ts +7 -0
  20. package/dist/config/ConfigLoader.d.ts.map +1 -0
  21. package/dist/config/ConfigLoader.js +94 -0
  22. package/dist/config/ConfigLoader.js.map +1 -0
  23. package/dist/database/ConnectionFactory.d.ts +5 -0
  24. package/dist/database/ConnectionFactory.d.ts.map +1 -0
  25. package/dist/database/ConnectionFactory.js +22 -0
  26. package/dist/database/ConnectionFactory.js.map +1 -0
  27. package/dist/database/SqlSafety.d.ts +7 -0
  28. package/dist/database/SqlSafety.d.ts.map +1 -0
  29. package/dist/database/SqlSafety.js +47 -0
  30. package/dist/database/SqlSafety.js.map +1 -0
  31. package/dist/database/connectors/MssqlConnector.d.ts +13 -0
  32. package/dist/database/connectors/MssqlConnector.d.ts.map +1 -0
  33. package/dist/database/connectors/MssqlConnector.js +72 -0
  34. package/dist/database/connectors/MssqlConnector.js.map +1 -0
  35. package/dist/database/connectors/MysqlConnector.d.ts +12 -0
  36. package/dist/database/connectors/MysqlConnector.d.ts.map +1 -0
  37. package/dist/database/connectors/MysqlConnector.js +70 -0
  38. package/dist/database/connectors/MysqlConnector.js.map +1 -0
  39. package/dist/database/connectors/PostgresConnector.d.ts +12 -0
  40. package/dist/database/connectors/PostgresConnector.d.ts.map +1 -0
  41. package/dist/database/connectors/PostgresConnector.js +65 -0
  42. package/dist/database/connectors/PostgresConnector.js.map +1 -0
  43. package/dist/errors/DbUtilityError.d.ts +7 -0
  44. package/dist/errors/DbUtilityError.d.ts.map +1 -0
  45. package/dist/errors/DbUtilityError.js +15 -0
  46. package/dist/errors/DbUtilityError.js.map +1 -0
  47. package/dist/generators/GeneratorTypes.d.ts +15 -0
  48. package/dist/generators/GeneratorTypes.d.ts.map +1 -0
  49. package/dist/generators/GeneratorTypes.js +3 -0
  50. package/dist/generators/GeneratorTypes.js.map +1 -0
  51. package/dist/generators/GeneratorWriter.d.ts +6 -0
  52. package/dist/generators/GeneratorWriter.d.ts.map +1 -0
  53. package/dist/generators/GeneratorWriter.js +25 -0
  54. package/dist/generators/GeneratorWriter.js.map +1 -0
  55. package/dist/generators/MongooseGenerator.d.ts +10 -0
  56. package/dist/generators/MongooseGenerator.d.ts.map +1 -0
  57. package/dist/generators/MongooseGenerator.js +75 -0
  58. package/dist/generators/MongooseGenerator.js.map +1 -0
  59. package/dist/generators/PrismaGenerator.d.ts +9 -0
  60. package/dist/generators/PrismaGenerator.d.ts.map +1 -0
  61. package/dist/generators/PrismaGenerator.js +87 -0
  62. package/dist/generators/PrismaGenerator.js.map +1 -0
  63. package/dist/generators/SequelizeGenerator.d.ts +12 -0
  64. package/dist/generators/SequelizeGenerator.d.ts.map +1 -0
  65. package/dist/generators/SequelizeGenerator.js +243 -0
  66. package/dist/generators/SequelizeGenerator.js.map +1 -0
  67. package/dist/generators/TypeORMGenerator.d.ts +12 -0
  68. package/dist/generators/TypeORMGenerator.d.ts.map +1 -0
  69. package/dist/generators/TypeORMGenerator.js +216 -0
  70. package/dist/generators/TypeORMGenerator.js.map +1 -0
  71. package/dist/i18n/messages.d.ts +49 -0
  72. package/dist/i18n/messages.d.ts.map +1 -0
  73. package/dist/i18n/messages.js +149 -0
  74. package/dist/i18n/messages.js.map +1 -0
  75. package/dist/index.d.ts +2 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +8 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/introspection/DataExtractor.d.ts +10 -0
  80. package/dist/introspection/DataExtractor.d.ts.map +1 -0
  81. package/dist/introspection/DataExtractor.js +52 -0
  82. package/dist/introspection/DataExtractor.js.map +1 -0
  83. package/dist/introspection/IntrospectionLogger.d.ts +7 -0
  84. package/dist/introspection/IntrospectionLogger.d.ts.map +1 -0
  85. package/dist/introspection/IntrospectionLogger.js +30 -0
  86. package/dist/introspection/IntrospectionLogger.js.map +1 -0
  87. package/dist/introspection/IntrospectionService.d.ts +10 -0
  88. package/dist/introspection/IntrospectionService.d.ts.map +1 -0
  89. package/dist/introspection/IntrospectionService.js +37 -0
  90. package/dist/introspection/IntrospectionService.js.map +1 -0
  91. package/dist/introspection/Introspector.d.ts +11 -0
  92. package/dist/introspection/Introspector.d.ts.map +1 -0
  93. package/dist/introspection/Introspector.js +11 -0
  94. package/dist/introspection/Introspector.js.map +1 -0
  95. package/dist/introspection/MssqlIntrospector.d.ts +11 -0
  96. package/dist/introspection/MssqlIntrospector.d.ts.map +1 -0
  97. package/dist/introspection/MssqlIntrospector.js +193 -0
  98. package/dist/introspection/MssqlIntrospector.js.map +1 -0
  99. package/dist/introspection/MysqlIntrospector.d.ts +10 -0
  100. package/dist/introspection/MysqlIntrospector.d.ts.map +1 -0
  101. package/dist/introspection/MysqlIntrospector.js +175 -0
  102. package/dist/introspection/MysqlIntrospector.js.map +1 -0
  103. package/dist/introspection/PostgresIntrospector.d.ts +11 -0
  104. package/dist/introspection/PostgresIntrospector.d.ts.map +1 -0
  105. package/dist/introspection/PostgresIntrospector.js +192 -0
  106. package/dist/introspection/PostgresIntrospector.js.map +1 -0
  107. package/dist/testing/ContainerManager.d.ts +7 -0
  108. package/dist/testing/ContainerManager.d.ts.map +1 -0
  109. package/dist/testing/ContainerManager.js +68 -0
  110. package/dist/testing/ContainerManager.js.map +1 -0
  111. package/dist/testing/MigrationTester.d.ts +18 -0
  112. package/dist/testing/MigrationTester.d.ts.map +1 -0
  113. package/dist/testing/MigrationTester.js +399 -0
  114. package/dist/testing/MigrationTester.js.map +1 -0
  115. package/dist/testing/runners/MigrationRunner.d.ts +5 -0
  116. package/dist/testing/runners/MigrationRunner.d.ts.map +1 -0
  117. package/dist/testing/runners/MigrationRunner.js +3 -0
  118. package/dist/testing/runners/MigrationRunner.js.map +1 -0
  119. package/dist/testing/runners/SequelizeRunner.d.ts +8 -0
  120. package/dist/testing/runners/SequelizeRunner.d.ts.map +1 -0
  121. package/dist/testing/runners/SequelizeRunner.js +71 -0
  122. package/dist/testing/runners/SequelizeRunner.js.map +1 -0
  123. package/dist/testing/runners/TypeORMRunner.d.ts +8 -0
  124. package/dist/testing/runners/TypeORMRunner.d.ts.map +1 -0
  125. package/dist/testing/runners/TypeORMRunner.js +91 -0
  126. package/dist/testing/runners/TypeORMRunner.js.map +1 -0
  127. package/dist/types/database.d.ts +22 -0
  128. package/dist/types/database.d.ts.map +1 -0
  129. package/dist/types/database.js +3 -0
  130. package/dist/types/database.js.map +1 -0
  131. package/dist/types/introspection.d.ts +43 -0
  132. package/dist/types/introspection.d.ts.map +1 -0
  133. package/dist/types/introspection.js +3 -0
  134. package/dist/types/introspection.js.map +1 -0
  135. package/dist/utils/PackageManager.d.ts +13 -0
  136. package/dist/utils/PackageManager.d.ts.map +1 -0
  137. package/dist/utils/PackageManager.js +114 -0
  138. package/dist/utils/PackageManager.js.map +1 -0
  139. package/dist/utils/topologicalSort.d.ts +3 -0
  140. package/dist/utils/topologicalSort.d.ts.map +1 -0
  141. package/dist/utils/topologicalSort.js +37 -0
  142. package/dist/utils/topologicalSort.js.map +1 -0
  143. package/package.json +98 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IntrospectionService.js","sourceRoot":"","sources":["../../src/introspection/IntrospectionService.ts"],"names":[],"mappings":";;;AAAA,6DAA0D;AAI1D,2DAAwD;AACxD,2DAAwD;AACxD,iEAA8D;AAE9D,MAAa,oBAAoB;IACvB,SAAS,CAAqB;IAC9B,MAAM,CAAiB;IAE/B,YAAY,SAA6B,EAAE,MAAsB;QAC/D,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,+BAAc,CAAC,gCAAgC,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,gBAAgB,EAAE,CAAC;QACrD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,kBAAkB;QACxB,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACzB,KAAK,UAAU;gBACb,OAAO,IAAI,2CAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAClD,KAAK,OAAO;gBACV,OAAO,IAAI,qCAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C,KAAK,OAAO;gBACV,OAAO,IAAI,qCAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C;gBACE,MAAM,IAAI,+BAAc,CAAC,mCAAmC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;CACF;AA/BD,oDA+BC"}
@@ -0,0 +1,11 @@
1
+ import { DatabaseSchema } from '../types/introspection';
2
+ import { IDatabaseConnector } from '../types/database';
3
+ export interface IDatabaseIntrospector {
4
+ introspectSchema(): Promise<DatabaseSchema>;
5
+ }
6
+ export declare abstract class BaseIntrospector implements IDatabaseIntrospector {
7
+ protected connector: IDatabaseConnector;
8
+ constructor(connector: IDatabaseConnector);
9
+ abstract introspectSchema(): Promise<DatabaseSchema>;
10
+ }
11
+ //# sourceMappingURL=Introspector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Introspector.d.ts","sourceRoot":"","sources":["../../src/introspection/Introspector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;CAC7C;AAED,8BAAsB,gBAAiB,YAAW,qBAAqB;IACrE,SAAS,CAAC,SAAS,EAAE,kBAAkB,CAAC;gBAE5B,SAAS,EAAE,kBAAkB;IAIzC,QAAQ,CAAC,gBAAgB,IAAI,OAAO,CAAC,cAAc,CAAC;CACrD"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseIntrospector = void 0;
4
+ class BaseIntrospector {
5
+ connector;
6
+ constructor(connector) {
7
+ this.connector = connector;
8
+ }
9
+ }
10
+ exports.BaseIntrospector = BaseIntrospector;
11
+ //# sourceMappingURL=Introspector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Introspector.js","sourceRoot":"","sources":["../../src/introspection/Introspector.ts"],"names":[],"mappings":";;;AAOA,MAAsB,gBAAgB;IAC1B,SAAS,CAAqB;IAExC,YAAY,SAA6B;QACvC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CAGF;AARD,4CAQC"}
@@ -0,0 +1,11 @@
1
+ import { BaseIntrospector } from './Introspector';
2
+ import { DatabaseSchema } from '../types/introspection';
3
+ export declare class MssqlIntrospector extends BaseIntrospector {
4
+ introspectSchema(): Promise<DatabaseSchema>;
5
+ private loadTables;
6
+ private loadColumns;
7
+ private loadPrimaryKeys;
8
+ private loadIndexes;
9
+ private loadForeignKeys;
10
+ }
11
+ //# sourceMappingURL=MssqlIntrospector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MssqlIntrospector.d.ts","sourceRoot":"","sources":["../../src/introspection/MssqlIntrospector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAEL,cAAc,EAIf,MAAM,wBAAwB,CAAC;AAyChC,qBAAa,iBAAkB,SAAQ,gBAAgB;IAC/C,gBAAgB,IAAI,OAAO,CAAC,cAAc,CAAC;YA4GnC,UAAU;YAWV,WAAW;YAkBX,eAAe;YAef,WAAW;YAyBX,eAAe;CA8B9B"}
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MssqlIntrospector = void 0;
4
+ const Introspector_1 = require("./Introspector");
5
+ class MssqlIntrospector extends Introspector_1.BaseIntrospector {
6
+ async introspectSchema() {
7
+ const tables = await this.loadTables();
8
+ const columns = await this.loadColumns();
9
+ const primaryKeys = await this.loadPrimaryKeys();
10
+ const indexes = await this.loadIndexes();
11
+ const foreignKeys = await this.loadForeignKeys();
12
+ const tableMap = new Map();
13
+ tables.forEach((t) => {
14
+ tableMap.set(t.table_name, {
15
+ name: t.table_name,
16
+ columns: [],
17
+ indexes: [],
18
+ foreignKeys: [],
19
+ });
20
+ });
21
+ const pkColumnsByTable = new Map();
22
+ primaryKeys.forEach((pk) => {
23
+ if (!pkColumnsByTable.has(pk.table_name)) {
24
+ pkColumnsByTable.set(pk.table_name, new Set());
25
+ }
26
+ pkColumnsByTable.get(pk.table_name)?.add(pk.column_name);
27
+ });
28
+ columns.forEach((c) => {
29
+ const table = tableMap.get(c.table_name);
30
+ if (!table)
31
+ return;
32
+ const pkSet = pkColumnsByTable.get(c.table_name);
33
+ const column = {
34
+ name: c.column_name,
35
+ dataType: c.data_type,
36
+ isNullable: c.is_nullable === 'YES',
37
+ hasDefault: c.column_default !== null,
38
+ defaultValue: c.column_default,
39
+ isPrimaryKey: pkSet ? pkSet.has(c.column_name) : false,
40
+ isUnique: false,
41
+ isAutoIncrement: false,
42
+ maxLength: c.character_maximum_length,
43
+ numericPrecision: c.numeric_precision,
44
+ numericScale: c.numeric_scale,
45
+ };
46
+ table.columns.push(column);
47
+ });
48
+ const indexMap = new Map();
49
+ indexes.forEach((i) => {
50
+ const key = `${i.table_name}:${i.index_name}`;
51
+ if (!indexMap.has(key)) {
52
+ indexMap.set(key, {
53
+ name: i.index_name,
54
+ columns: [],
55
+ isUnique: i.is_unique,
56
+ isPrimary: i.is_primary,
57
+ });
58
+ }
59
+ const entry = indexMap.get(key);
60
+ if (!entry)
61
+ return;
62
+ entry.columns.push(i.column_name);
63
+ });
64
+ indexMap.forEach((idx, key) => {
65
+ const tableName = key.split(':')[0];
66
+ const table = tableMap.get(tableName);
67
+ if (!table)
68
+ return;
69
+ table.indexes.push(idx);
70
+ });
71
+ const fkMap = new Map();
72
+ foreignKeys.forEach((fk) => {
73
+ const key = `${fk.table_name}:${fk.constraint_name}`;
74
+ if (!fkMap.has(key)) {
75
+ fkMap.set(key, {
76
+ name: fk.constraint_name,
77
+ tableName: fk.table_name,
78
+ columns: [],
79
+ referencedTable: fk.referenced_table_name,
80
+ referencedColumns: [],
81
+ updateRule: fk.update_rule,
82
+ deleteRule: fk.delete_rule,
83
+ });
84
+ }
85
+ const entry = fkMap.get(key);
86
+ if (!entry)
87
+ return;
88
+ entry.columns.push(fk.column_name);
89
+ entry.referencedColumns.push(fk.referenced_column_name);
90
+ });
91
+ fkMap.forEach((fk) => {
92
+ const table = tableMap.get(fk.tableName);
93
+ if (!table)
94
+ return;
95
+ table.foreignKeys.push(fk);
96
+ });
97
+ return {
98
+ tables: Array.from(tableMap.values()),
99
+ };
100
+ }
101
+ async loadTables() {
102
+ const sql = `
103
+ SELECT TABLE_NAME AS table_name
104
+ FROM INFORMATION_SCHEMA.TABLES
105
+ WHERE TABLE_TYPE = 'BASE TABLE'
106
+ ORDER BY TABLE_NAME
107
+ `;
108
+ return this.connector.query(sql);
109
+ }
110
+ async loadColumns() {
111
+ const sql = `
112
+ SELECT
113
+ TABLE_NAME AS table_name,
114
+ COLUMN_NAME AS column_name,
115
+ DATA_TYPE AS data_type,
116
+ IS_NULLABLE AS is_nullable,
117
+ COLUMN_DEFAULT AS column_default,
118
+ CHARACTER_MAXIMUM_LENGTH AS character_maximum_length,
119
+ NUMERIC_PRECISION AS numeric_precision,
120
+ NUMERIC_SCALE AS numeric_scale
121
+ FROM INFORMATION_SCHEMA.COLUMNS
122
+ ORDER BY TABLE_NAME, ORDINAL_POSITION
123
+ `;
124
+ return this.connector.query(sql);
125
+ }
126
+ async loadPrimaryKeys() {
127
+ const sql = `
128
+ SELECT
129
+ ku.table_name,
130
+ ku.column_name
131
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc
132
+ JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS ku
133
+ ON tc.CONSTRAINT_NAME = ku.CONSTRAINT_NAME
134
+ WHERE tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
135
+ ORDER BY ku.table_name, ku.ordinal_position
136
+ `;
137
+ return this.connector.query(sql);
138
+ }
139
+ async loadIndexes() {
140
+ const sql = `
141
+ SELECT
142
+ t.name AS table_name,
143
+ ind.name AS index_name,
144
+ ind.is_unique,
145
+ ind.is_primary_key AS is_primary,
146
+ col.name AS column_name,
147
+ ic.key_ordinal
148
+ FROM sys.indexes ind
149
+ INNER JOIN sys.index_columns ic
150
+ ON ind.object_id = ic.object_id
151
+ AND ind.index_id = ic.index_id
152
+ INNER JOIN sys.columns col
153
+ ON ic.object_id = col.object_id
154
+ AND ic.column_id = col.column_id
155
+ INNER JOIN sys.tables t
156
+ ON ind.object_id = t.object_id
157
+ WHERE t.is_ms_shipped = 0
158
+ ORDER BY t.name, ind.name, ic.key_ordinal
159
+ `;
160
+ return this.connector.query(sql);
161
+ }
162
+ async loadForeignKeys() {
163
+ const sql = `
164
+ SELECT
165
+ fk.name AS constraint_name,
166
+ tp.name AS table_name,
167
+ cp.name AS column_name,
168
+ tr.name AS referenced_table_name,
169
+ cr.name AS referenced_column_name,
170
+ rc.UPDATE_RULE AS update_rule,
171
+ rc.DELETE_RULE AS delete_rule
172
+ FROM sys.foreign_keys fk
173
+ INNER JOIN sys.foreign_key_columns fkc
174
+ ON fk.object_id = fkc.constraint_object_id
175
+ INNER JOIN sys.tables tp
176
+ ON fkc.parent_object_id = tp.object_id
177
+ INNER JOIN sys.columns cp
178
+ ON fkc.parent_object_id = cp.object_id
179
+ AND fkc.parent_column_id = cp.column_id
180
+ INNER JOIN sys.tables tr
181
+ ON fkc.referenced_object_id = tr.object_id
182
+ INNER JOIN sys.columns cr
183
+ ON fkc.referenced_object_id = cr.object_id
184
+ AND fkc.referenced_column_id = cr.column_id
185
+ INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
186
+ ON fk.name = rc.CONSTRAINT_NAME
187
+ ORDER BY tp.name, fk.name, fkc.constraint_column_id
188
+ `;
189
+ return this.connector.query(sql);
190
+ }
191
+ }
192
+ exports.MssqlIntrospector = MssqlIntrospector;
193
+ //# sourceMappingURL=MssqlIntrospector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MssqlIntrospector.js","sourceRoot":"","sources":["../../src/introspection/MssqlIntrospector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { BaseIntrospector } from './Introspector';
2
+ import { DatabaseSchema } from '../types/introspection';
3
+ export declare class MysqlIntrospector extends BaseIntrospector {
4
+ introspectSchema(): Promise<DatabaseSchema>;
5
+ private loadTables;
6
+ private loadColumns;
7
+ private loadIndexes;
8
+ private loadForeignKeys;
9
+ }
10
+ //# sourceMappingURL=MysqlIntrospector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MysqlIntrospector.d.ts","sourceRoot":"","sources":["../../src/introspection/MysqlIntrospector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAEL,cAAc,EAIf,MAAM,wBAAwB,CAAC;AAoChC,qBAAa,iBAAkB,SAAQ,gBAAgB;IAC/C,gBAAgB,IAAI,OAAO,CAAC,cAAc,CAAC;YAwHnC,UAAU;YAYV,WAAW;YAoBX,WAAW;YAgBX,eAAe;CAoB9B"}
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MysqlIntrospector = void 0;
4
+ const Introspector_1 = require("./Introspector");
5
+ class MysqlIntrospector extends Introspector_1.BaseIntrospector {
6
+ async introspectSchema() {
7
+ const tables = await this.loadTables();
8
+ const columns = await this.loadColumns();
9
+ const indexes = await this.loadIndexes();
10
+ const foreignKeys = await this.loadForeignKeys();
11
+ const tableMap = new Map();
12
+ tables.forEach((t) => {
13
+ tableMap.set(t.table_name, {
14
+ name: t.table_name,
15
+ columns: [],
16
+ indexes: [],
17
+ foreignKeys: [],
18
+ });
19
+ });
20
+ const pkColumnsByTable = new Map();
21
+ const uniqueColumnsByTable = new Map();
22
+ indexes
23
+ .filter((i) => i.index_name === 'PRIMARY')
24
+ .forEach((i) => {
25
+ if (!pkColumnsByTable.has(i.table_name)) {
26
+ pkColumnsByTable.set(i.table_name, new Set());
27
+ }
28
+ pkColumnsByTable.get(i.table_name)?.add(i.column_name);
29
+ });
30
+ indexes
31
+ .filter((i) => i.index_name !== 'PRIMARY' && i.non_unique === 0)
32
+ .forEach((i) => {
33
+ if (!uniqueColumnsByTable.has(i.table_name)) {
34
+ uniqueColumnsByTable.set(i.table_name, new Set());
35
+ }
36
+ uniqueColumnsByTable.get(i.table_name)?.add(i.column_name);
37
+ });
38
+ columns.forEach((c) => {
39
+ const table = tableMap.get(c.table_name);
40
+ if (!table)
41
+ return;
42
+ const pkSet = pkColumnsByTable.get(c.table_name);
43
+ const uniqueSet = uniqueColumnsByTable.get(c.table_name);
44
+ const column = {
45
+ name: c.column_name,
46
+ dataType: c.data_type,
47
+ isNullable: c.is_nullable === 'YES',
48
+ hasDefault: c.column_default !== null,
49
+ defaultValue: c.column_default,
50
+ isPrimaryKey: pkSet ? pkSet.has(c.column_name) : false,
51
+ isUnique: uniqueSet ? uniqueSet.has(c.column_name) : false,
52
+ isAutoIncrement: c.extra.toLowerCase().includes('auto_increment'),
53
+ maxLength: c.character_maximum_length,
54
+ numericPrecision: c.numeric_precision,
55
+ numericScale: c.numeric_scale,
56
+ };
57
+ table.columns.push(column);
58
+ });
59
+ const indexMap = new Map();
60
+ indexes.forEach((i) => {
61
+ const key = `${i.table_name}:${i.index_name}`;
62
+ if (!indexMap.has(key)) {
63
+ indexMap.set(key, {
64
+ name: i.index_name,
65
+ columns: [],
66
+ isUnique: i.non_unique === 0,
67
+ isPrimary: i.index_name === 'PRIMARY',
68
+ });
69
+ }
70
+ const entry = indexMap.get(key);
71
+ if (!entry)
72
+ return;
73
+ entry.columns.push(i.column_name);
74
+ });
75
+ indexMap.forEach((idx, key) => {
76
+ const tableName = key.split(':')[0];
77
+ const table = tableMap.get(tableName);
78
+ if (!table)
79
+ return;
80
+ table.indexes.push(idx);
81
+ });
82
+ const fkMap = new Map();
83
+ foreignKeys.forEach((fk) => {
84
+ const key = `${fk.table_name}:${fk.constraint_name}`;
85
+ if (!fkMap.has(key)) {
86
+ fkMap.set(key, {
87
+ name: fk.constraint_name,
88
+ tableName: fk.table_name,
89
+ columns: [],
90
+ referencedTable: fk.referenced_table_name,
91
+ referencedColumns: [],
92
+ updateRule: fk.update_rule,
93
+ deleteRule: fk.delete_rule,
94
+ });
95
+ }
96
+ const entry = fkMap.get(key);
97
+ if (!entry)
98
+ return;
99
+ entry.columns.push(fk.column_name);
100
+ entry.referencedColumns.push(fk.referenced_column_name);
101
+ });
102
+ fkMap.forEach((fk) => {
103
+ const table = tableMap.get(fk.tableName);
104
+ if (!table)
105
+ return;
106
+ table.foreignKeys.push(fk);
107
+ });
108
+ return {
109
+ tables: Array.from(tableMap.values()),
110
+ };
111
+ }
112
+ async loadTables() {
113
+ const sql = `
114
+ SELECT table_name
115
+ FROM information_schema.tables
116
+ WHERE table_schema = DATABASE()
117
+ AND table_type = 'BASE TABLE'
118
+ ORDER BY table_name
119
+ `;
120
+ return this.connector.query(sql);
121
+ }
122
+ async loadColumns() {
123
+ const sql = `
124
+ SELECT
125
+ table_name,
126
+ column_name,
127
+ data_type,
128
+ is_nullable,
129
+ column_default,
130
+ character_maximum_length,
131
+ numeric_precision,
132
+ numeric_scale,
133
+ extra
134
+ FROM information_schema.columns
135
+ WHERE table_schema = DATABASE()
136
+ ORDER BY table_name, ordinal_position
137
+ `;
138
+ return this.connector.query(sql);
139
+ }
140
+ async loadIndexes() {
141
+ const sql = `
142
+ SELECT
143
+ table_name,
144
+ index_name,
145
+ non_unique,
146
+ column_name,
147
+ seq_in_index
148
+ FROM information_schema.statistics
149
+ WHERE table_schema = DATABASE()
150
+ ORDER BY table_name, index_name, seq_in_index
151
+ `;
152
+ return this.connector.query(sql);
153
+ }
154
+ async loadForeignKeys() {
155
+ const sql = `
156
+ SELECT
157
+ rc.constraint_name,
158
+ kcu.table_name,
159
+ kcu.column_name,
160
+ kcu.referenced_table_name,
161
+ kcu.referenced_column_name,
162
+ rc.update_rule,
163
+ rc.delete_rule
164
+ FROM information_schema.referential_constraints AS rc
165
+ JOIN information_schema.key_column_usage AS kcu
166
+ ON rc.constraint_name = kcu.constraint_name
167
+ AND rc.constraint_schema = kcu.table_schema
168
+ WHERE kcu.table_schema = DATABASE()
169
+ ORDER BY kcu.table_name, rc.constraint_name, kcu.ordinal_position
170
+ `;
171
+ return this.connector.query(sql);
172
+ }
173
+ }
174
+ exports.MysqlIntrospector = MysqlIntrospector;
175
+ //# sourceMappingURL=MysqlIntrospector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MysqlIntrospector.js","sourceRoot":"","sources":["../../src/introspection/MysqlIntrospector.ts"],"names":[],"mappings":";;;AAAA,iDAAkD;AA2ClD,MAAa,iBAAkB,SAAQ,+BAAgB;IACrD,KAAK,CAAC,gBAAgB;QACpB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAEjD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;QAElD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACnB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE;gBACzB,IAAI,EAAE,CAAC,CAAC,UAAU;gBAClB,OAAO,EAAE,EAAE;gBACX,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,EAAE;aAChB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAuB,CAAC;QACxD,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAuB,CAAC;QAE5D,OAAO;aACJ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC;aACzC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACb,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;gBACxC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YAChD,CAAC;YACD,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEL,OAAO;aACJ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC;aAC/D,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACb,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC5C,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YACpD,CAAC;YACD,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEL,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACpB,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YACzC,IAAI,CAAC,KAAK;gBAAE,OAAO;YAEnB,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YACjD,MAAM,SAAS,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YAEzD,MAAM,MAAM,GAAmB;gBAC7B,IAAI,EAAE,CAAC,CAAC,WAAW;gBACnB,QAAQ,EAAE,CAAC,CAAC,SAAS;gBACrB,UAAU,EAAE,CAAC,CAAC,WAAW,KAAK,KAAK;gBACnC,UAAU,EAAE,CAAC,CAAC,cAAc,KAAK,IAAI;gBACrC,YAAY,EAAE,CAAC,CAAC,cAAc;gBAC9B,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK;gBACtD,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK;gBAC1D,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;gBACjE,SAAS,EAAE,CAAC,CAAC,wBAAwB;gBACrC,gBAAgB,EAAE,CAAC,CAAC,iBAAiB;gBACrC,YAAY,EAAE,CAAC,CAAC,aAAa;aAC9B,CAAC;YAEF,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;QAElD,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACpB,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YAC9C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE;oBAChB,IAAI,EAAE,CAAC,CAAC,UAAU;oBAClB,OAAO,EAAE,EAAE;oBACX,QAAQ,EAAE,CAAC,CAAC,UAAU,KAAK,CAAC;oBAC5B,SAAS,EAAE,CAAC,CAAC,UAAU,KAAK,SAAS;iBACtC,CAAC,CAAC;YACL,CAAC;YAED,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK;gBAAE,OAAO;YACnB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC5B,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACtC,IAAI,CAAC,KAAK;gBAAE,OAAO;YACnB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,IAAI,GAAG,EAA8B,CAAC;QAEpD,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YACzB,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC,eAAe,EAAE,CAAC;YACrD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;oBACb,IAAI,EAAE,EAAE,CAAC,eAAe;oBACxB,SAAS,EAAE,EAAE,CAAC,UAAU;oBACxB,OAAO,EAAE,EAAE;oBACX,eAAe,EAAE,EAAE,CAAC,qBAAqB;oBACzC,iBAAiB,EAAE,EAAE;oBACrB,UAAU,EAAE,EAAE,CAAC,WAAW;oBAC1B,UAAU,EAAE,EAAE,CAAC,WAAW;iBAC3B,CAAC,CAAC;YACL,CAAC;YAED,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,CAAC,KAAK;gBAAE,OAAO;YACnB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;YACnC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YACnB,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;YACzC,IAAI,CAAC,KAAK;gBAAE,OAAO;YACnB,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;SACtC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,MAAM,GAAG,GAAG;;;;;;KAMX,CAAC;QAEF,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAgB,GAAG,CAAC,CAAC;IAClD,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,MAAM,GAAG,GAAG;;;;;;;;;;;;;;KAcX,CAAC;QAEF,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAiB,GAAG,CAAC,CAAC;IACnD,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,MAAM,GAAG,GAAG;;;;;;;;;;KAUX,CAAC;QAEF,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAgB,GAAG,CAAC,CAAC;IAClD,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;KAeX,CAAC;QAEF,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAa,GAAG,CAAC,CAAC;IAC/C,CAAC;CACF;AA7LD,8CA6LC"}
@@ -0,0 +1,11 @@
1
+ import { DatabaseSchema } from '../types/introspection';
2
+ import { BaseIntrospector } from './Introspector';
3
+ export declare class PostgresIntrospector extends BaseIntrospector {
4
+ introspectSchema(): Promise<DatabaseSchema>;
5
+ private loadTables;
6
+ private loadColumns;
7
+ private loadConstraints;
8
+ private loadIndexes;
9
+ private loadForeignKeys;
10
+ }
11
+ //# sourceMappingURL=PostgresIntrospector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostgresIntrospector.d.ts","sourceRoot":"","sources":["../../src/introspection/PostgresIntrospector.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EAIf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AA0ClD,qBAAa,oBAAqB,SAAQ,gBAAgB;IAClD,gBAAgB,IAAI,OAAO,CAAC,cAAc,CAAC;YA2GnC,UAAU;YAYV,WAAW;YAmBX,eAAe;YAmBf,WAAW;YAsBX,eAAe;CA2B9B"}
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PostgresIntrospector = void 0;
4
+ const Introspector_1 = require("./Introspector");
5
+ class PostgresIntrospector extends Introspector_1.BaseIntrospector {
6
+ async introspectSchema() {
7
+ const tables = await this.loadTables();
8
+ const columns = await this.loadColumns();
9
+ const constraints = await this.loadConstraints();
10
+ const indexes = await this.loadIndexes();
11
+ const foreignKeys = await this.loadForeignKeys();
12
+ const tableMap = new Map();
13
+ tables.forEach((t) => {
14
+ tableMap.set(t.table_name, {
15
+ name: t.table_name,
16
+ columns: [],
17
+ indexes: [],
18
+ foreignKeys: [],
19
+ });
20
+ });
21
+ const pkColumnsByTable = new Map();
22
+ const uniqueColumnsByTable = new Map();
23
+ constraints.forEach((c) => {
24
+ if (c.constraint_type === 'PRIMARY KEY') {
25
+ if (!pkColumnsByTable.has(c.table_name)) {
26
+ pkColumnsByTable.set(c.table_name, new Set());
27
+ }
28
+ pkColumnsByTable.get(c.table_name)?.add(c.column_name);
29
+ }
30
+ if (c.constraint_type === 'UNIQUE') {
31
+ if (!uniqueColumnsByTable.has(c.table_name)) {
32
+ uniqueColumnsByTable.set(c.table_name, new Set());
33
+ }
34
+ uniqueColumnsByTable.get(c.table_name)?.add(c.column_name);
35
+ }
36
+ });
37
+ columns.forEach((c) => {
38
+ const table = tableMap.get(c.table_name);
39
+ if (!table)
40
+ return;
41
+ const pkSet = pkColumnsByTable.get(c.table_name);
42
+ const uniqueSet = uniqueColumnsByTable.get(c.table_name);
43
+ const column = {
44
+ name: c.column_name,
45
+ dataType: c.data_type,
46
+ isNullable: c.is_nullable === 'YES',
47
+ hasDefault: c.column_default !== null,
48
+ defaultValue: c.column_default,
49
+ isPrimaryKey: pkSet ? pkSet.has(c.column_name) : false,
50
+ isUnique: uniqueSet ? uniqueSet.has(c.column_name) : false,
51
+ isAutoIncrement: c.column_default !== null && c.column_default.includes('nextval'),
52
+ maxLength: c.character_maximum_length,
53
+ numericPrecision: c.numeric_precision,
54
+ numericScale: c.numeric_scale,
55
+ };
56
+ table.columns.push(column);
57
+ });
58
+ indexes.forEach((i) => {
59
+ const table = tableMap.get(i.table_name);
60
+ if (!table)
61
+ return;
62
+ const index = {
63
+ name: i.index_name,
64
+ columns: i.column_names,
65
+ isUnique: i.is_unique,
66
+ isPrimary: i.is_primary,
67
+ };
68
+ table.indexes.push(index);
69
+ });
70
+ const fkMap = new Map();
71
+ foreignKeys.forEach((fk) => {
72
+ const key = `${fk.table_name}:${fk.constraint_name}`;
73
+ if (!fkMap.has(key)) {
74
+ fkMap.set(key, {
75
+ name: fk.constraint_name,
76
+ tableName: fk.table_name,
77
+ columns: [],
78
+ referencedTable: fk.referenced_table_name,
79
+ referencedColumns: [],
80
+ updateRule: fk.update_rule,
81
+ deleteRule: fk.delete_rule,
82
+ });
83
+ }
84
+ const entry = fkMap.get(key);
85
+ if (!entry)
86
+ return;
87
+ entry.columns.push(fk.column_name);
88
+ entry.referencedColumns.push(fk.referenced_column_name);
89
+ });
90
+ fkMap.forEach((fk) => {
91
+ const tableEntry = tableMap.get(fk.tableName);
92
+ if (!tableEntry)
93
+ return;
94
+ tableEntry.foreignKeys.push(fk);
95
+ });
96
+ return {
97
+ tables: Array.from(tableMap.values()),
98
+ };
99
+ }
100
+ async loadTables() {
101
+ const sql = `
102
+ SELECT table_name
103
+ FROM information_schema.tables
104
+ WHERE table_schema = 'public'
105
+ AND table_type = 'BASE TABLE'
106
+ ORDER BY table_name
107
+ `;
108
+ return this.connector.query(sql);
109
+ }
110
+ async loadColumns() {
111
+ const sql = `
112
+ SELECT
113
+ table_name,
114
+ column_name,
115
+ data_type,
116
+ is_nullable,
117
+ column_default,
118
+ character_maximum_length,
119
+ numeric_precision,
120
+ numeric_scale
121
+ FROM information_schema.columns
122
+ WHERE table_schema = 'public'
123
+ ORDER BY table_name, ordinal_position
124
+ `;
125
+ return this.connector.query(sql);
126
+ }
127
+ async loadConstraints() {
128
+ const sql = `
129
+ SELECT
130
+ tc.table_name,
131
+ tc.constraint_name,
132
+ tc.constraint_type,
133
+ kcu.column_name
134
+ FROM information_schema.table_constraints AS tc
135
+ JOIN information_schema.key_column_usage AS kcu
136
+ ON tc.constraint_name = kcu.constraint_name
137
+ AND tc.table_schema = kcu.table_schema
138
+ WHERE tc.table_schema = 'public'
139
+ AND tc.constraint_type IN ('PRIMARY KEY', 'UNIQUE')
140
+ ORDER BY tc.table_name, tc.constraint_name, kcu.ordinal_position
141
+ `;
142
+ return this.connector.query(sql);
143
+ }
144
+ async loadIndexes() {
145
+ const sql = `
146
+ SELECT
147
+ t.relname AS table_name,
148
+ i.relname AS index_name,
149
+ ix.indisunique AS is_unique,
150
+ ix.indisprimary AS is_primary,
151
+ ARRAY_AGG(a.attname ORDER BY array_position(ix.indkey, a.attnum::smallint)) AS column_names
152
+ FROM pg_class t
153
+ JOIN pg_index ix ON t.oid = ix.indrelid
154
+ JOIN pg_class i ON i.oid = ix.indexrelid
155
+ JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(ix.indkey)
156
+ JOIN pg_namespace ns ON ns.oid = t.relnamespace
157
+ WHERE ns.nspname = 'public'
158
+ AND t.relkind = 'r'
159
+ GROUP BY t.relname, i.relname, ix.indisunique, ix.indisprimary
160
+ ORDER BY t.relname, i.relname
161
+ `;
162
+ return this.connector.query(sql);
163
+ }
164
+ async loadForeignKeys() {
165
+ const sql = `
166
+ SELECT
167
+ tc.constraint_name,
168
+ tc.table_name,
169
+ kcu.column_name,
170
+ ccu.table_name AS referenced_table_name,
171
+ ccu.column_name AS referenced_column_name,
172
+ rc.update_rule,
173
+ rc.delete_rule
174
+ FROM information_schema.table_constraints AS tc
175
+ JOIN information_schema.key_column_usage AS kcu
176
+ ON tc.constraint_name = kcu.constraint_name
177
+ AND tc.table_schema = kcu.table_schema
178
+ JOIN information_schema.constraint_column_usage AS ccu
179
+ ON ccu.constraint_name = tc.constraint_name
180
+ AND ccu.table_schema = tc.table_schema
181
+ JOIN information_schema.referential_constraints AS rc
182
+ ON rc.constraint_name = tc.constraint_name
183
+ AND rc.constraint_schema = tc.table_schema
184
+ WHERE tc.constraint_type = 'FOREIGN KEY'
185
+ AND tc.table_schema = 'public'
186
+ ORDER BY tc.table_name, tc.constraint_name, kcu.ordinal_position
187
+ `;
188
+ return this.connector.query(sql);
189
+ }
190
+ }
191
+ exports.PostgresIntrospector = PostgresIntrospector;
192
+ //# sourceMappingURL=PostgresIntrospector.js.map