@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,989 @@
1
+ import { foreignKey, index, int, integer, sqliteTable, text, uniqueIndex } from 'drizzle-orm/sqlite-core';
2
+ import { JsonRecreateTableStatement } from 'src/jsonStatements';
3
+ import { expect, test } from 'vitest';
4
+ import { diffTestSchemasLibSQL } from './schemaDiffer';
5
+
6
+ test('drop autoincrement', async (t) => {
7
+ const schema1 = {
8
+ users: sqliteTable('users', {
9
+ id: int('id').primaryKey({ autoIncrement: true }),
10
+ }),
11
+ };
12
+
13
+ const schema2 = {
14
+ users: sqliteTable('users', {
15
+ id: int('id').primaryKey({ autoIncrement: false }),
16
+ }),
17
+ };
18
+
19
+ const { statements } = await diffTestSchemasLibSQL(schema1, schema2, []);
20
+
21
+ expect(statements.length).toBe(1);
22
+ expect(statements[0]).toStrictEqual({
23
+ columns: [{
24
+ autoincrement: false,
25
+ generated: undefined,
26
+ name: 'id',
27
+ notNull: true,
28
+ primaryKey: true,
29
+ type: 'integer',
30
+ }],
31
+ compositePKs: [],
32
+ referenceData: [],
33
+ tableName: 'users',
34
+ type: 'recreate_table',
35
+ uniqueConstraints: [],
36
+ checkConstraints: [],
37
+ });
38
+ });
39
+
40
+ test('set autoincrement', async (t) => {
41
+ const schema1 = {
42
+ users: sqliteTable('users', {
43
+ id: int('id').primaryKey({ autoIncrement: false }),
44
+ }),
45
+ };
46
+
47
+ const schema2 = {
48
+ users: sqliteTable('users', {
49
+ id: int('id').primaryKey({ autoIncrement: true }),
50
+ }),
51
+ };
52
+
53
+ const { statements } = await diffTestSchemasLibSQL(schema1, schema2, []);
54
+
55
+ expect(statements.length).toBe(1);
56
+ expect(statements[0]).toStrictEqual({
57
+ columns: [{
58
+ autoincrement: true,
59
+ generated: undefined,
60
+ name: 'id',
61
+ notNull: true,
62
+ primaryKey: true,
63
+ type: 'integer',
64
+ }],
65
+ compositePKs: [],
66
+ referenceData: [],
67
+ tableName: 'users',
68
+ type: 'recreate_table',
69
+ uniqueConstraints: [],
70
+ checkConstraints: [],
71
+ });
72
+ });
73
+
74
+ test('set not null', async (t) => {
75
+ const schema1 = {
76
+ users: sqliteTable('users', {
77
+ id: int('id').primaryKey({ autoIncrement: true }),
78
+ name: text('name'),
79
+ }),
80
+ };
81
+
82
+ const schema2 = {
83
+ users: sqliteTable('users', {
84
+ id: int('id').primaryKey({ autoIncrement: true }),
85
+ name: text('name').notNull(),
86
+ }),
87
+ };
88
+
89
+ const { statements, sqlStatements } = await diffTestSchemasLibSQL(
90
+ schema1,
91
+ schema2,
92
+ [],
93
+ );
94
+
95
+ expect(statements.length).toBe(1);
96
+ expect(statements[0]).toStrictEqual({
97
+ type: 'alter_table_alter_column_set_notnull',
98
+ tableName: 'users',
99
+ columnName: 'name',
100
+ schema: '',
101
+ newDataType: 'text',
102
+ columnDefault: undefined,
103
+ columnOnUpdate: undefined,
104
+ columnNotNull: true,
105
+ columnAutoIncrement: false,
106
+ columnPk: false,
107
+ });
108
+
109
+ expect(sqlStatements.length).toBe(1);
110
+ expect(sqlStatements[0]).toBe(
111
+ `ALTER TABLE \`users\` ALTER COLUMN "name" TO "name" text NOT NULL;`,
112
+ );
113
+ });
114
+
115
+ test('drop not null', async (t) => {
116
+ const schema1 = {
117
+ users: sqliteTable('users', {
118
+ id: int('id').primaryKey({ autoIncrement: true }),
119
+ name: text('name').notNull(),
120
+ }),
121
+ };
122
+
123
+ const schema2 = {
124
+ users: sqliteTable('users', {
125
+ id: int('id').primaryKey({ autoIncrement: true }),
126
+ name: text('name'),
127
+ }),
128
+ };
129
+
130
+ const { statements, sqlStatements } = await diffTestSchemasLibSQL(
131
+ schema1,
132
+ schema2,
133
+ [],
134
+ );
135
+
136
+ expect(statements.length).toBe(1);
137
+ expect(statements[0]).toStrictEqual({
138
+ type: 'alter_table_alter_column_drop_notnull',
139
+ tableName: 'users',
140
+ columnName: 'name',
141
+ schema: '',
142
+ newDataType: 'text',
143
+ columnDefault: undefined,
144
+ columnOnUpdate: undefined,
145
+ columnNotNull: false,
146
+ columnAutoIncrement: false,
147
+ columnPk: false,
148
+ });
149
+
150
+ expect(sqlStatements.length).toBe(1);
151
+ expect(sqlStatements[0]).toBe(
152
+ `ALTER TABLE \`users\` ALTER COLUMN "name" TO "name" text;`,
153
+ );
154
+ });
155
+
156
+ test('set default. set not null. add column', async (t) => {
157
+ const schema1 = {
158
+ users: sqliteTable('users', {
159
+ id: int('id').primaryKey({ autoIncrement: true }),
160
+ name: text('name'),
161
+ }),
162
+ };
163
+
164
+ const schema2 = {
165
+ users: sqliteTable('users', {
166
+ id: int('id').primaryKey({ autoIncrement: true }),
167
+ name: text('name').notNull().default('name'),
168
+ age: int('age').notNull(),
169
+ }),
170
+ };
171
+
172
+ const { statements, sqlStatements } = await diffTestSchemasLibSQL(
173
+ schema1,
174
+ schema2,
175
+ [],
176
+ );
177
+
178
+ expect(statements.length).toBe(3);
179
+ expect(statements[0]).toStrictEqual({
180
+ type: 'alter_table_alter_column_set_default',
181
+ tableName: 'users',
182
+ columnName: 'name',
183
+ newDefaultValue: "'name'",
184
+ schema: '',
185
+ newDataType: 'text',
186
+ columnOnUpdate: undefined,
187
+ columnNotNull: true,
188
+ columnAutoIncrement: false,
189
+ columnPk: false,
190
+ });
191
+ expect(statements[1]).toStrictEqual({
192
+ type: 'alter_table_alter_column_set_notnull',
193
+ tableName: 'users',
194
+ columnName: 'name',
195
+ schema: '',
196
+ newDataType: 'text',
197
+ columnDefault: "'name'",
198
+ columnOnUpdate: undefined,
199
+ columnNotNull: true,
200
+ columnAutoIncrement: false,
201
+ columnPk: false,
202
+ });
203
+ expect(statements[2]).toStrictEqual({
204
+ type: 'sqlite_alter_table_add_column',
205
+ tableName: 'users',
206
+ referenceData: undefined,
207
+ column: {
208
+ name: 'age',
209
+ type: 'integer',
210
+ primaryKey: false,
211
+ notNull: true,
212
+ autoincrement: false,
213
+ },
214
+ });
215
+
216
+ expect(sqlStatements.length).toBe(2);
217
+ expect(sqlStatements[0]).toBe(
218
+ `ALTER TABLE \`users\` ALTER COLUMN "name" TO "name" text NOT NULL DEFAULT 'name';`,
219
+ );
220
+ expect(sqlStatements[1]).toBe(
221
+ `ALTER TABLE \`users\` ADD \`age\` integer NOT NULL;`,
222
+ );
223
+ });
224
+
225
+ test('drop default. drop not null', async (t) => {
226
+ const schema1 = {
227
+ users: sqliteTable('users', {
228
+ id: int('id').primaryKey({ autoIncrement: true }),
229
+ name: text('name').notNull().default('name'),
230
+ }),
231
+ };
232
+
233
+ const schema2 = {
234
+ users: sqliteTable('users', {
235
+ id: int('id').primaryKey({ autoIncrement: true }),
236
+ name: text('name'),
237
+ }),
238
+ };
239
+
240
+ const { statements, sqlStatements } = await diffTestSchemasLibSQL(
241
+ schema1,
242
+ schema2,
243
+ [],
244
+ );
245
+
246
+ expect(statements.length).toBe(2);
247
+ expect(statements[0]).toStrictEqual({
248
+ type: 'alter_table_alter_column_drop_default',
249
+ tableName: 'users',
250
+ columnName: 'name',
251
+ schema: '',
252
+ newDataType: 'text',
253
+ columnDefault: undefined,
254
+ columnOnUpdate: undefined,
255
+ columnNotNull: false,
256
+ columnAutoIncrement: false,
257
+ columnPk: false,
258
+ });
259
+ expect(statements[1]).toStrictEqual({
260
+ type: 'alter_table_alter_column_drop_notnull',
261
+ tableName: 'users',
262
+ columnName: 'name',
263
+ schema: '',
264
+ newDataType: 'text',
265
+ columnDefault: undefined,
266
+ columnOnUpdate: undefined,
267
+ columnNotNull: false,
268
+ columnAutoIncrement: false,
269
+ columnPk: false,
270
+ });
271
+
272
+ expect(sqlStatements.length).toBe(1);
273
+ expect(sqlStatements[0]).toBe(
274
+ `ALTER TABLE \`users\` ALTER COLUMN "name" TO "name" text;`,
275
+ );
276
+ });
277
+
278
+ test('set data type. set default', async (t) => {
279
+ const schema1 = {
280
+ users: sqliteTable('users', {
281
+ id: int('id').primaryKey({ autoIncrement: true }),
282
+ name: text('name'),
283
+ }),
284
+ };
285
+
286
+ const schema2 = {
287
+ users: sqliteTable('users', {
288
+ id: int('id').primaryKey({ autoIncrement: true }),
289
+ name: int('name').default(123),
290
+ }),
291
+ };
292
+
293
+ const { statements, sqlStatements } = await diffTestSchemasLibSQL(
294
+ schema1,
295
+ schema2,
296
+ [],
297
+ );
298
+
299
+ expect(statements.length).toBe(2);
300
+ expect(statements[0]).toStrictEqual({
301
+ type: 'alter_table_alter_column_set_type',
302
+ tableName: 'users',
303
+ columnName: 'name',
304
+ newDataType: 'integer',
305
+ oldDataType: 'text',
306
+ schema: '',
307
+ columnDefault: 123,
308
+ columnOnUpdate: undefined,
309
+ columnNotNull: false,
310
+ columnAutoIncrement: false,
311
+ columnPk: false,
312
+ });
313
+ expect(statements[1]).toStrictEqual({
314
+ type: 'alter_table_alter_column_set_default',
315
+ tableName: 'users',
316
+ columnName: 'name',
317
+ schema: '',
318
+ newDataType: 'integer',
319
+ newDefaultValue: 123,
320
+ columnOnUpdate: undefined,
321
+ columnNotNull: false,
322
+ columnAutoIncrement: false,
323
+ columnPk: false,
324
+ });
325
+
326
+ expect(sqlStatements.length).toBe(1);
327
+ expect(sqlStatements[0]).toBe(
328
+ `ALTER TABLE \`users\` ALTER COLUMN "name" TO "name" integer DEFAULT 123;`,
329
+ );
330
+ });
331
+
332
+ test('add foriegn key', async (t) => {
333
+ const schema = {
334
+ table: sqliteTable('table', {
335
+ id: int('id').primaryKey({ autoIncrement: true }),
336
+ name: text('name'),
337
+ }),
338
+ };
339
+
340
+ const schema1 = {
341
+ users: sqliteTable('users', {
342
+ id: int('id').primaryKey({ autoIncrement: true }),
343
+ tableId: int('table_id'),
344
+ }),
345
+ };
346
+
347
+ const schema2 = {
348
+ users: sqliteTable('users', {
349
+ id: int('id').primaryKey({ autoIncrement: true }),
350
+ tableId: int('table_id').references(() => schema.table.id),
351
+ }),
352
+ };
353
+
354
+ const { statements, sqlStatements } = await diffTestSchemasLibSQL(
355
+ schema1,
356
+ schema2,
357
+ [],
358
+ );
359
+
360
+ expect(statements.length).toBe(1);
361
+ expect(statements[0]).toStrictEqual({
362
+ type: 'create_reference',
363
+ tableName: 'users',
364
+ data: 'users_table_id_table_id_fk;users;table_id;table;id;no action;no action',
365
+ schema: '',
366
+ columnNotNull: false,
367
+ columnDefault: undefined,
368
+ columnType: 'integer',
369
+ });
370
+
371
+ expect(sqlStatements.length).toBe(1);
372
+ expect(sqlStatements[0]).toBe(
373
+ `ALTER TABLE \`users\` ALTER COLUMN "table_id" TO "table_id" integer REFERENCES table(id) ON DELETE no action ON UPDATE no action;`,
374
+ );
375
+ });
376
+
377
+ test('drop foriegn key', async (t) => {
378
+ const schema = {
379
+ table: sqliteTable('table', {
380
+ id: int('id').primaryKey({ autoIncrement: true }),
381
+ name: text('name'),
382
+ }),
383
+ };
384
+
385
+ const schema1 = {
386
+ users: sqliteTable('users', {
387
+ id: int('id').primaryKey({ autoIncrement: true }),
388
+ tableId: int('table_id').references(() => schema.table.id, {
389
+ onDelete: 'cascade',
390
+ }),
391
+ }),
392
+ };
393
+
394
+ const schema2 = {
395
+ users: sqliteTable('users', {
396
+ id: int('id').primaryKey({ autoIncrement: true }),
397
+ tableId: int('table_id'),
398
+ }),
399
+ };
400
+
401
+ const { statements, sqlStatements } = await diffTestSchemasLibSQL(
402
+ schema1,
403
+ schema2,
404
+ [],
405
+ );
406
+
407
+ expect(statements.length).toBe(1);
408
+ expect(statements[0]).toStrictEqual({
409
+ columns: [
410
+ {
411
+ autoincrement: true,
412
+ generated: undefined,
413
+ name: 'id',
414
+ notNull: true,
415
+ primaryKey: true,
416
+ type: 'integer',
417
+ },
418
+ {
419
+ autoincrement: false,
420
+ generated: undefined,
421
+ name: 'table_id',
422
+ notNull: false,
423
+ primaryKey: false,
424
+ type: 'integer',
425
+ },
426
+ ],
427
+ compositePKs: [],
428
+ referenceData: [],
429
+ tableName: 'users',
430
+ type: 'recreate_table',
431
+ uniqueConstraints: [],
432
+ checkConstraints: [],
433
+ });
434
+
435
+ expect(sqlStatements.length).toBe(6);
436
+ expect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`);
437
+ expect(sqlStatements[1]).toBe(`CREATE TABLE \`__new_users\` (
438
+ \t\`id\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
439
+ \t\`table_id\` integer
440
+ );\n`);
441
+ expect(sqlStatements[2]).toBe(
442
+ `INSERT INTO \`__new_users\`("id", "table_id") SELECT "id", "table_id" FROM \`users\`;`,
443
+ );
444
+ expect(sqlStatements[3]).toBe(`DROP TABLE \`users\`;`);
445
+ expect(sqlStatements[4]).toBe(
446
+ `ALTER TABLE \`__new_users\` RENAME TO \`users\`;`,
447
+ );
448
+ expect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);
449
+ });
450
+
451
+ test('alter foriegn key', async (t) => {
452
+ const tableRef = sqliteTable('table', {
453
+ id: int('id').primaryKey({ autoIncrement: true }),
454
+ name: text('name'),
455
+ });
456
+ const tableRef2 = sqliteTable('table2', {
457
+ id: int('id').primaryKey({ autoIncrement: true }),
458
+ name: text('name'),
459
+ });
460
+
461
+ const schema1 = {
462
+ users: sqliteTable('users', {
463
+ id: int('id').primaryKey({ autoIncrement: true }),
464
+ tableId: int('table_id').references(() => tableRef.id, {
465
+ onDelete: 'cascade',
466
+ }),
467
+ }),
468
+ };
469
+
470
+ const schema2 = {
471
+ users: sqliteTable('users', {
472
+ id: int('id').primaryKey({ autoIncrement: true }),
473
+ tableId: int('table_id').references(() => tableRef2.id),
474
+ }),
475
+ };
476
+
477
+ const { statements, sqlStatements } = await diffTestSchemasLibSQL(
478
+ schema1,
479
+ schema2,
480
+ [],
481
+ );
482
+
483
+ expect(statements.length).toBe(1);
484
+ expect(statements[0]).toStrictEqual({
485
+ columns: [
486
+ {
487
+ autoincrement: true,
488
+ generated: undefined,
489
+ name: 'id',
490
+ notNull: true,
491
+ primaryKey: true,
492
+ type: 'integer',
493
+ },
494
+ {
495
+ autoincrement: false,
496
+ generated: undefined,
497
+ name: 'table_id',
498
+ notNull: false,
499
+ primaryKey: false,
500
+ type: 'integer',
501
+ },
502
+ ],
503
+ compositePKs: [],
504
+ referenceData: [
505
+ {
506
+ columnsFrom: ['table_id'],
507
+ columnsTo: ['id'],
508
+ name: 'users_table_id_table2_id_fk',
509
+ onDelete: 'no action',
510
+ onUpdate: 'no action',
511
+ tableFrom: 'users',
512
+ tableTo: 'table2',
513
+ },
514
+ ],
515
+ tableName: 'users',
516
+ type: 'recreate_table',
517
+ uniqueConstraints: [],
518
+ checkConstraints: [],
519
+ });
520
+
521
+ expect(sqlStatements.length).toBe(6);
522
+ expect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`);
523
+ expect(sqlStatements[1]).toBe(`CREATE TABLE \`__new_users\` (
524
+ \t\`id\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
525
+ \t\`table_id\` integer,
526
+ \tFOREIGN KEY (\`table_id\`) REFERENCES \`table2\`(\`id\`) ON UPDATE no action ON DELETE no action
527
+ );\n`);
528
+ expect(sqlStatements[2]).toBe(
529
+ `INSERT INTO \`__new_users\`("id", "table_id") SELECT "id", "table_id" FROM \`users\`;`,
530
+ );
531
+ expect(sqlStatements[3]).toBe(
532
+ 'DROP TABLE `users`;',
533
+ );
534
+ expect(sqlStatements[4]).toBe(
535
+ 'ALTER TABLE `__new_users` RENAME TO `users`;',
536
+ );
537
+ expect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);
538
+ });
539
+
540
+ test('add foriegn key for multiple columns', async (t) => {
541
+ const tableRef = sqliteTable('table', {
542
+ id: int('id').primaryKey({ autoIncrement: true }),
543
+ age: int('age'),
544
+ age1: int('age_1'),
545
+ });
546
+
547
+ const schema1 = {
548
+ users: sqliteTable('users', {
549
+ id: int('id').primaryKey({ autoIncrement: true }),
550
+ column: int('column'),
551
+ column1: int('column_1'),
552
+ }),
553
+ tableRef,
554
+ };
555
+
556
+ const schema2 = {
557
+ tableRef,
558
+ users: sqliteTable(
559
+ 'users',
560
+ {
561
+ id: int('id').primaryKey({ autoIncrement: true }),
562
+ column: int('column'),
563
+ column1: int('column_1'),
564
+ },
565
+ (table) => ({
566
+ foreignKey: foreignKey({
567
+ columns: [table.column, table.column1],
568
+ foreignColumns: [tableRef.age, tableRef.age1],
569
+ }),
570
+ }),
571
+ ),
572
+ };
573
+ const { statements, sqlStatements } = await diffTestSchemasLibSQL(
574
+ schema1,
575
+ schema2,
576
+ [],
577
+ );
578
+
579
+ expect(statements.length).toBe(1);
580
+ expect(statements[0]).toStrictEqual({
581
+ columns: [
582
+ {
583
+ autoincrement: true,
584
+ generated: undefined,
585
+ name: 'id',
586
+ notNull: true,
587
+ primaryKey: true,
588
+ type: 'integer',
589
+ },
590
+ {
591
+ autoincrement: false,
592
+ generated: undefined,
593
+ name: 'column',
594
+ notNull: false,
595
+ primaryKey: false,
596
+ type: 'integer',
597
+ },
598
+ {
599
+ autoincrement: false,
600
+ generated: undefined,
601
+ name: 'column_1',
602
+ notNull: false,
603
+ primaryKey: false,
604
+ type: 'integer',
605
+ },
606
+ ],
607
+ compositePKs: [],
608
+ referenceData: [
609
+ {
610
+ columnsFrom: ['column', 'column_1'],
611
+ columnsTo: ['age', 'age_1'],
612
+ name: 'users_column_column_1_table_age_age_1_fk',
613
+ onDelete: 'no action',
614
+ onUpdate: 'no action',
615
+ tableFrom: 'users',
616
+ tableTo: 'table',
617
+ },
618
+ ],
619
+ tableName: 'users',
620
+ type: 'recreate_table',
621
+ uniqueConstraints: [],
622
+ checkConstraints: [],
623
+ } as JsonRecreateTableStatement);
624
+
625
+ expect(sqlStatements.length).toBe(6);
626
+ expect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`);
627
+ expect(sqlStatements[1]).toBe(
628
+ `CREATE TABLE \`__new_users\` (
629
+ \t\`id\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
630
+ \t\`column\` integer,
631
+ \t\`column_1\` integer,
632
+ \tFOREIGN KEY (\`column\`,\`column_1\`) REFERENCES \`table\`(\`age\`,\`age_1\`) ON UPDATE no action ON DELETE no action
633
+ );\n`,
634
+ );
635
+ expect(sqlStatements[2]).toBe(
636
+ `INSERT INTO \`__new_users\`("id", "column", "column_1") SELECT "id", "column", "column_1" FROM \`users\`;`,
637
+ );
638
+ expect(sqlStatements[3]).toBe(`DROP TABLE \`users\`;`);
639
+ expect(sqlStatements[4]).toBe(
640
+ `ALTER TABLE \`__new_users\` RENAME TO \`users\`;`,
641
+ );
642
+ expect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);
643
+ });
644
+
645
+ test('drop foriegn key for multiple columns', async (t) => {
646
+ const tableRef = sqliteTable('table', {
647
+ id: int('id').primaryKey({ autoIncrement: true }),
648
+ age: int('age'),
649
+ age1: int('age_1'),
650
+ });
651
+
652
+ const schema1 = {
653
+ users: sqliteTable(
654
+ 'users',
655
+ {
656
+ id: int('id').primaryKey({ autoIncrement: true }),
657
+ column: int('column'),
658
+ column1: int('column_1'),
659
+ },
660
+ (table) => ({
661
+ foreignKey: foreignKey({
662
+ columns: [table.column, table.column1],
663
+ foreignColumns: [tableRef.age, tableRef.age1],
664
+ }),
665
+ }),
666
+ ),
667
+ tableRef,
668
+ };
669
+
670
+ const schema2 = {
671
+ users: sqliteTable('users', {
672
+ id: int('id').primaryKey({ autoIncrement: true }),
673
+ column: int('column'),
674
+ column1: int('column_1'),
675
+ }),
676
+ tableRef,
677
+ };
678
+ const { statements, sqlStatements } = await diffTestSchemasLibSQL(
679
+ schema1,
680
+ schema2,
681
+ [],
682
+ );
683
+
684
+ expect(statements.length).toBe(1);
685
+ expect(statements[0]).toStrictEqual({
686
+ columns: [
687
+ {
688
+ autoincrement: true,
689
+ generated: undefined,
690
+ name: 'id',
691
+ notNull: true,
692
+ primaryKey: true,
693
+ type: 'integer',
694
+ },
695
+ {
696
+ autoincrement: false,
697
+ generated: undefined,
698
+ name: 'column',
699
+ notNull: false,
700
+ primaryKey: false,
701
+ type: 'integer',
702
+ },
703
+ {
704
+ autoincrement: false,
705
+ generated: undefined,
706
+ name: 'column_1',
707
+ notNull: false,
708
+ primaryKey: false,
709
+ type: 'integer',
710
+ },
711
+ ],
712
+ compositePKs: [],
713
+ referenceData: [],
714
+ tableName: 'users',
715
+ type: 'recreate_table',
716
+ uniqueConstraints: [],
717
+ checkConstraints: [],
718
+ });
719
+
720
+ expect(sqlStatements.length).toBe(6);
721
+ expect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`);
722
+ expect(sqlStatements[1]).toBe(
723
+ `CREATE TABLE \`__new_users\` (
724
+ \t\`id\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
725
+ \t\`column\` integer,
726
+ \t\`column_1\` integer
727
+ );\n`,
728
+ );
729
+ expect(sqlStatements[2]).toBe(
730
+ `INSERT INTO \`__new_users\`("id", "column", "column_1") SELECT "id", "column", "column_1" FROM \`users\`;`,
731
+ );
732
+ expect(sqlStatements[3]).toBe(`DROP TABLE \`users\`;`);
733
+ expect(sqlStatements[4]).toBe(
734
+ `ALTER TABLE \`__new_users\` RENAME TO \`users\`;`,
735
+ );
736
+ expect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);
737
+ });
738
+
739
+ test('alter column drop generated', async (t) => {
740
+ const from = {
741
+ users: sqliteTable('table', {
742
+ id: int('id').primaryKey().notNull(),
743
+ name: text('name').generatedAlwaysAs('drizzle is the best').notNull(),
744
+ }),
745
+ };
746
+
747
+ const to = {
748
+ users: sqliteTable('table', {
749
+ id: int('id').primaryKey().notNull(),
750
+ name: text('name').notNull(),
751
+ }),
752
+ };
753
+
754
+ const { statements, sqlStatements } = await diffTestSchemasLibSQL(
755
+ from,
756
+ to,
757
+ [],
758
+ );
759
+
760
+ expect(statements.length).toBe(1);
761
+ expect(statements[0]).toStrictEqual({
762
+ columnAutoIncrement: false,
763
+ columnDefault: undefined,
764
+ columnGenerated: undefined,
765
+ columnName: 'name',
766
+ columnNotNull: true,
767
+ columnOnUpdate: undefined,
768
+ columnPk: false,
769
+ newDataType: 'text',
770
+ schema: '',
771
+ tableName: 'table',
772
+ type: 'alter_table_alter_column_drop_generated',
773
+ });
774
+
775
+ expect(sqlStatements.length).toBe(2);
776
+ expect(sqlStatements[0]).toBe(`ALTER TABLE \`table\` DROP COLUMN \`name\`;`);
777
+ expect(sqlStatements[1]).toBe(
778
+ `ALTER TABLE \`table\` ADD \`name\` text NOT NULL;`,
779
+ );
780
+ });
781
+
782
+ test('recreate table with nested references', async (t) => {
783
+ let users = sqliteTable('users', {
784
+ id: int('id').primaryKey({ autoIncrement: true }),
785
+ name: text('name'),
786
+ age: integer('age'),
787
+ });
788
+ let subscriptions = sqliteTable('subscriptions', {
789
+ id: int('id').primaryKey({ autoIncrement: true }),
790
+ userId: integer('user_id').references(() => users.id),
791
+ customerId: text('customer_id'),
792
+ });
793
+ const schema1 = {
794
+ users: users,
795
+ subscriptions: subscriptions,
796
+ subscriptionMetadata: sqliteTable('subscriptions_metadata', {
797
+ id: int('id').primaryKey({ autoIncrement: true }),
798
+ subscriptionId: text('subscription_id').references(
799
+ () => subscriptions.id,
800
+ ),
801
+ }),
802
+ };
803
+
804
+ users = sqliteTable('users', {
805
+ id: int('id').primaryKey({ autoIncrement: false }),
806
+ name: text('name'),
807
+ age: integer('age'),
808
+ });
809
+ const schema2 = {
810
+ users: users,
811
+ subscriptions: subscriptions,
812
+ subscriptionMetadata: sqliteTable('subscriptions_metadata', {
813
+ id: int('id').primaryKey({ autoIncrement: true }),
814
+ subscriptionId: text('subscription_id').references(
815
+ () => subscriptions.id,
816
+ ),
817
+ }),
818
+ };
819
+
820
+ const { statements, sqlStatements } = await diffTestSchemasLibSQL(
821
+ schema1,
822
+ schema2,
823
+ [],
824
+ );
825
+
826
+ expect(statements.length).toBe(1);
827
+ expect(statements[0]).toStrictEqual({
828
+ columns: [
829
+ {
830
+ autoincrement: false,
831
+ generated: undefined,
832
+ name: 'id',
833
+ notNull: true,
834
+ primaryKey: true,
835
+ type: 'integer',
836
+ },
837
+ {
838
+ autoincrement: false,
839
+ generated: undefined,
840
+ name: 'name',
841
+ notNull: false,
842
+ primaryKey: false,
843
+ type: 'text',
844
+ },
845
+ {
846
+ autoincrement: false,
847
+ generated: undefined,
848
+ name: 'age',
849
+ notNull: false,
850
+ primaryKey: false,
851
+ type: 'integer',
852
+ },
853
+ ],
854
+ compositePKs: [],
855
+ referenceData: [],
856
+ tableName: 'users',
857
+ type: 'recreate_table',
858
+ uniqueConstraints: [],
859
+ checkConstraints: [],
860
+ });
861
+
862
+ expect(sqlStatements.length).toBe(6);
863
+ expect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`);
864
+ expect(sqlStatements[1]).toBe(`CREATE TABLE \`__new_users\` (
865
+ \t\`id\` integer PRIMARY KEY NOT NULL,
866
+ \t\`name\` text,
867
+ \t\`age\` integer
868
+ );\n`);
869
+ expect(sqlStatements[2]).toBe(
870
+ `INSERT INTO \`__new_users\`("id", "name", "age") SELECT "id", "name", "age" FROM \`users\`;`,
871
+ );
872
+ expect(sqlStatements[3]).toBe(`DROP TABLE \`users\`;`);
873
+ expect(sqlStatements[4]).toBe(
874
+ `ALTER TABLE \`__new_users\` RENAME TO \`users\`;`,
875
+ );
876
+ expect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);
877
+ });
878
+
879
+ test('set not null with index', async (t) => {
880
+ const schema1 = {
881
+ users: sqliteTable('users', {
882
+ id: int('id').primaryKey({ autoIncrement: true }),
883
+ name: text('name'),
884
+ }, (table) => ({
885
+ someIndex: index('users_name_index').on(table.name),
886
+ })),
887
+ };
888
+
889
+ const schema2 = {
890
+ users: sqliteTable('users', {
891
+ id: int('id').primaryKey({ autoIncrement: true }),
892
+ name: text('name').notNull(),
893
+ }, (table) => ({
894
+ someIndex: index('users_name_index').on(table.name),
895
+ })),
896
+ };
897
+
898
+ const { statements, sqlStatements } = await diffTestSchemasLibSQL(
899
+ schema1,
900
+ schema2,
901
+ [],
902
+ );
903
+
904
+ expect(statements.length).toBe(1);
905
+ expect(statements[0]).toStrictEqual({
906
+ type: 'alter_table_alter_column_set_notnull',
907
+ tableName: 'users',
908
+ columnName: 'name',
909
+ schema: '',
910
+ newDataType: 'text',
911
+ columnDefault: undefined,
912
+ columnOnUpdate: undefined,
913
+ columnNotNull: true,
914
+ columnAutoIncrement: false,
915
+ columnPk: false,
916
+ });
917
+
918
+ expect(sqlStatements.length).toBe(3);
919
+ expect(sqlStatements[0]).toBe(
920
+ `DROP INDEX "users_name_index";`,
921
+ );
922
+ expect(sqlStatements[1]).toBe(
923
+ `ALTER TABLE \`users\` ALTER COLUMN "name" TO "name" text NOT NULL;`,
924
+ );
925
+ expect(sqlStatements[2]).toBe(
926
+ `CREATE INDEX \`users_name_index\` ON \`users\` (\`name\`);`,
927
+ );
928
+ });
929
+
930
+ test('drop not null with two indexes', async (t) => {
931
+ const schema1 = {
932
+ users: sqliteTable('users', {
933
+ id: int('id').primaryKey({ autoIncrement: true }),
934
+ name: text('name').notNull(),
935
+ age: int('age').notNull(),
936
+ }, (table) => ({
937
+ someUniqeIndex: uniqueIndex('users_name_unique').on(table.name),
938
+ someIndex: index('users_age_index').on(table.age),
939
+ })),
940
+ };
941
+
942
+ const schema2 = {
943
+ users: sqliteTable('users', {
944
+ id: int('id').primaryKey({ autoIncrement: true }),
945
+ name: text('name'),
946
+ age: int('age').notNull(),
947
+ }, (table) => ({
948
+ someUniqeIndex: uniqueIndex('users_name_unique').on(table.name),
949
+ someIndex: index('users_age_index').on(table.age),
950
+ })),
951
+ };
952
+
953
+ const { statements, sqlStatements } = await diffTestSchemasLibSQL(
954
+ schema1,
955
+ schema2,
956
+ [],
957
+ );
958
+
959
+ expect(statements.length).toBe(1);
960
+ expect(statements[0]).toStrictEqual({
961
+ type: 'alter_table_alter_column_drop_notnull',
962
+ tableName: 'users',
963
+ columnName: 'name',
964
+ schema: '',
965
+ newDataType: 'text',
966
+ columnDefault: undefined,
967
+ columnOnUpdate: undefined,
968
+ columnNotNull: false,
969
+ columnAutoIncrement: false,
970
+ columnPk: false,
971
+ });
972
+
973
+ expect(sqlStatements.length).toBe(5);
974
+ expect(sqlStatements[0]).toBe(
975
+ `DROP INDEX "users_name_unique";`,
976
+ );
977
+ expect(sqlStatements[1]).toBe(
978
+ `DROP INDEX "users_age_index";`,
979
+ );
980
+ expect(sqlStatements[2]).toBe(
981
+ `ALTER TABLE \`users\` ALTER COLUMN "name" TO "name" text;`,
982
+ );
983
+ expect(sqlStatements[3]).toBe(
984
+ `CREATE UNIQUE INDEX \`users_name_unique\` ON \`users\` (\`name\`);`,
985
+ );
986
+ expect(sqlStatements[4]).toBe(
987
+ `CREATE INDEX \`users_age_index\` ON \`users\` (\`age\`);`,
988
+ );
989
+ });