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