@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,1812 @@
1
+ import { JsonAddColumnStatement, JsonSqliteAddColumnStatement, JsonStatement } from 'src/jsonStatements';
2
+ import { SQLiteSchemaSquashed } from 'src/serializer/sqliteSchema';
3
+ import { SQLiteAlterTableAddColumnConvertor } from 'src/sqlgenerator';
4
+ import { libSQLCombineStatements } from 'src/statementCombiner';
5
+ import { expect, test } from 'vitest';
6
+
7
+ /**
8
+ * ! before:
9
+ *
10
+ * user: {
11
+ * id INT;
12
+ * first_name INT;
13
+ * iq INT;
14
+ * PRIMARY KEY (id, iq)
15
+ * INDEXES: {
16
+ * UNIQUE id;
17
+ * }
18
+ * }
19
+ *
20
+ * ! after:
21
+ *
22
+ * new_user: {
23
+ * id INT;
24
+ * first_name INT;
25
+ * iq INT;
26
+ * PRIMARY KEY (id, iq)
27
+ * INDEXES: {}
28
+ * }
29
+ *
30
+ * rename table and drop unique index
31
+ * expect to get "rename_table" statement and then "recreate_table"
32
+ */
33
+ test(`rename table and drop index`, async (t) => {
34
+ const statements: JsonStatement[] = [
35
+ {
36
+ type: 'rename_table',
37
+ fromSchema: '',
38
+ toSchema: '',
39
+ tableNameFrom: 'user',
40
+ tableNameTo: 'new_user',
41
+ },
42
+ {
43
+ type: 'drop_index',
44
+ tableName: 'new_user',
45
+ data: 'user_first_name_unique;first_name;true;',
46
+ schema: '',
47
+ },
48
+ ];
49
+ const json1: SQLiteSchemaSquashed = {
50
+ version: '6',
51
+ dialect: 'sqlite',
52
+ tables: {
53
+ user: {
54
+ name: 'user',
55
+ columns: {
56
+ id: {
57
+ name: 'id',
58
+ type: 'int',
59
+ primaryKey: false,
60
+ notNull: false,
61
+ autoincrement: false,
62
+ },
63
+ first_name: {
64
+ name: 'first_name',
65
+ type: 'int',
66
+ primaryKey: false,
67
+ notNull: false,
68
+ autoincrement: false,
69
+ },
70
+ iq: {
71
+ name: 'iq',
72
+ type: 'int',
73
+ primaryKey: false,
74
+ notNull: true,
75
+ autoincrement: false,
76
+ },
77
+ },
78
+ indexes: {
79
+ user_first_name_unique: 'user_first_name_unique;first_name;true;',
80
+ },
81
+ foreignKeys: {},
82
+ compositePrimaryKeys: {
83
+ user_id_iq_pk: 'id,iq',
84
+ },
85
+ uniqueConstraints: {},
86
+ checkConstraints: {},
87
+ },
88
+ },
89
+ enums: {},
90
+ views: {},
91
+ };
92
+ const json2: SQLiteSchemaSquashed = {
93
+ version: '6',
94
+ dialect: 'sqlite',
95
+ tables: {
96
+ new_user: {
97
+ name: 'new_user',
98
+ columns: {
99
+ id: {
100
+ name: 'id',
101
+ type: 'int',
102
+ primaryKey: false,
103
+ notNull: false,
104
+ autoincrement: false,
105
+ },
106
+ first_name: {
107
+ name: 'first_name',
108
+ type: 'int',
109
+ primaryKey: false,
110
+ notNull: false,
111
+ autoincrement: false,
112
+ },
113
+ iq: {
114
+ name: 'iq',
115
+ type: 'int',
116
+ primaryKey: false,
117
+ notNull: true,
118
+ autoincrement: false,
119
+ },
120
+ },
121
+ indexes: {},
122
+ foreignKeys: {},
123
+ compositePrimaryKeys: {
124
+ new_user_id_iq_pk: 'id,iq',
125
+ },
126
+ uniqueConstraints: {},
127
+ checkConstraints: {},
128
+ },
129
+ },
130
+ enums: {},
131
+ views: {},
132
+ };
133
+
134
+ const newJsonStatements = [
135
+ {
136
+ type: 'rename_table',
137
+ fromSchema: '',
138
+ toSchema: '',
139
+ tableNameFrom: 'user',
140
+ tableNameTo: 'new_user',
141
+ },
142
+ {
143
+ type: 'drop_index',
144
+ tableName: 'new_user',
145
+ data: 'user_first_name_unique;first_name;true;',
146
+ schema: '',
147
+ },
148
+ ];
149
+ expect(libSQLCombineStatements(statements, json2)).toStrictEqual(
150
+ newJsonStatements,
151
+ );
152
+ });
153
+
154
+ /**
155
+ * ! before:
156
+ *
157
+ * autoincrement1: {
158
+ * id INT PRIMARY KEY;
159
+ * }
160
+ *
161
+ * autoincrement2: {
162
+ * id INT PRIMARY KEY AUTOINCREMENT;
163
+ * }
164
+ *
165
+ * dropNotNull: {
166
+ * id INT NOT NULL;
167
+ * }
168
+ *
169
+ * ! after:
170
+ *
171
+ * autoincrement1: {
172
+ * id INT PRIMARY KEY AUTOINCREMENT;
173
+ * }
174
+ *
175
+ * autoincrement2: {
176
+ * id INT PRI<ARY KEY;
177
+ * }
178
+ *
179
+ * dropNotNull: {
180
+ * id INT;
181
+ * }
182
+ *
183
+ * drop autoincrement for autoincrement1
184
+ * set autoincrement for autoincrement2
185
+ *
186
+ * expect to:
187
+ * - get "recreate_table" for autoincrement1
188
+ * - get "recreate_table" for autoincrement2
189
+ * - get "drop_notnull" for dropNotNull
190
+ */
191
+ test(`drop, set autoincrement. drop not null`, async (t) => {
192
+ const statements: JsonStatement[] = [
193
+ {
194
+ type: 'alter_table_alter_column_set_autoincrement',
195
+ tableName: 'autoincrement1',
196
+ columnName: 'id',
197
+ schema: '',
198
+ newDataType: 'int',
199
+ columnDefault: undefined,
200
+ columnOnUpdate: undefined,
201
+ columnNotNull: true,
202
+ columnAutoIncrement: true,
203
+ columnPk: true,
204
+ } as unknown as JsonStatement,
205
+ {
206
+ type: 'alter_table_alter_column_drop_autoincrement',
207
+ tableName: 'autoincrement2',
208
+ columnName: 'id',
209
+ schema: '',
210
+ newDataType: 'int',
211
+ columnDefault: undefined,
212
+ columnOnUpdate: undefined,
213
+ columnNotNull: true,
214
+ columnAutoIncrement: false,
215
+ columnPk: true,
216
+ } as unknown as JsonStatement,
217
+ {
218
+ type: 'alter_table_alter_column_drop_notnull',
219
+ tableName: 'dropNotNull',
220
+ columnName: 'id',
221
+ schema: '',
222
+ newDataType: 'int',
223
+ columnDefault: undefined,
224
+ columnOnUpdate: undefined,
225
+ columnNotNull: false,
226
+ columnAutoIncrement: false,
227
+ columnPk: false,
228
+ } as unknown as JsonStatement,
229
+ ];
230
+ const json1: SQLiteSchemaSquashed = {
231
+ version: '6',
232
+ dialect: 'sqlite',
233
+ tables: {
234
+ autoincrement1: {
235
+ name: 'autoincrement1',
236
+ columns: {
237
+ id: {
238
+ name: 'id',
239
+ type: 'int',
240
+ primaryKey: true,
241
+ notNull: true,
242
+ autoincrement: false,
243
+ },
244
+ },
245
+ indexes: {},
246
+ foreignKeys: {},
247
+ compositePrimaryKeys: {},
248
+ uniqueConstraints: {},
249
+ checkConstraints: {},
250
+ },
251
+ autoincrement2: {
252
+ name: 'autoincrement2',
253
+ columns: {
254
+ id: {
255
+ name: 'id',
256
+ type: 'int',
257
+ primaryKey: true,
258
+ notNull: false,
259
+ autoincrement: true,
260
+ },
261
+ },
262
+ indexes: {},
263
+ foreignKeys: {},
264
+ compositePrimaryKeys: {},
265
+ uniqueConstraints: {},
266
+ checkConstraints: {},
267
+ },
268
+ dropNotNull: {
269
+ name: 'dropNotNull',
270
+ columns: {
271
+ id: {
272
+ name: 'id',
273
+ type: 'int',
274
+ primaryKey: false,
275
+ notNull: true,
276
+ autoincrement: false,
277
+ },
278
+ },
279
+ indexes: {},
280
+ foreignKeys: {},
281
+ compositePrimaryKeys: {},
282
+ uniqueConstraints: {},
283
+ checkConstraints: {},
284
+ },
285
+ },
286
+ enums: {},
287
+ views: {},
288
+ };
289
+ const json2: SQLiteSchemaSquashed = {
290
+ version: '6',
291
+ dialect: 'sqlite',
292
+ tables: {
293
+ autoincrement1: {
294
+ name: 'autoincrement1',
295
+ columns: {
296
+ id: {
297
+ name: 'id',
298
+ type: 'int',
299
+ primaryKey: true,
300
+ notNull: true,
301
+ autoincrement: true,
302
+ },
303
+ },
304
+ indexes: {},
305
+ foreignKeys: {},
306
+ compositePrimaryKeys: {},
307
+ uniqueConstraints: {},
308
+ checkConstraints: {},
309
+ },
310
+ autoincrement2: {
311
+ name: 'autoincrement2',
312
+ columns: {
313
+ id: {
314
+ name: 'id',
315
+ type: 'int',
316
+ primaryKey: true,
317
+ notNull: true,
318
+ autoincrement: false,
319
+ },
320
+ },
321
+ indexes: {},
322
+ foreignKeys: {},
323
+ compositePrimaryKeys: {},
324
+ uniqueConstraints: {},
325
+ checkConstraints: {},
326
+ },
327
+ dropNotNull: {
328
+ name: 'dropNotNull',
329
+ columns: {
330
+ id: {
331
+ name: 'id',
332
+ type: 'int',
333
+ primaryKey: false,
334
+ notNull: false,
335
+ autoincrement: false,
336
+ },
337
+ },
338
+ indexes: {},
339
+ foreignKeys: {},
340
+ compositePrimaryKeys: {},
341
+ uniqueConstraints: {},
342
+ checkConstraints: {},
343
+ },
344
+ },
345
+ enums: {},
346
+ views: {},
347
+ };
348
+
349
+ const newJsonStatements = [
350
+ {
351
+ type: 'recreate_table',
352
+ tableName: 'autoincrement1',
353
+ columns: [
354
+ {
355
+ name: 'id',
356
+ type: 'int',
357
+ primaryKey: true,
358
+ notNull: true,
359
+ autoincrement: true,
360
+ },
361
+ ],
362
+ compositePKs: [],
363
+ referenceData: [],
364
+ uniqueConstraints: [],
365
+ checkConstraints: [],
366
+ },
367
+ {
368
+ type: 'recreate_table',
369
+ tableName: 'autoincrement2',
370
+ columns: [
371
+ {
372
+ name: 'id',
373
+ type: 'int',
374
+ primaryKey: true,
375
+ notNull: true,
376
+ autoincrement: false,
377
+ },
378
+ ],
379
+ compositePKs: [],
380
+ referenceData: [],
381
+ uniqueConstraints: [],
382
+ checkConstraints: [],
383
+ },
384
+ {
385
+ type: 'alter_table_alter_column_drop_notnull',
386
+ tableName: 'dropNotNull',
387
+ columnName: 'id',
388
+ schema: '',
389
+ newDataType: 'int',
390
+ columnDefault: undefined,
391
+ columnOnUpdate: undefined,
392
+ columnNotNull: false,
393
+ columnAutoIncrement: false,
394
+ columnPk: false,
395
+ },
396
+ ];
397
+ expect(libSQLCombineStatements(statements, json2)).toStrictEqual(
398
+ newJsonStatements,
399
+ );
400
+ });
401
+
402
+ /**
403
+ * ! before:
404
+ *
405
+ * pk1: {
406
+ * id INT;
407
+ * }
408
+ *
409
+ * pk2: {
410
+ * id INT PRIMARY KEY;
411
+ * }
412
+ *
413
+ * ref_table: {
414
+ * id INT;
415
+ * }
416
+ *
417
+ * create_reference: {
418
+ * id INT;
419
+ * }
420
+ *
421
+ * ! after:
422
+ *
423
+ * pk1: {
424
+ * id INT PRIMARY KEY;
425
+ * }
426
+ *
427
+ * pk2: {
428
+ * id INT;
429
+ * }
430
+ *
431
+ * ref_table: {
432
+ * id INT;
433
+ * }
434
+ *
435
+ * create_reference: {
436
+ * id INT -> ref_table INT;
437
+ * }
438
+ *
439
+ * drop primary key for pk2
440
+ * set primary key for pk1
441
+ * "create_reference" reference on "ref_table"
442
+ *
443
+ * expect to:
444
+ * - "recreate_table" statement for pk1
445
+ * - "recreate_table" statement for pk2
446
+ * - "create_reference" statement for create_reference
447
+ */
448
+ test(`drop and set primary key. create reference`, async (t) => {
449
+ const statements: JsonStatement[] = [
450
+ {
451
+ type: 'alter_table_alter_column_set_pk',
452
+ tableName: 'pk1',
453
+ schema: '',
454
+ columnName: 'id',
455
+ },
456
+ {
457
+ type: 'alter_table_alter_column_set_notnull',
458
+ tableName: 'pk1',
459
+ columnName: 'id',
460
+ schema: '',
461
+ newDataType: 'int',
462
+ columnDefault: undefined,
463
+ columnOnUpdate: undefined,
464
+ columnNotNull: true,
465
+ columnAutoIncrement: false,
466
+ columnPk: true,
467
+ } as unknown as JsonStatement,
468
+ {
469
+ type: 'alter_table_alter_column_drop_pk',
470
+ tableName: 'pk2',
471
+ columnName: 'id',
472
+ schema: '',
473
+ },
474
+ {
475
+ type: 'alter_table_alter_column_drop_notnull',
476
+ tableName: 'pk2',
477
+ columnName: 'id',
478
+ schema: '',
479
+ newDataType: 'int',
480
+ columnDefault: undefined,
481
+ columnOnUpdate: undefined,
482
+ columnNotNull: false,
483
+ columnAutoIncrement: false,
484
+ columnPk: false,
485
+ } as unknown as JsonStatement,
486
+ {
487
+ type: 'create_reference',
488
+ tableName: 'create_reference',
489
+ data: 'create_reference_id_ref_table_id_fk;create_reference;id;ref_table;id;no action;no action',
490
+ schema: '',
491
+ columnNotNull: false,
492
+ columnDefault: undefined,
493
+ columnType: 'int',
494
+ },
495
+ ];
496
+ const json1: SQLiteSchemaSquashed = {
497
+ version: '6',
498
+ dialect: 'sqlite',
499
+ tables: {
500
+ create_reference: {
501
+ name: 'create_reference',
502
+ columns: {
503
+ id: {
504
+ name: 'id',
505
+ type: 'int',
506
+ primaryKey: false,
507
+ notNull: false,
508
+ autoincrement: false,
509
+ },
510
+ },
511
+ indexes: {},
512
+ foreignKeys: {},
513
+ compositePrimaryKeys: {},
514
+ uniqueConstraints: {},
515
+ checkConstraints: {},
516
+ },
517
+ pk1: {
518
+ name: 'pk1',
519
+ columns: {
520
+ id: {
521
+ name: 'id',
522
+ type: 'int',
523
+ primaryKey: false,
524
+ notNull: false,
525
+ autoincrement: false,
526
+ },
527
+ },
528
+ indexes: {},
529
+ foreignKeys: {},
530
+ compositePrimaryKeys: {},
531
+ uniqueConstraints: {},
532
+ checkConstraints: {},
533
+ },
534
+ pk2: {
535
+ name: 'pk2',
536
+ columns: {
537
+ id: {
538
+ name: 'id',
539
+ type: 'int',
540
+ primaryKey: true,
541
+ notNull: true,
542
+ autoincrement: false,
543
+ },
544
+ },
545
+ indexes: {},
546
+ foreignKeys: {},
547
+ compositePrimaryKeys: {},
548
+ uniqueConstraints: {},
549
+ checkConstraints: {},
550
+ },
551
+ ref_table: {
552
+ name: 'ref_table',
553
+ columns: {
554
+ id: {
555
+ name: 'id',
556
+ type: 'int',
557
+ primaryKey: true,
558
+ notNull: true,
559
+ autoincrement: false,
560
+ },
561
+ },
562
+ indexes: {},
563
+ foreignKeys: {},
564
+ compositePrimaryKeys: {},
565
+ uniqueConstraints: {},
566
+ checkConstraints: {},
567
+ },
568
+ },
569
+ enums: {},
570
+ views: {},
571
+ };
572
+ const json2: SQLiteSchemaSquashed = {
573
+ version: '6',
574
+ dialect: 'sqlite',
575
+ tables: {
576
+ create_reference: {
577
+ name: 'create_reference',
578
+ columns: {
579
+ id: {
580
+ name: 'id',
581
+ type: 'int',
582
+ primaryKey: false,
583
+ notNull: false,
584
+ autoincrement: false,
585
+ },
586
+ },
587
+ indexes: {},
588
+ foreignKeys: {
589
+ create_reference_id_ref_table_id_fk:
590
+ 'create_reference_id_ref_table_id_fk;create_reference;id;ref_table;id;no action;no action',
591
+ },
592
+ compositePrimaryKeys: {},
593
+ uniqueConstraints: {},
594
+ checkConstraints: {},
595
+ },
596
+ pk1: {
597
+ name: 'pk1',
598
+ columns: {
599
+ id: {
600
+ name: 'id',
601
+ type: 'int',
602
+ primaryKey: true,
603
+ notNull: true,
604
+ autoincrement: false,
605
+ },
606
+ },
607
+ indexes: {},
608
+ foreignKeys: {},
609
+ compositePrimaryKeys: {},
610
+ uniqueConstraints: {},
611
+ checkConstraints: {},
612
+ },
613
+ pk2: {
614
+ name: 'pk2',
615
+ columns: {
616
+ id: {
617
+ name: 'id',
618
+ type: 'int',
619
+ primaryKey: false,
620
+ notNull: false,
621
+ autoincrement: false,
622
+ },
623
+ },
624
+ indexes: {},
625
+ foreignKeys: {},
626
+ compositePrimaryKeys: {},
627
+ uniqueConstraints: {},
628
+ checkConstraints: {},
629
+ },
630
+ ref_table: {
631
+ name: 'ref_table',
632
+ columns: {
633
+ id: {
634
+ name: 'id',
635
+ type: 'int',
636
+ primaryKey: true,
637
+ notNull: true,
638
+ autoincrement: false,
639
+ },
640
+ },
641
+ indexes: {},
642
+ foreignKeys: {},
643
+ compositePrimaryKeys: {},
644
+ uniqueConstraints: {},
645
+ checkConstraints: {},
646
+ },
647
+ },
648
+ enums: {},
649
+ views: {},
650
+ };
651
+
652
+ const newJsonStatements = [
653
+ {
654
+ type: 'recreate_table',
655
+ tableName: 'pk1',
656
+ columns: [
657
+ {
658
+ name: 'id',
659
+ type: 'int',
660
+ primaryKey: true,
661
+ notNull: true,
662
+ autoincrement: false,
663
+ },
664
+ ],
665
+ compositePKs: [],
666
+ referenceData: [],
667
+ uniqueConstraints: [],
668
+ checkConstraints: [],
669
+ },
670
+ {
671
+ type: 'recreate_table',
672
+ tableName: 'pk2',
673
+ columns: [
674
+ {
675
+ name: 'id',
676
+ type: 'int',
677
+ primaryKey: false,
678
+ notNull: false,
679
+ autoincrement: false,
680
+ },
681
+ ],
682
+ compositePKs: [],
683
+ referenceData: [],
684
+ uniqueConstraints: [],
685
+ checkConstraints: [],
686
+ },
687
+ {
688
+ type: 'create_reference',
689
+ tableName: 'create_reference',
690
+ data: 'create_reference_id_ref_table_id_fk;create_reference;id;ref_table;id;no action;no action',
691
+ schema: '',
692
+ columnNotNull: false,
693
+ columnDefault: undefined,
694
+ columnType: 'int',
695
+ },
696
+ ];
697
+ expect(libSQLCombineStatements(statements, json2)).toStrictEqual(
698
+ newJsonStatements,
699
+ );
700
+ });
701
+
702
+ /**
703
+ * ! before:
704
+ *
705
+ * fk1: {
706
+ * fk_id INT;
707
+ * fk_id1 INT;
708
+ * }
709
+ *
710
+ * fk2: {
711
+ * fk2_id INT; -> composite reference on ref_table id INT
712
+ * fk2_id1 INT; -> composite reference on ref_table id1 INT
713
+ * }
714
+ *
715
+ * ref_table: {
716
+ * id INT;
717
+ * id1 INT;
718
+ * }
719
+ *
720
+ * ! after:
721
+ *
722
+ * fk1: {
723
+ * fk_id INT; -> composite reference on ref_table id INT
724
+ * fk_id1 INT; -> composite reference on ref_table id1 INT
725
+ * }
726
+ *
727
+ * fk2: {
728
+ * fk2_id INT;
729
+ * fk2_id1 INT;
730
+ * }
731
+ *
732
+ * ref_table: {
733
+ * id INT;
734
+ * id1 INT;
735
+ * }
736
+ *
737
+ * set multi column reference for fk1
738
+ * drop multi column reference for fk2
739
+ *
740
+ * expect to:
741
+ * - "recreate_table" statement for fk1
742
+ * - "recreate_table" statement for fk2
743
+ */
744
+ test(`set and drop multiple columns reference`, async (t) => {
745
+ const statements: JsonStatement[] = [
746
+ {
747
+ type: 'delete_reference',
748
+ tableName: 'fk1',
749
+ data: 'fk1_fk_id_fk_id1_ref_table_id_id1_fk;fk1;fk_id,fk_id1;ref_table;id,id1;no action;no action',
750
+ schema: '',
751
+ isMulticolumn: true,
752
+ },
753
+ {
754
+ type: 'create_reference',
755
+ tableName: 'fk2',
756
+ data: 'fk2_fk2_id_fk2_id1_ref_table_id_id1_fk;fk2;fk2_id,fk2_id1;ref_table;id,id1;no action;no action',
757
+ schema: '',
758
+ isMulticolumn: true,
759
+ },
760
+ ];
761
+ const json1: SQLiteSchemaSquashed = {
762
+ version: '6',
763
+ dialect: 'sqlite',
764
+ tables: {
765
+ fk1: {
766
+ name: 'fk1',
767
+ columns: {
768
+ fk_id: {
769
+ name: 'fk_id',
770
+ type: 'int',
771
+ primaryKey: false,
772
+ notNull: false,
773
+ autoincrement: false,
774
+ },
775
+ fk_id1: {
776
+ name: 'fk_id1',
777
+ type: 'int',
778
+ primaryKey: false,
779
+ notNull: false,
780
+ autoincrement: false,
781
+ },
782
+ },
783
+ indexes: {},
784
+ foreignKeys: {
785
+ fk1_fk_id_fk_id1_ref_table_id_id1_fk:
786
+ 'fk1_fk_id_fk_id1_ref_table_id_id1_fk;fk1;fk_id,fk_id1;ref_table;id,id1;no action;no action',
787
+ },
788
+ compositePrimaryKeys: {},
789
+ uniqueConstraints: {},
790
+ checkConstraints: {},
791
+ },
792
+ fk2: {
793
+ name: 'fk2',
794
+ columns: {
795
+ fk2_id: {
796
+ name: 'fk2_id',
797
+ type: 'int',
798
+ primaryKey: false,
799
+ notNull: false,
800
+ autoincrement: false,
801
+ },
802
+ fk2_id1: {
803
+ name: 'fk2_id1',
804
+ type: 'int',
805
+ primaryKey: false,
806
+ notNull: false,
807
+ autoincrement: false,
808
+ },
809
+ },
810
+ indexes: {},
811
+ foreignKeys: {},
812
+ compositePrimaryKeys: {},
813
+ uniqueConstraints: {},
814
+ checkConstraints: {},
815
+ },
816
+ ref_table: {
817
+ name: 'ref_table',
818
+ columns: {
819
+ id: {
820
+ name: 'id',
821
+ type: 'int',
822
+ primaryKey: false,
823
+ notNull: false,
824
+ autoincrement: false,
825
+ },
826
+ id1: {
827
+ name: 'id1',
828
+ type: 'int',
829
+ primaryKey: false,
830
+ notNull: false,
831
+ autoincrement: false,
832
+ },
833
+ },
834
+ indexes: {},
835
+ foreignKeys: {},
836
+ compositePrimaryKeys: {},
837
+ uniqueConstraints: {},
838
+ checkConstraints: {},
839
+ },
840
+ },
841
+ enums: {},
842
+ views: {},
843
+ };
844
+ const json2: SQLiteSchemaSquashed = {
845
+ version: '6',
846
+ dialect: 'sqlite',
847
+ tables: {
848
+ fk1: {
849
+ name: 'fk1',
850
+ columns: {
851
+ fk_id: {
852
+ name: 'fk_id',
853
+ type: 'int',
854
+ primaryKey: false,
855
+ notNull: false,
856
+ autoincrement: false,
857
+ },
858
+ fk_id1: {
859
+ name: 'fk_id1',
860
+ type: 'int',
861
+ primaryKey: false,
862
+ notNull: false,
863
+ autoincrement: false,
864
+ },
865
+ },
866
+ indexes: {},
867
+ foreignKeys: {},
868
+ compositePrimaryKeys: {},
869
+ uniqueConstraints: {},
870
+ checkConstraints: {},
871
+ },
872
+ fk2: {
873
+ name: 'fk2',
874
+ columns: {
875
+ fk2_id: {
876
+ name: 'fk2_id',
877
+ type: 'int',
878
+ primaryKey: false,
879
+ notNull: false,
880
+ autoincrement: false,
881
+ },
882
+ fk2_id1: {
883
+ name: 'fk2_id1',
884
+ type: 'int',
885
+ primaryKey: false,
886
+ notNull: false,
887
+ autoincrement: false,
888
+ },
889
+ },
890
+ indexes: {},
891
+ foreignKeys: {
892
+ fk2_fk2_id_fk2_id1_ref_table_id_id1_fk:
893
+ 'fk2_fk2_id_fk2_id1_ref_table_id_id1_fk;fk2;fk2_id,fk2_id1;ref_table;id,id1;no action;no action',
894
+ },
895
+ compositePrimaryKeys: {},
896
+ uniqueConstraints: {},
897
+ checkConstraints: {},
898
+ },
899
+ ref_table: {
900
+ name: 'ref_table',
901
+ columns: {
902
+ id: {
903
+ name: 'id',
904
+ type: 'int',
905
+ primaryKey: false,
906
+ notNull: false,
907
+ autoincrement: false,
908
+ },
909
+ id1: {
910
+ name: 'id1',
911
+ type: 'int',
912
+ primaryKey: false,
913
+ notNull: false,
914
+ autoincrement: false,
915
+ },
916
+ },
917
+ indexes: {},
918
+ foreignKeys: {},
919
+ compositePrimaryKeys: {},
920
+ uniqueConstraints: {},
921
+ checkConstraints: {},
922
+ },
923
+ },
924
+ enums: {},
925
+ views: {},
926
+ };
927
+
928
+ const newJsonStatements = [
929
+ {
930
+ type: 'recreate_table',
931
+ tableName: 'fk1',
932
+ columns: [
933
+ {
934
+ name: 'fk_id',
935
+ type: 'int',
936
+ primaryKey: false,
937
+ notNull: false,
938
+ autoincrement: false,
939
+ },
940
+ {
941
+ name: 'fk_id1',
942
+ type: 'int',
943
+ primaryKey: false,
944
+ notNull: false,
945
+ autoincrement: false,
946
+ },
947
+ ],
948
+ compositePKs: [],
949
+ referenceData: [],
950
+ uniqueConstraints: [],
951
+ checkConstraints: [],
952
+ },
953
+ {
954
+ type: 'recreate_table',
955
+ tableName: 'fk2',
956
+ columns: [
957
+ {
958
+ name: 'fk2_id',
959
+ type: 'int',
960
+ primaryKey: false,
961
+ notNull: false,
962
+ autoincrement: false,
963
+ },
964
+ {
965
+ name: 'fk2_id1',
966
+ type: 'int',
967
+ primaryKey: false,
968
+ notNull: false,
969
+ autoincrement: false,
970
+ },
971
+ ],
972
+ compositePKs: [],
973
+ referenceData: [
974
+ {
975
+ name: 'fk2_fk2_id_fk2_id1_ref_table_id_id1_fk',
976
+ tableFrom: 'fk2',
977
+ tableTo: 'ref_table',
978
+ columnsFrom: ['fk2_id', 'fk2_id1'],
979
+ columnsTo: ['id', 'id1'],
980
+ onDelete: 'no action',
981
+ onUpdate: 'no action',
982
+ },
983
+ ],
984
+ uniqueConstraints: [],
985
+ checkConstraints: [],
986
+ },
987
+ ];
988
+ expect(libSQLCombineStatements(statements, json2)).toStrictEqual(
989
+ newJsonStatements,
990
+ );
991
+ });
992
+
993
+ /**
994
+ * ! before:
995
+ *
996
+ * pk: {
997
+ * pk TEXT PRIMARY KEY;
998
+ * }
999
+ *
1000
+ * simple: {
1001
+ * simple TEXT;
1002
+ * }
1003
+ *
1004
+ * unique: {
1005
+ * unique INT UNIQUE;
1006
+ * }
1007
+ *
1008
+ * ! after:
1009
+ *
1010
+ * pk: {
1011
+ * pk INT PRIMARY KEY;
1012
+ * }
1013
+ *
1014
+ * simple: {
1015
+ * simple INT;
1016
+ * }
1017
+ *
1018
+ * unique: {
1019
+ * unique TEXT UNIQUE;
1020
+ * }
1021
+ *
1022
+ * set new type for primary key column
1023
+ * set new type for unique column
1024
+ * set new type for column without pk or unique
1025
+ *
1026
+ * expect to:
1027
+ * - "recreate_table" statement for pk
1028
+ * - "recreate_table" statement for unique
1029
+ * - "alter_table_alter_column_set_type" statement for simple
1030
+ * - "create_index" statement for unique
1031
+ */
1032
+ test(`set new type for primary key, unique and normal column`, async (t) => {
1033
+ const statements: JsonStatement[] = [
1034
+ {
1035
+ type: 'alter_table_alter_column_set_type',
1036
+ tableName: 'pk',
1037
+ columnName: 'pk',
1038
+ newDataType: 'int',
1039
+ oldDataType: 'text',
1040
+ schema: '',
1041
+ columnDefault: undefined,
1042
+ columnOnUpdate: undefined,
1043
+ columnNotNull: true,
1044
+ columnAutoIncrement: false,
1045
+ columnPk: true,
1046
+ } as unknown as JsonStatement,
1047
+ {
1048
+ type: 'alter_table_alter_column_set_type',
1049
+ tableName: 'simple',
1050
+ columnName: 'simple',
1051
+ newDataType: 'int',
1052
+ oldDataType: 'text',
1053
+ schema: '',
1054
+ columnDefault: undefined,
1055
+ columnOnUpdate: undefined,
1056
+ columnNotNull: false,
1057
+ columnAutoIncrement: false,
1058
+ columnPk: false,
1059
+ } as unknown as JsonStatement,
1060
+ {
1061
+ type: 'alter_table_alter_column_set_type',
1062
+ tableName: 'unique',
1063
+ columnName: 'unique',
1064
+ newDataType: 'text',
1065
+ oldDataType: 'int',
1066
+ schema: '',
1067
+ columnDefault: undefined,
1068
+ columnOnUpdate: undefined,
1069
+ columnNotNull: false,
1070
+ columnAutoIncrement: false,
1071
+ columnPk: false,
1072
+ } as unknown as JsonStatement,
1073
+ ];
1074
+ const json1: SQLiteSchemaSquashed = {
1075
+ version: '6',
1076
+ dialect: 'sqlite',
1077
+ tables: {
1078
+ pk: {
1079
+ name: 'pk',
1080
+ columns: {
1081
+ pk: {
1082
+ name: 'pk',
1083
+ type: 'text',
1084
+ primaryKey: true,
1085
+ notNull: true,
1086
+ autoincrement: false,
1087
+ },
1088
+ },
1089
+ indexes: {},
1090
+ foreignKeys: {},
1091
+ compositePrimaryKeys: {},
1092
+ uniqueConstraints: {},
1093
+ checkConstraints: {},
1094
+ },
1095
+ simple: {
1096
+ name: 'simple',
1097
+ columns: {
1098
+ simple: {
1099
+ name: 'simple',
1100
+ type: 'text',
1101
+ primaryKey: false,
1102
+ notNull: false,
1103
+ autoincrement: false,
1104
+ },
1105
+ },
1106
+ indexes: {},
1107
+ foreignKeys: {},
1108
+ compositePrimaryKeys: {},
1109
+ uniqueConstraints: {},
1110
+ checkConstraints: {},
1111
+ },
1112
+ unique: {
1113
+ name: 'unique',
1114
+ columns: {
1115
+ unique: {
1116
+ name: 'unique',
1117
+ type: 'int',
1118
+ primaryKey: false,
1119
+ notNull: false,
1120
+ autoincrement: false,
1121
+ },
1122
+ },
1123
+ indexes: {
1124
+ unique_unique_unique: 'unique_unique_unique;unique;true;',
1125
+ },
1126
+ foreignKeys: {},
1127
+ compositePrimaryKeys: {},
1128
+ uniqueConstraints: {},
1129
+ checkConstraints: {},
1130
+ },
1131
+ },
1132
+ enums: {},
1133
+ views: {},
1134
+ };
1135
+ const json2: SQLiteSchemaSquashed = {
1136
+ version: '6',
1137
+ dialect: 'sqlite',
1138
+ tables: {
1139
+ pk: {
1140
+ name: 'pk',
1141
+ columns: {
1142
+ pk: {
1143
+ name: 'pk',
1144
+ type: 'int',
1145
+ primaryKey: true,
1146
+ notNull: true,
1147
+ autoincrement: false,
1148
+ },
1149
+ },
1150
+ indexes: {},
1151
+ foreignKeys: {},
1152
+ compositePrimaryKeys: {},
1153
+ uniqueConstraints: {},
1154
+ checkConstraints: {},
1155
+ },
1156
+ simple: {
1157
+ name: 'simple',
1158
+ columns: {
1159
+ simple: {
1160
+ name: 'simple',
1161
+ type: 'int',
1162
+ primaryKey: false,
1163
+ notNull: false,
1164
+ autoincrement: false,
1165
+ },
1166
+ },
1167
+ indexes: {},
1168
+ foreignKeys: {},
1169
+ compositePrimaryKeys: {},
1170
+ uniqueConstraints: {},
1171
+ checkConstraints: {},
1172
+ },
1173
+ unique: {
1174
+ name: 'unique',
1175
+ columns: {
1176
+ unique: {
1177
+ name: 'unique',
1178
+ type: 'text',
1179
+ primaryKey: false,
1180
+ notNull: false,
1181
+ autoincrement: false,
1182
+ },
1183
+ },
1184
+ indexes: {
1185
+ unique_unique_unique: 'unique_unique_unique;unique;true;',
1186
+ },
1187
+ foreignKeys: {},
1188
+ compositePrimaryKeys: {},
1189
+ uniqueConstraints: {},
1190
+ checkConstraints: {},
1191
+ },
1192
+ },
1193
+ enums: {},
1194
+ views: {},
1195
+ };
1196
+
1197
+ const newJsonStatements = [
1198
+ {
1199
+ type: 'recreate_table',
1200
+ tableName: 'pk',
1201
+ columns: [
1202
+ {
1203
+ name: 'pk',
1204
+ type: 'int',
1205
+ primaryKey: true,
1206
+ notNull: true,
1207
+ autoincrement: false,
1208
+ },
1209
+ ],
1210
+ compositePKs: [],
1211
+ referenceData: [],
1212
+ uniqueConstraints: [],
1213
+ checkConstraints: [],
1214
+ },
1215
+ {
1216
+ type: 'alter_table_alter_column_set_type',
1217
+ tableName: 'simple',
1218
+ columnName: 'simple',
1219
+ newDataType: 'int',
1220
+ oldDataType: 'text',
1221
+ schema: '',
1222
+ columnDefault: undefined,
1223
+ columnOnUpdate: undefined,
1224
+ columnNotNull: false,
1225
+ columnAutoIncrement: false,
1226
+ columnPk: false,
1227
+ },
1228
+ {
1229
+ type: 'alter_table_alter_column_set_type',
1230
+ tableName: 'unique',
1231
+ columnName: 'unique',
1232
+ newDataType: 'text',
1233
+ oldDataType: 'int',
1234
+ schema: '',
1235
+ columnDefault: undefined,
1236
+ columnOnUpdate: undefined,
1237
+ columnNotNull: false,
1238
+ columnAutoIncrement: false,
1239
+ columnPk: false,
1240
+ },
1241
+ ];
1242
+ expect(libSQLCombineStatements(statements, json2)).toStrictEqual(
1243
+ newJsonStatements,
1244
+ );
1245
+ });
1246
+
1247
+ test(`add columns. set fk`, async (t) => {
1248
+ const statements: JsonStatement[] = [
1249
+ {
1250
+ type: 'sqlite_alter_table_add_column',
1251
+ tableName: 'ref',
1252
+ column: {
1253
+ name: 'test',
1254
+ type: 'integer',
1255
+ primaryKey: false,
1256
+ notNull: false,
1257
+ autoincrement: false,
1258
+ },
1259
+ referenceData: undefined,
1260
+ },
1261
+ {
1262
+ type: 'sqlite_alter_table_add_column',
1263
+ tableName: 'ref',
1264
+ column: {
1265
+ name: 'test1',
1266
+ type: 'integer',
1267
+ primaryKey: false,
1268
+ notNull: false,
1269
+ autoincrement: false,
1270
+ },
1271
+ referenceData: undefined,
1272
+ },
1273
+ {
1274
+ type: 'create_reference',
1275
+ tableName: 'ref',
1276
+ data: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action',
1277
+ schema: '',
1278
+ columnNotNull: false,
1279
+ columnDefault: undefined,
1280
+ columnType: 'integer',
1281
+ },
1282
+ ];
1283
+ const json1: SQLiteSchemaSquashed = {
1284
+ version: '6',
1285
+ dialect: 'sqlite',
1286
+ tables: {
1287
+ ref: {
1288
+ name: 'ref',
1289
+ columns: {
1290
+ id1: {
1291
+ name: 'id1',
1292
+ type: 'text',
1293
+ primaryKey: false,
1294
+ notNull: true,
1295
+ autoincrement: false,
1296
+ },
1297
+ new_age: {
1298
+ name: 'new_age',
1299
+ type: 'integer',
1300
+ primaryKey: false,
1301
+ notNull: false,
1302
+ autoincrement: false,
1303
+ },
1304
+ },
1305
+ indexes: {},
1306
+ foreignKeys: {},
1307
+ compositePrimaryKeys: {},
1308
+ uniqueConstraints: {},
1309
+ checkConstraints: {},
1310
+ },
1311
+ user: {
1312
+ name: 'user',
1313
+ columns: {
1314
+ id1: {
1315
+ name: 'id1',
1316
+ type: 'text',
1317
+ primaryKey: false,
1318
+ notNull: true,
1319
+ autoincrement: false,
1320
+ },
1321
+ new_age: {
1322
+ name: 'new_age',
1323
+ type: 'integer',
1324
+ primaryKey: false,
1325
+ notNull: false,
1326
+ autoincrement: false,
1327
+ },
1328
+ },
1329
+ indexes: {},
1330
+ foreignKeys: {},
1331
+ compositePrimaryKeys: {},
1332
+ uniqueConstraints: {},
1333
+ checkConstraints: {},
1334
+ },
1335
+ },
1336
+ enums: {},
1337
+ views: {},
1338
+ };
1339
+ const json2: SQLiteSchemaSquashed = {
1340
+ version: '6',
1341
+ dialect: 'sqlite',
1342
+ tables: {
1343
+ ref: {
1344
+ name: 'ref',
1345
+ columns: {
1346
+ id1: {
1347
+ name: 'id1',
1348
+ type: 'text',
1349
+ primaryKey: false,
1350
+ notNull: true,
1351
+ autoincrement: false,
1352
+ },
1353
+ new_age: {
1354
+ name: 'new_age',
1355
+ type: 'integer',
1356
+ primaryKey: false,
1357
+ notNull: false,
1358
+ autoincrement: false,
1359
+ },
1360
+ test: {
1361
+ name: 'test',
1362
+ type: 'integer',
1363
+ primaryKey: false,
1364
+ notNull: false,
1365
+ autoincrement: false,
1366
+ },
1367
+ test1: {
1368
+ name: 'test1',
1369
+ type: 'integer',
1370
+ primaryKey: false,
1371
+ notNull: false,
1372
+ autoincrement: false,
1373
+ },
1374
+ },
1375
+ indexes: {},
1376
+ foreignKeys: {
1377
+ ref_new_age_user_new_age_fk: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action',
1378
+ },
1379
+ compositePrimaryKeys: {},
1380
+ uniqueConstraints: {},
1381
+ checkConstraints: {},
1382
+ },
1383
+ user: {
1384
+ name: 'user',
1385
+ columns: {
1386
+ id1: {
1387
+ name: 'id1',
1388
+ type: 'text',
1389
+ primaryKey: false,
1390
+ notNull: true,
1391
+ autoincrement: false,
1392
+ },
1393
+ new_age: {
1394
+ name: 'new_age',
1395
+ type: 'integer',
1396
+ primaryKey: false,
1397
+ notNull: false,
1398
+ autoincrement: false,
1399
+ },
1400
+ },
1401
+ indexes: {},
1402
+ foreignKeys: {},
1403
+ compositePrimaryKeys: {},
1404
+ uniqueConstraints: {},
1405
+ checkConstraints: {},
1406
+ },
1407
+ },
1408
+ enums: {},
1409
+ views: {},
1410
+ };
1411
+
1412
+ const newJsonStatements = [
1413
+ {
1414
+ type: 'sqlite_alter_table_add_column',
1415
+ tableName: 'ref',
1416
+ column: {
1417
+ name: 'test',
1418
+ type: 'integer',
1419
+ primaryKey: false,
1420
+ notNull: false,
1421
+ autoincrement: false,
1422
+ },
1423
+ referenceData: undefined,
1424
+ },
1425
+ {
1426
+ type: 'sqlite_alter_table_add_column',
1427
+ tableName: 'ref',
1428
+ column: {
1429
+ name: 'test1',
1430
+ type: 'integer',
1431
+ primaryKey: false,
1432
+ notNull: false,
1433
+ autoincrement: false,
1434
+ },
1435
+ referenceData: undefined,
1436
+ },
1437
+ {
1438
+ type: 'create_reference',
1439
+ tableName: 'ref',
1440
+ data: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action',
1441
+ schema: '',
1442
+ columnNotNull: false,
1443
+ columnDefault: undefined,
1444
+ columnType: 'integer',
1445
+ },
1446
+ ];
1447
+ expect(libSQLCombineStatements(statements, json2)).toStrictEqual(
1448
+ newJsonStatements,
1449
+ );
1450
+ });
1451
+
1452
+ test(`add column and fk`, async (t) => {
1453
+ const statements: JsonStatement[] = [
1454
+ {
1455
+ type: 'sqlite_alter_table_add_column',
1456
+ tableName: 'ref',
1457
+ column: {
1458
+ name: 'test1',
1459
+ type: 'integer',
1460
+ primaryKey: false,
1461
+ notNull: false,
1462
+ autoincrement: false,
1463
+ },
1464
+ referenceData: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',
1465
+ },
1466
+ {
1467
+ type: 'create_reference',
1468
+ tableName: 'ref',
1469
+ data: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',
1470
+ schema: '',
1471
+ columnNotNull: false,
1472
+ columnDefault: undefined,
1473
+ columnType: 'integer',
1474
+ },
1475
+ ];
1476
+ const json1: SQLiteSchemaSquashed = {
1477
+ version: '6',
1478
+ dialect: 'sqlite',
1479
+ tables: {
1480
+ ref: {
1481
+ name: 'ref',
1482
+ columns: {
1483
+ id1: {
1484
+ name: 'id1',
1485
+ type: 'text',
1486
+ primaryKey: false,
1487
+ notNull: true,
1488
+ autoincrement: false,
1489
+ },
1490
+ new_age: {
1491
+ name: 'new_age',
1492
+ type: 'integer',
1493
+ primaryKey: false,
1494
+ notNull: false,
1495
+ autoincrement: false,
1496
+ },
1497
+ test1: {
1498
+ name: 'test1',
1499
+ type: 'integer',
1500
+ primaryKey: false,
1501
+ notNull: false,
1502
+ autoincrement: false,
1503
+ },
1504
+ },
1505
+ indexes: {},
1506
+ foreignKeys: {
1507
+ ref_test1_user_new_age_fk: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',
1508
+ },
1509
+ compositePrimaryKeys: {},
1510
+ uniqueConstraints: {},
1511
+ checkConstraints: {},
1512
+ },
1513
+ user: {
1514
+ name: 'user',
1515
+ columns: {
1516
+ id1: {
1517
+ name: 'id1',
1518
+ type: 'text',
1519
+ primaryKey: false,
1520
+ notNull: true,
1521
+ autoincrement: false,
1522
+ },
1523
+ new_age: {
1524
+ name: 'new_age',
1525
+ type: 'integer',
1526
+ primaryKey: false,
1527
+ notNull: false,
1528
+ autoincrement: false,
1529
+ },
1530
+ },
1531
+ indexes: {},
1532
+ foreignKeys: {},
1533
+ compositePrimaryKeys: {},
1534
+ uniqueConstraints: {},
1535
+ checkConstraints: {},
1536
+ },
1537
+ },
1538
+ enums: {},
1539
+ views: {},
1540
+ };
1541
+ const json2: SQLiteSchemaSquashed = {
1542
+ version: '6',
1543
+ dialect: 'sqlite',
1544
+ tables: {
1545
+ ref: {
1546
+ name: 'ref',
1547
+ columns: {
1548
+ id1: {
1549
+ name: 'id1',
1550
+ type: 'text',
1551
+ primaryKey: false,
1552
+ notNull: true,
1553
+ autoincrement: false,
1554
+ },
1555
+ new_age: {
1556
+ name: 'new_age',
1557
+ type: 'integer',
1558
+ primaryKey: false,
1559
+ notNull: false,
1560
+ autoincrement: false,
1561
+ },
1562
+ test: {
1563
+ name: 'test',
1564
+ type: 'integer',
1565
+ primaryKey: false,
1566
+ notNull: false,
1567
+ autoincrement: false,
1568
+ },
1569
+ test1: {
1570
+ name: 'test1',
1571
+ type: 'integer',
1572
+ primaryKey: false,
1573
+ notNull: false,
1574
+ autoincrement: false,
1575
+ },
1576
+ },
1577
+ indexes: {},
1578
+ foreignKeys: {
1579
+ ref_new_age_user_new_age_fk: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action',
1580
+ },
1581
+ compositePrimaryKeys: {},
1582
+ uniqueConstraints: {},
1583
+ checkConstraints: {},
1584
+ },
1585
+ user: {
1586
+ name: 'user',
1587
+ columns: {
1588
+ id1: {
1589
+ name: 'id1',
1590
+ type: 'text',
1591
+ primaryKey: false,
1592
+ notNull: true,
1593
+ autoincrement: false,
1594
+ },
1595
+ new_age: {
1596
+ name: 'new_age',
1597
+ type: 'integer',
1598
+ primaryKey: false,
1599
+ notNull: false,
1600
+ autoincrement: false,
1601
+ },
1602
+ },
1603
+ indexes: {},
1604
+ foreignKeys: {},
1605
+ compositePrimaryKeys: {},
1606
+ uniqueConstraints: {},
1607
+ checkConstraints: {},
1608
+ },
1609
+ },
1610
+ enums: {},
1611
+ views: {},
1612
+ };
1613
+
1614
+ const newJsonStatements = [
1615
+ {
1616
+ type: 'sqlite_alter_table_add_column',
1617
+ tableName: 'ref',
1618
+ column: {
1619
+ name: 'test1',
1620
+ type: 'integer',
1621
+ primaryKey: false,
1622
+ notNull: false,
1623
+ autoincrement: false,
1624
+ },
1625
+ referenceData: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',
1626
+ },
1627
+ ];
1628
+ expect(libSQLCombineStatements(statements, json2)).toStrictEqual(
1629
+ newJsonStatements,
1630
+ );
1631
+ });
1632
+
1633
+ test(`add column and fk`, async (t) => {
1634
+ const statements: JsonStatement[] = [
1635
+ {
1636
+ type: 'sqlite_alter_table_add_column',
1637
+ tableName: 'ref',
1638
+ column: {
1639
+ name: 'test1',
1640
+ type: 'integer',
1641
+ primaryKey: false,
1642
+ notNull: false,
1643
+ autoincrement: false,
1644
+ },
1645
+ referenceData: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',
1646
+ },
1647
+ {
1648
+ type: 'create_reference',
1649
+ tableName: 'ref',
1650
+ data: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',
1651
+ schema: '',
1652
+ columnNotNull: false,
1653
+ columnDefault: undefined,
1654
+ columnType: 'integer',
1655
+ },
1656
+ ];
1657
+ const json1: SQLiteSchemaSquashed = {
1658
+ version: '6',
1659
+ dialect: 'sqlite',
1660
+ tables: {
1661
+ ref: {
1662
+ name: 'ref',
1663
+ columns: {
1664
+ id1: {
1665
+ name: 'id1',
1666
+ type: 'text',
1667
+ primaryKey: false,
1668
+ notNull: true,
1669
+ autoincrement: false,
1670
+ },
1671
+ new_age: {
1672
+ name: 'new_age',
1673
+ type: 'integer',
1674
+ primaryKey: false,
1675
+ notNull: false,
1676
+ autoincrement: false,
1677
+ },
1678
+ test1: {
1679
+ name: 'test1',
1680
+ type: 'integer',
1681
+ primaryKey: false,
1682
+ notNull: false,
1683
+ autoincrement: false,
1684
+ },
1685
+ },
1686
+ indexes: {},
1687
+ foreignKeys: {
1688
+ ref_test1_user_new_age_fk: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',
1689
+ },
1690
+ compositePrimaryKeys: {},
1691
+ uniqueConstraints: {},
1692
+ checkConstraints: {},
1693
+ },
1694
+ user: {
1695
+ name: 'user',
1696
+ columns: {
1697
+ id1: {
1698
+ name: 'id1',
1699
+ type: 'text',
1700
+ primaryKey: false,
1701
+ notNull: true,
1702
+ autoincrement: false,
1703
+ },
1704
+ new_age: {
1705
+ name: 'new_age',
1706
+ type: 'integer',
1707
+ primaryKey: false,
1708
+ notNull: false,
1709
+ autoincrement: false,
1710
+ },
1711
+ },
1712
+ indexes: {},
1713
+ foreignKeys: {},
1714
+ compositePrimaryKeys: {},
1715
+ uniqueConstraints: {},
1716
+ checkConstraints: {},
1717
+ },
1718
+ },
1719
+ enums: {},
1720
+ views: {},
1721
+ };
1722
+ const json2: SQLiteSchemaSquashed = {
1723
+ version: '6',
1724
+ dialect: 'sqlite',
1725
+ tables: {
1726
+ ref: {
1727
+ name: 'ref',
1728
+ columns: {
1729
+ id1: {
1730
+ name: 'id1',
1731
+ type: 'text',
1732
+ primaryKey: false,
1733
+ notNull: true,
1734
+ autoincrement: false,
1735
+ },
1736
+ new_age: {
1737
+ name: 'new_age',
1738
+ type: 'integer',
1739
+ primaryKey: false,
1740
+ notNull: false,
1741
+ autoincrement: false,
1742
+ },
1743
+ test: {
1744
+ name: 'test',
1745
+ type: 'integer',
1746
+ primaryKey: false,
1747
+ notNull: false,
1748
+ autoincrement: false,
1749
+ },
1750
+ test1: {
1751
+ name: 'test1',
1752
+ type: 'integer',
1753
+ primaryKey: false,
1754
+ notNull: false,
1755
+ autoincrement: false,
1756
+ },
1757
+ },
1758
+ indexes: {},
1759
+ foreignKeys: {
1760
+ ref_new_age_user_new_age_fk: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action',
1761
+ },
1762
+ compositePrimaryKeys: {},
1763
+ uniqueConstraints: {},
1764
+ checkConstraints: {},
1765
+ },
1766
+ user: {
1767
+ name: 'user',
1768
+ columns: {
1769
+ id1: {
1770
+ name: 'id1',
1771
+ type: 'text',
1772
+ primaryKey: false,
1773
+ notNull: true,
1774
+ autoincrement: false,
1775
+ },
1776
+ new_age: {
1777
+ name: 'new_age',
1778
+ type: 'integer',
1779
+ primaryKey: false,
1780
+ notNull: false,
1781
+ autoincrement: false,
1782
+ },
1783
+ },
1784
+ indexes: {},
1785
+ foreignKeys: {},
1786
+ compositePrimaryKeys: {},
1787
+ uniqueConstraints: {},
1788
+ checkConstraints: {},
1789
+ },
1790
+ },
1791
+ enums: {},
1792
+ views: {},
1793
+ };
1794
+
1795
+ const newJsonStatements = [
1796
+ {
1797
+ type: 'sqlite_alter_table_add_column',
1798
+ tableName: 'ref',
1799
+ column: {
1800
+ name: 'test1',
1801
+ type: 'integer',
1802
+ primaryKey: false,
1803
+ notNull: false,
1804
+ autoincrement: false,
1805
+ },
1806
+ referenceData: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action',
1807
+ },
1808
+ ];
1809
+ expect(libSQLCombineStatements(statements, json2)).toStrictEqual(
1810
+ newJsonStatements,
1811
+ );
1812
+ });