@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,245 @@
1
+ import { sql } from 'drizzle-orm';
2
+ import { index, pgTable, serial, text, vector } from 'drizzle-orm/pg-core';
3
+ import { JsonCreateIndexStatement } from 'src/jsonStatements';
4
+ import { PgSquasher } from 'src/serializer/pgSchema';
5
+ import { diffTestSchemas } from 'tests/schemaDiffer';
6
+ import { expect } from 'vitest';
7
+ import { DialectSuite, run } from './common';
8
+
9
+ const pgSuite: DialectSuite = {
10
+ async vectorIndex() {
11
+ const schema1 = {
12
+ users: pgTable('users', {
13
+ id: serial('id').primaryKey(),
14
+ name: vector('name', { dimensions: 3 }),
15
+ }),
16
+ };
17
+
18
+ const schema2 = {
19
+ users: pgTable(
20
+ 'users',
21
+ {
22
+ id: serial('id').primaryKey(),
23
+ embedding: vector('name', { dimensions: 3 }),
24
+ },
25
+ (t) => ({
26
+ indx2: index('vector_embedding_idx')
27
+ .using('hnsw', t.embedding.op('vector_ip_ops'))
28
+ .with({ m: 16, ef_construction: 64 }),
29
+ }),
30
+ ),
31
+ };
32
+
33
+ const { statements, sqlStatements } = await diffTestSchemas(
34
+ schema1,
35
+ schema2,
36
+ [],
37
+ );
38
+
39
+ expect(statements.length).toBe(1);
40
+ expect(statements[0]).toStrictEqual({
41
+ schema: '',
42
+ tableName: 'users',
43
+ type: 'create_index_pg',
44
+ data: {
45
+ columns: [
46
+ {
47
+ asc: true,
48
+ expression: 'name',
49
+ isExpression: false,
50
+ nulls: 'last',
51
+ opclass: 'vector_ip_ops',
52
+ },
53
+ ],
54
+ concurrently: false,
55
+ isUnique: false,
56
+ method: 'hnsw',
57
+ name: 'vector_embedding_idx',
58
+ where: undefined,
59
+ with: {
60
+ ef_construction: 64,
61
+ m: 16,
62
+ },
63
+ },
64
+ });
65
+ expect(sqlStatements.length).toBe(1);
66
+ expect(sqlStatements[0]).toBe(
67
+ `CREATE INDEX "vector_embedding_idx" ON "users" USING hnsw ("name" vector_ip_ops) WITH (m=16,ef_construction=64);`,
68
+ );
69
+ },
70
+
71
+ async indexesToBeTriggered() {
72
+ const schema1 = {
73
+ users: pgTable(
74
+ 'users',
75
+ {
76
+ id: serial('id').primaryKey(),
77
+ name: text('name'),
78
+ },
79
+ (t) => ({
80
+ indx: index('indx').on(t.name.desc()).concurrently(),
81
+ indx1: index('indx1')
82
+ .on(t.name.desc())
83
+ .where(sql`true`),
84
+ indx2: index('indx2')
85
+ .on(t.name.op('text_ops'))
86
+ .where(sql`true`),
87
+ indx3: index('indx3')
88
+ .on(sql`lower(name)`)
89
+ .where(sql`true`),
90
+ }),
91
+ ),
92
+ };
93
+
94
+ const schema2 = {
95
+ users: pgTable(
96
+ 'users',
97
+ {
98
+ id: serial('id').primaryKey(),
99
+ name: text('name'),
100
+ },
101
+ (t) => ({
102
+ indx: index('indx').on(t.name.desc()),
103
+ indx1: index('indx1')
104
+ .on(t.name.desc())
105
+ .where(sql`false`),
106
+ indx2: index('indx2')
107
+ .on(t.name.op('test'))
108
+ .where(sql`true`),
109
+ indx3: index('indx3')
110
+ .on(sql`lower(${t.id})`)
111
+ .where(sql`true`),
112
+ indx4: index('indx4')
113
+ .on(sql`lower(id)`)
114
+ .where(sql`true`),
115
+ }),
116
+ ),
117
+ };
118
+
119
+ const { statements, sqlStatements } = await diffTestSchemas(
120
+ schema1,
121
+ schema2,
122
+ [],
123
+ );
124
+
125
+ expect(sqlStatements).toStrictEqual([
126
+ 'DROP INDEX "indx";',
127
+ 'DROP INDEX "indx1";',
128
+ 'DROP INDEX "indx2";',
129
+ 'DROP INDEX "indx3";',
130
+ 'CREATE INDEX "indx4" ON "users" USING btree (lower(id)) WHERE true;',
131
+ 'CREATE INDEX "indx" ON "users" USING btree ("name" DESC NULLS LAST);',
132
+ 'CREATE INDEX "indx1" ON "users" USING btree ("name" DESC NULLS LAST) WHERE false;',
133
+ 'CREATE INDEX "indx2" ON "users" USING btree ("name" test) WHERE true;',
134
+ 'CREATE INDEX "indx3" ON "users" USING btree (lower("id")) WHERE true;',
135
+ ]);
136
+ },
137
+
138
+ async simpleIndex() {
139
+ const schema1 = {
140
+ users: pgTable('users', {
141
+ id: serial('id').primaryKey(),
142
+ name: text('name'),
143
+ }),
144
+ };
145
+
146
+ const schema2 = {
147
+ users: pgTable(
148
+ 'users',
149
+ {
150
+ id: serial('id').primaryKey(),
151
+ name: text('name'),
152
+ },
153
+ (t) => ({
154
+ indx: index()
155
+ .on(t.name.desc(), t.id.asc().nullsLast())
156
+ .with({ fillfactor: 70 })
157
+ .where(sql`select 1`),
158
+ indx1: index('indx1')
159
+ .using('hash', t.name.desc(), sql`${t.name}`)
160
+ .with({ fillfactor: 70 }),
161
+ }),
162
+ ),
163
+ };
164
+
165
+ const { statements, sqlStatements } = await diffTestSchemas(
166
+ schema1,
167
+ schema2,
168
+ [],
169
+ );
170
+
171
+ expect(statements.length).toBe(2);
172
+ expect(statements[0]).toStrictEqual({
173
+ schema: '',
174
+ tableName: 'users',
175
+ type: 'create_index_pg',
176
+ data: {
177
+ columns: [
178
+ {
179
+ asc: false,
180
+ expression: 'name',
181
+ isExpression: false,
182
+ nulls: 'last',
183
+ opclass: '',
184
+ },
185
+ {
186
+ asc: true,
187
+ expression: 'id',
188
+ isExpression: false,
189
+ nulls: 'last',
190
+ opclass: '',
191
+ },
192
+ ],
193
+ concurrently: false,
194
+ isUnique: false,
195
+ method: 'btree',
196
+ name: 'users_name_id_index',
197
+ where: 'select 1',
198
+ with: {
199
+ fillfactor: 70,
200
+ },
201
+ },
202
+ // data: 'users_name_id_index;name,false,last,undefined,,id,true,last,undefined;false;false;btree;select 1;{"fillfactor":70}',
203
+ });
204
+ expect(statements[1]).toStrictEqual({
205
+ schema: '',
206
+ tableName: 'users',
207
+ type: 'create_index_pg',
208
+ data: {
209
+ columns: [
210
+ {
211
+ asc: false,
212
+ expression: 'name',
213
+ isExpression: false,
214
+ nulls: 'last',
215
+ opclass: '',
216
+ },
217
+ {
218
+ asc: true,
219
+ expression: '"name"',
220
+ isExpression: true,
221
+ nulls: 'last',
222
+ opclass: '',
223
+ },
224
+ ],
225
+ concurrently: false,
226
+ isUnique: false,
227
+ method: 'hash',
228
+ name: 'indx1',
229
+ where: undefined,
230
+ with: {
231
+ fillfactor: 70,
232
+ },
233
+ },
234
+ });
235
+ expect(sqlStatements.length).toBe(2);
236
+ expect(sqlStatements[0]).toBe(
237
+ `CREATE INDEX "users_name_id_index" ON "users" USING btree ("name" DESC NULLS LAST,"id") WITH (fillfactor=70) WHERE select 1;`,
238
+ );
239
+ expect(sqlStatements[1]).toBe(
240
+ `CREATE INDEX "indx1" ON "users" USING hash ("name" DESC NULLS LAST,"name") WITH (fillfactor=70);`,
241
+ );
242
+ },
243
+ };
244
+
245
+ run(pgSuite);
@@ -0,0 +1,35 @@
1
+ import { createClient } from '@libsql/client';
2
+ import { sql } from 'drizzle-orm';
3
+ import { int, sqliteTable, sqliteView } from 'drizzle-orm/sqlite-core';
4
+ import fs from 'fs';
5
+ import { introspectLibSQLToFile, introspectMySQLToFile, introspectSQLiteToFile } from 'tests/schemaDiffer';
6
+ import { expect, test } from 'vitest';
7
+
8
+ if (!fs.existsSync('tests/introspect/libsql')) {
9
+ fs.mkdirSync('tests/introspect/libsql');
10
+ }
11
+
12
+ test('view #1', async () => {
13
+ const turso = createClient({
14
+ url: ':memory:',
15
+ });
16
+
17
+ const users = sqliteTable('users', { id: int('id') });
18
+ const testView = sqliteView('some_view', { id: int('id') }).as(
19
+ sql`SELECT * FROM ${users}`,
20
+ );
21
+
22
+ const schema = {
23
+ users: users,
24
+ testView,
25
+ };
26
+
27
+ const { statements, sqlStatements } = await introspectLibSQLToFile(
28
+ turso,
29
+ schema,
30
+ 'view-1',
31
+ );
32
+
33
+ expect(statements.length).toBe(0);
34
+ expect(sqlStatements.length).toBe(0);
35
+ });
@@ -0,0 +1,319 @@
1
+ import 'dotenv/config';
2
+ import Docker from 'dockerode';
3
+ import { SQL, sql } from 'drizzle-orm';
4
+ import {
5
+ bigint,
6
+ char,
7
+ check,
8
+ decimal,
9
+ double,
10
+ float,
11
+ int,
12
+ mediumint,
13
+ mysqlEnum,
14
+ mysqlTable,
15
+ mysqlView,
16
+ serial,
17
+ smallint,
18
+ text,
19
+ tinyint,
20
+ varchar,
21
+ } from 'drizzle-orm/mysql-core';
22
+ import * as fs from 'fs';
23
+ import getPort from 'get-port';
24
+ import { Connection, createConnection } from 'mysql2/promise';
25
+ import { introspectMySQLToFile } from 'tests/schemaDiffer';
26
+ import { v4 as uuid } from 'uuid';
27
+ import { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';
28
+
29
+ let client: Connection;
30
+ let mysqlContainer: Docker.Container;
31
+
32
+ async function createDockerDB(): Promise<string> {
33
+ const docker = new Docker();
34
+ const port = await getPort({ port: 3306 });
35
+ const image = 'mysql:8';
36
+
37
+ const pullStream = await docker.pull(image);
38
+ await new Promise((resolve, reject) =>
39
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
40
+ docker.modem.followProgress(pullStream, (err) => err ? reject(err) : resolve(err))
41
+ );
42
+
43
+ mysqlContainer = await docker.createContainer({
44
+ Image: image,
45
+ Env: ['MYSQL_ROOT_PASSWORD=mysql', 'MYSQL_DATABASE=drizzle'],
46
+ name: `drizzle-integration-tests-${uuid()}`,
47
+ HostConfig: {
48
+ AutoRemove: true,
49
+ PortBindings: {
50
+ '3306/tcp': [{ HostPort: `${port}` }],
51
+ },
52
+ },
53
+ });
54
+
55
+ await mysqlContainer.start();
56
+
57
+ return `mysql://root:mysql@127.0.0.1:${port}/drizzle`;
58
+ }
59
+
60
+ beforeAll(async () => {
61
+ const connectionString = process.env.MYSQL_CONNECTION_STRING ?? await createDockerDB();
62
+
63
+ const sleep = 1000;
64
+ let timeLeft = 20000;
65
+ let connected = false;
66
+ let lastError: unknown | undefined;
67
+ do {
68
+ try {
69
+ client = await createConnection(connectionString);
70
+ await client.connect();
71
+ connected = true;
72
+ break;
73
+ } catch (e) {
74
+ lastError = e;
75
+ await new Promise((resolve) => setTimeout(resolve, sleep));
76
+ timeLeft -= sleep;
77
+ }
78
+ } while (timeLeft > 0);
79
+ if (!connected) {
80
+ console.error('Cannot connect to MySQL');
81
+ await client?.end().catch(console.error);
82
+ await mysqlContainer?.stop().catch(console.error);
83
+ throw lastError;
84
+ }
85
+ });
86
+
87
+ afterAll(async () => {
88
+ await client?.end().catch(console.error);
89
+ await mysqlContainer?.stop().catch(console.error);
90
+ });
91
+
92
+ beforeEach(async () => {
93
+ await client.query(`drop database if exists \`drizzle\`;`);
94
+ await client.query(`create database \`drizzle\`;`);
95
+ await client.query(`use \`drizzle\`;`);
96
+ });
97
+
98
+ if (!fs.existsSync('tests/introspect/mysql')) {
99
+ fs.mkdirSync('tests/introspect/mysql');
100
+ }
101
+
102
+ test('generated always column: link to another column', async () => {
103
+ const schema = {
104
+ users: mysqlTable('users', {
105
+ id: int('id'),
106
+ email: text('email'),
107
+ generatedEmail: text('generatedEmail').generatedAlwaysAs(
108
+ (): SQL => sql`\`email\``,
109
+ ),
110
+ }),
111
+ };
112
+
113
+ const { statements, sqlStatements } = await introspectMySQLToFile(
114
+ client,
115
+ schema,
116
+ 'generated-link-column',
117
+ 'drizzle',
118
+ );
119
+
120
+ expect(statements.length).toBe(0);
121
+ expect(sqlStatements.length).toBe(0);
122
+ });
123
+
124
+ test('generated always column virtual: link to another column', async () => {
125
+ const schema = {
126
+ users: mysqlTable('users', {
127
+ id: int('id'),
128
+ email: text('email'),
129
+ generatedEmail: text('generatedEmail').generatedAlwaysAs(
130
+ (): SQL => sql`\`email\``,
131
+ { mode: 'virtual' },
132
+ ),
133
+ }),
134
+ };
135
+
136
+ const { statements, sqlStatements } = await introspectMySQLToFile(
137
+ client,
138
+ schema,
139
+ 'generated-link-column-virtual',
140
+ 'drizzle',
141
+ );
142
+
143
+ expect(statements.length).toBe(0);
144
+ expect(sqlStatements.length).toBe(0);
145
+ });
146
+
147
+ test('Default value of character type column: char', async () => {
148
+ const schema = {
149
+ users: mysqlTable('users', {
150
+ id: int('id'),
151
+ sortKey: char('sortKey', { length: 255 }).default('0'),
152
+ }),
153
+ };
154
+
155
+ const { statements, sqlStatements } = await introspectMySQLToFile(
156
+ client,
157
+ schema,
158
+ 'default-value-char-column',
159
+ 'drizzle',
160
+ );
161
+
162
+ expect(statements.length).toBe(0);
163
+ expect(sqlStatements.length).toBe(0);
164
+ });
165
+
166
+ test('Default value of character type column: varchar', async () => {
167
+ const schema = {
168
+ users: mysqlTable('users', {
169
+ id: int('id'),
170
+ sortKey: varchar('sortKey', { length: 255 }).default('0'),
171
+ }),
172
+ };
173
+
174
+ const { statements, sqlStatements } = await introspectMySQLToFile(
175
+ client,
176
+ schema,
177
+ 'default-value-varchar-column',
178
+ 'drizzle',
179
+ );
180
+
181
+ expect(statements.length).toBe(0);
182
+ expect(sqlStatements.length).toBe(0);
183
+ });
184
+
185
+ test('introspect checks', async () => {
186
+ const schema = {
187
+ users: mysqlTable('users', {
188
+ id: serial('id'),
189
+ name: varchar('name', { length: 255 }),
190
+ age: int('age'),
191
+ }, (table) => ({
192
+ someCheck: check('some_check', sql`${table.age} > 21`),
193
+ })),
194
+ };
195
+
196
+ const { statements, sqlStatements } = await introspectMySQLToFile(
197
+ client,
198
+ schema,
199
+ 'introspect-checks',
200
+ 'drizzle',
201
+ );
202
+
203
+ expect(statements.length).toBe(0);
204
+ expect(sqlStatements.length).toBe(0);
205
+ });
206
+
207
+ test('view #1', async () => {
208
+ const users = mysqlTable('users', { id: int('id') });
209
+ const testView = mysqlView('some_view', { id: int('id') }).as(
210
+ sql`select \`drizzle\`.\`users\`.\`id\` AS \`id\` from \`drizzle\`.\`users\``,
211
+ );
212
+
213
+ const schema = {
214
+ users: users,
215
+ testView,
216
+ };
217
+
218
+ const { statements, sqlStatements } = await introspectMySQLToFile(
219
+ client,
220
+ schema,
221
+ 'view-1',
222
+ 'drizzle',
223
+ );
224
+
225
+ expect(statements.length).toBe(0);
226
+ expect(sqlStatements.length).toBe(0);
227
+ });
228
+
229
+ test('view #2', async () => {
230
+ const users = mysqlTable('some_users', { id: int('id') });
231
+ const testView = mysqlView('some_view', { id: int('id') }).algorithm('temptable').sqlSecurity('definer').as(
232
+ sql`SELECT * FROM ${users}`,
233
+ );
234
+
235
+ const schema = {
236
+ users: users,
237
+ testView,
238
+ };
239
+
240
+ const { statements, sqlStatements } = await introspectMySQLToFile(
241
+ client,
242
+ schema,
243
+ 'view-2',
244
+ 'drizzle',
245
+ );
246
+
247
+ expect(statements.length).toBe(0);
248
+ expect(sqlStatements.length).toBe(0);
249
+ });
250
+
251
+ test('handle float type', async () => {
252
+ const schema = {
253
+ table: mysqlTable('table', {
254
+ col1: float(),
255
+ col2: float({ precision: 2 }),
256
+ col3: float({ precision: 2, scale: 1 }),
257
+ }),
258
+ };
259
+
260
+ const { statements, sqlStatements } = await introspectMySQLToFile(
261
+ client,
262
+ schema,
263
+ 'handle-float-type',
264
+ 'drizzle',
265
+ );
266
+
267
+ expect(statements.length).toBe(0);
268
+ expect(sqlStatements.length).toBe(0);
269
+ });
270
+
271
+ test('handle unsigned numerical types', async () => {
272
+ const schema = {
273
+ table: mysqlTable('table', {
274
+ col1: int({ unsigned: true }),
275
+ col2: tinyint({ unsigned: true }),
276
+ col3: smallint({ unsigned: true }),
277
+ col4: mediumint({ unsigned: true }),
278
+ col5: bigint({ mode: 'number', unsigned: true }),
279
+ col6: float({ unsigned: true }),
280
+ col7: float({ precision: 2, scale: 1, unsigned: true }),
281
+ col8: double({ unsigned: true }),
282
+ col9: double({ precision: 2, scale: 1, unsigned: true }),
283
+ col10: decimal({ unsigned: true }),
284
+ col11: decimal({ precision: 2, scale: 1, unsigned: true }),
285
+ }),
286
+ };
287
+
288
+ const { statements, sqlStatements } = await introspectMySQLToFile(
289
+ client,
290
+ schema,
291
+ 'handle-unsigned-numerical-types',
292
+ 'drizzle',
293
+ );
294
+
295
+ expect(statements.length).toBe(0);
296
+ expect(sqlStatements.length).toBe(0);
297
+ });
298
+
299
+ test('instrospect strings with single quotes', async () => {
300
+ const schema = {
301
+ columns: mysqlTable('columns', {
302
+ enum: mysqlEnum('my_enum', ['escape\'s quotes "', 'escape\'s quotes 2 "']).default('escape\'s quotes "'),
303
+ text: text('text').default('escape\'s quotes " '),
304
+ varchar: varchar('varchar', { length: 255 }).default('escape\'s quotes " '),
305
+ }),
306
+ };
307
+
308
+ const { statements, sqlStatements } = await introspectMySQLToFile(
309
+ client,
310
+ schema,
311
+ 'introspect-strings-with-single-quotes',
312
+ 'drizzle',
313
+ );
314
+
315
+ expect(statements.length).toBe(0);
316
+ expect(sqlStatements.length).toBe(0);
317
+
318
+ await client.query(`drop table columns;`);
319
+ });