@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,1211 @@
1
+ import { JsonStatement } from 'src/jsonStatements';
2
+ import { SQLiteSchemaSquashed } from 'src/serializer/sqliteSchema';
3
+ import { sqliteCombineStatements } from 'src/statementCombiner';
4
+ import { expect, test } from 'vitest';
5
+
6
+ test(`renamed column and altered this column type`, async (t) => {
7
+ const statements: JsonStatement[] = [
8
+ {
9
+ type: 'alter_table_rename_column',
10
+ tableName: 'user',
11
+ oldColumnName: 'lastName',
12
+ newColumnName: 'lastName123',
13
+ schema: '',
14
+ },
15
+ {
16
+ type: 'alter_table_alter_column_set_type',
17
+ tableName: 'user',
18
+ columnName: 'lastName123',
19
+ newDataType: 'int',
20
+ oldDataType: 'text',
21
+ schema: '',
22
+ columnDefault: undefined,
23
+ columnOnUpdate: undefined,
24
+ columnNotNull: false,
25
+ columnAutoIncrement: false,
26
+ columnPk: false,
27
+ columnIsUnique: false,
28
+ } as unknown as JsonStatement,
29
+ ];
30
+ const json1: SQLiteSchemaSquashed = {
31
+ version: '6',
32
+ dialect: 'sqlite',
33
+ tables: {
34
+ user: {
35
+ name: 'user',
36
+ columns: {
37
+ firstName: {
38
+ name: 'firstName',
39
+ type: 'int',
40
+ primaryKey: true,
41
+ notNull: true,
42
+ autoincrement: false,
43
+ },
44
+ lastName: {
45
+ name: 'lastName',
46
+ type: 'text',
47
+ primaryKey: false,
48
+ notNull: false,
49
+ autoincrement: false,
50
+ },
51
+ test: {
52
+ name: 'test',
53
+ type: 'text',
54
+ primaryKey: false,
55
+ notNull: false,
56
+ autoincrement: false,
57
+ },
58
+ },
59
+ indexes: {},
60
+ foreignKeys: {},
61
+ compositePrimaryKeys: {},
62
+ uniqueConstraints: {},
63
+ checkConstraints: {},
64
+ },
65
+ },
66
+ enums: {},
67
+ views: {},
68
+ };
69
+ const json2: SQLiteSchemaSquashed = {
70
+ version: '6',
71
+ dialect: 'sqlite',
72
+ tables: {
73
+ user: {
74
+ name: 'user',
75
+ columns: {
76
+ firstName: {
77
+ name: 'firstName',
78
+ type: 'int',
79
+ primaryKey: true,
80
+ notNull: true,
81
+ autoincrement: false,
82
+ },
83
+ lastName: {
84
+ name: 'lastName123',
85
+ type: 'int',
86
+ primaryKey: false,
87
+ notNull: false,
88
+ autoincrement: false,
89
+ },
90
+ test: {
91
+ name: 'test',
92
+ type: 'int',
93
+ primaryKey: false,
94
+ notNull: false,
95
+ autoincrement: false,
96
+ },
97
+ },
98
+ indexes: {},
99
+ foreignKeys: {},
100
+ compositePrimaryKeys: {},
101
+ uniqueConstraints: {},
102
+ checkConstraints: {},
103
+ },
104
+ },
105
+ enums: {},
106
+ views: {},
107
+ };
108
+
109
+ const newJsonStatements = [
110
+ {
111
+ type: 'recreate_table',
112
+ tableName: 'user',
113
+ columns: [
114
+ {
115
+ name: 'firstName',
116
+ type: 'int',
117
+ primaryKey: true,
118
+ notNull: true,
119
+ autoincrement: false,
120
+ },
121
+ {
122
+ name: 'lastName123',
123
+ type: 'int',
124
+ primaryKey: false,
125
+ notNull: false,
126
+ autoincrement: false,
127
+ },
128
+ {
129
+ name: 'test',
130
+ type: 'int',
131
+ primaryKey: false,
132
+ notNull: false,
133
+ autoincrement: false,
134
+ },
135
+ ],
136
+ compositePKs: [],
137
+ referenceData: [],
138
+ uniqueConstraints: [],
139
+ checkConstraints: [],
140
+ },
141
+ ];
142
+ expect(sqliteCombineStatements(statements, json2)).toStrictEqual(
143
+ newJsonStatements,
144
+ );
145
+ });
146
+
147
+ test(`renamed column and droped column "test"`, async (t) => {
148
+ const statements: JsonStatement[] = [
149
+ {
150
+ type: 'alter_table_rename_column',
151
+ tableName: 'user',
152
+ oldColumnName: 'lastName',
153
+ newColumnName: 'lastName123',
154
+ schema: '',
155
+ },
156
+ {
157
+ type: 'alter_table_drop_column',
158
+ tableName: 'user',
159
+ columnName: 'test',
160
+ schema: '',
161
+ },
162
+ ];
163
+ const json1: SQLiteSchemaSquashed = {
164
+ version: '6',
165
+ dialect: 'sqlite',
166
+ tables: {
167
+ user: {
168
+ name: 'user',
169
+ columns: {
170
+ firstName: {
171
+ name: 'firstName',
172
+ type: 'int',
173
+ primaryKey: true,
174
+ notNull: true,
175
+ autoincrement: false,
176
+ },
177
+ lastName: {
178
+ name: 'lastName',
179
+ type: 'text',
180
+ primaryKey: false,
181
+ notNull: false,
182
+ autoincrement: false,
183
+ },
184
+ test: {
185
+ name: 'test',
186
+ type: 'text',
187
+ primaryKey: false,
188
+ notNull: false,
189
+ autoincrement: false,
190
+ },
191
+ },
192
+ indexes: {},
193
+ foreignKeys: {},
194
+ compositePrimaryKeys: {},
195
+ uniqueConstraints: {},
196
+ checkConstraints: {},
197
+ },
198
+ },
199
+ enums: {},
200
+ views: {},
201
+ };
202
+ const json2: SQLiteSchemaSquashed = {
203
+ version: '6',
204
+ dialect: 'sqlite',
205
+ tables: {
206
+ user: {
207
+ name: 'user',
208
+ columns: {
209
+ firstName: {
210
+ name: 'firstName',
211
+ type: 'int',
212
+ primaryKey: true,
213
+ notNull: true,
214
+ autoincrement: false,
215
+ },
216
+ lastName: {
217
+ name: 'lastName123',
218
+ type: 'int',
219
+ primaryKey: false,
220
+ notNull: false,
221
+ autoincrement: false,
222
+ },
223
+ test: {
224
+ name: 'test',
225
+ type: 'int',
226
+ primaryKey: false,
227
+ notNull: false,
228
+ autoincrement: false,
229
+ },
230
+ },
231
+ indexes: {},
232
+ foreignKeys: {},
233
+ compositePrimaryKeys: {},
234
+ uniqueConstraints: {},
235
+ checkConstraints: {},
236
+ },
237
+ },
238
+ enums: {},
239
+ views: {},
240
+ };
241
+
242
+ const newJsonStatements: JsonStatement[] = [
243
+ {
244
+ type: 'alter_table_rename_column',
245
+ tableName: 'user',
246
+ oldColumnName: 'lastName',
247
+ newColumnName: 'lastName123',
248
+ schema: '',
249
+ },
250
+ {
251
+ type: 'alter_table_drop_column',
252
+ tableName: 'user',
253
+ columnName: 'test',
254
+ schema: '',
255
+ },
256
+ ];
257
+ expect(sqliteCombineStatements(statements, json2)).toStrictEqual(
258
+ newJsonStatements,
259
+ );
260
+ });
261
+
262
+ test(`droped column that is part of composite pk`, async (t) => {
263
+ const statements: JsonStatement[] = [
264
+ { type: 'delete_composite_pk', tableName: 'user', data: 'id,iq' },
265
+ {
266
+ type: 'alter_table_alter_column_set_pk',
267
+ tableName: 'user',
268
+ schema: '',
269
+ columnName: 'id',
270
+ },
271
+ {
272
+ type: 'alter_table_drop_column',
273
+ tableName: 'user',
274
+ columnName: 'iq',
275
+ schema: '',
276
+ },
277
+ ];
278
+ const json1: SQLiteSchemaSquashed = {
279
+ version: '6',
280
+ dialect: 'sqlite',
281
+ tables: {
282
+ user: {
283
+ name: 'user',
284
+ columns: {
285
+ id: {
286
+ name: 'id',
287
+ type: 'int',
288
+ primaryKey: false,
289
+ notNull: false,
290
+ autoincrement: false,
291
+ },
292
+ first_nam: {
293
+ name: 'first_nam',
294
+ type: 'text',
295
+ primaryKey: false,
296
+ notNull: false,
297
+ autoincrement: false,
298
+ },
299
+ iq: {
300
+ name: 'iq',
301
+ type: 'int',
302
+ primaryKey: false,
303
+ notNull: false,
304
+ autoincrement: false,
305
+ },
306
+ },
307
+ indexes: {},
308
+ foreignKeys: {},
309
+ compositePrimaryKeys: {
310
+ user_id_iq_pk: 'id,iq',
311
+ },
312
+ uniqueConstraints: {},
313
+ checkConstraints: {},
314
+ },
315
+ },
316
+ enums: {},
317
+ views: {},
318
+ };
319
+ const json2: SQLiteSchemaSquashed = {
320
+ version: '6',
321
+ dialect: 'sqlite',
322
+ tables: {
323
+ user: {
324
+ name: 'user',
325
+ columns: {
326
+ id: {
327
+ name: 'id',
328
+ type: 'int',
329
+ primaryKey: true,
330
+ notNull: false,
331
+ autoincrement: false,
332
+ },
333
+ first_nam: {
334
+ name: 'first_nam',
335
+ type: 'text',
336
+ primaryKey: false,
337
+ notNull: false,
338
+ autoincrement: false,
339
+ },
340
+ },
341
+ indexes: {},
342
+ foreignKeys: {},
343
+ compositePrimaryKeys: {},
344
+ uniqueConstraints: {},
345
+ checkConstraints: {},
346
+ },
347
+ },
348
+ enums: {},
349
+ views: {},
350
+ };
351
+
352
+ const newJsonStatements: JsonStatement[] = [
353
+ {
354
+ type: 'recreate_table',
355
+ tableName: 'user',
356
+ columns: [
357
+ {
358
+ name: 'id',
359
+ type: 'int',
360
+ primaryKey: true,
361
+ notNull: false,
362
+ autoincrement: false,
363
+ },
364
+ {
365
+ name: 'first_nam',
366
+ type: 'text',
367
+ primaryKey: false,
368
+ notNull: false,
369
+ autoincrement: false,
370
+ },
371
+ ],
372
+ compositePKs: [],
373
+ referenceData: [],
374
+ uniqueConstraints: [],
375
+ checkConstraints: [],
376
+ },
377
+ ];
378
+ expect(sqliteCombineStatements(statements, json2)).toStrictEqual(
379
+ newJsonStatements,
380
+ );
381
+ });
382
+
383
+ test(`drop column "ref"."name", rename column "ref"."age". dropped primary key "user"."id". Set not null to "user"."iq"`, async (t) => {
384
+ const statements: JsonStatement[] = [
385
+ {
386
+ type: 'alter_table_rename_column',
387
+ tableName: 'ref',
388
+ oldColumnName: 'age',
389
+ newColumnName: 'age1',
390
+ schema: '',
391
+ },
392
+ {
393
+ type: 'alter_table_alter_column_drop_pk',
394
+ tableName: 'user',
395
+ columnName: 'id',
396
+ schema: '',
397
+ },
398
+ {
399
+ type: 'alter_table_alter_column_drop_autoincrement',
400
+ tableName: 'user',
401
+ columnName: 'id',
402
+ schema: '',
403
+ newDataType: 'int',
404
+ columnDefault: undefined,
405
+ columnOnUpdate: undefined,
406
+ columnNotNull: false,
407
+ columnAutoIncrement: false,
408
+ columnPk: false,
409
+ } as unknown as JsonStatement,
410
+ {
411
+ type: 'alter_table_alter_column_drop_notnull',
412
+ tableName: 'user',
413
+ columnName: 'id',
414
+ schema: '',
415
+ newDataType: 'int',
416
+ columnDefault: undefined,
417
+ columnOnUpdate: undefined,
418
+ columnNotNull: false,
419
+ columnAutoIncrement: false,
420
+ columnPk: false,
421
+ } as unknown as JsonStatement,
422
+ {
423
+ type: 'alter_table_alter_column_set_notnull',
424
+ tableName: 'user',
425
+ columnName: 'iq',
426
+ schema: '',
427
+ newDataType: 'int',
428
+ columnDefault: undefined,
429
+ columnOnUpdate: undefined,
430
+ columnNotNull: true,
431
+ columnAutoIncrement: false,
432
+ columnPk: false,
433
+ } as unknown as JsonStatement,
434
+ {
435
+ type: 'alter_table_drop_column',
436
+ tableName: 'ref',
437
+ columnName: 'text',
438
+ schema: '',
439
+ },
440
+ ];
441
+ const json1: SQLiteSchemaSquashed = {
442
+ version: '6',
443
+ dialect: 'sqlite',
444
+ tables: {
445
+ ref: {
446
+ name: 'ref',
447
+ columns: {
448
+ id: {
449
+ name: 'id',
450
+ type: 'int',
451
+ primaryKey: true,
452
+ notNull: true,
453
+ autoincrement: true,
454
+ },
455
+ user_iq: {
456
+ name: 'user_iq',
457
+ type: 'text',
458
+ primaryKey: false,
459
+ notNull: false,
460
+ autoincrement: false,
461
+ },
462
+ name: {
463
+ name: 'name',
464
+ type: 'text',
465
+ primaryKey: false,
466
+ notNull: true,
467
+ autoincrement: false,
468
+ },
469
+ age: {
470
+ name: 'age',
471
+ type: 'int',
472
+ primaryKey: false,
473
+ notNull: true,
474
+ autoincrement: false,
475
+ },
476
+ },
477
+ indexes: {},
478
+ foreignKeys: {
479
+ ref_user_iq_user_iq_fk: 'ref_user_iq_user_iq_fk;ref;user_iq;user;iq;no action;no action',
480
+ },
481
+ compositePrimaryKeys: {},
482
+ uniqueConstraints: {},
483
+ checkConstraints: {},
484
+ },
485
+ user: {
486
+ name: 'user',
487
+ columns: {
488
+ id: {
489
+ name: 'id',
490
+ type: 'int',
491
+ primaryKey: true,
492
+ notNull: true,
493
+ autoincrement: true,
494
+ },
495
+ first_name: {
496
+ name: 'first_name',
497
+ type: 'text',
498
+ primaryKey: false,
499
+ notNull: false,
500
+ autoincrement: false,
501
+ },
502
+ iq: {
503
+ name: 'iq',
504
+ type: 'int',
505
+ primaryKey: false,
506
+ notNull: false,
507
+ autoincrement: false,
508
+ },
509
+ },
510
+ indexes: {},
511
+ foreignKeys: {},
512
+ compositePrimaryKeys: {},
513
+ uniqueConstraints: {},
514
+ checkConstraints: {},
515
+ },
516
+ },
517
+ enums: {},
518
+ views: {},
519
+ };
520
+ const json2: SQLiteSchemaSquashed = {
521
+ version: '6',
522
+ dialect: 'sqlite',
523
+ tables: {
524
+ ref: {
525
+ name: 'ref',
526
+ columns: {
527
+ id: {
528
+ name: 'id',
529
+ type: 'int',
530
+ primaryKey: true,
531
+ notNull: true,
532
+ autoincrement: false,
533
+ },
534
+ user_iq: {
535
+ name: 'user_iq',
536
+ type: 'text',
537
+ primaryKey: false,
538
+ notNull: false,
539
+ autoincrement: false,
540
+ },
541
+ age1: {
542
+ name: 'age1',
543
+ type: 'int',
544
+ primaryKey: false,
545
+ notNull: true,
546
+ autoincrement: false,
547
+ },
548
+ },
549
+ indexes: {},
550
+ foreignKeys: {
551
+ ref_user_iq_user_iq_fk: 'ref_user_iq_user_iq_fk;ref;user_iq;user;iq;no action;no action',
552
+ },
553
+ compositePrimaryKeys: {},
554
+ uniqueConstraints: {},
555
+ checkConstraints: {},
556
+ },
557
+ user: {
558
+ name: 'user',
559
+ columns: {
560
+ id: {
561
+ name: 'id',
562
+ type: 'int',
563
+ primaryKey: false,
564
+ notNull: true,
565
+ autoincrement: false,
566
+ },
567
+ first_name: {
568
+ name: 'first_name',
569
+ type: 'text',
570
+ primaryKey: false,
571
+ notNull: false,
572
+ autoincrement: false,
573
+ },
574
+ iq: {
575
+ name: 'iq',
576
+ type: 'int',
577
+ primaryKey: false,
578
+ notNull: true,
579
+ autoincrement: false,
580
+ },
581
+ },
582
+ indexes: {},
583
+ foreignKeys: {},
584
+ compositePrimaryKeys: {},
585
+ uniqueConstraints: {},
586
+ checkConstraints: {},
587
+ },
588
+ },
589
+ enums: {},
590
+ views: {},
591
+ };
592
+
593
+ const newJsonStatements: JsonStatement[] = [
594
+ {
595
+ type: 'alter_table_rename_column',
596
+ tableName: 'ref',
597
+ oldColumnName: 'age',
598
+ newColumnName: 'age1',
599
+ schema: '',
600
+ },
601
+ {
602
+ type: 'alter_table_drop_column',
603
+ tableName: 'ref',
604
+ columnName: 'text',
605
+ schema: '',
606
+ },
607
+ {
608
+ type: 'recreate_table',
609
+ tableName: 'user',
610
+ columns: [
611
+ {
612
+ name: 'id',
613
+ type: 'int',
614
+ primaryKey: false,
615
+ notNull: true,
616
+ autoincrement: false,
617
+ },
618
+ {
619
+ name: 'first_name',
620
+ type: 'text',
621
+ primaryKey: false,
622
+ notNull: false,
623
+ autoincrement: false,
624
+ },
625
+ {
626
+ name: 'iq',
627
+ type: 'int',
628
+ primaryKey: false,
629
+ notNull: true,
630
+ autoincrement: false,
631
+ },
632
+ ],
633
+ compositePKs: [],
634
+ referenceData: [],
635
+ uniqueConstraints: [],
636
+ checkConstraints: [],
637
+ },
638
+ ];
639
+
640
+ expect(sqliteCombineStatements(statements, json2)).toStrictEqual(
641
+ newJsonStatements,
642
+ );
643
+ });
644
+
645
+ test(`create reference on exising column (table includes unique index). expect to recreate column and recreate index`, async (t) => {
646
+ const statements: JsonStatement[] = [
647
+ {
648
+ type: 'create_reference',
649
+ tableName: 'unique',
650
+ data: 'unique_ref_pk_pk_pk_fk;unique;ref_pk;pk;pk;no action;no action',
651
+ schema: '',
652
+ },
653
+ ];
654
+ const json1: SQLiteSchemaSquashed = {
655
+ version: '6',
656
+ dialect: 'sqlite',
657
+ tables: {
658
+ pk: {
659
+ name: 'pk',
660
+ columns: {
661
+ pk: {
662
+ name: 'pk',
663
+ type: 'int',
664
+ primaryKey: true,
665
+ notNull: true,
666
+ autoincrement: false,
667
+ },
668
+ },
669
+ indexes: {},
670
+ foreignKeys: {},
671
+ compositePrimaryKeys: {},
672
+ uniqueConstraints: {},
673
+ checkConstraints: {},
674
+ },
675
+ unique: {
676
+ name: 'unique',
677
+ columns: {
678
+ unique: {
679
+ name: 'unique',
680
+ type: 'text',
681
+ primaryKey: false,
682
+ notNull: false,
683
+ autoincrement: false,
684
+ },
685
+ ref_pk: {
686
+ name: 'ref_pk',
687
+ type: 'int',
688
+ primaryKey: false,
689
+ notNull: false,
690
+ autoincrement: false,
691
+ },
692
+ },
693
+ indexes: {
694
+ unique_unique_unique: 'unique_unique_unique;unique;true;',
695
+ },
696
+ foreignKeys: {},
697
+ compositePrimaryKeys: {},
698
+ uniqueConstraints: {},
699
+ checkConstraints: {},
700
+ },
701
+ },
702
+ enums: {},
703
+ views: {},
704
+ };
705
+ const json2: SQLiteSchemaSquashed = {
706
+ version: '6',
707
+ dialect: 'sqlite',
708
+ tables: {
709
+ pk: {
710
+ name: 'pk',
711
+ columns: {
712
+ pk: {
713
+ name: 'pk',
714
+ type: 'int',
715
+ primaryKey: true,
716
+ notNull: true,
717
+ autoincrement: false,
718
+ },
719
+ },
720
+ indexes: {},
721
+ foreignKeys: {},
722
+ compositePrimaryKeys: {},
723
+ uniqueConstraints: {},
724
+ checkConstraints: {},
725
+ },
726
+ unique: {
727
+ name: 'unique',
728
+ columns: {
729
+ unique: {
730
+ name: 'unique',
731
+ type: 'text',
732
+ primaryKey: false,
733
+ notNull: false,
734
+ autoincrement: false,
735
+ },
736
+ ref_pk: {
737
+ name: 'ref_pk',
738
+ type: 'int',
739
+ primaryKey: false,
740
+ notNull: false,
741
+ autoincrement: false,
742
+ },
743
+ },
744
+ indexes: {
745
+ unique_unique_unique: 'unique_unique_unique;unique;true;',
746
+ },
747
+ foreignKeys: {
748
+ unique_ref_pk_pk_pk_fk: 'unique_ref_pk_pk_pk_fk;unique;ref_pk;pk;pk;no action;no action',
749
+ },
750
+ compositePrimaryKeys: {},
751
+ uniqueConstraints: {},
752
+ checkConstraints: {},
753
+ },
754
+ },
755
+ enums: {},
756
+ views: {},
757
+ };
758
+
759
+ const newJsonStatements: JsonStatement[] = [
760
+ {
761
+ type: 'recreate_table',
762
+ tableName: 'unique',
763
+ columns: [
764
+ {
765
+ name: 'unique',
766
+ type: 'text',
767
+ primaryKey: false,
768
+ notNull: false,
769
+ autoincrement: false,
770
+ },
771
+ {
772
+ name: 'ref_pk',
773
+ type: 'int',
774
+ primaryKey: false,
775
+ notNull: false,
776
+ autoincrement: false,
777
+ },
778
+ ],
779
+ compositePKs: [],
780
+ referenceData: [
781
+ {
782
+ name: 'unique_ref_pk_pk_pk_fk',
783
+ tableFrom: 'unique',
784
+ tableTo: 'pk',
785
+ columnsFrom: ['ref_pk'],
786
+ columnsTo: ['pk'],
787
+ onDelete: 'no action',
788
+ onUpdate: 'no action',
789
+ },
790
+ ],
791
+ uniqueConstraints: [],
792
+ checkConstraints: [],
793
+ },
794
+ {
795
+ data: 'unique_unique_unique;unique;true;',
796
+ internal: undefined,
797
+ schema: '',
798
+ tableName: 'unique',
799
+ type: 'create_index',
800
+ },
801
+ ];
802
+
803
+ expect(sqliteCombineStatements(statements, json2)).toStrictEqual(
804
+ newJsonStatements,
805
+ );
806
+ });
807
+
808
+ test(`add columns. set fk`, async (t) => {
809
+ const statements: JsonStatement[] = [
810
+ {
811
+ type: 'sqlite_alter_table_add_column',
812
+ tableName: 'ref',
813
+ column: {
814
+ name: 'test',
815
+ type: 'integer',
816
+ primaryKey: false,
817
+ notNull: false,
818
+ autoincrement: false,
819
+ },
820
+ referenceData: undefined,
821
+ },
822
+ {
823
+ type: 'sqlite_alter_table_add_column',
824
+ tableName: 'ref',
825
+ column: {
826
+ name: 'test1',
827
+ type: 'integer',
828
+ primaryKey: false,
829
+ notNull: false,
830
+ autoincrement: false,
831
+ },
832
+ referenceData: undefined,
833
+ },
834
+ {
835
+ type: 'create_reference',
836
+ tableName: 'ref',
837
+ data: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action',
838
+ schema: '',
839
+ columnNotNull: false,
840
+ columnDefault: undefined,
841
+ columnType: 'integer',
842
+ },
843
+ ];
844
+ const json1: SQLiteSchemaSquashed = {
845
+ version: '6',
846
+ dialect: 'sqlite',
847
+ tables: {
848
+ ref: {
849
+ name: 'ref',
850
+ columns: {
851
+ id1: {
852
+ name: 'id1',
853
+ type: 'text',
854
+ primaryKey: false,
855
+ notNull: true,
856
+ autoincrement: false,
857
+ },
858
+ new_age: {
859
+ name: 'new_age',
860
+ type: 'integer',
861
+ primaryKey: false,
862
+ notNull: false,
863
+ autoincrement: false,
864
+ },
865
+ },
866
+ indexes: {},
867
+ foreignKeys: {},
868
+ compositePrimaryKeys: {},
869
+ uniqueConstraints: {},
870
+ checkConstraints: {},
871
+ },
872
+ user: {
873
+ name: 'user',
874
+ columns: {
875
+ id1: {
876
+ name: 'id1',
877
+ type: 'text',
878
+ primaryKey: false,
879
+ notNull: true,
880
+ autoincrement: false,
881
+ },
882
+ new_age: {
883
+ name: 'new_age',
884
+ type: 'integer',
885
+ primaryKey: false,
886
+ notNull: false,
887
+ autoincrement: false,
888
+ },
889
+ },
890
+ indexes: {},
891
+ foreignKeys: {},
892
+ compositePrimaryKeys: {},
893
+ uniqueConstraints: {},
894
+ checkConstraints: {},
895
+ },
896
+ },
897
+ enums: {},
898
+ views: {},
899
+ };
900
+ const json2: SQLiteSchemaSquashed = {
901
+ version: '6',
902
+ dialect: 'sqlite',
903
+ tables: {
904
+ ref: {
905
+ name: 'ref',
906
+ columns: {
907
+ id1: {
908
+ name: 'id1',
909
+ type: 'text',
910
+ primaryKey: false,
911
+ notNull: true,
912
+ autoincrement: false,
913
+ },
914
+ new_age: {
915
+ name: 'new_age',
916
+ type: 'integer',
917
+ primaryKey: false,
918
+ notNull: false,
919
+ autoincrement: false,
920
+ },
921
+ test: {
922
+ name: 'test',
923
+ type: 'integer',
924
+ primaryKey: false,
925
+ notNull: false,
926
+ autoincrement: false,
927
+ },
928
+ test1: {
929
+ name: 'test1',
930
+ type: 'integer',
931
+ primaryKey: false,
932
+ notNull: false,
933
+ autoincrement: false,
934
+ },
935
+ },
936
+ indexes: {},
937
+ foreignKeys: {
938
+ ref_new_age_user_new_age_fk: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action',
939
+ },
940
+ compositePrimaryKeys: {},
941
+ uniqueConstraints: {},
942
+ checkConstraints: {},
943
+ },
944
+ user: {
945
+ name: 'user',
946
+ columns: {
947
+ id1: {
948
+ name: 'id1',
949
+ type: 'text',
950
+ primaryKey: false,
951
+ notNull: true,
952
+ autoincrement: false,
953
+ },
954
+ new_age: {
955
+ name: 'new_age',
956
+ type: 'integer',
957
+ primaryKey: false,
958
+ notNull: false,
959
+ autoincrement: false,
960
+ },
961
+ },
962
+ indexes: {},
963
+ foreignKeys: {},
964
+ compositePrimaryKeys: {},
965
+ uniqueConstraints: {},
966
+ checkConstraints: {},
967
+ },
968
+ },
969
+ enums: {},
970
+ views: {},
971
+ };
972
+
973
+ const newJsonStatements = [
974
+ {
975
+ columns: [
976
+ {
977
+ autoincrement: false,
978
+ name: 'id1',
979
+ notNull: true,
980
+ primaryKey: false,
981
+ type: 'text',
982
+ },
983
+ {
984
+ autoincrement: false,
985
+ name: 'new_age',
986
+ notNull: false,
987
+ primaryKey: false,
988
+ type: 'integer',
989
+ },
990
+ {
991
+ autoincrement: false,
992
+ name: 'test',
993
+ notNull: false,
994
+ primaryKey: false,
995
+ type: 'integer',
996
+ },
997
+ {
998
+ autoincrement: false,
999
+ name: 'test1',
1000
+ notNull: false,
1001
+ primaryKey: false,
1002
+ type: 'integer',
1003
+ },
1004
+ ],
1005
+ compositePKs: [],
1006
+ referenceData: [
1007
+ {
1008
+ columnsFrom: [
1009
+ 'new_age',
1010
+ ],
1011
+ columnsTo: [
1012
+ 'new_age',
1013
+ ],
1014
+ name: 'ref_new_age_user_new_age_fk',
1015
+ onDelete: 'no action',
1016
+ onUpdate: 'no action',
1017
+ tableFrom: 'ref',
1018
+ tableTo: 'user',
1019
+ },
1020
+ ],
1021
+ tableName: 'ref',
1022
+ type: 'recreate_table',
1023
+ uniqueConstraints: [],
1024
+ checkConstraints: [],
1025
+ },
1026
+ ];
1027
+ expect(sqliteCombineStatements(statements, json2)).toStrictEqual(
1028
+ newJsonStatements,
1029
+ );
1030
+ });
1031
+
1032
+ test(`add column and fk`, async (t) => {
1033
+ const statements: JsonStatement[] = [
1034
+ {
1035
+ type: 'sqlite_alter_table_add_column',
1036
+ tableName: 'ref',
1037
+ column: {
1038
+ name: 'test1',
1039
+ type: 'integer',
1040
+ primaryKey: false,
1041
+ notNull: false,
1042
+ autoincrement: false,
1043
+ },
1044
+ referenceData: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',
1045
+ },
1046
+ {
1047
+ type: 'create_reference',
1048
+ tableName: 'ref',
1049
+ data: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',
1050
+ schema: '',
1051
+ columnNotNull: false,
1052
+ columnDefault: undefined,
1053
+ columnType: 'integer',
1054
+ },
1055
+ ];
1056
+ const json1: SQLiteSchemaSquashed = {
1057
+ version: '6',
1058
+ dialect: 'sqlite',
1059
+ tables: {
1060
+ ref: {
1061
+ name: 'ref',
1062
+ columns: {
1063
+ id1: {
1064
+ name: 'id1',
1065
+ type: 'text',
1066
+ primaryKey: false,
1067
+ notNull: true,
1068
+ autoincrement: false,
1069
+ },
1070
+ new_age: {
1071
+ name: 'new_age',
1072
+ type: 'integer',
1073
+ primaryKey: false,
1074
+ notNull: false,
1075
+ autoincrement: false,
1076
+ },
1077
+ test1: {
1078
+ name: 'test1',
1079
+ type: 'integer',
1080
+ primaryKey: false,
1081
+ notNull: false,
1082
+ autoincrement: false,
1083
+ },
1084
+ },
1085
+ indexes: {},
1086
+ foreignKeys: {
1087
+ ref_test1_user_new_age_fk: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',
1088
+ },
1089
+ compositePrimaryKeys: {},
1090
+ uniqueConstraints: {},
1091
+ checkConstraints: {},
1092
+ },
1093
+ user: {
1094
+ name: 'user',
1095
+ columns: {
1096
+ id1: {
1097
+ name: 'id1',
1098
+ type: 'text',
1099
+ primaryKey: false,
1100
+ notNull: true,
1101
+ autoincrement: false,
1102
+ },
1103
+ new_age: {
1104
+ name: 'new_age',
1105
+ type: 'integer',
1106
+ primaryKey: false,
1107
+ notNull: false,
1108
+ autoincrement: false,
1109
+ },
1110
+ },
1111
+ indexes: {},
1112
+ foreignKeys: {},
1113
+ compositePrimaryKeys: {},
1114
+ uniqueConstraints: {},
1115
+ checkConstraints: {},
1116
+ },
1117
+ },
1118
+ enums: {},
1119
+ views: {},
1120
+ };
1121
+ const json2: SQLiteSchemaSquashed = {
1122
+ version: '6',
1123
+ dialect: 'sqlite',
1124
+ tables: {
1125
+ ref: {
1126
+ name: 'ref',
1127
+ columns: {
1128
+ id1: {
1129
+ name: 'id1',
1130
+ type: 'text',
1131
+ primaryKey: false,
1132
+ notNull: true,
1133
+ autoincrement: false,
1134
+ },
1135
+ new_age: {
1136
+ name: 'new_age',
1137
+ type: 'integer',
1138
+ primaryKey: false,
1139
+ notNull: false,
1140
+ autoincrement: false,
1141
+ },
1142
+ test: {
1143
+ name: 'test',
1144
+ type: 'integer',
1145
+ primaryKey: false,
1146
+ notNull: false,
1147
+ autoincrement: false,
1148
+ },
1149
+ test1: {
1150
+ name: 'test1',
1151
+ type: 'integer',
1152
+ primaryKey: false,
1153
+ notNull: false,
1154
+ autoincrement: false,
1155
+ },
1156
+ },
1157
+ indexes: {},
1158
+ foreignKeys: {
1159
+ ref_new_age_user_new_age_fk: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action',
1160
+ },
1161
+ compositePrimaryKeys: {},
1162
+ uniqueConstraints: {},
1163
+ checkConstraints: {},
1164
+ },
1165
+ user: {
1166
+ name: 'user',
1167
+ columns: {
1168
+ id1: {
1169
+ name: 'id1',
1170
+ type: 'text',
1171
+ primaryKey: false,
1172
+ notNull: true,
1173
+ autoincrement: false,
1174
+ },
1175
+ new_age: {
1176
+ name: 'new_age',
1177
+ type: 'integer',
1178
+ primaryKey: false,
1179
+ notNull: false,
1180
+ autoincrement: false,
1181
+ },
1182
+ },
1183
+ indexes: {},
1184
+ foreignKeys: {},
1185
+ compositePrimaryKeys: {},
1186
+ uniqueConstraints: {},
1187
+ checkConstraints: {},
1188
+ },
1189
+ },
1190
+ enums: {},
1191
+ views: {},
1192
+ };
1193
+
1194
+ const newJsonStatements = [
1195
+ {
1196
+ type: 'sqlite_alter_table_add_column',
1197
+ tableName: 'ref',
1198
+ column: {
1199
+ name: 'test1',
1200
+ type: 'integer',
1201
+ primaryKey: false,
1202
+ notNull: false,
1203
+ autoincrement: false,
1204
+ },
1205
+ referenceData: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',
1206
+ },
1207
+ ];
1208
+ expect(sqliteCombineStatements(statements, json2)).toStrictEqual(
1209
+ newJsonStatements,
1210
+ );
1211
+ });