@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,218 @@
1
+ import { sql } from 'drizzle-orm';
2
+ import { int, sqliteTable, sqliteView } from 'drizzle-orm/sqlite-core';
3
+ import { expect, test } from 'vitest';
4
+ import { diffTestSchemasLibSQL } from './schemaDiffer';
5
+
6
+ test('create view', async () => {
7
+ const users = sqliteTable('users', { id: int('id').default(1) });
8
+ const view = sqliteView('view').as((qb) => qb.select().from(users));
9
+ const to = {
10
+ users: users,
11
+ testView: view,
12
+ };
13
+
14
+ const { statements, sqlStatements } = await diffTestSchemasLibSQL({}, to, []);
15
+
16
+ expect(statements.length).toBe(2);
17
+ expect(statements[0]).toStrictEqual({
18
+ type: 'sqlite_create_table',
19
+ tableName: 'users',
20
+ columns: [{
21
+ autoincrement: false,
22
+ default: 1,
23
+ name: 'id',
24
+ type: 'integer',
25
+ primaryKey: false,
26
+ notNull: false,
27
+ }],
28
+ compositePKs: [],
29
+ uniqueConstraints: [],
30
+ referenceData: [],
31
+ checkConstraints: [],
32
+ });
33
+ expect(statements[1]).toStrictEqual({
34
+ type: 'sqlite_create_view',
35
+ name: 'view',
36
+ definition: 'select "id" from "users"',
37
+ });
38
+
39
+ expect(sqlStatements.length).toBe(2);
40
+ expect(sqlStatements[0]).toBe(`CREATE TABLE \`users\` (
41
+ \t\`id\` integer DEFAULT 1
42
+ );\n`);
43
+ expect(sqlStatements[1]).toBe(`CREATE VIEW \`view\` AS select "id" from "users";`);
44
+ });
45
+
46
+ test('drop view', async () => {
47
+ const users = sqliteTable('users', {
48
+ id: int('id').primaryKey({ autoIncrement: true }),
49
+ });
50
+
51
+ const from = {
52
+ users: users,
53
+ testView: sqliteView('view', { id: int('id') }).as(sql`SELECT * FROM users`),
54
+ };
55
+ const to = {
56
+ users,
57
+ };
58
+
59
+ const { statements, sqlStatements } = await diffTestSchemasLibSQL(from, to, []);
60
+
61
+ expect(statements.length).toBe(1);
62
+ expect(statements[0]).toStrictEqual({
63
+ name: 'view',
64
+ type: 'drop_view',
65
+ });
66
+
67
+ expect(sqlStatements.length).toBe(1);
68
+ expect(sqlStatements[0]).toBe(
69
+ `DROP VIEW \`view\`;`,
70
+ );
71
+ });
72
+
73
+ test('alter view', async () => {
74
+ const users = sqliteTable('users', {
75
+ id: int('id').primaryKey({ autoIncrement: true }),
76
+ });
77
+
78
+ const from = {
79
+ users: users,
80
+ testView: sqliteView('view', { id: int('id') }).as(sql`SELECT * FROM users`),
81
+ };
82
+ const to = {
83
+ users,
84
+ testView: sqliteView('view', { id: int('id') }).as(sql`SELECT * FROM users WHERE users.id = 1`),
85
+ };
86
+ const { statements, sqlStatements } = await diffTestSchemasLibSQL(from, to, []);
87
+
88
+ expect(statements.length).toBe(2);
89
+ expect(statements[0]).toStrictEqual({
90
+ name: 'view',
91
+ type: 'drop_view',
92
+ });
93
+ expect(statements[1]).toStrictEqual({
94
+ name: 'view',
95
+ type: 'sqlite_create_view',
96
+ definition: 'SELECT * FROM users WHERE users.id = 1',
97
+ });
98
+
99
+ expect(sqlStatements.length).toBe(2);
100
+ expect(sqlStatements[0]).toBe(
101
+ `DROP VIEW \`view\`;`,
102
+ );
103
+ expect(sqlStatements[1]).toBe(
104
+ `CREATE VIEW \`view\` AS SELECT * FROM users WHERE users.id = 1;`,
105
+ );
106
+ });
107
+
108
+ test('create view with existing flag', async () => {
109
+ const view = sqliteView('view', {}).existing();
110
+ const to = {
111
+ testView: view,
112
+ };
113
+
114
+ const { statements, sqlStatements } = await diffTestSchemasLibSQL({}, to, []);
115
+
116
+ expect(statements.length).toBe(0);
117
+ expect(sqlStatements.length).toBe(0);
118
+ });
119
+
120
+ test('drop view with existing flag', async () => {
121
+ const users = sqliteTable('users', {
122
+ id: int('id').primaryKey({ autoIncrement: true }),
123
+ });
124
+
125
+ const from = {
126
+ users: users,
127
+ testView: sqliteView('view', { id: int('id') }).existing(),
128
+ };
129
+ const to = {
130
+ users,
131
+ };
132
+
133
+ const { statements, sqlStatements } = await diffTestSchemasLibSQL(from, to, []);
134
+
135
+ expect(statements.length).toBe(0);
136
+ expect(sqlStatements.length).toBe(0);
137
+ });
138
+
139
+ test('rename view with existing flag', async () => {
140
+ const users = sqliteTable('users', {
141
+ id: int('id').primaryKey({ autoIncrement: true }),
142
+ });
143
+
144
+ const from = {
145
+ users: users,
146
+ testView: sqliteView('view', { id: int('id') }).existing(),
147
+ };
148
+ const to = {
149
+ users,
150
+ testView: sqliteView('new_view', { id: int('id') }).existing(),
151
+ };
152
+ const { statements, sqlStatements } = await diffTestSchemasLibSQL(from, to, ['view->new_view']);
153
+
154
+ expect(statements.length).toBe(0);
155
+ expect(sqlStatements.length).toBe(0);
156
+ });
157
+
158
+ test('rename view and drop existing flag', async () => {
159
+ const users = sqliteTable('users', {
160
+ id: int('id').primaryKey({ autoIncrement: true }),
161
+ });
162
+
163
+ const from = {
164
+ users: users,
165
+ testView: sqliteView('view', { id: int('id') }).existing(),
166
+ };
167
+ const to = {
168
+ users,
169
+ testView: sqliteView('new_view', { id: int('id') }).as(sql`SELECT * FROM users`),
170
+ };
171
+ const { statements, sqlStatements } = await diffTestSchemasLibSQL(from, to, ['view->new_view']);
172
+
173
+ expect(statements.length).toBe(2);
174
+ expect(statements[0]).toStrictEqual({
175
+ name: 'view',
176
+ type: 'drop_view',
177
+ });
178
+ expect(statements[1]).toStrictEqual({
179
+ type: 'sqlite_create_view',
180
+ name: 'new_view',
181
+ definition: 'SELECT * FROM users',
182
+ });
183
+
184
+ expect(sqlStatements.length).toBe(2);
185
+ expect(sqlStatements[0]).toBe('DROP VIEW `view`;');
186
+ expect(sqlStatements[1]).toBe(`CREATE VIEW \`new_view\` AS SELECT * FROM users;`);
187
+ });
188
+
189
+ test('rename view and alter ".as"', async () => {
190
+ const users = sqliteTable('users', {
191
+ id: int('id').primaryKey({ autoIncrement: true }),
192
+ });
193
+
194
+ const from = {
195
+ users: users,
196
+ testView: sqliteView('view', { id: int('id') }).as(sql`SELECT * FROM users`),
197
+ };
198
+ const to = {
199
+ users,
200
+ testView: sqliteView('new_view', { id: int('id') }).as(sql`SELECT * FROM users WHERE 1=1`),
201
+ };
202
+ const { statements, sqlStatements } = await diffTestSchemasLibSQL(from, to, ['view->new_view']);
203
+
204
+ expect(statements.length).toBe(2);
205
+ expect(statements[0]).toStrictEqual({
206
+ name: 'view',
207
+ type: 'drop_view',
208
+ });
209
+ expect(statements[1]).toStrictEqual({
210
+ type: 'sqlite_create_view',
211
+ name: 'new_view',
212
+ definition: 'SELECT * FROM users WHERE 1=1',
213
+ });
214
+
215
+ expect(sqlStatements.length).toBe(2);
216
+ expect(sqlStatements[0]).toBe('DROP VIEW `view`;');
217
+ expect(sqlStatements[1]).toBe(`CREATE VIEW \`new_view\` AS SELECT * FROM users WHERE 1=1;`);
218
+ });
@@ -0,0 +1,6 @@
1
+ import { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core';
2
+
3
+ export const users = sqliteTable('users', {
4
+ id: integer('id').primaryKey().notNull(),
5
+ name: text('name').notNull(),
6
+ });
@@ -0,0 +1,58 @@
1
+ import { createClient } from '@libsql/client';
2
+ import { connectToLibSQL } from 'src/cli/connections';
3
+ import { expect, test } from 'vitest';
4
+
5
+ test('validate migrate function', async () => {
6
+ const credentials = {
7
+ url: ':memory:',
8
+ };
9
+ const { migrate, query } = await connectToLibSQL(credentials);
10
+
11
+ await migrate({ migrationsFolder: 'tests/migrate/migrations' });
12
+
13
+ const res = await query(`PRAGMA table_info("users");`);
14
+
15
+ expect(res).toStrictEqual([{
16
+ cid: 0,
17
+ name: 'id',
18
+ type: 'INTEGER',
19
+ notnull: 0,
20
+ dflt_value: null,
21
+ pk: 0,
22
+ }, {
23
+ cid: 1,
24
+ name: 'name',
25
+ type: 'INTEGER',
26
+ notnull: 1,
27
+ dflt_value: null,
28
+ pk: 0,
29
+ }]);
30
+ });
31
+
32
+ // test('validate migrate function', async () => {
33
+ // const credentials = {
34
+ // url: '',
35
+ // authToken: '',
36
+ // };
37
+ // const { migrate, query } = await connectToLibSQL(credentials);
38
+
39
+ // await migrate({ migrationsFolder: 'tests/migrate/migrations' });
40
+
41
+ // const res = await query(`PRAGMA table_info("users");`);
42
+
43
+ // expect(res).toStrictEqual([{
44
+ // cid: 0,
45
+ // name: 'id',
46
+ // type: 'INTEGER',
47
+ // notnull: 0,
48
+ // dflt_value: null,
49
+ // pk: 0,
50
+ // }, {
51
+ // cid: 1,
52
+ // name: 'name',
53
+ // type: 'INTEGER',
54
+ // notnull: 1,
55
+ // dflt_value: null,
56
+ // pk: 0,
57
+ // }]);
58
+ // });
@@ -0,0 +1,4 @@
1
+ CREATE TABLE `users` (
2
+ `id` integer PRIMARY KEY NOT NULL,
3
+ `name` text NOT NULL
4
+ );
@@ -0,0 +1,10 @@
1
+ PRAGMA foreign_keys=OFF;--> statement-breakpoint
2
+ CREATE TABLE `__new_users` (
3
+ `id` integer,
4
+ `name` integer NOT NULL
5
+ );
6
+ --> statement-breakpoint
7
+ INSERT INTO `__new_users`("id", "name") SELECT "id", "name" FROM `users`;--> statement-breakpoint
8
+ DROP TABLE `users`;--> statement-breakpoint
9
+ ALTER TABLE `__new_users` RENAME TO `users`;--> statement-breakpoint
10
+ PRAGMA foreign_keys=ON;
@@ -0,0 +1,40 @@
1
+ {
2
+ "version": "6",
3
+ "dialect": "sqlite",
4
+ "id": "2bd46776-9e41-4a6c-b617-5c600bb176f2",
5
+ "prevId": "00000000-0000-0000-0000-000000000000",
6
+ "tables": {
7
+ "users": {
8
+ "name": "users",
9
+ "columns": {
10
+ "id": {
11
+ "name": "id",
12
+ "type": "integer",
13
+ "primaryKey": true,
14
+ "notNull": true,
15
+ "autoincrement": false
16
+ },
17
+ "name": {
18
+ "name": "name",
19
+ "type": "text",
20
+ "primaryKey": false,
21
+ "notNull": true,
22
+ "autoincrement": false
23
+ }
24
+ },
25
+ "indexes": {},
26
+ "foreignKeys": {},
27
+ "compositePrimaryKeys": {},
28
+ "uniqueConstraints": {}
29
+ }
30
+ },
31
+ "enums": {},
32
+ "_meta": {
33
+ "schemas": {},
34
+ "tables": {},
35
+ "columns": {}
36
+ },
37
+ "internal": {
38
+ "indexes": {}
39
+ }
40
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "version": "6",
3
+ "dialect": "sqlite",
4
+ "id": "6c0ec455-42fd-47fd-a22c-4bb4551e1358",
5
+ "prevId": "2bd46776-9e41-4a6c-b617-5c600bb176f2",
6
+ "tables": {
7
+ "users": {
8
+ "name": "users",
9
+ "columns": {
10
+ "id": {
11
+ "name": "id",
12
+ "type": "integer",
13
+ "primaryKey": false,
14
+ "notNull": false,
15
+ "autoincrement": false
16
+ },
17
+ "name": {
18
+ "name": "name",
19
+ "type": "integer",
20
+ "primaryKey": false,
21
+ "notNull": true,
22
+ "autoincrement": false
23
+ }
24
+ },
25
+ "indexes": {},
26
+ "foreignKeys": {},
27
+ "compositePrimaryKeys": {},
28
+ "uniqueConstraints": {}
29
+ }
30
+ },
31
+ "enums": {},
32
+ "_meta": {
33
+ "schemas": {},
34
+ "tables": {},
35
+ "columns": {}
36
+ },
37
+ "internal": {
38
+ "indexes": {}
39
+ }
40
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "version": "7",
3
+ "dialect": "sqlite",
4
+ "entries": [
5
+ {
6
+ "idx": 0,
7
+ "version": "6",
8
+ "when": 1725358702427,
9
+ "tag": "0000_little_blizzard",
10
+ "breakpoints": true
11
+ },
12
+ {
13
+ "idx": 1,
14
+ "version": "6",
15
+ "when": 1725358713033,
16
+ "tag": "0001_nebulous_storm",
17
+ "breakpoints": true
18
+ }
19
+ ]
20
+ }
@@ -0,0 +1,291 @@
1
+ import { sql } from 'drizzle-orm';
2
+ import { check, int, mysqlTable, serial, varchar } from 'drizzle-orm/mysql-core';
3
+ import { expect, test } from 'vitest';
4
+ import { diffTestSchemasMysql } from './schemaDiffer';
5
+
6
+ test('create table with check', async (t) => {
7
+ const to = {
8
+ users: mysqlTable('users', {
9
+ id: serial('id').primaryKey(),
10
+ age: int('age'),
11
+ }, (table) => ({
12
+ checkConstraint: check('some_check_name', sql`${table.age} > 21`),
13
+ })),
14
+ };
15
+
16
+ const { sqlStatements, statements } = await diffTestSchemasMysql({}, to, []);
17
+
18
+ expect(statements.length).toBe(1);
19
+ expect(statements[0]).toStrictEqual({
20
+ type: 'create_table',
21
+ tableName: 'users',
22
+ columns: [
23
+ {
24
+ name: 'id',
25
+ type: 'serial',
26
+ notNull: true,
27
+ primaryKey: false,
28
+ autoincrement: true,
29
+ },
30
+ {
31
+ name: 'age',
32
+ type: 'int',
33
+ notNull: false,
34
+ primaryKey: false,
35
+ autoincrement: false,
36
+ },
37
+ ],
38
+ compositePKs: [
39
+ 'users_id;id',
40
+ ],
41
+ checkConstraints: ['some_check_name;\`users\`.\`age\` > 21'],
42
+ compositePkName: 'users_id',
43
+ uniqueConstraints: [],
44
+ schema: undefined,
45
+ internals: {
46
+ tables: {},
47
+ indexes: {},
48
+ },
49
+ });
50
+
51
+ expect(sqlStatements.length).toBe(1);
52
+ expect(sqlStatements[0]).toBe(`CREATE TABLE \`users\` (
53
+ \t\`id\` serial AUTO_INCREMENT NOT NULL,
54
+ \t\`age\` int,
55
+ \tCONSTRAINT \`users_id\` PRIMARY KEY(\`id\`),
56
+ \tCONSTRAINT \`some_check_name\` CHECK(\`users\`.\`age\` > 21)
57
+ );\n`);
58
+ });
59
+
60
+ test('add check contraint to existing table', async (t) => {
61
+ const from = {
62
+ users: mysqlTable('users', {
63
+ id: serial('id').primaryKey(),
64
+ age: int('age'),
65
+ }),
66
+ };
67
+
68
+ const to = {
69
+ users: mysqlTable('users', {
70
+ id: serial('id').primaryKey(),
71
+ age: int('age'),
72
+ }, (table) => ({
73
+ checkConstraint: check('some_check_name', sql`${table.age} > 21`),
74
+ })),
75
+ };
76
+
77
+ const { sqlStatements, statements } = await diffTestSchemasMysql(from, to, []);
78
+
79
+ expect(statements.length).toBe(1);
80
+ expect(statements[0]).toStrictEqual({
81
+ type: 'create_check_constraint',
82
+ tableName: 'users',
83
+ data: 'some_check_name;\`users\`.\`age\` > 21',
84
+ schema: '',
85
+ });
86
+
87
+ expect(sqlStatements.length).toBe(1);
88
+ expect(sqlStatements[0]).toBe(
89
+ `ALTER TABLE \`users\` ADD CONSTRAINT \`some_check_name\` CHECK (\`users\`.\`age\` > 21);`,
90
+ );
91
+ });
92
+
93
+ test('drop check contraint in existing table', async (t) => {
94
+ const to = {
95
+ users: mysqlTable('users', {
96
+ id: serial('id').primaryKey(),
97
+ age: int('age'),
98
+ }),
99
+ };
100
+
101
+ const from = {
102
+ users: mysqlTable('users', {
103
+ id: serial('id').primaryKey(),
104
+ age: int('age'),
105
+ }, (table) => ({
106
+ checkConstraint: check('some_check_name', sql`${table.age} > 21`),
107
+ })),
108
+ };
109
+
110
+ const { sqlStatements, statements } = await diffTestSchemasMysql(from, to, []);
111
+
112
+ expect(statements.length).toBe(1);
113
+ expect(statements[0]).toStrictEqual({
114
+ type: 'delete_check_constraint',
115
+ tableName: 'users',
116
+ schema: '',
117
+ constraintName: 'some_check_name',
118
+ });
119
+
120
+ expect(sqlStatements.length).toBe(1);
121
+ expect(sqlStatements[0]).toBe(
122
+ `ALTER TABLE \`users\` DROP CONSTRAINT \`some_check_name\`;`,
123
+ );
124
+ });
125
+
126
+ test('rename check constraint', async (t) => {
127
+ const from = {
128
+ users: mysqlTable('users', {
129
+ id: serial('id').primaryKey(),
130
+ age: int('age'),
131
+ }, (table) => ({
132
+ checkConstraint: check('some_check_name', sql`${table.age} > 21`),
133
+ })),
134
+ };
135
+
136
+ const to = {
137
+ users: mysqlTable('users', {
138
+ id: serial('id').primaryKey(),
139
+ age: int('age'),
140
+ }, (table) => ({
141
+ checkConstraint: check('new_check_name', sql`${table.age} > 21`),
142
+ })),
143
+ };
144
+
145
+ const { sqlStatements, statements } = await diffTestSchemasMysql(from, to, []);
146
+
147
+ expect(statements.length).toBe(2);
148
+ expect(statements[0]).toStrictEqual({
149
+ constraintName: 'some_check_name',
150
+ schema: '',
151
+ tableName: 'users',
152
+ type: 'delete_check_constraint',
153
+ });
154
+ expect(statements[1]).toStrictEqual({
155
+ data: 'new_check_name;\`users\`.\`age\` > 21',
156
+ schema: '',
157
+ tableName: 'users',
158
+ type: 'create_check_constraint',
159
+ });
160
+
161
+ expect(sqlStatements.length).toBe(2);
162
+ expect(sqlStatements[0]).toBe(
163
+ `ALTER TABLE \`users\` DROP CONSTRAINT \`some_check_name\`;`,
164
+ );
165
+ expect(sqlStatements[1]).toBe(
166
+ `ALTER TABLE \`users\` ADD CONSTRAINT \`new_check_name\` CHECK (\`users\`.\`age\` > 21);`,
167
+ );
168
+ });
169
+
170
+ test('alter check constraint', async (t) => {
171
+ const from = {
172
+ users: mysqlTable('users', {
173
+ id: serial('id').primaryKey(),
174
+ age: int('age'),
175
+ }, (table) => ({
176
+ checkConstraint: check('some_check_name', sql`${table.age} > 21`),
177
+ })),
178
+ };
179
+
180
+ const to = {
181
+ users: mysqlTable('users', {
182
+ id: serial('id').primaryKey(),
183
+ age: int('age'),
184
+ }, (table) => ({
185
+ checkConstraint: check('new_check_name', sql`${table.age} > 10`),
186
+ })),
187
+ };
188
+
189
+ const { sqlStatements, statements } = await diffTestSchemasMysql(from, to, []);
190
+ expect(statements.length).toBe(2);
191
+ expect(statements[0]).toStrictEqual({
192
+ constraintName: 'some_check_name',
193
+ schema: '',
194
+ tableName: 'users',
195
+ type: 'delete_check_constraint',
196
+ });
197
+ expect(statements[1]).toStrictEqual({
198
+ data: 'new_check_name;\`users\`.\`age\` > 10',
199
+ schema: '',
200
+ tableName: 'users',
201
+ type: 'create_check_constraint',
202
+ });
203
+
204
+ expect(sqlStatements.length).toBe(2);
205
+ expect(sqlStatements[0]).toBe(
206
+ `ALTER TABLE \`users\` DROP CONSTRAINT \`some_check_name\`;`,
207
+ );
208
+ expect(sqlStatements[1]).toBe(
209
+ `ALTER TABLE \`users\` ADD CONSTRAINT \`new_check_name\` CHECK (\`users\`.\`age\` > 10);`,
210
+ );
211
+ });
212
+
213
+ test('alter multiple check constraints', async (t) => {
214
+ const from = {
215
+ users: mysqlTable('users', {
216
+ id: serial('id').primaryKey(),
217
+ age: int('age'),
218
+ name: varchar('name', { length: 255 }),
219
+ }, (table) => ({
220
+ checkConstraint1: check('some_check_name_1', sql`${table.age} > 21`),
221
+ checkConstraint2: check('some_check_name_2', sql`${table.name} != 'Alex'`),
222
+ })),
223
+ };
224
+
225
+ const to = {
226
+ users: mysqlTable('users', {
227
+ id: serial('id').primaryKey(),
228
+ age: int('age'),
229
+ name: varchar('name', { length: 255 }),
230
+ }, (table) => ({
231
+ checkConstraint1: check('some_check_name_3', sql`${table.age} > 21`),
232
+ checkConstraint2: check('some_check_name_4', sql`${table.name} != 'Alex'`),
233
+ })),
234
+ };
235
+
236
+ const { sqlStatements, statements } = await diffTestSchemasMysql(from, to, []);
237
+ expect(statements.length).toBe(4);
238
+ expect(statements[0]).toStrictEqual({
239
+ constraintName: 'some_check_name_1',
240
+ schema: '',
241
+ tableName: 'users',
242
+ type: 'delete_check_constraint',
243
+ });
244
+ expect(statements[1]).toStrictEqual({
245
+ constraintName: 'some_check_name_2',
246
+ schema: '',
247
+ tableName: 'users',
248
+ type: 'delete_check_constraint',
249
+ });
250
+ expect(statements[2]).toStrictEqual({
251
+ data: 'some_check_name_3;\`users\`.\`age\` > 21',
252
+ schema: '',
253
+ tableName: 'users',
254
+ type: 'create_check_constraint',
255
+ });
256
+ expect(statements[3]).toStrictEqual({
257
+ data: "some_check_name_4;\`users\`.\`name\` != 'Alex'",
258
+ schema: '',
259
+ tableName: 'users',
260
+ type: 'create_check_constraint',
261
+ });
262
+
263
+ expect(sqlStatements.length).toBe(4);
264
+ expect(sqlStatements[0]).toBe(
265
+ `ALTER TABLE \`users\` DROP CONSTRAINT \`some_check_name_1\`;`,
266
+ );
267
+ expect(sqlStatements[1]).toBe(
268
+ `ALTER TABLE \`users\` DROP CONSTRAINT \`some_check_name_2\`;`,
269
+ );
270
+ expect(sqlStatements[2]).toBe(
271
+ `ALTER TABLE \`users\` ADD CONSTRAINT \`some_check_name_3\` CHECK (\`users\`.\`age\` > 21);`,
272
+ );
273
+ expect(sqlStatements[3]).toBe(
274
+ `ALTER TABLE \`users\` ADD CONSTRAINT \`some_check_name_4\` CHECK (\`users\`.\`name\` != \'Alex\');`,
275
+ );
276
+ });
277
+
278
+ test('create checks with same names', async (t) => {
279
+ const to = {
280
+ users: mysqlTable('users', {
281
+ id: serial('id').primaryKey(),
282
+ age: int('age'),
283
+ name: varchar('name', { length: 255 }),
284
+ }, (table) => ({
285
+ checkConstraint1: check('some_check_name', sql`${table.age} > 21`),
286
+ checkConstraint2: check('some_check_name', sql`${table.name} != 'Alex'`),
287
+ })),
288
+ };
289
+
290
+ await expect(diffTestSchemasMysql({}, to, [])).rejects.toThrowError();
291
+ });