@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,751 @@
1
+ import { integer, pgEnum, pgSchema, pgTable, serial } from 'drizzle-orm/pg-core';
2
+ import { expect, test } from 'vitest';
3
+ import { diffTestSchemas } from './schemaDiffer';
4
+
5
+ test('enums #1', async () => {
6
+ const to = {
7
+ enum: pgEnum('enum', ['value']),
8
+ };
9
+
10
+ const { statements, sqlStatements } = await diffTestSchemas({}, to, []);
11
+
12
+ expect(sqlStatements.length).toBe(1);
13
+ expect(sqlStatements[0]).toBe(`CREATE TYPE "public"."enum" AS ENUM('value');`);
14
+ expect(statements.length).toBe(1);
15
+ expect(statements[0]).toStrictEqual({
16
+ name: 'enum',
17
+ schema: 'public',
18
+ type: 'create_type_enum',
19
+ values: ['value'],
20
+ });
21
+ });
22
+
23
+ test('enums #2', async () => {
24
+ const folder = pgSchema('folder');
25
+ const to = {
26
+ enum: folder.enum('enum', ['value']),
27
+ };
28
+
29
+ const { statements, sqlStatements } = await diffTestSchemas({}, to, []);
30
+
31
+ expect(sqlStatements.length).toBe(1);
32
+ expect(sqlStatements[0]).toBe(`CREATE TYPE "folder"."enum" AS ENUM('value');`);
33
+ expect(statements.length).toBe(1);
34
+ expect(statements[0]).toStrictEqual({
35
+ name: 'enum',
36
+ schema: 'folder',
37
+ type: 'create_type_enum',
38
+ values: ['value'],
39
+ });
40
+ });
41
+
42
+ test('enums #3', async () => {
43
+ const from = {
44
+ enum: pgEnum('enum', ['value']),
45
+ };
46
+
47
+ const { statements, sqlStatements } = await diffTestSchemas(from, {}, []);
48
+
49
+ expect(sqlStatements.length).toBe(1);
50
+ expect(sqlStatements[0]).toBe(`DROP TYPE "public"."enum";`);
51
+ expect(statements.length).toBe(1);
52
+ expect(statements[0]).toStrictEqual({
53
+ type: 'drop_type_enum',
54
+ name: 'enum',
55
+ schema: 'public',
56
+ });
57
+ });
58
+
59
+ test('enums #4', async () => {
60
+ const folder = pgSchema('folder');
61
+
62
+ const from = {
63
+ enum: folder.enum('enum', ['value']),
64
+ };
65
+
66
+ const { statements, sqlStatements } = await diffTestSchemas(from, {}, []);
67
+
68
+ expect(sqlStatements.length).toBe(1);
69
+ expect(sqlStatements[0]).toBe(`DROP TYPE "folder"."enum";`);
70
+ expect(statements.length).toBe(1);
71
+ expect(statements[0]).toStrictEqual({
72
+ type: 'drop_type_enum',
73
+ name: 'enum',
74
+ schema: 'folder',
75
+ });
76
+ });
77
+
78
+ test('enums #5', async () => {
79
+ const folder1 = pgSchema('folder1');
80
+ const folder2 = pgSchema('folder2');
81
+
82
+ const from = {
83
+ folder1,
84
+ enum: folder1.enum('enum', ['value']),
85
+ };
86
+
87
+ const to = {
88
+ folder2,
89
+ enum: folder2.enum('enum', ['value']),
90
+ };
91
+
92
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, ['folder1->folder2']);
93
+
94
+ expect(sqlStatements.length).toBe(1);
95
+ expect(sqlStatements[0]).toBe(`ALTER SCHEMA "folder1" RENAME TO "folder2";\n`);
96
+ expect(statements.length).toBe(1);
97
+ expect(statements[0]).toStrictEqual({
98
+ type: 'rename_schema',
99
+ from: 'folder1',
100
+ to: 'folder2',
101
+ });
102
+ });
103
+
104
+ test('enums #6', async () => {
105
+ const folder1 = pgSchema('folder1');
106
+ const folder2 = pgSchema('folder2');
107
+
108
+ const from = {
109
+ folder1,
110
+ folder2,
111
+ enum: folder1.enum('enum', ['value']),
112
+ };
113
+
114
+ const to = {
115
+ folder1,
116
+ folder2,
117
+ enum: folder2.enum('enum', ['value']),
118
+ };
119
+
120
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, [
121
+ 'folder1.enum->folder2.enum',
122
+ ]);
123
+
124
+ expect(sqlStatements.length).toBe(1);
125
+ expect(sqlStatements[0]).toBe(`ALTER TYPE "folder1"."enum" SET SCHEMA "folder2";`);
126
+ expect(statements.length).toBe(1);
127
+ expect(statements[0]).toStrictEqual({
128
+ type: 'move_type_enum',
129
+ name: 'enum',
130
+ schemaFrom: 'folder1',
131
+ schemaTo: 'folder2',
132
+ });
133
+ });
134
+
135
+ test('enums #7', async () => {
136
+ const from = {
137
+ enum: pgEnum('enum', ['value1']),
138
+ };
139
+
140
+ const to = {
141
+ enum: pgEnum('enum', ['value1', 'value2']),
142
+ };
143
+
144
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, []);
145
+
146
+ expect(sqlStatements.length).toBe(1);
147
+ expect(sqlStatements[0]).toBe(`ALTER TYPE "public"."enum" ADD VALUE 'value2';`);
148
+ expect(statements.length).toBe(1);
149
+ expect(statements[0]).toStrictEqual({
150
+ type: 'alter_type_add_value',
151
+ name: 'enum',
152
+ schema: 'public',
153
+ value: 'value2',
154
+ before: '',
155
+ });
156
+ });
157
+
158
+ test('enums #8', async () => {
159
+ const from = {
160
+ enum: pgEnum('enum', ['value1']),
161
+ };
162
+
163
+ const to = {
164
+ enum: pgEnum('enum', ['value1', 'value2', 'value3']),
165
+ };
166
+
167
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, []);
168
+
169
+ expect(sqlStatements.length).toBe(2);
170
+ expect(sqlStatements[0]).toBe(`ALTER TYPE "public"."enum" ADD VALUE 'value2';`);
171
+ expect(sqlStatements[1]).toBe(`ALTER TYPE "public"."enum" ADD VALUE 'value3';`);
172
+ expect(statements.length).toBe(2);
173
+ expect(statements[0]).toStrictEqual({
174
+ type: 'alter_type_add_value',
175
+ name: 'enum',
176
+ schema: 'public',
177
+ value: 'value2',
178
+ before: '',
179
+ });
180
+
181
+ expect(statements[1]).toStrictEqual({
182
+ type: 'alter_type_add_value',
183
+ name: 'enum',
184
+ schema: 'public',
185
+ value: 'value3',
186
+ before: '',
187
+ });
188
+ });
189
+
190
+ test('enums #9', async () => {
191
+ const from = {
192
+ enum: pgEnum('enum', ['value1', 'value3']),
193
+ };
194
+
195
+ const to = {
196
+ enum: pgEnum('enum', ['value1', 'value2', 'value3']),
197
+ };
198
+
199
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, []);
200
+
201
+ expect(sqlStatements.length).toBe(1);
202
+ expect(sqlStatements[0]).toBe(`ALTER TYPE "public"."enum" ADD VALUE 'value2' BEFORE 'value3';`);
203
+ expect(statements.length).toBe(1);
204
+ expect(statements[0]).toStrictEqual({
205
+ type: 'alter_type_add_value',
206
+ name: 'enum',
207
+ schema: 'public',
208
+ value: 'value2',
209
+ before: 'value3',
210
+ });
211
+ });
212
+
213
+ test('enums #10', async () => {
214
+ const schema = pgSchema('folder');
215
+ const from = {
216
+ enum: schema.enum('enum', ['value1']),
217
+ };
218
+
219
+ const to = {
220
+ enum: schema.enum('enum', ['value1', 'value2']),
221
+ };
222
+
223
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, []);
224
+
225
+ expect(sqlStatements.length).toBe(1);
226
+ expect(sqlStatements[0]).toBe(`ALTER TYPE "folder"."enum" ADD VALUE 'value2';`);
227
+ expect(statements.length).toBe(1);
228
+ expect(statements[0]).toStrictEqual({
229
+ type: 'alter_type_add_value',
230
+ name: 'enum',
231
+ schema: 'folder',
232
+ value: 'value2',
233
+ before: '',
234
+ });
235
+ });
236
+
237
+ test('enums #11', async () => {
238
+ const schema1 = pgSchema('folder1');
239
+ const from = {
240
+ enum: schema1.enum('enum', ['value1']),
241
+ };
242
+
243
+ const to = {
244
+ enum: pgEnum('enum', ['value1']),
245
+ };
246
+
247
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, [
248
+ 'folder1.enum->public.enum',
249
+ ]);
250
+
251
+ expect(sqlStatements.length).toBe(1);
252
+ expect(sqlStatements[0]).toBe(`ALTER TYPE "folder1"."enum" SET SCHEMA "public";`);
253
+ expect(statements.length).toBe(1);
254
+ expect(statements[0]).toStrictEqual({
255
+ type: 'move_type_enum',
256
+ name: 'enum',
257
+ schemaFrom: 'folder1',
258
+ schemaTo: 'public',
259
+ });
260
+ });
261
+
262
+ test('enums #12', async () => {
263
+ const schema1 = pgSchema('folder1');
264
+ const from = {
265
+ enum: pgEnum('enum', ['value1']),
266
+ };
267
+
268
+ const to = {
269
+ enum: schema1.enum('enum', ['value1']),
270
+ };
271
+
272
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, [
273
+ 'public.enum->folder1.enum',
274
+ ]);
275
+
276
+ expect(sqlStatements.length).toBe(1);
277
+ expect(sqlStatements[0]).toBe(`ALTER TYPE "public"."enum" SET SCHEMA "folder1";`);
278
+ expect(statements.length).toBe(1);
279
+ expect(statements[0]).toStrictEqual({
280
+ type: 'move_type_enum',
281
+ name: 'enum',
282
+ schemaFrom: 'public',
283
+ schemaTo: 'folder1',
284
+ });
285
+ });
286
+
287
+ test('enums #13', async () => {
288
+ const from = {
289
+ enum: pgEnum('enum1', ['value1']),
290
+ };
291
+
292
+ const to = {
293
+ enum: pgEnum('enum2', ['value1']),
294
+ };
295
+
296
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, [
297
+ 'public.enum1->public.enum2',
298
+ ]);
299
+
300
+ expect(sqlStatements.length).toBe(1);
301
+ expect(sqlStatements[0]).toBe(`ALTER TYPE "public"."enum1" RENAME TO "enum2";`);
302
+ expect(statements.length).toBe(1);
303
+ expect(statements[0]).toStrictEqual({
304
+ type: 'rename_type_enum',
305
+ nameFrom: 'enum1',
306
+ nameTo: 'enum2',
307
+ schema: 'public',
308
+ });
309
+ });
310
+
311
+ test('enums #14', async () => {
312
+ const folder1 = pgSchema('folder1');
313
+ const folder2 = pgSchema('folder2');
314
+ const from = {
315
+ enum: folder1.enum('enum1', ['value1']),
316
+ };
317
+
318
+ const to = {
319
+ enum: folder2.enum('enum2', ['value1']),
320
+ };
321
+
322
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, [
323
+ 'folder1.enum1->folder2.enum2',
324
+ ]);
325
+
326
+ expect(sqlStatements.length).toBe(2);
327
+ expect(sqlStatements[0]).toBe(`ALTER TYPE "folder1"."enum1" SET SCHEMA "folder2";`);
328
+ expect(sqlStatements[1]).toBe(`ALTER TYPE "folder2"."enum1" RENAME TO "enum2";`);
329
+ expect(statements.length).toBe(2);
330
+ expect(statements[0]).toStrictEqual({
331
+ type: 'move_type_enum',
332
+ name: 'enum1',
333
+ schemaFrom: 'folder1',
334
+ schemaTo: 'folder2',
335
+ });
336
+ expect(statements[1]).toStrictEqual({
337
+ type: 'rename_type_enum',
338
+ nameFrom: 'enum1',
339
+ nameTo: 'enum2',
340
+ schema: 'folder2',
341
+ });
342
+ });
343
+
344
+ test('enums #15', async () => {
345
+ const folder1 = pgSchema('folder1');
346
+ const folder2 = pgSchema('folder2');
347
+ const from = {
348
+ enum: folder1.enum('enum1', ['value1', 'value4']),
349
+ };
350
+
351
+ const to = {
352
+ enum: folder2.enum('enum2', ['value1', 'value2', 'value3', 'value4']),
353
+ };
354
+
355
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, [
356
+ 'folder1.enum1->folder2.enum2',
357
+ ]);
358
+
359
+ expect(sqlStatements.length).toBe(4);
360
+ expect(sqlStatements[0]).toBe(`ALTER TYPE "folder1"."enum1" SET SCHEMA "folder2";`);
361
+ expect(sqlStatements[1]).toBe(`ALTER TYPE "folder2"."enum1" RENAME TO "enum2";`);
362
+ expect(sqlStatements[2]).toBe(`ALTER TYPE "folder2"."enum2" ADD VALUE 'value2' BEFORE 'value4';`);
363
+ expect(sqlStatements[3]).toBe(`ALTER TYPE "folder2"."enum2" ADD VALUE 'value3' BEFORE 'value4';`);
364
+
365
+ expect(statements.length).toBe(4);
366
+ expect(statements[0]).toStrictEqual({
367
+ type: 'move_type_enum',
368
+ name: 'enum1',
369
+ schemaFrom: 'folder1',
370
+ schemaTo: 'folder2',
371
+ });
372
+ expect(statements[1]).toStrictEqual({
373
+ type: 'rename_type_enum',
374
+ nameFrom: 'enum1',
375
+ nameTo: 'enum2',
376
+ schema: 'folder2',
377
+ });
378
+ expect(statements[2]).toStrictEqual({
379
+ type: 'alter_type_add_value',
380
+ name: 'enum2',
381
+ schema: 'folder2',
382
+ value: 'value2',
383
+ before: 'value4',
384
+ });
385
+ expect(statements[3]).toStrictEqual({
386
+ type: 'alter_type_add_value',
387
+ name: 'enum2',
388
+ schema: 'folder2',
389
+ value: 'value3',
390
+ before: 'value4',
391
+ });
392
+ });
393
+
394
+ test('enums #16', async () => {
395
+ const enum1 = pgEnum('enum1', ['value1']);
396
+ const enum2 = pgEnum('enum2', ['value1']);
397
+
398
+ const from = {
399
+ enum1,
400
+ table: pgTable('table', {
401
+ column: enum1('column'),
402
+ }),
403
+ };
404
+
405
+ const to = {
406
+ enum2,
407
+ table: pgTable('table', {
408
+ column: enum2('column'),
409
+ }),
410
+ };
411
+
412
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, [
413
+ 'public.enum1->public.enum2',
414
+ ]);
415
+
416
+ expect(sqlStatements.length).toBe(1);
417
+ expect(sqlStatements[0]).toBe(`ALTER TYPE "public"."enum1" RENAME TO "enum2";`);
418
+
419
+ expect(statements.length).toBe(1);
420
+ expect(statements[0]).toStrictEqual({
421
+ type: 'rename_type_enum',
422
+ nameFrom: 'enum1',
423
+ nameTo: 'enum2',
424
+ schema: 'public',
425
+ });
426
+ });
427
+
428
+ test('enums #17', async () => {
429
+ const schema = pgSchema('schema');
430
+ const enum1 = pgEnum('enum1', ['value1']);
431
+ const enum2 = schema.enum('enum1', ['value1']);
432
+
433
+ const from = {
434
+ enum1,
435
+ table: pgTable('table', {
436
+ column: enum1('column'),
437
+ }),
438
+ };
439
+
440
+ const to = {
441
+ enum2,
442
+ table: pgTable('table', {
443
+ column: enum2('column'),
444
+ }),
445
+ };
446
+
447
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, [
448
+ 'public.enum1->schema.enum1',
449
+ ]);
450
+
451
+ expect(sqlStatements.length).toBe(1);
452
+ expect(sqlStatements[0]).toBe(`ALTER TYPE "public"."enum1" SET SCHEMA "schema";`);
453
+
454
+ expect(sqlStatements.length).toBe(1);
455
+ expect(statements.length).toBe(1);
456
+ expect(statements[0]).toStrictEqual({
457
+ type: 'move_type_enum',
458
+ name: 'enum1',
459
+ schemaFrom: 'public',
460
+ schemaTo: 'schema',
461
+ });
462
+ });
463
+
464
+ test('enums #18', async () => {
465
+ const schema1 = pgSchema('schema1');
466
+ const schema2 = pgSchema('schema2');
467
+
468
+ const enum1 = schema1.enum('enum1', ['value1']);
469
+ const enum2 = schema2.enum('enum2', ['value1']);
470
+
471
+ const from = {
472
+ enum1,
473
+ table: pgTable('table', {
474
+ column: enum1('column'),
475
+ }),
476
+ };
477
+
478
+ const to = {
479
+ enum2,
480
+ table: pgTable('table', {
481
+ column: enum2('column'),
482
+ }),
483
+ };
484
+
485
+ // change name and schema of the enum, no table changes
486
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, [
487
+ 'schema1.enum1->schema2.enum2',
488
+ ]);
489
+
490
+ expect(sqlStatements.length).toBe(2);
491
+ expect(sqlStatements[0]).toBe(`ALTER TYPE "schema1"."enum1" SET SCHEMA "schema2";`);
492
+ expect(sqlStatements[1]).toBe(`ALTER TYPE "schema2"."enum1" RENAME TO "enum2";`);
493
+
494
+ expect(statements.length).toBe(2);
495
+ expect(statements[0]).toStrictEqual({
496
+ type: 'move_type_enum',
497
+ name: 'enum1',
498
+ schemaFrom: 'schema1',
499
+ schemaTo: 'schema2',
500
+ });
501
+ expect(statements[1]).toStrictEqual({
502
+ type: 'rename_type_enum',
503
+ nameFrom: 'enum1',
504
+ nameTo: 'enum2',
505
+ schema: 'schema2',
506
+ });
507
+ });
508
+
509
+ test('enums #19', async () => {
510
+ const myEnum = pgEnum('my_enum', ["escape's quotes"]);
511
+
512
+ const from = {};
513
+
514
+ const to = { myEnum };
515
+
516
+ const { sqlStatements } = await diffTestSchemas(from, to, []);
517
+
518
+ expect(sqlStatements.length).toBe(1);
519
+ expect(sqlStatements[0]).toStrictEqual(
520
+ 'CREATE TYPE "public"."my_enum" AS ENUM(\'escape\'\'s quotes\');',
521
+ );
522
+ });
523
+
524
+ test('enums #20', async () => {
525
+ const myEnum = pgEnum('my_enum', ['one', 'two', 'three']);
526
+
527
+ const from = {
528
+ myEnum,
529
+ table: pgTable('table', {
530
+ id: serial('id').primaryKey(),
531
+ }),
532
+ };
533
+
534
+ const to = {
535
+ myEnum,
536
+ table: pgTable('table', {
537
+ id: serial('id').primaryKey(),
538
+ col1: myEnum('col1'),
539
+ col2: integer('col2'),
540
+ }),
541
+ };
542
+
543
+ const { sqlStatements } = await diffTestSchemas(from, to, []);
544
+
545
+ expect(sqlStatements.length).toBe(2);
546
+ expect(sqlStatements).toStrictEqual([
547
+ 'ALTER TABLE "table" ADD COLUMN "col1" "my_enum";',
548
+ 'ALTER TABLE "table" ADD COLUMN "col2" integer;',
549
+ ]);
550
+ });
551
+
552
+ test('enums #21', async () => {
553
+ const myEnum = pgEnum('my_enum', ['one', 'two', 'three']);
554
+
555
+ const from = {
556
+ myEnum,
557
+ table: pgTable('table', {
558
+ id: serial('id').primaryKey(),
559
+ }),
560
+ };
561
+
562
+ const to = {
563
+ myEnum,
564
+ table: pgTable('table', {
565
+ id: serial('id').primaryKey(),
566
+ col1: myEnum('col1').array(),
567
+ col2: integer('col2').array(),
568
+ }),
569
+ };
570
+
571
+ const { sqlStatements } = await diffTestSchemas(from, to, []);
572
+
573
+ expect(sqlStatements.length).toBe(2);
574
+ expect(sqlStatements).toStrictEqual([
575
+ 'ALTER TABLE "table" ADD COLUMN "col1" "my_enum"[];',
576
+ 'ALTER TABLE "table" ADD COLUMN "col2" integer[];',
577
+ ]);
578
+ });
579
+
580
+ test('drop enum value', async () => {
581
+ const enum1 = pgEnum('enum', ['value1', 'value2', 'value3']);
582
+
583
+ const from = {
584
+ enum1,
585
+ };
586
+
587
+ const enum2 = pgEnum('enum', ['value1', 'value3']);
588
+ const to = {
589
+ enum2,
590
+ };
591
+
592
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, []);
593
+
594
+ expect(sqlStatements.length).toBe(2);
595
+ expect(sqlStatements[0]).toBe(`DROP TYPE "public"."enum";`);
596
+ expect(sqlStatements[1]).toBe(`CREATE TYPE "public"."enum" AS ENUM('value1', 'value3');`);
597
+
598
+ expect(statements.length).toBe(1);
599
+ expect(statements[0]).toStrictEqual({
600
+ columnsWithEnum: [],
601
+ deletedValues: [
602
+ 'value2',
603
+ ],
604
+ name: 'enum',
605
+ newValues: [
606
+ 'value1',
607
+ 'value3',
608
+ ],
609
+ schema: 'public',
610
+ type: 'alter_type_drop_value',
611
+ });
612
+ });
613
+
614
+ test('drop enum value. enum is columns data type', async () => {
615
+ const enum1 = pgEnum('enum', ['value1', 'value2', 'value3']);
616
+
617
+ const schema = pgSchema('new_schema');
618
+
619
+ const from = {
620
+ schema,
621
+ enum1,
622
+ table: pgTable('table', {
623
+ column: enum1('column'),
624
+ }),
625
+ table2: schema.table('table', {
626
+ column: enum1('column'),
627
+ }),
628
+ };
629
+
630
+ const enum2 = pgEnum('enum', ['value1', 'value3']);
631
+ const to = {
632
+ schema,
633
+ enum2,
634
+ table: pgTable('table', {
635
+ column: enum1('column'),
636
+ }),
637
+ table2: schema.table('table', {
638
+ column: enum1('column'),
639
+ }),
640
+ };
641
+
642
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, []);
643
+
644
+ expect(sqlStatements.length).toBe(6);
645
+ expect(sqlStatements[0]).toBe(`ALTER TABLE "public"."table" ALTER COLUMN "column" SET DATA TYPE text;`);
646
+ expect(sqlStatements[1]).toBe(`ALTER TABLE "new_schema"."table" ALTER COLUMN "column" SET DATA TYPE text;`);
647
+ expect(sqlStatements[2]).toBe(`DROP TYPE "public"."enum";`);
648
+ expect(sqlStatements[3]).toBe(`CREATE TYPE "public"."enum" AS ENUM('value1', 'value3');`);
649
+ expect(sqlStatements[4]).toBe(
650
+ `ALTER TABLE "public"."table" ALTER COLUMN "column" SET DATA TYPE "public"."enum" USING "column"::"public"."enum";`,
651
+ );
652
+ expect(sqlStatements[5]).toBe(
653
+ `ALTER TABLE "new_schema"."table" ALTER COLUMN "column" SET DATA TYPE "public"."enum" USING "column"::"public"."enum";`,
654
+ );
655
+
656
+ expect(statements.length).toBe(1);
657
+ expect(statements[0]).toStrictEqual({
658
+ columnsWithEnum: [
659
+ {
660
+ column: 'column',
661
+ schema: 'public',
662
+ table: 'table',
663
+ },
664
+ {
665
+ column: 'column',
666
+ schema: 'new_schema',
667
+ table: 'table',
668
+ },
669
+ ],
670
+ deletedValues: [
671
+ 'value2',
672
+ ],
673
+ name: 'enum',
674
+ newValues: [
675
+ 'value1',
676
+ 'value3',
677
+ ],
678
+ schema: 'public',
679
+ type: 'alter_type_drop_value',
680
+ });
681
+ });
682
+
683
+ test('shuffle enum values', async () => {
684
+ const enum1 = pgEnum('enum', ['value1', 'value2', 'value3']);
685
+
686
+ const schema = pgSchema('new_schema');
687
+
688
+ const from = {
689
+ schema,
690
+ enum1,
691
+ table: pgTable('table', {
692
+ column: enum1('column'),
693
+ }),
694
+ table2: schema.table('table', {
695
+ column: enum1('column'),
696
+ }),
697
+ };
698
+
699
+ const enum2 = pgEnum('enum', ['value1', 'value3', 'value2']);
700
+ const to = {
701
+ schema,
702
+ enum2,
703
+ table: pgTable('table', {
704
+ column: enum1('column'),
705
+ }),
706
+ table2: schema.table('table', {
707
+ column: enum1('column'),
708
+ }),
709
+ };
710
+
711
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, []);
712
+
713
+ expect(sqlStatements.length).toBe(6);
714
+ expect(sqlStatements[0]).toBe(`ALTER TABLE "public"."table" ALTER COLUMN "column" SET DATA TYPE text;`);
715
+ expect(sqlStatements[1]).toBe(`ALTER TABLE "new_schema"."table" ALTER COLUMN "column" SET DATA TYPE text;`);
716
+ expect(sqlStatements[2]).toBe(`DROP TYPE "public"."enum";`);
717
+ expect(sqlStatements[3]).toBe(`CREATE TYPE "public"."enum" AS ENUM('value1', 'value3', 'value2');`);
718
+ expect(sqlStatements[4]).toBe(
719
+ `ALTER TABLE "public"."table" ALTER COLUMN "column" SET DATA TYPE "public"."enum" USING "column"::"public"."enum";`,
720
+ );
721
+ expect(sqlStatements[5]).toBe(
722
+ `ALTER TABLE "new_schema"."table" ALTER COLUMN "column" SET DATA TYPE "public"."enum" USING "column"::"public"."enum";`,
723
+ );
724
+
725
+ expect(statements.length).toBe(1);
726
+ expect(statements[0]).toStrictEqual({
727
+ columnsWithEnum: [
728
+ {
729
+ column: 'column',
730
+ schema: 'public',
731
+ table: 'table',
732
+ },
733
+ {
734
+ column: 'column',
735
+ schema: 'new_schema',
736
+ table: 'table',
737
+ },
738
+ ],
739
+ deletedValues: [
740
+ 'value3',
741
+ ],
742
+ name: 'enum',
743
+ newValues: [
744
+ 'value1',
745
+ 'value3',
746
+ 'value2',
747
+ ],
748
+ schema: 'public',
749
+ type: 'alter_type_drop_value',
750
+ });
751
+ });