@anthonyalayo/drizzle-kit 1.0.2 → 1.0.5
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.
- package/api.d.mts +2891 -0
- package/api.d.ts +2891 -0
- package/api.js +47534 -0
- package/api.mjs +47521 -0
- package/bin.cjs +80043 -0
- package/{src/index.ts → index-Z-1TKnbX.d.mts} +123 -141
- package/index-Z-1TKnbX.d.ts +308 -0
- package/index.d.mts +2 -0
- package/index.d.ts +2 -0
- package/index.js +32 -0
- package/index.mjs +7 -0
- package/package.json +2 -2
- package/utils.js +6056 -0
- package/utils.mjs +6032 -0
- package/.gitignore +0 -25
- package/build.dev.ts +0 -51
- package/build.ts +0 -112
- package/imports-checker/analyze.ts +0 -78
- package/imports-checker/checker.ts +0 -296
- package/imports-checker/grammar/grammar.ohm +0 -121
- package/imports-checker/grammar/grammar.ohm-bundle.d.ts +0 -164
- package/imports-checker/grammar/grammar.ohm-bundle.js +0 -753
- package/imports-checker/index.ts +0 -48
- package/patches/difflib@0.2.4.patch +0 -31
- package/src/@types/utils.ts +0 -58
- package/src/api.ts +0 -504
- package/src/cli/commands/_es5.ts +0 -2
- package/src/cli/commands/check.ts +0 -52
- package/src/cli/commands/drop.ts +0 -60
- package/src/cli/commands/introspect.ts +0 -772
- package/src/cli/commands/libSqlPushUtils.ts +0 -355
- package/src/cli/commands/migrate.ts +0 -1526
- package/src/cli/commands/mysqlIntrospect.ts +0 -53
- package/src/cli/commands/mysqlPushUtils.ts +0 -352
- package/src/cli/commands/mysqlUp.ts +0 -102
- package/src/cli/commands/pgIntrospect.ts +0 -55
- package/src/cli/commands/pgPushUtils.ts +0 -269
- package/src/cli/commands/pgUp.ts +0 -217
- package/src/cli/commands/push.ts +0 -637
- package/src/cli/commands/singlestoreIntrospect.ts +0 -53
- package/src/cli/commands/singlestorePushUtils.ts +0 -456
- package/src/cli/commands/singlestoreUp.ts +0 -1
- package/src/cli/commands/sqliteIntrospect.ts +0 -96
- package/src/cli/commands/sqlitePushUtils.ts +0 -322
- package/src/cli/commands/sqliteUp.ts +0 -52
- package/src/cli/commands/utils.ts +0 -858
- package/src/cli/connections.ts +0 -914
- package/src/cli/index.ts +0 -48
- package/src/cli/schema.ts +0 -794
- package/src/cli/selector-ui.ts +0 -38
- package/src/cli/utils.ts +0 -112
- package/src/cli/validations/cli.ts +0 -79
- package/src/cli/validations/common.ts +0 -193
- package/src/cli/validations/libsql.ts +0 -27
- package/src/cli/validations/mysql.ts +0 -61
- package/src/cli/validations/outputs.ts +0 -91
- package/src/cli/validations/postgres.ts +0 -83
- package/src/cli/validations/singlestore.ts +0 -61
- package/src/cli/validations/sqlite.ts +0 -104
- package/src/cli/validations/studio.ts +0 -24
- package/src/cli/views.ts +0 -658
- package/src/extensions/getTablesFilterByExtensions.ts +0 -16
- package/src/extensions/vector.ts +0 -10
- package/src/global.ts +0 -61
- package/src/introspect-mysql.ts +0 -1030
- package/src/introspect-pg.ts +0 -1435
- package/src/introspect-singlestore.ts +0 -913
- package/src/introspect-sqlite.ts +0 -533
- package/src/jsonDiffer.js +0 -882
- package/src/jsonStatements.ts +0 -3590
- package/src/loader.mjs +0 -57
- package/src/migrationPreparator.ts +0 -217
- package/src/schemaValidator.ts +0 -23
- package/src/serializer/index.ts +0 -142
- package/src/serializer/mysqlImports.ts +0 -38
- package/src/serializer/mysqlSchema.ts +0 -423
- package/src/serializer/mysqlSerializer.ts +0 -999
- package/src/serializer/pgImports.ts +0 -106
- package/src/serializer/pgSchema.ts +0 -937
- package/src/serializer/pgSerializer.ts +0 -2223
- package/src/serializer/singlestoreImports.ts +0 -38
- package/src/serializer/singlestoreSchema.ts +0 -257
- package/src/serializer/singlestoreSerializer.ts +0 -767
- package/src/serializer/sqliteImports.ts +0 -41
- package/src/serializer/sqliteSchema.ts +0 -352
- package/src/serializer/sqliteSerializer.ts +0 -931
- package/src/serializer/studio.ts +0 -694
- package/src/serializer/utils.ts +0 -45
- package/src/simulator.ts +0 -157
- package/src/snapshotsDiffer.ts +0 -4398
- package/src/sqlgenerator.ts +0 -4212
- package/src/statementCombiner.ts +0 -597
- package/src/utils/certs.ts +0 -44
- package/src/utils/words.ts +0 -1333
- package/src/utils.ts +0 -370
- package/tests/bin.test.ts +0 -58
- package/tests/cli/d1http.config.ts +0 -12
- package/tests/cli/drizzle.config.ts +0 -9
- package/tests/cli/durable-sqlite.config.ts +0 -7
- package/tests/cli/expo.config.ts +0 -7
- package/tests/cli/postgres.config.ts +0 -13
- package/tests/cli/postgres2.config.ts +0 -17
- package/tests/cli/schema.ts +0 -1
- package/tests/cli/turso.config.ts +0 -10
- package/tests/cli-export.test.ts +0 -79
- package/tests/cli-generate.test.ts +0 -259
- package/tests/cli-migrate.test.ts +0 -103
- package/tests/cli-push.test.ts +0 -126
- package/tests/common.ts +0 -15
- package/tests/indexes/common.ts +0 -21
- package/tests/indexes/pg.test.ts +0 -245
- package/tests/introspect/libsql.test.ts +0 -35
- package/tests/introspect/mysql.test.ts +0 -319
- package/tests/introspect/pg.test.ts +0 -894
- package/tests/introspect/singlestore.test.ts +0 -275
- package/tests/introspect/sqlite.test.ts +0 -122
- package/tests/libsql-checks.test.ts +0 -308
- package/tests/libsql-statements.test.ts +0 -989
- package/tests/libsql-views.test.ts +0 -218
- package/tests/migrate/libsq-schema.ts +0 -6
- package/tests/migrate/libsql-migrate.test.ts +0 -58
- package/tests/migrate/migrations/0000_little_blizzard.sql +0 -4
- package/tests/migrate/migrations/0001_nebulous_storm.sql +0 -10
- package/tests/migrate/migrations/meta/0000_snapshot.json +0 -40
- package/tests/migrate/migrations/meta/0001_snapshot.json +0 -40
- package/tests/migrate/migrations/meta/_journal.json +0 -20
- package/tests/mysql-checks.test.ts +0 -291
- package/tests/mysql-generated.test.ts +0 -1290
- package/tests/mysql-schemas.test.ts +0 -156
- package/tests/mysql-views.test.ts +0 -553
- package/tests/mysql.test.ts +0 -863
- package/tests/pg-array.test.ts +0 -368
- package/tests/pg-checks.test.ts +0 -329
- package/tests/pg-columns.test.ts +0 -484
- package/tests/pg-domains.test.ts +0 -306
- package/tests/pg-enums.test.ts +0 -751
- package/tests/pg-generated.test.ts +0 -529
- package/tests/pg-identity.test.ts +0 -447
- package/tests/pg-schemas.test.ts +0 -105
- package/tests/pg-sequences.test.ts +0 -298
- package/tests/pg-tables.test.ts +0 -1021
- package/tests/pg-views.test.ts +0 -1929
- package/tests/push/common.ts +0 -58
- package/tests/push/libsql.test.ts +0 -1400
- package/tests/push/mysql-push.test.ts +0 -345
- package/tests/push/mysql.test.ts +0 -788
- package/tests/push/pg.test.ts +0 -4341
- package/tests/push/singlestore-push.test.ts +0 -894
- package/tests/push/singlestore.test.ts +0 -444
- package/tests/push/sqlite.test.ts +0 -1613
- package/tests/rls/pg-policy.test.ts +0 -1656
- package/tests/rls/pg-role.test.ts +0 -234
- package/tests/schemaDiffer.ts +0 -2852
- package/tests/singlestore-generated.test.ts +0 -1290
- package/tests/singlestore-schemas.test.ts +0 -155
- package/tests/singlestore.test.ts +0 -978
- package/tests/sqlite-checks.test.ts +0 -308
- package/tests/sqlite-columns.test.ts +0 -1049
- package/tests/sqlite-generated.test.ts +0 -1726
- package/tests/sqlite-tables.test.ts +0 -637
- package/tests/sqlite-views.test.ts +0 -218
- package/tests/statements-combiner/libsql-statements-combiner.test.ts +0 -1812
- package/tests/statements-combiner/singlestore-statements-combiner.test.ts +0 -882
- package/tests/statements-combiner/sqlite-statements-combiner.test.ts +0 -1211
- package/tests/test/sqlite.test.ts +0 -39
- package/tests/testsinglestore.ts +0 -29
- package/tests/validations.test.ts +0 -869
- package/tests/wrap-param.test.ts +0 -16
- package/tsconfig.build.json +0 -4
- package/tsconfig.cli-types.json +0 -9
- package/tsconfig.json +0 -28
- package/vitest.config.ts +0 -34
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
import Docker from 'dockerode';
|
|
2
|
-
import 'dotenv/config';
|
|
3
|
-
import { SQL, sql } from 'drizzle-orm';
|
|
4
|
-
import {
|
|
5
|
-
bigint,
|
|
6
|
-
char,
|
|
7
|
-
decimal,
|
|
8
|
-
double,
|
|
9
|
-
float,
|
|
10
|
-
int,
|
|
11
|
-
mediumint,
|
|
12
|
-
singlestoreTable,
|
|
13
|
-
smallint,
|
|
14
|
-
text,
|
|
15
|
-
tinyint,
|
|
16
|
-
varchar,
|
|
17
|
-
} from 'drizzle-orm/singlestore-core';
|
|
18
|
-
import * as fs from 'fs';
|
|
19
|
-
import getPort from 'get-port';
|
|
20
|
-
import { Connection, createConnection } from 'mysql2/promise';
|
|
21
|
-
import { introspectSingleStoreToFile } from 'tests/schemaDiffer';
|
|
22
|
-
import { v4 as uuid } from 'uuid';
|
|
23
|
-
import { afterAll, beforeAll, beforeEach, expect, test } from 'vitest';
|
|
24
|
-
|
|
25
|
-
let client: Connection;
|
|
26
|
-
let singlestoreContainer: Docker.Container;
|
|
27
|
-
|
|
28
|
-
async function createDockerDB(): Promise<string> {
|
|
29
|
-
const docker = new Docker();
|
|
30
|
-
const port = await getPort({ port: 3306 });
|
|
31
|
-
const image = 'ghcr.io/singlestore-labs/singlestoredb-dev:latest';
|
|
32
|
-
|
|
33
|
-
const pullStream = await docker.pull(image);
|
|
34
|
-
await new Promise((resolve, reject) =>
|
|
35
|
-
docker.modem.followProgress(pullStream, (err) => err ? reject(err) : resolve(err))
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
singlestoreContainer = await docker.createContainer({
|
|
39
|
-
Image: image,
|
|
40
|
-
Env: ['ROOT_PASSWORD=singlestore'],
|
|
41
|
-
name: `drizzle-integration-tests-${uuid()}`,
|
|
42
|
-
HostConfig: {
|
|
43
|
-
AutoRemove: true,
|
|
44
|
-
PortBindings: {
|
|
45
|
-
'3306/tcp': [{ HostPort: `${port}` }],
|
|
46
|
-
},
|
|
47
|
-
},
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
await singlestoreContainer.start();
|
|
51
|
-
await new Promise((resolve) => setTimeout(resolve, 4000));
|
|
52
|
-
|
|
53
|
-
return `singlestore://root:singlestore@localhost:${port}/`;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
beforeAll(async () => {
|
|
57
|
-
const connectionString = process.env.SINGLESTORE_CONNECTION_STRING ?? await createDockerDB();
|
|
58
|
-
|
|
59
|
-
const sleep = 1000;
|
|
60
|
-
let timeLeft = 20000;
|
|
61
|
-
let connected = false;
|
|
62
|
-
let lastError: unknown | undefined;
|
|
63
|
-
do {
|
|
64
|
-
try {
|
|
65
|
-
client = await createConnection(connectionString);
|
|
66
|
-
await client.connect();
|
|
67
|
-
connected = true;
|
|
68
|
-
break;
|
|
69
|
-
} catch (e) {
|
|
70
|
-
lastError = e;
|
|
71
|
-
await new Promise((resolve) => setTimeout(resolve, sleep));
|
|
72
|
-
timeLeft -= sleep;
|
|
73
|
-
}
|
|
74
|
-
} while (timeLeft > 0);
|
|
75
|
-
if (!connected) {
|
|
76
|
-
console.error('Cannot connect to SingleStore');
|
|
77
|
-
await client?.end().catch(console.error);
|
|
78
|
-
await singlestoreContainer?.stop().catch(console.error);
|
|
79
|
-
throw lastError;
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
afterAll(async () => {
|
|
84
|
-
await client?.end().catch(console.error);
|
|
85
|
-
await singlestoreContainer?.stop().catch(console.error);
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
beforeEach(async () => {
|
|
89
|
-
await client.query(`drop database if exists \`drizzle\`;`);
|
|
90
|
-
await client.query(`create database \`drizzle\`;`);
|
|
91
|
-
await client.query(`use \`drizzle\`;`);
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
if (!fs.existsSync('tests/introspect/singlestore')) {
|
|
95
|
-
fs.mkdirSync('tests/introspect/singlestore');
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// TODO: Unskip this test when generated column is implemented
|
|
99
|
-
/* test.skip('generated always column: link to another column', async () => {
|
|
100
|
-
const schema = {
|
|
101
|
-
users: singlestoreTable('users', {
|
|
102
|
-
id: int('id'),
|
|
103
|
-
email: text('email'),
|
|
104
|
-
generatedEmail: text('generatedEmail').generatedAlwaysAs(
|
|
105
|
-
(): SQL => sql`\`email\``,
|
|
106
|
-
),
|
|
107
|
-
}),
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
const { statements, sqlStatements } = await introspectSingleStoreToFile(
|
|
111
|
-
client,
|
|
112
|
-
schema,
|
|
113
|
-
'generated-link-column',
|
|
114
|
-
'drizzle',
|
|
115
|
-
);
|
|
116
|
-
|
|
117
|
-
expect(statements.length).toBe(0);
|
|
118
|
-
expect(sqlStatements.length).toBe(0);
|
|
119
|
-
}); */
|
|
120
|
-
|
|
121
|
-
// TODO: Unskip this test when generated column is implemented
|
|
122
|
-
/* test.skip('generated always column virtual: link to another column', async () => {
|
|
123
|
-
const schema = {
|
|
124
|
-
users: singlestoreTable('users', {
|
|
125
|
-
id: int('id'),
|
|
126
|
-
email: text('email'),
|
|
127
|
-
generatedEmail: text('generatedEmail').generatedAlwaysAs(
|
|
128
|
-
(): SQL => sql`\`email\``,
|
|
129
|
-
{ mode: 'virtual' },
|
|
130
|
-
),
|
|
131
|
-
}),
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
const { statements, sqlStatements } = await introspectSingleStoreToFile(
|
|
135
|
-
client,
|
|
136
|
-
schema,
|
|
137
|
-
'generated-link-column-virtual',
|
|
138
|
-
'drizzle',
|
|
139
|
-
);
|
|
140
|
-
|
|
141
|
-
expect(statements.length).toBe(0);
|
|
142
|
-
expect(sqlStatements.length).toBe(0);
|
|
143
|
-
}); */
|
|
144
|
-
|
|
145
|
-
test('Default value of character type column: char', async () => {
|
|
146
|
-
const schema = {
|
|
147
|
-
users: singlestoreTable('users', {
|
|
148
|
-
id: int('id'),
|
|
149
|
-
sortKey: char('sortKey', { length: 255 }).default('0'),
|
|
150
|
-
}),
|
|
151
|
-
};
|
|
152
|
-
|
|
153
|
-
const { statements, sqlStatements } = await introspectSingleStoreToFile(
|
|
154
|
-
client,
|
|
155
|
-
schema,
|
|
156
|
-
'default-value-char-column',
|
|
157
|
-
'drizzle',
|
|
158
|
-
);
|
|
159
|
-
|
|
160
|
-
expect(statements.length).toBe(0);
|
|
161
|
-
expect(sqlStatements.length).toBe(0);
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
test('Default value of character type column: varchar', async () => {
|
|
165
|
-
const schema = {
|
|
166
|
-
users: singlestoreTable('users', {
|
|
167
|
-
id: int('id'),
|
|
168
|
-
sortKey: varchar('sortKey', { length: 255 }).default('0'),
|
|
169
|
-
}),
|
|
170
|
-
};
|
|
171
|
-
|
|
172
|
-
const { statements, sqlStatements } = await introspectSingleStoreToFile(
|
|
173
|
-
client,
|
|
174
|
-
schema,
|
|
175
|
-
'default-value-varchar-column',
|
|
176
|
-
'drizzle',
|
|
177
|
-
);
|
|
178
|
-
|
|
179
|
-
expect(statements.length).toBe(0);
|
|
180
|
-
expect(sqlStatements.length).toBe(0);
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
// TODO: Unskip this test when views are implemented
|
|
184
|
-
/* test('view #1', async () => {
|
|
185
|
-
const users = singlestoreTable('users', { id: int('id') });
|
|
186
|
-
const testView = singlestoreView('some_view', { id: int('id') }).as(
|
|
187
|
-
sql`select \`drizzle\`.\`users\`.\`id\` AS \`id\` from \`drizzle\`.\`users\``,
|
|
188
|
-
);
|
|
189
|
-
|
|
190
|
-
const schema = {
|
|
191
|
-
users: users,
|
|
192
|
-
testView,
|
|
193
|
-
};
|
|
194
|
-
|
|
195
|
-
const { statements, sqlStatements } = await introspectSingleStoreToFile(
|
|
196
|
-
client,
|
|
197
|
-
schema,
|
|
198
|
-
'view-1',
|
|
199
|
-
'drizzle',
|
|
200
|
-
);
|
|
201
|
-
|
|
202
|
-
expect(statements.length).toBe(0);
|
|
203
|
-
expect(sqlStatements.length).toBe(0);
|
|
204
|
-
}); */
|
|
205
|
-
|
|
206
|
-
// TODO: Unskip this test when views are implemented
|
|
207
|
-
/* test('view #2', async () => {
|
|
208
|
-
const users = singlestoreTable('some_users', { id: int('id') });
|
|
209
|
-
const testView = singlestoreView('some_view', { id: int('id') }).algorithm('temptable').sqlSecurity('definer').as(
|
|
210
|
-
sql`SELECT * FROM ${users}`,
|
|
211
|
-
);
|
|
212
|
-
|
|
213
|
-
const schema = {
|
|
214
|
-
users: users,
|
|
215
|
-
testView,
|
|
216
|
-
};
|
|
217
|
-
|
|
218
|
-
const { statements, sqlStatements } = await introspectSingleStoreToFile(
|
|
219
|
-
client,
|
|
220
|
-
schema,
|
|
221
|
-
'view-2',
|
|
222
|
-
'drizzle',
|
|
223
|
-
);
|
|
224
|
-
|
|
225
|
-
expect(statements.length).toBe(0);
|
|
226
|
-
expect(sqlStatements.length).toBe(0);
|
|
227
|
-
}); */
|
|
228
|
-
|
|
229
|
-
test('handle float type', async () => {
|
|
230
|
-
const schema = {
|
|
231
|
-
table: singlestoreTable('table', {
|
|
232
|
-
col1: float(),
|
|
233
|
-
col2: float({ precision: 2 }),
|
|
234
|
-
col3: float({ precision: 2, scale: 1 }),
|
|
235
|
-
}),
|
|
236
|
-
};
|
|
237
|
-
|
|
238
|
-
const { statements, sqlStatements } = await introspectSingleStoreToFile(
|
|
239
|
-
client,
|
|
240
|
-
schema,
|
|
241
|
-
'handle-float-type',
|
|
242
|
-
'drizzle',
|
|
243
|
-
);
|
|
244
|
-
|
|
245
|
-
expect(statements.length).toBe(0);
|
|
246
|
-
expect(sqlStatements.length).toBe(0);
|
|
247
|
-
});
|
|
248
|
-
|
|
249
|
-
test('handle unsigned numerical types', async () => {
|
|
250
|
-
const schema = {
|
|
251
|
-
table: singlestoreTable('table', {
|
|
252
|
-
col1: int({ unsigned: true }),
|
|
253
|
-
col2: tinyint({ unsigned: true }),
|
|
254
|
-
col3: smallint({ unsigned: true }),
|
|
255
|
-
col4: mediumint({ unsigned: true }),
|
|
256
|
-
col5: bigint({ mode: 'number', unsigned: true }),
|
|
257
|
-
col6: float({ unsigned: true }),
|
|
258
|
-
col7: float({ precision: 2, scale: 1, unsigned: true }),
|
|
259
|
-
col8: double({ unsigned: true }),
|
|
260
|
-
col9: double({ precision: 2, scale: 1, unsigned: true }),
|
|
261
|
-
col10: decimal({ unsigned: true }),
|
|
262
|
-
col11: decimal({ precision: 2, scale: 1, unsigned: true }),
|
|
263
|
-
}),
|
|
264
|
-
};
|
|
265
|
-
|
|
266
|
-
const { statements, sqlStatements } = await introspectSingleStoreToFile(
|
|
267
|
-
client,
|
|
268
|
-
schema,
|
|
269
|
-
'handle-unsigned-numerical-types',
|
|
270
|
-
'drizzle',
|
|
271
|
-
);
|
|
272
|
-
|
|
273
|
-
expect(statements.length).toBe(0);
|
|
274
|
-
expect(sqlStatements.length).toBe(0);
|
|
275
|
-
});
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import Database from 'better-sqlite3';
|
|
2
|
-
import { SQL, sql } from 'drizzle-orm';
|
|
3
|
-
import { check, int, sqliteTable, sqliteView, text } from 'drizzle-orm/sqlite-core';
|
|
4
|
-
import * as fs from 'fs';
|
|
5
|
-
import { introspectSQLiteToFile } from 'tests/schemaDiffer';
|
|
6
|
-
import { expect, test } from 'vitest';
|
|
7
|
-
|
|
8
|
-
if (!fs.existsSync('tests/introspect/sqlite')) {
|
|
9
|
-
fs.mkdirSync('tests/introspect/sqlite');
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
test('generated always column: link to another column', async () => {
|
|
13
|
-
const sqlite = new Database(':memory:');
|
|
14
|
-
|
|
15
|
-
const schema = {
|
|
16
|
-
users: sqliteTable('users', {
|
|
17
|
-
id: int('id'),
|
|
18
|
-
email: text('email'),
|
|
19
|
-
generatedEmail: text('generatedEmail').generatedAlwaysAs(
|
|
20
|
-
(): SQL => sql`\`email\``,
|
|
21
|
-
),
|
|
22
|
-
}),
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
const { statements, sqlStatements } = await introspectSQLiteToFile(
|
|
26
|
-
sqlite,
|
|
27
|
-
schema,
|
|
28
|
-
'generated-link-column',
|
|
29
|
-
);
|
|
30
|
-
|
|
31
|
-
expect(statements.length).toBe(0);
|
|
32
|
-
expect(sqlStatements.length).toBe(0);
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
test('generated always column virtual: link to another column', async () => {
|
|
36
|
-
const sqlite = new Database(':memory:');
|
|
37
|
-
|
|
38
|
-
const schema = {
|
|
39
|
-
users: sqliteTable('users', {
|
|
40
|
-
id: int('id'),
|
|
41
|
-
email: text('email'),
|
|
42
|
-
generatedEmail: text('generatedEmail').generatedAlwaysAs(
|
|
43
|
-
(): SQL => sql`\`email\``,
|
|
44
|
-
{ mode: 'virtual' },
|
|
45
|
-
),
|
|
46
|
-
}),
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
const { statements, sqlStatements } = await introspectSQLiteToFile(
|
|
50
|
-
sqlite,
|
|
51
|
-
schema,
|
|
52
|
-
'generated-link-column-virtual',
|
|
53
|
-
);
|
|
54
|
-
|
|
55
|
-
expect(statements.length).toBe(0);
|
|
56
|
-
expect(sqlStatements.length).toBe(0);
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
test('instrospect strings with single quotes', async () => {
|
|
60
|
-
const sqlite = new Database(':memory:');
|
|
61
|
-
|
|
62
|
-
const schema = {
|
|
63
|
-
columns: sqliteTable('columns', {
|
|
64
|
-
text: text('text').default('escape\'s quotes " '),
|
|
65
|
-
}),
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
const { statements, sqlStatements } = await introspectSQLiteToFile(
|
|
69
|
-
sqlite,
|
|
70
|
-
schema,
|
|
71
|
-
'introspect-strings-with-single-quotes',
|
|
72
|
-
);
|
|
73
|
-
|
|
74
|
-
expect(statements.length).toBe(0);
|
|
75
|
-
expect(sqlStatements.length).toBe(0);
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
test('introspect checks', async () => {
|
|
79
|
-
const sqlite = new Database(':memory:');
|
|
80
|
-
|
|
81
|
-
const schema = {
|
|
82
|
-
users: sqliteTable('users', {
|
|
83
|
-
id: int('id'),
|
|
84
|
-
name: text('name'),
|
|
85
|
-
age: int('age'),
|
|
86
|
-
}, (table) => ({
|
|
87
|
-
someCheck: check('some_check', sql`${table.age} > 21`),
|
|
88
|
-
})),
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
const { statements, sqlStatements } = await introspectSQLiteToFile(
|
|
92
|
-
sqlite,
|
|
93
|
-
schema,
|
|
94
|
-
'introspect-checks',
|
|
95
|
-
);
|
|
96
|
-
|
|
97
|
-
expect(statements.length).toBe(0);
|
|
98
|
-
expect(sqlStatements.length).toBe(0);
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
test('view #1', async () => {
|
|
102
|
-
const sqlite = new Database(':memory:');
|
|
103
|
-
|
|
104
|
-
const users = sqliteTable('users', { id: int('id') });
|
|
105
|
-
const testView = sqliteView('some_view', { id: int('id') }).as(
|
|
106
|
-
sql`SELECT * FROM ${users}`,
|
|
107
|
-
);
|
|
108
|
-
|
|
109
|
-
const schema = {
|
|
110
|
-
users: users,
|
|
111
|
-
testView,
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
const { statements, sqlStatements } = await introspectSQLiteToFile(
|
|
115
|
-
sqlite,
|
|
116
|
-
schema,
|
|
117
|
-
'view-1',
|
|
118
|
-
);
|
|
119
|
-
|
|
120
|
-
expect(statements.length).toBe(0);
|
|
121
|
-
expect(sqlStatements.length).toBe(0);
|
|
122
|
-
});
|
|
@@ -1,308 +0,0 @@
|
|
|
1
|
-
import { sql } from 'drizzle-orm';
|
|
2
|
-
import { check, int, sqliteTable, text } from 'drizzle-orm/sqlite-core';
|
|
3
|
-
import { expect, test } from 'vitest';
|
|
4
|
-
import { diffTestSchemasLibSQL } from './schemaDiffer';
|
|
5
|
-
|
|
6
|
-
test('create table with check', async (t) => {
|
|
7
|
-
const to = {
|
|
8
|
-
users: sqliteTable('users', {
|
|
9
|
-
id: int('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 diffTestSchemasLibSQL({}, to, []);
|
|
17
|
-
|
|
18
|
-
expect(statements.length).toBe(1);
|
|
19
|
-
expect(statements[0]).toStrictEqual({
|
|
20
|
-
type: 'sqlite_create_table',
|
|
21
|
-
tableName: 'users',
|
|
22
|
-
columns: [
|
|
23
|
-
{
|
|
24
|
-
name: 'id',
|
|
25
|
-
type: 'integer',
|
|
26
|
-
notNull: true,
|
|
27
|
-
primaryKey: true,
|
|
28
|
-
autoincrement: false,
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
name: 'age',
|
|
32
|
-
type: 'integer',
|
|
33
|
-
notNull: false,
|
|
34
|
-
primaryKey: false,
|
|
35
|
-
autoincrement: false,
|
|
36
|
-
},
|
|
37
|
-
],
|
|
38
|
-
compositePKs: [],
|
|
39
|
-
checkConstraints: ['some_check_name;"users"."age" > 21'],
|
|
40
|
-
referenceData: [],
|
|
41
|
-
uniqueConstraints: [],
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
expect(sqlStatements.length).toBe(1);
|
|
45
|
-
expect(sqlStatements[0]).toBe(`CREATE TABLE \`users\` (
|
|
46
|
-
\t\`id\` integer PRIMARY KEY NOT NULL,
|
|
47
|
-
\t\`age\` integer,
|
|
48
|
-
\tCONSTRAINT "some_check_name" CHECK("users"."age" > 21)
|
|
49
|
-
);\n`);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
test('add check contraint to existing table', async (t) => {
|
|
53
|
-
const to = {
|
|
54
|
-
users: sqliteTable('users', {
|
|
55
|
-
id: int('id').primaryKey(),
|
|
56
|
-
age: int('age'),
|
|
57
|
-
}, (table) => ({
|
|
58
|
-
checkConstraint: check('some_check_name', sql`${table.age} > 21`),
|
|
59
|
-
})),
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
const from = {
|
|
63
|
-
users: sqliteTable('users', {
|
|
64
|
-
id: int('id').primaryKey(),
|
|
65
|
-
age: int('age'),
|
|
66
|
-
}),
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
const { sqlStatements, statements } = await diffTestSchemasLibSQL(from, to, []);
|
|
70
|
-
|
|
71
|
-
expect(statements.length).toBe(1);
|
|
72
|
-
expect(statements[0]).toStrictEqual({
|
|
73
|
-
columns: [
|
|
74
|
-
{
|
|
75
|
-
autoincrement: false,
|
|
76
|
-
generated: undefined,
|
|
77
|
-
name: 'id',
|
|
78
|
-
notNull: true,
|
|
79
|
-
primaryKey: true,
|
|
80
|
-
type: 'integer',
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
autoincrement: false,
|
|
84
|
-
generated: undefined,
|
|
85
|
-
name: 'age',
|
|
86
|
-
notNull: false,
|
|
87
|
-
primaryKey: false,
|
|
88
|
-
type: 'integer',
|
|
89
|
-
},
|
|
90
|
-
],
|
|
91
|
-
compositePKs: [],
|
|
92
|
-
referenceData: [],
|
|
93
|
-
tableName: 'users',
|
|
94
|
-
type: 'recreate_table',
|
|
95
|
-
uniqueConstraints: [],
|
|
96
|
-
checkConstraints: ['some_check_name;"users"."age" > 21'],
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
expect(sqlStatements.length).toBe(6);
|
|
100
|
-
expect(sqlStatements[0]).toBe('PRAGMA foreign_keys=OFF;');
|
|
101
|
-
expect(sqlStatements[1]).toBe(`CREATE TABLE \`__new_users\` (
|
|
102
|
-
\t\`id\` integer PRIMARY KEY NOT NULL,
|
|
103
|
-
\t\`age\` integer,
|
|
104
|
-
\tCONSTRAINT "some_check_name" CHECK("__new_users"."age" > 21)
|
|
105
|
-
);\n`);
|
|
106
|
-
expect(sqlStatements[2]).toBe(`INSERT INTO \`__new_users\`("id", "age") SELECT "id", "age" FROM \`users\`;`);
|
|
107
|
-
expect(sqlStatements[3]).toBe(`DROP TABLE \`users\`;`);
|
|
108
|
-
expect(sqlStatements[4]).toBe(`ALTER TABLE \`__new_users\` RENAME TO \`users\`;`);
|
|
109
|
-
expect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
test('drop check contraint to existing table', async (t) => {
|
|
113
|
-
const from = {
|
|
114
|
-
users: sqliteTable('users', {
|
|
115
|
-
id: int('id').primaryKey(),
|
|
116
|
-
age: int('age'),
|
|
117
|
-
}, (table) => ({
|
|
118
|
-
checkConstraint: check('some_check_name', sql`${table.age} > 21`),
|
|
119
|
-
})),
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
const to = {
|
|
123
|
-
users: sqliteTable('users', {
|
|
124
|
-
id: int('id').primaryKey(),
|
|
125
|
-
age: int('age'),
|
|
126
|
-
}),
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
const { sqlStatements, statements } = await diffTestSchemasLibSQL(from, to, []);
|
|
130
|
-
|
|
131
|
-
expect(statements.length).toBe(1);
|
|
132
|
-
expect(statements[0]).toStrictEqual({
|
|
133
|
-
columns: [
|
|
134
|
-
{
|
|
135
|
-
autoincrement: false,
|
|
136
|
-
generated: undefined,
|
|
137
|
-
name: 'id',
|
|
138
|
-
notNull: true,
|
|
139
|
-
primaryKey: true,
|
|
140
|
-
type: 'integer',
|
|
141
|
-
},
|
|
142
|
-
{
|
|
143
|
-
autoincrement: false,
|
|
144
|
-
generated: undefined,
|
|
145
|
-
name: 'age',
|
|
146
|
-
notNull: false,
|
|
147
|
-
primaryKey: false,
|
|
148
|
-
type: 'integer',
|
|
149
|
-
},
|
|
150
|
-
],
|
|
151
|
-
compositePKs: [],
|
|
152
|
-
referenceData: [],
|
|
153
|
-
tableName: 'users',
|
|
154
|
-
type: 'recreate_table',
|
|
155
|
-
uniqueConstraints: [],
|
|
156
|
-
checkConstraints: [],
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
expect(sqlStatements.length).toBe(6);
|
|
160
|
-
expect(sqlStatements[0]).toBe('PRAGMA foreign_keys=OFF;');
|
|
161
|
-
expect(sqlStatements[1]).toBe(`CREATE TABLE \`__new_users\` (
|
|
162
|
-
\t\`id\` integer PRIMARY KEY NOT NULL,
|
|
163
|
-
\t\`age\` integer
|
|
164
|
-
);\n`);
|
|
165
|
-
expect(sqlStatements[2]).toBe(`INSERT INTO \`__new_users\`("id", "age") SELECT "id", "age" FROM \`users\`;`);
|
|
166
|
-
expect(sqlStatements[3]).toBe(`DROP TABLE \`users\`;`);
|
|
167
|
-
expect(sqlStatements[4]).toBe(`ALTER TABLE \`__new_users\` RENAME TO \`users\`;`);
|
|
168
|
-
expect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
test('rename check constraint', async (t) => {
|
|
172
|
-
const from = {
|
|
173
|
-
users: sqliteTable('users', {
|
|
174
|
-
id: int('id').primaryKey(),
|
|
175
|
-
age: int('age'),
|
|
176
|
-
}, (table) => ({
|
|
177
|
-
checkConstraint: check('some_check_name', sql`${table.age} > 21`),
|
|
178
|
-
})),
|
|
179
|
-
};
|
|
180
|
-
|
|
181
|
-
const to = {
|
|
182
|
-
users: sqliteTable('users', {
|
|
183
|
-
id: int('id').primaryKey(),
|
|
184
|
-
age: int('age'),
|
|
185
|
-
}, (table) => ({
|
|
186
|
-
checkConstraint: check('new_some_check_name', sql`${table.age} > 21`),
|
|
187
|
-
})),
|
|
188
|
-
};
|
|
189
|
-
|
|
190
|
-
const { sqlStatements, statements } = await diffTestSchemasLibSQL(from, to, []);
|
|
191
|
-
|
|
192
|
-
expect(statements.length).toBe(1);
|
|
193
|
-
expect(statements[0]).toStrictEqual({
|
|
194
|
-
columns: [
|
|
195
|
-
{
|
|
196
|
-
autoincrement: false,
|
|
197
|
-
generated: undefined,
|
|
198
|
-
name: 'id',
|
|
199
|
-
notNull: true,
|
|
200
|
-
primaryKey: true,
|
|
201
|
-
type: 'integer',
|
|
202
|
-
},
|
|
203
|
-
{
|
|
204
|
-
autoincrement: false,
|
|
205
|
-
generated: undefined,
|
|
206
|
-
name: 'age',
|
|
207
|
-
notNull: false,
|
|
208
|
-
primaryKey: false,
|
|
209
|
-
type: 'integer',
|
|
210
|
-
},
|
|
211
|
-
],
|
|
212
|
-
compositePKs: [],
|
|
213
|
-
referenceData: [],
|
|
214
|
-
tableName: 'users',
|
|
215
|
-
type: 'recreate_table',
|
|
216
|
-
uniqueConstraints: [],
|
|
217
|
-
checkConstraints: [`new_some_check_name;"users"."age" > 21`],
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
expect(sqlStatements.length).toBe(6);
|
|
221
|
-
expect(sqlStatements[0]).toBe('PRAGMA foreign_keys=OFF;');
|
|
222
|
-
expect(sqlStatements[1]).toBe(`CREATE TABLE \`__new_users\` (
|
|
223
|
-
\t\`id\` integer PRIMARY KEY NOT NULL,
|
|
224
|
-
\t\`age\` integer,
|
|
225
|
-
\tCONSTRAINT "new_some_check_name" CHECK("__new_users"."age" > 21)
|
|
226
|
-
);\n`);
|
|
227
|
-
expect(sqlStatements[2]).toBe(`INSERT INTO \`__new_users\`("id", "age") SELECT "id", "age" FROM \`users\`;`);
|
|
228
|
-
expect(sqlStatements[3]).toBe(`DROP TABLE \`users\`;`);
|
|
229
|
-
expect(sqlStatements[4]).toBe(`ALTER TABLE \`__new_users\` RENAME TO \`users\`;`);
|
|
230
|
-
expect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);
|
|
231
|
-
});
|
|
232
|
-
|
|
233
|
-
test('rename check constraint', async (t) => {
|
|
234
|
-
const from = {
|
|
235
|
-
users: sqliteTable('users', {
|
|
236
|
-
id: int('id').primaryKey(),
|
|
237
|
-
age: int('age'),
|
|
238
|
-
}, (table) => ({
|
|
239
|
-
checkConstraint: check('some_check_name', sql`${table.age} > 21`),
|
|
240
|
-
})),
|
|
241
|
-
};
|
|
242
|
-
|
|
243
|
-
const to = {
|
|
244
|
-
users: sqliteTable('users', {
|
|
245
|
-
id: int('id').primaryKey(),
|
|
246
|
-
age: int('age'),
|
|
247
|
-
}, (table) => ({
|
|
248
|
-
checkConstraint: check('some_check_name', sql`${table.age} > 10`),
|
|
249
|
-
})),
|
|
250
|
-
};
|
|
251
|
-
|
|
252
|
-
const { sqlStatements, statements } = await diffTestSchemasLibSQL(from, to, []);
|
|
253
|
-
|
|
254
|
-
expect(statements.length).toBe(1);
|
|
255
|
-
expect(statements[0]).toStrictEqual({
|
|
256
|
-
columns: [
|
|
257
|
-
{
|
|
258
|
-
autoincrement: false,
|
|
259
|
-
generated: undefined,
|
|
260
|
-
name: 'id',
|
|
261
|
-
notNull: true,
|
|
262
|
-
primaryKey: true,
|
|
263
|
-
type: 'integer',
|
|
264
|
-
},
|
|
265
|
-
{
|
|
266
|
-
autoincrement: false,
|
|
267
|
-
generated: undefined,
|
|
268
|
-
name: 'age',
|
|
269
|
-
notNull: false,
|
|
270
|
-
primaryKey: false,
|
|
271
|
-
type: 'integer',
|
|
272
|
-
},
|
|
273
|
-
],
|
|
274
|
-
compositePKs: [],
|
|
275
|
-
referenceData: [],
|
|
276
|
-
tableName: 'users',
|
|
277
|
-
type: 'recreate_table',
|
|
278
|
-
uniqueConstraints: [],
|
|
279
|
-
checkConstraints: [`some_check_name;"users"."age" > 10`],
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
expect(sqlStatements.length).toBe(6);
|
|
283
|
-
expect(sqlStatements[0]).toBe('PRAGMA foreign_keys=OFF;');
|
|
284
|
-
expect(sqlStatements[1]).toBe(`CREATE TABLE \`__new_users\` (
|
|
285
|
-
\t\`id\` integer PRIMARY KEY NOT NULL,
|
|
286
|
-
\t\`age\` integer,
|
|
287
|
-
\tCONSTRAINT "some_check_name" CHECK("__new_users"."age" > 10)
|
|
288
|
-
);\n`);
|
|
289
|
-
expect(sqlStatements[2]).toBe(`INSERT INTO \`__new_users\`("id", "age") SELECT "id", "age" FROM \`users\`;`);
|
|
290
|
-
expect(sqlStatements[3]).toBe(`DROP TABLE \`users\`;`);
|
|
291
|
-
expect(sqlStatements[4]).toBe(`ALTER TABLE \`__new_users\` RENAME TO \`users\`;`);
|
|
292
|
-
expect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`);
|
|
293
|
-
});
|
|
294
|
-
|
|
295
|
-
test('create checks with same names', async (t) => {
|
|
296
|
-
const to = {
|
|
297
|
-
users: sqliteTable('users', {
|
|
298
|
-
id: int('id').primaryKey(),
|
|
299
|
-
age: int('age'),
|
|
300
|
-
name: text('name'),
|
|
301
|
-
}, (table) => ({
|
|
302
|
-
checkConstraint1: check('some_check_name', sql`${table.age} > 21`),
|
|
303
|
-
checkConstraint2: check('some_check_name', sql`${table.name} != 'Alex'`),
|
|
304
|
-
})),
|
|
305
|
-
};
|
|
306
|
-
|
|
307
|
-
await expect(diffTestSchemasLibSQL({}, to, [])).rejects.toThrowError();
|
|
308
|
-
});
|