@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,368 @@
1
+ import {
2
+ bigint,
3
+ boolean,
4
+ date,
5
+ integer,
6
+ json,
7
+ pgEnum,
8
+ pgTable,
9
+ serial,
10
+ text,
11
+ timestamp,
12
+ uuid,
13
+ } from 'drizzle-orm/pg-core';
14
+ import { expect, test } from 'vitest';
15
+ import { diffTestSchemas } from './schemaDiffer';
16
+
17
+ test('array #1: empty array default', async (t) => {
18
+ const from = {
19
+ test: pgTable('test', {
20
+ id: serial('id').primaryKey(),
21
+ }),
22
+ };
23
+ const to = {
24
+ test: pgTable('test', {
25
+ id: serial('id').primaryKey(),
26
+ values: integer('values').array().default([]),
27
+ }),
28
+ };
29
+
30
+ const { statements } = await diffTestSchemas(from, to, []);
31
+
32
+ expect(statements.length).toBe(1);
33
+ expect(statements[0]).toStrictEqual({
34
+ type: 'alter_table_add_column',
35
+ tableName: 'test',
36
+ schema: '',
37
+ column: { name: 'values', type: 'integer[]', primaryKey: false, notNull: false, default: "'{}'" },
38
+ });
39
+ });
40
+
41
+ test('array #2: integer array default', async (t) => {
42
+ const from = {
43
+ test: pgTable('test', {
44
+ id: serial('id').primaryKey(),
45
+ }),
46
+ };
47
+ const to = {
48
+ test: pgTable('test', {
49
+ id: serial('id').primaryKey(),
50
+ values: integer('values').array().default([1, 2, 3]),
51
+ }),
52
+ };
53
+
54
+ const { statements } = await diffTestSchemas(from, to, []);
55
+
56
+ expect(statements.length).toBe(1);
57
+ expect(statements[0]).toStrictEqual({
58
+ type: 'alter_table_add_column',
59
+ tableName: 'test',
60
+ schema: '',
61
+ column: { name: 'values', type: 'integer[]', primaryKey: false, notNull: false, default: "'{1,2,3}'" },
62
+ });
63
+ });
64
+
65
+ test('array #3: bigint array default', async (t) => {
66
+ const from = {
67
+ test: pgTable('test', {
68
+ id: serial('id').primaryKey(),
69
+ }),
70
+ };
71
+ const to = {
72
+ test: pgTable('test', {
73
+ id: serial('id').primaryKey(),
74
+ values: bigint('values', { mode: 'bigint' }).array().default([BigInt(1), BigInt(2), BigInt(3)]),
75
+ }),
76
+ };
77
+
78
+ const { statements } = await diffTestSchemas(from, to, []);
79
+
80
+ expect(statements.length).toBe(1);
81
+ expect(statements[0]).toStrictEqual({
82
+ type: 'alter_table_add_column',
83
+ tableName: 'test',
84
+ schema: '',
85
+ column: { name: 'values', type: 'bigint[]', primaryKey: false, notNull: false, default: "'{1,2,3}'" },
86
+ });
87
+ });
88
+
89
+ test('array #4: boolean array default', async (t) => {
90
+ const from = {
91
+ test: pgTable('test', {
92
+ id: serial('id').primaryKey(),
93
+ }),
94
+ };
95
+ const to = {
96
+ test: pgTable('test', {
97
+ id: serial('id').primaryKey(),
98
+ values: boolean('values').array().default([true, false, true]),
99
+ }),
100
+ };
101
+
102
+ const { statements } = await diffTestSchemas(from, to, []);
103
+
104
+ expect(statements.length).toBe(1);
105
+ expect(statements[0]).toStrictEqual({
106
+ type: 'alter_table_add_column',
107
+ tableName: 'test',
108
+ schema: '',
109
+ column: {
110
+ name: 'values',
111
+ type: 'boolean[]',
112
+ primaryKey: false,
113
+ notNull: false,
114
+ default: "'{true,false,true}'",
115
+ },
116
+ });
117
+ });
118
+
119
+ test('array #5: multi-dimensional array default', async (t) => {
120
+ const from = {
121
+ test: pgTable('test', {
122
+ id: serial('id').primaryKey(),
123
+ }),
124
+ };
125
+ const to = {
126
+ test: pgTable('test', {
127
+ id: serial('id').primaryKey(),
128
+ values: integer('values').array().array().default([[1, 2], [3, 4]]),
129
+ }),
130
+ };
131
+
132
+ const { statements } = await diffTestSchemas(from, to, []);
133
+
134
+ expect(statements.length).toBe(1);
135
+ expect(statements[0]).toStrictEqual({
136
+ type: 'alter_table_add_column',
137
+ tableName: 'test',
138
+ schema: '',
139
+ column: {
140
+ name: 'values',
141
+ type: 'integer[][]',
142
+ primaryKey: false,
143
+ notNull: false,
144
+ default: "'{{1,2},{3,4}}'",
145
+ },
146
+ });
147
+ });
148
+
149
+ test('array #6: date array default', async (t) => {
150
+ const from = {
151
+ test: pgTable('test', {
152
+ id: serial('id').primaryKey(),
153
+ }),
154
+ };
155
+ const to = {
156
+ test: pgTable('test', {
157
+ id: serial('id').primaryKey(),
158
+ values: date('values').array().default(['2024-08-06', '2024-08-07']),
159
+ }),
160
+ };
161
+
162
+ const { statements } = await diffTestSchemas(from, to, []);
163
+
164
+ expect(statements.length).toBe(1);
165
+ expect(statements[0]).toStrictEqual({
166
+ type: 'alter_table_add_column',
167
+ tableName: 'test',
168
+ schema: '',
169
+ column: {
170
+ name: 'values',
171
+ type: 'date[]',
172
+ primaryKey: false,
173
+ notNull: false,
174
+ default: '\'{"2024-08-06","2024-08-07"}\'',
175
+ },
176
+ });
177
+ });
178
+
179
+ test('array #7: timestamp array default', async (t) => {
180
+ const from = {
181
+ test: pgTable('test', {
182
+ id: serial('id').primaryKey(),
183
+ }),
184
+ };
185
+ const to = {
186
+ test: pgTable('test', {
187
+ id: serial('id').primaryKey(),
188
+ values: timestamp('values').array().default([new Date('2024-08-06'), new Date('2024-08-07')]),
189
+ }),
190
+ };
191
+
192
+ const { statements } = await diffTestSchemas(from, to, []);
193
+
194
+ expect(statements.length).toBe(1);
195
+ expect(statements[0]).toStrictEqual({
196
+ type: 'alter_table_add_column',
197
+ tableName: 'test',
198
+ schema: '',
199
+ column: {
200
+ name: 'values',
201
+ type: 'timestamp[]',
202
+ primaryKey: false,
203
+ notNull: false,
204
+ default: '\'{"2024-08-06 00:00:00.000","2024-08-07 00:00:00.000"}\'',
205
+ },
206
+ });
207
+ });
208
+
209
+ test('array #8: json array default', async (t) => {
210
+ const from = {
211
+ test: pgTable('test', {
212
+ id: serial('id').primaryKey(),
213
+ }),
214
+ };
215
+ const to = {
216
+ test: pgTable('test', {
217
+ id: serial('id').primaryKey(),
218
+ values: json('values').array().default([{ a: 1 }, { b: 2 }]),
219
+ }),
220
+ };
221
+
222
+ const { statements } = await diffTestSchemas(from, to, []);
223
+
224
+ expect(statements.length).toBe(1);
225
+ expect(statements[0]).toStrictEqual({
226
+ type: 'alter_table_add_column',
227
+ tableName: 'test',
228
+ schema: '',
229
+ column: {
230
+ name: 'values',
231
+ type: 'json[]',
232
+ primaryKey: false,
233
+ notNull: false,
234
+ default: '\'{"{\\"a\\":1}","{\\"b\\":2}"}\'',
235
+ },
236
+ });
237
+ });
238
+
239
+ test('array #9: text array default', async (t) => {
240
+ const from = {
241
+ test: pgTable('test', {
242
+ id: serial('id').primaryKey(),
243
+ }),
244
+ };
245
+ const to = {
246
+ test: pgTable('test', {
247
+ id: serial('id').primaryKey(),
248
+ values: text('values').array().default(['abc', 'def']),
249
+ }),
250
+ };
251
+
252
+ const { statements } = await diffTestSchemas(from, to, []);
253
+
254
+ expect(statements.length).toBe(1);
255
+ expect(statements[0]).toStrictEqual({
256
+ type: 'alter_table_add_column',
257
+ tableName: 'test',
258
+ schema: '',
259
+ column: {
260
+ name: 'values',
261
+ type: 'text[]',
262
+ primaryKey: false,
263
+ notNull: false,
264
+ default: '\'{"abc","def"}\'',
265
+ },
266
+ });
267
+ });
268
+
269
+ test('array #10: uuid array default', async (t) => {
270
+ const from = {
271
+ test: pgTable('test', {
272
+ id: serial('id').primaryKey(),
273
+ }),
274
+ };
275
+ const to = {
276
+ test: pgTable('test', {
277
+ id: serial('id').primaryKey(),
278
+ values: uuid('values').array().default([
279
+ 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11',
280
+ 'b0eebc99-9c0b-4ef8-bb6d-cbb9bd380a11',
281
+ ]),
282
+ }),
283
+ };
284
+
285
+ const { statements } = await diffTestSchemas(from, to, []);
286
+
287
+ expect(statements.length).toBe(1);
288
+ expect(statements[0]).toStrictEqual({
289
+ type: 'alter_table_add_column',
290
+ tableName: 'test',
291
+ schema: '',
292
+ column: {
293
+ name: 'values',
294
+ type: 'uuid[]',
295
+ primaryKey: false,
296
+ notNull: false,
297
+ default: '\'{"a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11","b0eebc99-9c0b-4ef8-bb6d-cbb9bd380a11"}\'',
298
+ },
299
+ });
300
+ });
301
+
302
+ test('array #11: enum array default', async (t) => {
303
+ const testEnum = pgEnum('test_enum', ['a', 'b', 'c']);
304
+
305
+ const from = {
306
+ enum: testEnum,
307
+ test: pgTable('test', {
308
+ id: serial('id').primaryKey(),
309
+ }),
310
+ };
311
+ const to = {
312
+ enum: testEnum,
313
+ test: pgTable('test', {
314
+ id: serial('id').primaryKey(),
315
+ values: testEnum('values').array().default(['a', 'b', 'c']),
316
+ }),
317
+ };
318
+
319
+ const { statements } = await diffTestSchemas(from, to, []);
320
+
321
+ expect(statements.length).toBe(1);
322
+ expect(statements[0]).toStrictEqual({
323
+ type: 'alter_table_add_column',
324
+ tableName: 'test',
325
+ schema: '',
326
+ column: {
327
+ name: 'values',
328
+ type: 'test_enum[]',
329
+ primaryKey: false,
330
+ notNull: false,
331
+ default: '\'{"a","b","c"}\'',
332
+ },
333
+ });
334
+ });
335
+
336
+ test('array #12: enum empty array default', async (t) => {
337
+ const testEnum = pgEnum('test_enum', ['a', 'b', 'c']);
338
+
339
+ const from = {
340
+ enum: testEnum,
341
+ test: pgTable('test', {
342
+ id: serial('id').primaryKey(),
343
+ }),
344
+ };
345
+ const to = {
346
+ enum: testEnum,
347
+ test: pgTable('test', {
348
+ id: serial('id').primaryKey(),
349
+ values: testEnum('values').array().default([]),
350
+ }),
351
+ };
352
+
353
+ const { statements } = await diffTestSchemas(from, to, []);
354
+
355
+ expect(statements.length).toBe(1);
356
+ expect(statements[0]).toStrictEqual({
357
+ type: 'alter_table_add_column',
358
+ tableName: 'test',
359
+ schema: '',
360
+ column: {
361
+ name: 'values',
362
+ type: 'test_enum[]',
363
+ primaryKey: false,
364
+ notNull: false,
365
+ default: "'{}'",
366
+ },
367
+ });
368
+ });
@@ -0,0 +1,329 @@
1
+ import { sql } from 'drizzle-orm';
2
+ import { check, integer, pgTable, serial, varchar } from 'drizzle-orm/pg-core';
3
+ import { JsonCreateTableStatement } from 'src/jsonStatements';
4
+ import { expect, test } from 'vitest';
5
+ import { diffTestSchemas } from './schemaDiffer';
6
+
7
+ test('create table with check', async (t) => {
8
+ const to = {
9
+ users: pgTable('users', {
10
+ id: serial('id').primaryKey(),
11
+ age: integer('age'),
12
+ }, (table) => ({
13
+ checkConstraint: check('some_check_name', sql`${table.age} > 21`),
14
+ })),
15
+ };
16
+
17
+ const { sqlStatements, statements } = await diffTestSchemas({}, to, []);
18
+
19
+ expect(statements.length).toBe(1);
20
+ expect(statements[0]).toStrictEqual({
21
+ type: 'create_table',
22
+ tableName: 'users',
23
+ schema: '',
24
+ columns: [
25
+ {
26
+ name: 'id',
27
+ type: 'serial',
28
+ notNull: true,
29
+ primaryKey: true,
30
+ },
31
+ {
32
+ name: 'age',
33
+ type: 'integer',
34
+ notNull: false,
35
+ primaryKey: false,
36
+ },
37
+ ],
38
+ compositePKs: [],
39
+ checkConstraints: ['some_check_name;"users"."age" > 21'],
40
+ compositePkName: '',
41
+ uniqueConstraints: [],
42
+ isRLSEnabled: false,
43
+ policies: [],
44
+ } as JsonCreateTableStatement);
45
+
46
+ expect(sqlStatements.length).toBe(1);
47
+ expect(sqlStatements[0]).toBe(`CREATE TABLE "users" (
48
+ \t"id" serial PRIMARY KEY NOT NULL,
49
+ \t"age" integer,
50
+ \tCONSTRAINT "some_check_name" CHECK ("users"."age" > 21)
51
+ );\n`);
52
+ });
53
+
54
+ test('add check contraint to existing table', async (t) => {
55
+ const from = {
56
+ users: pgTable('users', {
57
+ id: serial('id').primaryKey(),
58
+ age: integer('age'),
59
+ }),
60
+ };
61
+
62
+ const to = {
63
+ users: pgTable('users', {
64
+ id: serial('id').primaryKey(),
65
+ age: integer('age'),
66
+ }, (table) => ({
67
+ checkConstraint: check('some_check_name', sql`${table.age} > 21`),
68
+ })),
69
+ };
70
+
71
+ const { sqlStatements, statements } = await diffTestSchemas(from, to, []);
72
+ expect(statements.length).toBe(1);
73
+ expect(statements[0]).toStrictEqual({
74
+ type: 'create_check_constraint',
75
+ tableName: 'users',
76
+ schema: '',
77
+ data: 'some_check_name;"users"."age" > 21',
78
+ });
79
+
80
+ expect(sqlStatements.length).toBe(1);
81
+ expect(sqlStatements[0]).toBe(
82
+ `ALTER TABLE "users" ADD CONSTRAINT "some_check_name" CHECK ("users"."age" > 21);`,
83
+ );
84
+ });
85
+
86
+ test('drop check contraint in existing table', async (t) => {
87
+ const from = {
88
+ users: pgTable('users', {
89
+ id: serial('id').primaryKey(),
90
+ age: integer('age'),
91
+ }, (table) => ({
92
+ checkConstraint: check('some_check_name', sql`${table.age} > 21`),
93
+ })),
94
+ };
95
+
96
+ const to = {
97
+ users: pgTable('users', {
98
+ id: serial('id').primaryKey(),
99
+ age: integer('age'),
100
+ }),
101
+ };
102
+
103
+ const { sqlStatements, statements } = await diffTestSchemas(from, to, []);
104
+ expect(statements.length).toBe(1);
105
+ expect(statements[0]).toStrictEqual({
106
+ type: 'delete_check_constraint',
107
+ tableName: 'users',
108
+ schema: '',
109
+ constraintName: 'some_check_name',
110
+ });
111
+
112
+ expect(sqlStatements.length).toBe(1);
113
+ expect(sqlStatements[0]).toBe(
114
+ `ALTER TABLE "users" DROP CONSTRAINT "some_check_name";`,
115
+ );
116
+ });
117
+
118
+ test('rename check constraint', async (t) => {
119
+ const from = {
120
+ users: pgTable('users', {
121
+ id: serial('id').primaryKey(),
122
+ age: integer('age'),
123
+ }, (table) => ({
124
+ checkConstraint: check('some_check_name', sql`${table.age} > 21`),
125
+ })),
126
+ };
127
+
128
+ const to = {
129
+ users: pgTable('users', {
130
+ id: serial('id').primaryKey(),
131
+ age: integer('age'),
132
+ }, (table) => ({
133
+ checkConstraint: check('new_check_name', sql`${table.age} > 21`),
134
+ })),
135
+ };
136
+
137
+ const { sqlStatements, statements } = await diffTestSchemas(from, to, []);
138
+ expect(statements.length).toBe(2);
139
+ expect(statements[0]).toStrictEqual({
140
+ constraintName: 'some_check_name',
141
+ schema: '',
142
+ tableName: 'users',
143
+ type: 'delete_check_constraint',
144
+ });
145
+ expect(statements[1]).toStrictEqual({
146
+ data: 'new_check_name;"users"."age" > 21',
147
+ schema: '',
148
+ tableName: 'users',
149
+ type: 'create_check_constraint',
150
+ });
151
+
152
+ expect(sqlStatements.length).toBe(2);
153
+ expect(sqlStatements[0]).toBe(
154
+ `ALTER TABLE "users" DROP CONSTRAINT "some_check_name";`,
155
+ );
156
+ expect(sqlStatements[1]).toBe(
157
+ `ALTER TABLE "users" ADD CONSTRAINT "new_check_name" CHECK ("users"."age" > 21);`,
158
+ );
159
+ });
160
+
161
+ test('alter check constraint', async (t) => {
162
+ const from = {
163
+ users: pgTable('users', {
164
+ id: serial('id').primaryKey(),
165
+ age: integer('age'),
166
+ }, (table) => ({
167
+ checkConstraint: check('some_check_name', sql`${table.age} > 21`),
168
+ })),
169
+ };
170
+
171
+ const to = {
172
+ users: pgTable('users', {
173
+ id: serial('id').primaryKey(),
174
+ age: integer('age'),
175
+ }, (table) => ({
176
+ checkConstraint: check('new_check_name', sql`${table.age} > 10`),
177
+ })),
178
+ };
179
+
180
+ const { sqlStatements, statements } = await diffTestSchemas(from, to, []);
181
+ expect(statements.length).toBe(2);
182
+ expect(statements[0]).toStrictEqual({
183
+ constraintName: 'some_check_name',
184
+ schema: '',
185
+ tableName: 'users',
186
+ type: 'delete_check_constraint',
187
+ });
188
+ expect(statements[1]).toStrictEqual({
189
+ data: 'new_check_name;"users"."age" > 10',
190
+ schema: '',
191
+ tableName: 'users',
192
+ type: 'create_check_constraint',
193
+ });
194
+
195
+ expect(sqlStatements.length).toBe(2);
196
+ expect(sqlStatements[0]).toBe(
197
+ `ALTER TABLE "users" DROP CONSTRAINT "some_check_name";`,
198
+ );
199
+ expect(sqlStatements[1]).toBe(
200
+ `ALTER TABLE "users" ADD CONSTRAINT "new_check_name" CHECK ("users"."age" > 10);`,
201
+ );
202
+ });
203
+
204
+ test('alter multiple check constraints', async (t) => {
205
+ const from = {
206
+ users: pgTable('users', {
207
+ id: serial('id').primaryKey(),
208
+ age: integer('age'),
209
+ name: varchar('name'),
210
+ }, (table) => ({
211
+ checkConstraint1: check('some_check_name_1', sql`${table.age} > 21`),
212
+ checkConstraint2: check('some_check_name_2', sql`${table.name} != 'Alex'`),
213
+ })),
214
+ };
215
+
216
+ const to = {
217
+ users: pgTable('users', {
218
+ id: serial('id').primaryKey(),
219
+ age: integer('age'),
220
+ name: varchar('name'),
221
+ }, (table) => ({
222
+ checkConstraint1: check('some_check_name_3', sql`${table.age} > 21`),
223
+ checkConstraint2: check('some_check_name_4', sql`${table.name} != 'Alex'`),
224
+ })),
225
+ };
226
+
227
+ const { sqlStatements, statements } = await diffTestSchemas(from, to, []);
228
+ expect(statements.length).toBe(4);
229
+ expect(statements[0]).toStrictEqual({
230
+ constraintName: 'some_check_name_1',
231
+ schema: '',
232
+ tableName: 'users',
233
+ type: 'delete_check_constraint',
234
+ });
235
+ expect(statements[1]).toStrictEqual({
236
+ constraintName: 'some_check_name_2',
237
+ schema: '',
238
+ tableName: 'users',
239
+ type: 'delete_check_constraint',
240
+ });
241
+ expect(statements[2]).toStrictEqual({
242
+ data: 'some_check_name_3;"users"."age" > 21',
243
+ schema: '',
244
+ tableName: 'users',
245
+ type: 'create_check_constraint',
246
+ });
247
+ expect(statements[3]).toStrictEqual({
248
+ data: 'some_check_name_4;"users"."name" != \'Alex\'',
249
+ schema: '',
250
+ tableName: 'users',
251
+ type: 'create_check_constraint',
252
+ });
253
+
254
+ expect(sqlStatements.length).toBe(4);
255
+ expect(sqlStatements[0]).toBe(
256
+ `ALTER TABLE "users" DROP CONSTRAINT "some_check_name_1";`,
257
+ );
258
+ expect(sqlStatements[1]).toBe(
259
+ `ALTER TABLE "users" DROP CONSTRAINT "some_check_name_2";`,
260
+ );
261
+ expect(sqlStatements[2]).toBe(
262
+ `ALTER TABLE "users" ADD CONSTRAINT "some_check_name_3" CHECK ("users"."age" > 21);`,
263
+ );
264
+ expect(sqlStatements[3]).toBe(
265
+ `ALTER TABLE "users" ADD CONSTRAINT "some_check_name_4" CHECK ("users"."name" != \'Alex\');`,
266
+ );
267
+ });
268
+
269
+ test('create checks with same names', async (t) => {
270
+ const to = {
271
+ users: pgTable('users', {
272
+ id: serial('id').primaryKey(),
273
+ age: integer('age'),
274
+ name: varchar('name'),
275
+ }, (table) => ({
276
+ checkConstraint1: check('some_check_name', sql`${table.age} > 21`),
277
+ checkConstraint2: check('some_check_name', sql`${table.name} != 'Alex'`),
278
+ })),
279
+ };
280
+
281
+ await expect(diffTestSchemas({}, to, [])).rejects.toThrowError();
282
+ });
283
+
284
+ test('create unnamed checks', async (t) => {
285
+ const to = {
286
+ users: pgTable('users', {
287
+ id: serial('id').primaryKey(),
288
+ age: integer('age'),
289
+ }, (table) => ({
290
+ checkConstraint: check(sql`${table.age} > 21`),
291
+ })),
292
+ };
293
+
294
+ const { sqlStatements, statements } = await diffTestSchemas({}, to, []);
295
+
296
+ expect(statements.length).toBe(1);
297
+ expect(statements[0]).toStrictEqual({
298
+ type: 'create_table',
299
+ tableName: 'users',
300
+ schema: '',
301
+ columns: [
302
+ {
303
+ name: 'id',
304
+ type: 'serial',
305
+ notNull: true,
306
+ primaryKey: true,
307
+ },
308
+ {
309
+ name: 'age',
310
+ type: 'integer',
311
+ notNull: false,
312
+ primaryKey: false,
313
+ },
314
+ ],
315
+ compositePKs: [],
316
+ checkConstraints: [';"users"."age" > 21'],
317
+ compositePkName: '',
318
+ uniqueConstraints: [],
319
+ isRLSEnabled: false,
320
+ policies: [],
321
+ } as JsonCreateTableStatement);
322
+
323
+ expect(sqlStatements.length).toBe(1);
324
+ expect(sqlStatements[0]).toBe(`CREATE TABLE "users" (
325
+ \t"id" serial PRIMARY KEY NOT NULL,
326
+ \t"age" integer,
327
+ \tCHECK ("users"."age" > 21)
328
+ );\n`);
329
+ });