@anthonyalayo/drizzle-kit 1.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 (161) hide show
  1. package/.gitignore +25 -0
  2. package/README.md +79 -0
  3. package/build.dev.ts +51 -0
  4. package/build.ts +112 -0
  5. package/imports-checker/analyze.ts +78 -0
  6. package/imports-checker/checker.ts +296 -0
  7. package/imports-checker/grammar/grammar.ohm +121 -0
  8. package/imports-checker/grammar/grammar.ohm-bundle.d.ts +164 -0
  9. package/imports-checker/grammar/grammar.ohm-bundle.js +753 -0
  10. package/imports-checker/index.ts +48 -0
  11. package/package.json +142 -0
  12. package/patches/difflib@0.2.4.patch +31 -0
  13. package/src/@types/utils.ts +58 -0
  14. package/src/api.ts +504 -0
  15. package/src/cli/commands/_es5.ts +2 -0
  16. package/src/cli/commands/check.ts +52 -0
  17. package/src/cli/commands/drop.ts +60 -0
  18. package/src/cli/commands/introspect.ts +772 -0
  19. package/src/cli/commands/libSqlPushUtils.ts +355 -0
  20. package/src/cli/commands/migrate.ts +1526 -0
  21. package/src/cli/commands/mysqlIntrospect.ts +53 -0
  22. package/src/cli/commands/mysqlPushUtils.ts +352 -0
  23. package/src/cli/commands/mysqlUp.ts +102 -0
  24. package/src/cli/commands/pgIntrospect.ts +55 -0
  25. package/src/cli/commands/pgPushUtils.ts +269 -0
  26. package/src/cli/commands/pgUp.ts +217 -0
  27. package/src/cli/commands/push.ts +637 -0
  28. package/src/cli/commands/singlestoreIntrospect.ts +53 -0
  29. package/src/cli/commands/singlestorePushUtils.ts +456 -0
  30. package/src/cli/commands/singlestoreUp.ts +1 -0
  31. package/src/cli/commands/sqliteIntrospect.ts +96 -0
  32. package/src/cli/commands/sqlitePushUtils.ts +322 -0
  33. package/src/cli/commands/sqliteUp.ts +52 -0
  34. package/src/cli/commands/utils.ts +858 -0
  35. package/src/cli/connections.ts +914 -0
  36. package/src/cli/index.ts +48 -0
  37. package/src/cli/schema.ts +794 -0
  38. package/src/cli/selector-ui.ts +38 -0
  39. package/src/cli/utils.ts +112 -0
  40. package/src/cli/validations/cli.ts +79 -0
  41. package/src/cli/validations/common.ts +193 -0
  42. package/src/cli/validations/libsql.ts +27 -0
  43. package/src/cli/validations/mysql.ts +61 -0
  44. package/src/cli/validations/outputs.ts +91 -0
  45. package/src/cli/validations/postgres.ts +83 -0
  46. package/src/cli/validations/singlestore.ts +61 -0
  47. package/src/cli/validations/sqlite.ts +104 -0
  48. package/src/cli/validations/studio.ts +24 -0
  49. package/src/cli/views.ts +658 -0
  50. package/src/extensions/getTablesFilterByExtensions.ts +16 -0
  51. package/src/extensions/vector.ts +10 -0
  52. package/src/global.ts +61 -0
  53. package/src/index.ts +326 -0
  54. package/src/introspect-mysql.ts +1030 -0
  55. package/src/introspect-pg.ts +1435 -0
  56. package/src/introspect-singlestore.ts +913 -0
  57. package/src/introspect-sqlite.ts +533 -0
  58. package/src/jsonDiffer.js +882 -0
  59. package/src/jsonStatements.ts +3590 -0
  60. package/src/loader.mjs +57 -0
  61. package/src/migrationPreparator.ts +217 -0
  62. package/src/schemaValidator.ts +23 -0
  63. package/src/serializer/index.ts +142 -0
  64. package/src/serializer/mysqlImports.ts +38 -0
  65. package/src/serializer/mysqlSchema.ts +423 -0
  66. package/src/serializer/mysqlSerializer.ts +999 -0
  67. package/src/serializer/pgImports.ts +106 -0
  68. package/src/serializer/pgSchema.ts +937 -0
  69. package/src/serializer/pgSerializer.ts +2223 -0
  70. package/src/serializer/singlestoreImports.ts +38 -0
  71. package/src/serializer/singlestoreSchema.ts +257 -0
  72. package/src/serializer/singlestoreSerializer.ts +767 -0
  73. package/src/serializer/sqliteImports.ts +41 -0
  74. package/src/serializer/sqliteSchema.ts +352 -0
  75. package/src/serializer/sqliteSerializer.ts +931 -0
  76. package/src/serializer/studio.ts +694 -0
  77. package/src/serializer/utils.ts +45 -0
  78. package/src/simulator.ts +157 -0
  79. package/src/snapshotsDiffer.ts +4398 -0
  80. package/src/sqlgenerator.ts +4212 -0
  81. package/src/statementCombiner.ts +597 -0
  82. package/src/utils/certs.ts +44 -0
  83. package/src/utils/words.ts +1333 -0
  84. package/src/utils.ts +370 -0
  85. package/tests/bin.test.ts +58 -0
  86. package/tests/cli/d1http.config.ts +12 -0
  87. package/tests/cli/drizzle.config.ts +9 -0
  88. package/tests/cli/durable-sqlite.config.ts +7 -0
  89. package/tests/cli/expo.config.ts +7 -0
  90. package/tests/cli/postgres.config.ts +13 -0
  91. package/tests/cli/postgres2.config.ts +17 -0
  92. package/tests/cli/schema.ts +1 -0
  93. package/tests/cli/turso.config.ts +10 -0
  94. package/tests/cli-export.test.ts +79 -0
  95. package/tests/cli-generate.test.ts +259 -0
  96. package/tests/cli-migrate.test.ts +103 -0
  97. package/tests/cli-push.test.ts +126 -0
  98. package/tests/common.ts +15 -0
  99. package/tests/indexes/common.ts +21 -0
  100. package/tests/indexes/pg.test.ts +245 -0
  101. package/tests/introspect/libsql.test.ts +35 -0
  102. package/tests/introspect/mysql.test.ts +319 -0
  103. package/tests/introspect/pg.test.ts +894 -0
  104. package/tests/introspect/singlestore.test.ts +275 -0
  105. package/tests/introspect/sqlite.test.ts +122 -0
  106. package/tests/libsql-checks.test.ts +308 -0
  107. package/tests/libsql-statements.test.ts +989 -0
  108. package/tests/libsql-views.test.ts +218 -0
  109. package/tests/migrate/libsq-schema.ts +6 -0
  110. package/tests/migrate/libsql-migrate.test.ts +58 -0
  111. package/tests/migrate/migrations/0000_little_blizzard.sql +4 -0
  112. package/tests/migrate/migrations/0001_nebulous_storm.sql +10 -0
  113. package/tests/migrate/migrations/meta/0000_snapshot.json +40 -0
  114. package/tests/migrate/migrations/meta/0001_snapshot.json +40 -0
  115. package/tests/migrate/migrations/meta/_journal.json +20 -0
  116. package/tests/mysql-checks.test.ts +291 -0
  117. package/tests/mysql-generated.test.ts +1290 -0
  118. package/tests/mysql-schemas.test.ts +156 -0
  119. package/tests/mysql-views.test.ts +553 -0
  120. package/tests/mysql.test.ts +863 -0
  121. package/tests/pg-array.test.ts +368 -0
  122. package/tests/pg-checks.test.ts +329 -0
  123. package/tests/pg-columns.test.ts +484 -0
  124. package/tests/pg-domains.test.ts +306 -0
  125. package/tests/pg-enums.test.ts +751 -0
  126. package/tests/pg-generated.test.ts +529 -0
  127. package/tests/pg-identity.test.ts +447 -0
  128. package/tests/pg-schemas.test.ts +105 -0
  129. package/tests/pg-sequences.test.ts +298 -0
  130. package/tests/pg-tables.test.ts +1021 -0
  131. package/tests/pg-views.test.ts +1929 -0
  132. package/tests/push/common.ts +58 -0
  133. package/tests/push/libsql.test.ts +1400 -0
  134. package/tests/push/mysql-push.test.ts +345 -0
  135. package/tests/push/mysql.test.ts +788 -0
  136. package/tests/push/pg.test.ts +4341 -0
  137. package/tests/push/singlestore-push.test.ts +894 -0
  138. package/tests/push/singlestore.test.ts +444 -0
  139. package/tests/push/sqlite.test.ts +1613 -0
  140. package/tests/rls/pg-policy.test.ts +1656 -0
  141. package/tests/rls/pg-role.test.ts +234 -0
  142. package/tests/schemaDiffer.ts +2852 -0
  143. package/tests/singlestore-generated.test.ts +1290 -0
  144. package/tests/singlestore-schemas.test.ts +155 -0
  145. package/tests/singlestore.test.ts +978 -0
  146. package/tests/sqlite-checks.test.ts +308 -0
  147. package/tests/sqlite-columns.test.ts +1049 -0
  148. package/tests/sqlite-generated.test.ts +1726 -0
  149. package/tests/sqlite-tables.test.ts +637 -0
  150. package/tests/sqlite-views.test.ts +218 -0
  151. package/tests/statements-combiner/libsql-statements-combiner.test.ts +1812 -0
  152. package/tests/statements-combiner/singlestore-statements-combiner.test.ts +882 -0
  153. package/tests/statements-combiner/sqlite-statements-combiner.test.ts +1211 -0
  154. package/tests/test/sqlite.test.ts +39 -0
  155. package/tests/testsinglestore.ts +29 -0
  156. package/tests/validations.test.ts +869 -0
  157. package/tests/wrap-param.test.ts +16 -0
  158. package/tsconfig.build.json +4 -0
  159. package/tsconfig.cli-types.json +9 -0
  160. package/tsconfig.json +28 -0
  161. package/vitest.config.ts +34 -0
@@ -0,0 +1,882 @@
1
+ 'use-strict';
2
+ import { diff } from 'json-diff';
3
+
4
+ export function diffForRenamedTables(pairs) {
5
+ // raname table1 to name of table2, so we can apply diffs
6
+ const renamed = pairs.map((it) => {
7
+ const from = it.from;
8
+ const to = it.to;
9
+ const newFrom = { ...from, name: to.name };
10
+ return [newFrom, to];
11
+ });
12
+
13
+ // find any alternations made to a renamed table
14
+ const altered = renamed.map((pair) => {
15
+ return diffForRenamedTable(pair[0], pair[1]);
16
+ });
17
+
18
+ return altered;
19
+ }
20
+
21
+ function diffForRenamedTable(t1, t2) {
22
+ t1.name = t2.name;
23
+ const diffed = diff(t1, t2) || {};
24
+ diffed.name = t2.name;
25
+
26
+ return findAlternationsInTable(diffed, t2.schema);
27
+ }
28
+
29
+ export function diffForRenamedColumn(t1, t2) {
30
+ const renamed = { ...t1, name: t2.name };
31
+ const diffed = diff(renamed, t2) || {};
32
+ diffed.name = t2.name;
33
+
34
+ return alternationsInColumn(diffed);
35
+ }
36
+
37
+ const update1to2 = (json) => {
38
+ Object.entries(json).forEach(([key, val]) => {
39
+ if ('object' !== typeof val) return;
40
+
41
+ if (val.hasOwnProperty('references')) {
42
+ const ref = val['references'];
43
+ const fkName = ref['foreignKeyName'];
44
+ const table = ref['table'];
45
+ const column = ref['column'];
46
+ const onDelete = ref['onDelete'];
47
+ const onUpdate = ref['onUpdate'];
48
+ const newRef = `${fkName};${table};${column};${onDelete ?? ''};${onUpdate ?? ''}`;
49
+ val['references'] = newRef;
50
+ } else {
51
+ update1to2(val);
52
+ }
53
+ });
54
+ };
55
+
56
+ const mapArraysDiff = (source, diff) => {
57
+ const sequence = [];
58
+ let sourceIndex = 0;
59
+ for (let i = 0; i < diff.length; i++) {
60
+ const it = diff[i];
61
+ if (it.length === 1) {
62
+ sequence.push({ type: 'same', value: source[sourceIndex] });
63
+ sourceIndex += 1;
64
+ } else {
65
+ if (it[0] === '-') {
66
+ sequence.push({ type: 'removed', value: it[1] });
67
+ } else {
68
+ sequence.push({ type: 'added', value: it[1], before: '' });
69
+ }
70
+ }
71
+ }
72
+ const result = sequence.reverse().reduce(
73
+ (acc, it) => {
74
+ if (it.type === 'same') {
75
+ acc.prev = it.value;
76
+ }
77
+
78
+ if (it.type === 'added' && acc.prev) {
79
+ it.before = acc.prev;
80
+ }
81
+ acc.result.push(it);
82
+ return acc;
83
+ },
84
+ { result: [] },
85
+ );
86
+
87
+ return result.result.reverse();
88
+ };
89
+
90
+ export function diffSchemasOrTables(left, right) {
91
+ left = JSON.parse(JSON.stringify(left));
92
+ right = JSON.parse(JSON.stringify(right));
93
+
94
+ const result = Object.entries(diff(left, right) ?? {});
95
+
96
+ const added = result
97
+ .filter((it) => it[0].endsWith('__added'))
98
+ .map((it) => it[1]);
99
+ const deleted = result
100
+ .filter((it) => it[0].endsWith('__deleted'))
101
+ .map((it) => it[1]);
102
+
103
+ return { added, deleted };
104
+ }
105
+
106
+ export function diffIndPolicies(left, right) {
107
+ left = JSON.parse(JSON.stringify(left));
108
+ right = JSON.parse(JSON.stringify(right));
109
+
110
+ const result = Object.entries(diff(left, right) ?? {});
111
+
112
+ const added = result
113
+ .filter((it) => it[0].endsWith('__added'))
114
+ .map((it) => it[1]);
115
+ const deleted = result
116
+ .filter((it) => it[0].endsWith('__deleted'))
117
+ .map((it) => it[1]);
118
+
119
+ return { added, deleted };
120
+ }
121
+
122
+ export function diffColumns(left, right) {
123
+ left = JSON.parse(JSON.stringify(left));
124
+ right = JSON.parse(JSON.stringify(right));
125
+ const result = diff(left, right) ?? {};
126
+
127
+ const alteredTables = Object.fromEntries(
128
+ Object.entries(result)
129
+ .filter((it) => {
130
+ return !(it[0].includes('__added') || it[0].includes('__deleted'));
131
+ })
132
+ .map((tableEntry) => {
133
+ // const entry = { name: it, ...result[it] }
134
+ const deletedColumns = Object.entries(tableEntry[1].columns ?? {})
135
+ .filter((it) => {
136
+ return it[0].endsWith('__deleted');
137
+ })
138
+ .map((it) => {
139
+ return it[1];
140
+ });
141
+
142
+ const addedColumns = Object.entries(tableEntry[1].columns ?? {})
143
+ .filter((it) => {
144
+ return it[0].endsWith('__added');
145
+ })
146
+ .map((it) => {
147
+ return it[1];
148
+ });
149
+
150
+ tableEntry[1].columns = {
151
+ added: addedColumns,
152
+ deleted: deletedColumns,
153
+ };
154
+ const table = left[tableEntry[0]];
155
+ return [
156
+ tableEntry[0],
157
+ { name: table.name, schema: table.schema, ...tableEntry[1] },
158
+ ];
159
+ }),
160
+ );
161
+
162
+ return alteredTables;
163
+ }
164
+
165
+ export function diffPolicies(left, right) {
166
+ left = JSON.parse(JSON.stringify(left));
167
+ right = JSON.parse(JSON.stringify(right));
168
+ const result = diff(left, right) ?? {};
169
+
170
+ const alteredTables = Object.fromEntries(
171
+ Object.entries(result)
172
+ .filter((it) => {
173
+ return !(it[0].includes('__added') || it[0].includes('__deleted'));
174
+ })
175
+ .map((tableEntry) => {
176
+ // const entry = { name: it, ...result[it] }
177
+ const deletedPolicies = Object.entries(tableEntry[1].policies ?? {})
178
+ .filter((it) => {
179
+ return it[0].endsWith('__deleted');
180
+ })
181
+ .map((it) => {
182
+ return it[1];
183
+ });
184
+
185
+ const addedPolicies = Object.entries(tableEntry[1].policies ?? {})
186
+ .filter((it) => {
187
+ return it[0].endsWith('__added');
188
+ })
189
+ .map((it) => {
190
+ return it[1];
191
+ });
192
+
193
+ tableEntry[1].policies = {
194
+ added: addedPolicies,
195
+ deleted: deletedPolicies,
196
+ };
197
+ const table = left[tableEntry[0]];
198
+ return [
199
+ tableEntry[0],
200
+ { name: table.name, schema: table.schema, ...tableEntry[1] },
201
+ ];
202
+ }),
203
+ );
204
+
205
+ return alteredTables;
206
+ }
207
+
208
+ export function applyJsonDiff(json1, json2) {
209
+ json1 = JSON.parse(JSON.stringify(json1));
210
+ json2 = JSON.parse(JSON.stringify(json2));
211
+
212
+ // deep copy, needed because of the bug in diff library
213
+ const rawDiff = diff(json1, json2);
214
+
215
+ const difference = JSON.parse(JSON.stringify(rawDiff || {}));
216
+ difference.schemas = difference.schemas || {};
217
+ difference.tables = difference.tables || {};
218
+ difference.domains = difference.domains || {};
219
+ difference.enums = difference.enums || {};
220
+ difference.sequences = difference.sequences || {};
221
+ difference.roles = difference.roles || {};
222
+ difference.policies = difference.policies || {};
223
+ difference.views = difference.views || {};
224
+
225
+ // remove added/deleted schemas
226
+ const schemaKeys = Object.keys(difference.schemas);
227
+ for (let key of schemaKeys) {
228
+ if (key.endsWith('__added') || key.endsWith('__deleted')) {
229
+ delete difference.schemas[key];
230
+ continue;
231
+ }
232
+ }
233
+
234
+ // remove added/deleted tables
235
+ const tableKeys = Object.keys(difference.tables);
236
+ for (let key of tableKeys) {
237
+ if (key.endsWith('__added') || key.endsWith('__deleted')) {
238
+ delete difference.tables[key];
239
+ continue;
240
+ }
241
+
242
+ // supply table name and schema for altered tables
243
+ const table = json1.tables[key];
244
+ difference.tables[key] = {
245
+ name: table.name,
246
+ schema: table.schema,
247
+ ...difference.tables[key],
248
+ };
249
+ }
250
+
251
+ for (let [tableKey, tableValue] of Object.entries(difference.tables)) {
252
+ const table = difference.tables[tableKey];
253
+ const columns = tableValue.columns || {};
254
+ const columnKeys = Object.keys(columns);
255
+ for (let key of columnKeys) {
256
+ if (key.endsWith('__added') || key.endsWith('__deleted')) {
257
+ delete table.columns[key];
258
+ continue;
259
+ }
260
+ }
261
+
262
+ if (Object.keys(columns).length === 0) {
263
+ delete table['columns'];
264
+ }
265
+
266
+ if (
267
+ 'name' in table
268
+ && 'schema' in table
269
+ && Object.keys(table).length === 2
270
+ ) {
271
+ delete difference.tables[tableKey];
272
+ }
273
+ }
274
+
275
+ const domainsEntries = Object.entries(difference.domains);
276
+ const alteredDomains = domainsEntries
277
+ .filter((it) => !(it[0].includes('__added') || it[0].includes('__deleted')))
278
+ .map((it) => {
279
+ const domainEntry = json1.domains[it[0]];
280
+ if (!domainEntry) return;
281
+ const { name, schema, baseType, notNull, defaultValue, checkConstraints } = domainEntry;
282
+ return { name, schema, baseType, notNull, defaultValue, checkConstraints };
283
+ }).filter(Boolean);
284
+
285
+ const enumsEntries = Object.entries(difference.enums);
286
+ const alteredEnums = enumsEntries
287
+ .filter((it) => !(it[0].includes('__added') || it[0].includes('__deleted')))
288
+ .map((it) => {
289
+ const enumEntry = json1.enums[it[0]];
290
+ const { name, schema, values } = enumEntry;
291
+
292
+ const sequence = mapArraysDiff(values, it[1].values);
293
+ const addedValues = sequence
294
+ .filter((it) => it.type === 'added')
295
+ .map((it) => {
296
+ return {
297
+ before: it.before,
298
+ value: it.value,
299
+ };
300
+ });
301
+ const deletedValues = sequence
302
+ .filter((it) => it.type === 'removed')
303
+ .map((it) => it.value);
304
+
305
+ return { name, schema, addedValues, deletedValues };
306
+ });
307
+
308
+ const sequencesEntries = Object.entries(difference.sequences);
309
+ const alteredSequences = sequencesEntries
310
+ .filter((it) => !(it[0].includes('__added') || it[0].includes('__deleted')) && 'values' in it[1])
311
+ .map((it) => {
312
+ return json2.sequences[it[0]];
313
+ });
314
+
315
+ const rolesEntries = Object.entries(difference.roles);
316
+ const alteredRoles = rolesEntries
317
+ .filter((it) => !(it[0].includes('__added') || it[0].includes('__deleted')))
318
+ .map((it) => {
319
+ return json2.roles[it[0]];
320
+ });
321
+
322
+ const policiesEntries = Object.entries(difference.policies);
323
+ const alteredPolicies = policiesEntries
324
+ .filter((it) => !(it[0].includes('__added') || it[0].includes('__deleted')))
325
+ .map((it) => {
326
+ return json2.policies[it[0]];
327
+ });
328
+
329
+ const viewsEntries = Object.entries(difference.views);
330
+
331
+ const alteredViews = viewsEntries.filter((it) => !(it[0].includes('__added') || it[0].includes('__deleted'))).map(
332
+ ([nameWithSchema, view]) => {
333
+ const deletedWithOption = view.with__deleted;
334
+
335
+ const addedWithOption = view.with__added;
336
+
337
+ const deletedWith = Object.fromEntries(
338
+ Object.entries(view.with || {}).filter((it) => it[0].endsWith('__deleted')).map(([key, value]) => {
339
+ return [key.replace('__deleted', ''), value];
340
+ }),
341
+ );
342
+
343
+ const addedWith = Object.fromEntries(
344
+ Object.entries(view.with || {}).filter((it) => it[0].endsWith('__added')).map(([key, value]) => {
345
+ return [key.replace('__added', ''), value];
346
+ }),
347
+ );
348
+
349
+ const alterWith = Object.fromEntries(
350
+ Object.entries(view.with || {}).filter((it) =>
351
+ typeof it[1].__old !== 'undefined' && typeof it[1].__new !== 'undefined'
352
+ ).map(
353
+ (it) => {
354
+ return [it[0], it[1].__new];
355
+ },
356
+ ),
357
+ );
358
+
359
+ const alteredSchema = view.schema;
360
+
361
+ const alteredDefinition = view.definition;
362
+
363
+ const alteredExisting = view.isExisting;
364
+
365
+ const addedTablespace = view.tablespace__added;
366
+ const droppedTablespace = view.tablespace__deleted;
367
+ const alterTablespaceTo = view.tablespace;
368
+
369
+ let alteredTablespace;
370
+ if (addedTablespace) alteredTablespace = { __new: addedTablespace, __old: 'pg_default' };
371
+ if (droppedTablespace) alteredTablespace = { __new: 'pg_default', __old: droppedTablespace };
372
+ if (alterTablespaceTo) alteredTablespace = alterTablespaceTo;
373
+
374
+ const addedUsing = view.using__added;
375
+ const droppedUsing = view.using__deleted;
376
+ const alterUsingTo = view.using;
377
+
378
+ let alteredUsing;
379
+ if (addedUsing) alteredUsing = { __new: addedUsing, __old: 'heap' };
380
+ if (droppedUsing) alteredUsing = { __new: 'heap', __old: droppedUsing };
381
+ if (alterUsingTo) alteredUsing = alterUsingTo;
382
+
383
+ const alteredMeta = view.meta;
384
+
385
+ return Object.fromEntries(
386
+ Object.entries({
387
+ name: json2.views[nameWithSchema].name,
388
+ schema: json2.views[nameWithSchema].schema,
389
+ // pg
390
+ deletedWithOption: deletedWithOption,
391
+ addedWithOption: addedWithOption,
392
+ deletedWith: Object.keys(deletedWith).length ? deletedWith : undefined,
393
+ addedWith: Object.keys(addedWith).length ? addedWith : undefined,
394
+ alteredWith: Object.keys(alterWith).length ? alterWith : undefined,
395
+ alteredSchema,
396
+ alteredTablespace,
397
+ alteredUsing,
398
+ // mysql
399
+ alteredMeta,
400
+ // common
401
+ alteredDefinition,
402
+ alteredExisting,
403
+ }).filter(([_, value]) => value !== undefined),
404
+ );
405
+ },
406
+ );
407
+
408
+ const alteredTablesWithColumns = Object.values(difference.tables).map(
409
+ (table) => {
410
+ return findAlternationsInTable(table);
411
+ },
412
+ );
413
+
414
+ return {
415
+ alteredTablesWithColumns,
416
+ alteredDomains,
417
+ alteredEnums,
418
+ alteredSequences,
419
+ alteredRoles,
420
+ alteredViews,
421
+ alteredPolicies,
422
+ };
423
+ }
424
+
425
+ const findAlternationsInTable = (table) => {
426
+ // map each table to have altered, deleted or renamed columns
427
+
428
+ // in case no columns were altered, but indexes were
429
+ const columns = table.columns ?? {};
430
+
431
+ const altered = Object.keys(columns)
432
+ .filter((it) => !(it.includes('__deleted') || it.includes('__added')))
433
+ .map((it) => {
434
+ return { name: it, ...columns[it] };
435
+ });
436
+
437
+ const deletedIndexes = Object.fromEntries(
438
+ Object.entries(table.indexes__deleted || {})
439
+ .concat(
440
+ Object.entries(table.indexes || {}).filter((it) => it[0].includes('__deleted')),
441
+ )
442
+ .map((entry) => [entry[0].replace('__deleted', ''), entry[1]]),
443
+ );
444
+
445
+ const addedIndexes = Object.fromEntries(
446
+ Object.entries(table.indexes__added || {})
447
+ .concat(
448
+ Object.entries(table.indexes || {}).filter((it) => it[0].includes('__added')),
449
+ )
450
+ .map((entry) => [entry[0].replace('__added', ''), entry[1]]),
451
+ );
452
+
453
+ const alteredIndexes = Object.fromEntries(
454
+ Object.entries(table.indexes || {}).filter((it) => {
455
+ return !it[0].endsWith('__deleted') && !it[0].endsWith('__added');
456
+ }),
457
+ );
458
+
459
+ const deletedPolicies = Object.fromEntries(
460
+ Object.entries(table.policies__deleted || {})
461
+ .concat(
462
+ Object.entries(table.policies || {}).filter((it) => it[0].includes('__deleted')),
463
+ )
464
+ .map((entry) => [entry[0].replace('__deleted', ''), entry[1]]),
465
+ );
466
+
467
+ const addedPolicies = Object.fromEntries(
468
+ Object.entries(table.policies__added || {})
469
+ .concat(
470
+ Object.entries(table.policies || {}).filter((it) => it[0].includes('__added')),
471
+ )
472
+ .map((entry) => [entry[0].replace('__added', ''), entry[1]]),
473
+ );
474
+
475
+ const alteredPolicies = Object.fromEntries(
476
+ Object.entries(table.policies || {}).filter((it) => {
477
+ return !it[0].endsWith('__deleted') && !it[0].endsWith('__added');
478
+ }),
479
+ );
480
+
481
+ const deletedForeignKeys = Object.fromEntries(
482
+ Object.entries(table.foreignKeys__deleted || {})
483
+ .concat(
484
+ Object.entries(table.foreignKeys || {}).filter((it) => it[0].includes('__deleted')),
485
+ )
486
+ .map((entry) => [entry[0].replace('__deleted', ''), entry[1]]),
487
+ );
488
+
489
+ const addedForeignKeys = Object.fromEntries(
490
+ Object.entries(table.foreignKeys__added || {})
491
+ .concat(
492
+ Object.entries(table.foreignKeys || {}).filter((it) => it[0].includes('__added')),
493
+ )
494
+ .map((entry) => [entry[0].replace('__added', ''), entry[1]]),
495
+ );
496
+
497
+ const alteredForeignKeys = Object.fromEntries(
498
+ Object.entries(table.foreignKeys || {})
499
+ .filter(
500
+ (it) => !it[0].endsWith('__added') && !it[0].endsWith('__deleted'),
501
+ )
502
+ .map((entry) => [entry[0], entry[1]]),
503
+ );
504
+
505
+ const addedCompositePKs = Object.fromEntries(
506
+ Object.entries(table.compositePrimaryKeys || {}).filter((it) => {
507
+ return it[0].endsWith('__added');
508
+ }),
509
+ );
510
+
511
+ const deletedCompositePKs = Object.fromEntries(
512
+ Object.entries(table.compositePrimaryKeys || {}).filter((it) => {
513
+ return it[0].endsWith('__deleted');
514
+ }),
515
+ );
516
+
517
+ const alteredCompositePKs = Object.fromEntries(
518
+ Object.entries(table.compositePrimaryKeys || {}).filter((it) => {
519
+ return !it[0].endsWith('__deleted') && !it[0].endsWith('__added');
520
+ }),
521
+ );
522
+
523
+ const addedUniqueConstraints = Object.fromEntries(
524
+ Object.entries(table.uniqueConstraints || {}).filter((it) => {
525
+ return it[0].endsWith('__added');
526
+ }),
527
+ );
528
+
529
+ const deletedUniqueConstraints = Object.fromEntries(
530
+ Object.entries(table.uniqueConstraints || {}).filter((it) => {
531
+ return it[0].endsWith('__deleted');
532
+ }),
533
+ );
534
+
535
+ const alteredUniqueConstraints = Object.fromEntries(
536
+ Object.entries(table.uniqueConstraints || {}).filter((it) => {
537
+ return !it[0].endsWith('__deleted') && !it[0].endsWith('__added');
538
+ }),
539
+ );
540
+
541
+ const addedCheckConstraints = Object.fromEntries(
542
+ Object.entries(table.checkConstraints || {}).filter((it) => {
543
+ return it[0].endsWith('__added');
544
+ }),
545
+ );
546
+
547
+ const deletedCheckConstraints = Object.fromEntries(
548
+ Object.entries(table.checkConstraints || {}).filter((it) => {
549
+ return it[0].endsWith('__deleted');
550
+ }),
551
+ );
552
+
553
+ const alteredCheckConstraints = Object.fromEntries(
554
+ Object.entries(table.checkConstraints || {}).filter((it) => {
555
+ return !it[0].endsWith('__deleted') && !it[0].endsWith('__added');
556
+ }),
557
+ );
558
+
559
+ const mappedAltered = altered.map((it) => alternationsInColumn(it)).filter(Boolean);
560
+
561
+ return {
562
+ name: table.name,
563
+ schema: table.schema || '',
564
+ altered: mappedAltered,
565
+ addedIndexes,
566
+ deletedIndexes,
567
+ alteredIndexes,
568
+ addedForeignKeys,
569
+ deletedForeignKeys,
570
+ alteredForeignKeys,
571
+ addedCompositePKs,
572
+ deletedCompositePKs,
573
+ alteredCompositePKs,
574
+ addedUniqueConstraints,
575
+ deletedUniqueConstraints,
576
+ alteredUniqueConstraints,
577
+ deletedPolicies,
578
+ addedPolicies,
579
+ alteredPolicies,
580
+ addedCheckConstraints,
581
+ deletedCheckConstraints,
582
+ alteredCheckConstraints,
583
+ };
584
+ };
585
+
586
+ const alternationsInColumn = (column) => {
587
+ const altered = [column];
588
+
589
+ const result = altered
590
+ .filter((it) => {
591
+ if ('type' in it && it.type.__old.replace(' (', '(') === it.type.__new.replace(' (', '(')) {
592
+ return false;
593
+ }
594
+ return true;
595
+ })
596
+ .map((it) => {
597
+ if (typeof it.name !== 'string' && '__old' in it.name) {
598
+ // rename
599
+ return {
600
+ ...it,
601
+ name: { type: 'changed', old: it.name.__old, new: it.name.__new },
602
+ };
603
+ }
604
+ return it;
605
+ })
606
+ .map((it) => {
607
+ if ('type' in it) {
608
+ // type change
609
+ return {
610
+ ...it,
611
+ type: { type: 'changed', old: it.type.__old, new: it.type.__new },
612
+ };
613
+ }
614
+ return it;
615
+ })
616
+ .map((it) => {
617
+ if ('default' in it) {
618
+ return {
619
+ ...it,
620
+ default: {
621
+ type: 'changed',
622
+ old: it.default.__old,
623
+ new: it.default.__new,
624
+ },
625
+ };
626
+ }
627
+ if ('default__added' in it) {
628
+ const { default__added, ...others } = it;
629
+ return {
630
+ ...others,
631
+ default: { type: 'added', value: it.default__added },
632
+ };
633
+ }
634
+ if ('default__deleted' in it) {
635
+ const { default__deleted, ...others } = it;
636
+ return {
637
+ ...others,
638
+ default: { type: 'deleted', value: it.default__deleted },
639
+ };
640
+ }
641
+ return it;
642
+ })
643
+ .map((it) => {
644
+ if ('generated' in it) {
645
+ if ('as' in it.generated && 'type' in it.generated) {
646
+ return {
647
+ ...it,
648
+ generated: {
649
+ type: 'changed',
650
+ old: { as: it.generated.as.__old, type: it.generated.type.__old },
651
+ new: { as: it.generated.as.__new, type: it.generated.type.__new },
652
+ },
653
+ };
654
+ } else if ('as' in it.generated) {
655
+ return {
656
+ ...it,
657
+ generated: {
658
+ type: 'changed',
659
+ old: { as: it.generated.as.__old },
660
+ new: { as: it.generated.as.__new },
661
+ },
662
+ };
663
+ } else {
664
+ return {
665
+ ...it,
666
+ generated: {
667
+ type: 'changed',
668
+ old: { as: it.generated.type.__old },
669
+ new: { as: it.generated.type.__new },
670
+ },
671
+ };
672
+ }
673
+ }
674
+ if ('generated__added' in it) {
675
+ const { generated__added, ...others } = it;
676
+ return {
677
+ ...others,
678
+ generated: { type: 'added', value: it.generated__added },
679
+ };
680
+ }
681
+ if ('generated__deleted' in it) {
682
+ const { generated__deleted, ...others } = it;
683
+ return {
684
+ ...others,
685
+ generated: { type: 'deleted', value: it.generated__deleted },
686
+ };
687
+ }
688
+ return it;
689
+ })
690
+ .map((it) => {
691
+ if ('identity' in it) {
692
+ return {
693
+ ...it,
694
+ identity: {
695
+ type: 'changed',
696
+ old: it.identity.__old,
697
+ new: it.identity.__new,
698
+ },
699
+ };
700
+ }
701
+ if ('identity__added' in it) {
702
+ const { identity__added, ...others } = it;
703
+ return {
704
+ ...others,
705
+ identity: { type: 'added', value: it.identity__added },
706
+ };
707
+ }
708
+ if ('identity__deleted' in it) {
709
+ const { identity__deleted, ...others } = it;
710
+ return {
711
+ ...others,
712
+ identity: { type: 'deleted', value: it.identity__deleted },
713
+ };
714
+ }
715
+ return it;
716
+ })
717
+ .map((it) => {
718
+ if ('notNull' in it) {
719
+ return {
720
+ ...it,
721
+ notNull: {
722
+ type: 'changed',
723
+ old: it.notNull.__old,
724
+ new: it.notNull.__new,
725
+ },
726
+ };
727
+ }
728
+ if ('notNull__added' in it) {
729
+ const { notNull__added, ...others } = it;
730
+ return {
731
+ ...others,
732
+ notNull: { type: 'added', value: it.notNull__added },
733
+ };
734
+ }
735
+ if ('notNull__deleted' in it) {
736
+ const { notNull__deleted, ...others } = it;
737
+ return {
738
+ ...others,
739
+ notNull: { type: 'deleted', value: it.notNull__deleted },
740
+ };
741
+ }
742
+ return it;
743
+ })
744
+ .map((it) => {
745
+ if ('primaryKey' in it) {
746
+ return {
747
+ ...it,
748
+ primaryKey: {
749
+ type: 'changed',
750
+ old: it.primaryKey.__old,
751
+ new: it.primaryKey.__new,
752
+ },
753
+ };
754
+ }
755
+ if ('primaryKey__added' in it) {
756
+ const { notNull__added, ...others } = it;
757
+ return {
758
+ ...others,
759
+ primaryKey: { type: 'added', value: it.primaryKey__added },
760
+ };
761
+ }
762
+ if ('primaryKey__deleted' in it) {
763
+ const { notNull__deleted, ...others } = it;
764
+ return {
765
+ ...others,
766
+ primaryKey: { type: 'deleted', value: it.primaryKey__deleted },
767
+ };
768
+ }
769
+ return it;
770
+ })
771
+ .map((it) => {
772
+ if ('typeSchema' in it) {
773
+ return {
774
+ ...it,
775
+ typeSchema: {
776
+ type: 'changed',
777
+ old: it.typeSchema.__old,
778
+ new: it.typeSchema.__new,
779
+ },
780
+ };
781
+ }
782
+ if ('typeSchema__added' in it) {
783
+ const { typeSchema__added, ...others } = it;
784
+ return {
785
+ ...others,
786
+ typeSchema: { type: 'added', value: it.typeSchema__added },
787
+ };
788
+ }
789
+ if ('typeSchema__deleted' in it) {
790
+ const { typeSchema__deleted, ...others } = it;
791
+ return {
792
+ ...others,
793
+ typeSchema: { type: 'deleted', value: it.typeSchema__deleted },
794
+ };
795
+ }
796
+ return it;
797
+ })
798
+ .map((it) => {
799
+ if ('onUpdate' in it) {
800
+ return {
801
+ ...it,
802
+ onUpdate: {
803
+ type: 'changed',
804
+ old: it.onUpdate.__old,
805
+ new: it.onUpdate.__new,
806
+ },
807
+ };
808
+ }
809
+ if ('onUpdate__added' in it) {
810
+ const { onUpdate__added, ...others } = it;
811
+ return {
812
+ ...others,
813
+ onUpdate: { type: 'added', value: it.onUpdate__added },
814
+ };
815
+ }
816
+ if ('onUpdate__deleted' in it) {
817
+ const { onUpdate__deleted, ...others } = it;
818
+ return {
819
+ ...others,
820
+ onUpdate: { type: 'deleted', value: it.onUpdate__deleted },
821
+ };
822
+ }
823
+ return it;
824
+ })
825
+ .map((it) => {
826
+ if ('autoincrement' in it) {
827
+ return {
828
+ ...it,
829
+ autoincrement: {
830
+ type: 'changed',
831
+ old: it.autoincrement.__old,
832
+ new: it.autoincrement.__new,
833
+ },
834
+ };
835
+ }
836
+ if ('autoincrement__added' in it) {
837
+ const { autoincrement__added, ...others } = it;
838
+ return {
839
+ ...others,
840
+ autoincrement: { type: 'added', value: it.autoincrement__added },
841
+ };
842
+ }
843
+ if ('autoincrement__deleted' in it) {
844
+ const { autoincrement__deleted, ...others } = it;
845
+ return {
846
+ ...others,
847
+ autoincrement: { type: 'deleted', value: it.autoincrement__deleted },
848
+ };
849
+ }
850
+ return it;
851
+ })
852
+ .map((it) => {
853
+ if ('' in it) {
854
+ return {
855
+ ...it,
856
+ autoincrement: {
857
+ type: 'changed',
858
+ old: it.autoincrement.__old,
859
+ new: it.autoincrement.__new,
860
+ },
861
+ };
862
+ }
863
+ if ('autoincrement__added' in it) {
864
+ const { autoincrement__added, ...others } = it;
865
+ return {
866
+ ...others,
867
+ autoincrement: { type: 'added', value: it.autoincrement__added },
868
+ };
869
+ }
870
+ if ('autoincrement__deleted' in it) {
871
+ const { autoincrement__deleted, ...others } = it;
872
+ return {
873
+ ...others,
874
+ autoincrement: { type: 'deleted', value: it.autoincrement__deleted },
875
+ };
876
+ }
877
+ return it;
878
+ })
879
+ .filter(Boolean);
880
+
881
+ return result[0];
882
+ };