@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
package/src/api.ts ADDED
@@ -0,0 +1,504 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { LibSQLDatabase } from 'drizzle-orm/libsql';
3
+ import type { MySql2Database } from 'drizzle-orm/mysql2';
4
+ import { PgDatabase } from 'drizzle-orm/pg-core';
5
+ import { SingleStoreDriverDatabase } from 'drizzle-orm/singlestore';
6
+ import {
7
+ columnsResolver,
8
+ domainsResolver,
9
+ enumsResolver,
10
+ indPolicyResolver,
11
+ mySqlViewsResolver,
12
+ policyResolver,
13
+ roleResolver,
14
+ schemasResolver,
15
+ sequencesResolver,
16
+ sqliteViewsResolver,
17
+ tablesResolver,
18
+ viewsResolver,
19
+ } from './cli/commands/migrate';
20
+ import { pgPushIntrospect } from './cli/commands/pgIntrospect';
21
+ import { pgSuggestions } from './cli/commands/pgPushUtils';
22
+ import { updateUpToV6 as upPgV6, updateUpToV7 as upPgV7 } from './cli/commands/pgUp';
23
+ import { sqlitePushIntrospect } from './cli/commands/sqliteIntrospect';
24
+ import { logSuggestionsAndReturn } from './cli/commands/sqlitePushUtils';
25
+ import type { CasingType } from './cli/validations/common';
26
+ import { getTablesFilterByExtensions } from './extensions/getTablesFilterByExtensions';
27
+ import { originUUID } from './global';
28
+ import type { Config } from './index';
29
+ import { fillPgSnapshot } from './migrationPreparator';
30
+ import { MySqlSchema as MySQLSchemaKit, mysqlSchema, squashMysqlScheme } from './serializer/mysqlSchema';
31
+ import { generateMySqlSnapshot } from './serializer/mysqlSerializer';
32
+ import { prepareFromExports } from './serializer/pgImports';
33
+ import { PgSchema as PgSchemaKit, pgSchema, squashPgScheme } from './serializer/pgSchema';
34
+ import { generatePgSnapshot } from './serializer/pgSerializer';
35
+ import {
36
+ SingleStoreSchema as SingleStoreSchemaKit,
37
+ singlestoreSchema,
38
+ squashSingleStoreScheme,
39
+ } from './serializer/singlestoreSchema';
40
+ import { generateSingleStoreSnapshot } from './serializer/singlestoreSerializer';
41
+ import { SQLiteSchema as SQLiteSchemaKit, sqliteSchema, squashSqliteScheme } from './serializer/sqliteSchema';
42
+ import { generateSqliteSnapshot } from './serializer/sqliteSerializer';
43
+ import type { DB, SQLiteDB } from './utils';
44
+ export type DrizzleSnapshotJSON = PgSchemaKit;
45
+ export type DrizzleSQLiteSnapshotJSON = SQLiteSchemaKit;
46
+ export type DrizzleMySQLSnapshotJSON = MySQLSchemaKit;
47
+ export type DrizzleSingleStoreSnapshotJSON = SingleStoreSchemaKit;
48
+
49
+ export const generateDrizzleJson = (
50
+ imports: Record<string, unknown>,
51
+ prevId?: string,
52
+ schemaFilters?: string[],
53
+ casing?: CasingType,
54
+ ): PgSchemaKit => {
55
+ const prepared = prepareFromExports(imports);
56
+
57
+ const id = randomUUID();
58
+
59
+ const snapshot = generatePgSnapshot(
60
+ prepared.tables,
61
+ prepared.domains,
62
+ prepared.enums,
63
+ prepared.schemas,
64
+ prepared.sequences,
65
+ prepared.roles,
66
+ prepared.policies,
67
+ prepared.views,
68
+ prepared.matViews,
69
+ casing,
70
+ schemaFilters,
71
+ );
72
+
73
+ return fillPgSnapshot({
74
+ serialized: snapshot,
75
+ id,
76
+ idPrev: prevId ?? originUUID,
77
+ });
78
+ };
79
+
80
+ export const generateMigration = async (
81
+ prev: DrizzleSnapshotJSON,
82
+ cur: DrizzleSnapshotJSON,
83
+ ) => {
84
+ const { applyPgSnapshotsDiff } = await import('./snapshotsDiffer');
85
+
86
+ const validatedPrev = pgSchema.parse(prev);
87
+ const validatedCur = pgSchema.parse(cur);
88
+
89
+ const squashedPrev = squashPgScheme(validatedPrev);
90
+ const squashedCur = squashPgScheme(validatedCur);
91
+
92
+ const { sqlStatements, _meta } = await applyPgSnapshotsDiff(
93
+ squashedPrev,
94
+ squashedCur,
95
+ schemasResolver,
96
+ domainsResolver,
97
+ enumsResolver,
98
+ sequencesResolver,
99
+ policyResolver,
100
+ indPolicyResolver,
101
+ roleResolver,
102
+ tablesResolver,
103
+ columnsResolver,
104
+ viewsResolver,
105
+ validatedPrev,
106
+ validatedCur,
107
+ );
108
+
109
+ return sqlStatements;
110
+ };
111
+
112
+ export const pushSchema = async (
113
+ imports: Record<string, unknown>,
114
+ drizzleInstance: PgDatabase<any>,
115
+ schemaFilters?: string[],
116
+ tablesFilter?: string[],
117
+ extensionsFilters?: Config['extensionsFilters'],
118
+ ) => {
119
+ const { applyPgSnapshotsDiff } = await import('./snapshotsDiffer');
120
+ const { sql } = await import('drizzle-orm');
121
+ const filters = (tablesFilter ?? []).concat(
122
+ getTablesFilterByExtensions({ extensionsFilters, dialect: 'postgresql' }),
123
+ );
124
+
125
+ const db: DB = {
126
+ query: async (query: string, params?: any[]) => {
127
+ const res = await drizzleInstance.execute(sql.raw(query));
128
+ return res.rows;
129
+ },
130
+ };
131
+
132
+ const cur = generateDrizzleJson(imports);
133
+ const { schema: prev } = await pgPushIntrospect(
134
+ db,
135
+ filters,
136
+ schemaFilters ?? ['public'],
137
+ undefined,
138
+ );
139
+
140
+ const validatedPrev = pgSchema.parse(prev);
141
+ const validatedCur = pgSchema.parse(cur);
142
+
143
+ const squashedPrev = squashPgScheme(validatedPrev, 'push');
144
+ const squashedCur = squashPgScheme(validatedCur, 'push');
145
+
146
+ const { statements } = await applyPgSnapshotsDiff(
147
+ squashedPrev,
148
+ squashedCur,
149
+ schemasResolver,
150
+ domainsResolver,
151
+ enumsResolver,
152
+ sequencesResolver,
153
+ policyResolver,
154
+ indPolicyResolver,
155
+ roleResolver,
156
+ tablesResolver,
157
+ columnsResolver,
158
+ viewsResolver,
159
+ validatedPrev,
160
+ validatedCur,
161
+ 'push',
162
+ );
163
+
164
+ const { shouldAskForApprove, statementsToExecute, infoToPrint } = await pgSuggestions(db, statements);
165
+
166
+ return {
167
+ hasDataLoss: shouldAskForApprove,
168
+ warnings: infoToPrint,
169
+ statementsToExecute,
170
+ apply: async () => {
171
+ for (const dStmnt of statementsToExecute) {
172
+ await db.query(dStmnt);
173
+ }
174
+ },
175
+ };
176
+ };
177
+
178
+ // SQLite
179
+
180
+ export const generateSQLiteDrizzleJson = async (
181
+ imports: Record<string, unknown>,
182
+ prevId?: string,
183
+ casing?: CasingType,
184
+ ): Promise<SQLiteSchemaKit> => {
185
+ const { prepareFromExports } = await import('./serializer/sqliteImports');
186
+
187
+ const prepared = prepareFromExports(imports);
188
+
189
+ const id = randomUUID();
190
+
191
+ const snapshot = generateSqliteSnapshot(prepared.tables, prepared.views, casing);
192
+
193
+ return {
194
+ ...snapshot,
195
+ id,
196
+ prevId: prevId ?? originUUID,
197
+ };
198
+ };
199
+
200
+ export const generateSQLiteMigration = async (
201
+ prev: DrizzleSQLiteSnapshotJSON,
202
+ cur: DrizzleSQLiteSnapshotJSON,
203
+ ) => {
204
+ const { applySqliteSnapshotsDiff } = await import('./snapshotsDiffer');
205
+
206
+ const validatedPrev = sqliteSchema.parse(prev);
207
+ const validatedCur = sqliteSchema.parse(cur);
208
+
209
+ const squashedPrev = squashSqliteScheme(validatedPrev);
210
+ const squashedCur = squashSqliteScheme(validatedCur);
211
+
212
+ const { sqlStatements } = await applySqliteSnapshotsDiff(
213
+ squashedPrev,
214
+ squashedCur,
215
+ tablesResolver,
216
+ columnsResolver,
217
+ sqliteViewsResolver,
218
+ validatedPrev,
219
+ validatedCur,
220
+ );
221
+
222
+ return sqlStatements;
223
+ };
224
+
225
+ export const pushSQLiteSchema = async (
226
+ imports: Record<string, unknown>,
227
+ drizzleInstance: LibSQLDatabase<any>,
228
+ ) => {
229
+ const { applySqliteSnapshotsDiff } = await import('./snapshotsDiffer');
230
+ const { sql } = await import('drizzle-orm');
231
+
232
+ const db: SQLiteDB = {
233
+ query: async (query: string, params?: any[]) => {
234
+ const res = drizzleInstance.all<any>(sql.raw(query));
235
+ return res;
236
+ },
237
+ run: async (query: string) => {
238
+ return Promise.resolve(drizzleInstance.run(sql.raw(query))).then(
239
+ () => {},
240
+ );
241
+ },
242
+ };
243
+
244
+ const cur = await generateSQLiteDrizzleJson(imports);
245
+ const { schema: prev } = await sqlitePushIntrospect(db, []);
246
+
247
+ const validatedPrev = sqliteSchema.parse(prev);
248
+ const validatedCur = sqliteSchema.parse(cur);
249
+
250
+ const squashedPrev = squashSqliteScheme(validatedPrev, 'push');
251
+ const squashedCur = squashSqliteScheme(validatedCur, 'push');
252
+
253
+ const { statements, _meta } = await applySqliteSnapshotsDiff(
254
+ squashedPrev,
255
+ squashedCur,
256
+ tablesResolver,
257
+ columnsResolver,
258
+ sqliteViewsResolver,
259
+ validatedPrev,
260
+ validatedCur,
261
+ 'push',
262
+ );
263
+
264
+ const { shouldAskForApprove, statementsToExecute, infoToPrint } = await logSuggestionsAndReturn(
265
+ db,
266
+ statements,
267
+ squashedPrev,
268
+ squashedCur,
269
+ _meta!,
270
+ );
271
+
272
+ return {
273
+ hasDataLoss: shouldAskForApprove,
274
+ warnings: infoToPrint,
275
+ statementsToExecute,
276
+ apply: async () => {
277
+ for (const dStmnt of statementsToExecute) {
278
+ await db.query(dStmnt);
279
+ }
280
+ },
281
+ };
282
+ };
283
+
284
+ // MySQL
285
+
286
+ export const generateMySQLDrizzleJson = async (
287
+ imports: Record<string, unknown>,
288
+ prevId?: string,
289
+ casing?: CasingType,
290
+ ): Promise<MySQLSchemaKit> => {
291
+ const { prepareFromExports } = await import('./serializer/mysqlImports');
292
+
293
+ const prepared = prepareFromExports(imports);
294
+
295
+ const id = randomUUID();
296
+
297
+ const snapshot = generateMySqlSnapshot(prepared.tables, prepared.views, casing);
298
+
299
+ return {
300
+ ...snapshot,
301
+ id,
302
+ prevId: prevId ?? originUUID,
303
+ };
304
+ };
305
+
306
+ export const generateMySQLMigration = async (
307
+ prev: DrizzleMySQLSnapshotJSON,
308
+ cur: DrizzleMySQLSnapshotJSON,
309
+ ) => {
310
+ const { applyMysqlSnapshotsDiff } = await import('./snapshotsDiffer');
311
+
312
+ const validatedPrev = mysqlSchema.parse(prev);
313
+ const validatedCur = mysqlSchema.parse(cur);
314
+
315
+ const squashedPrev = squashMysqlScheme(validatedPrev);
316
+ const squashedCur = squashMysqlScheme(validatedCur);
317
+
318
+ const { sqlStatements } = await applyMysqlSnapshotsDiff(
319
+ squashedPrev,
320
+ squashedCur,
321
+ tablesResolver,
322
+ columnsResolver,
323
+ mySqlViewsResolver,
324
+ validatedPrev,
325
+ validatedCur,
326
+ );
327
+
328
+ return sqlStatements;
329
+ };
330
+
331
+ export const pushMySQLSchema = async (
332
+ imports: Record<string, unknown>,
333
+ drizzleInstance: MySql2Database<any>,
334
+ databaseName: string,
335
+ ) => {
336
+ const { applyMysqlSnapshotsDiff } = await import('./snapshotsDiffer');
337
+ const { logSuggestionsAndReturn } = await import(
338
+ './cli/commands/mysqlPushUtils'
339
+ );
340
+ const { mysqlPushIntrospect } = await import(
341
+ './cli/commands/mysqlIntrospect'
342
+ );
343
+ const { sql } = await import('drizzle-orm');
344
+
345
+ const db: DB = {
346
+ query: async (query: string, params?: any[]) => {
347
+ const res = await drizzleInstance.execute(sql.raw(query));
348
+ return res[0] as unknown as any[];
349
+ },
350
+ };
351
+ const cur = await generateMySQLDrizzleJson(imports);
352
+ const { schema: prev } = await mysqlPushIntrospect(db, databaseName, []);
353
+
354
+ const validatedPrev = mysqlSchema.parse(prev);
355
+ const validatedCur = mysqlSchema.parse(cur);
356
+
357
+ const squashedPrev = squashMysqlScheme(validatedPrev);
358
+ const squashedCur = squashMysqlScheme(validatedCur);
359
+
360
+ const { statements } = await applyMysqlSnapshotsDiff(
361
+ squashedPrev,
362
+ squashedCur,
363
+ tablesResolver,
364
+ columnsResolver,
365
+ mySqlViewsResolver,
366
+ validatedPrev,
367
+ validatedCur,
368
+ 'push',
369
+ );
370
+
371
+ const { shouldAskForApprove, statementsToExecute, infoToPrint } = await logSuggestionsAndReturn(
372
+ db,
373
+ statements,
374
+ validatedCur,
375
+ );
376
+
377
+ return {
378
+ hasDataLoss: shouldAskForApprove,
379
+ warnings: infoToPrint,
380
+ statementsToExecute,
381
+ apply: async () => {
382
+ for (const dStmnt of statementsToExecute) {
383
+ await db.query(dStmnt);
384
+ }
385
+ },
386
+ };
387
+ };
388
+
389
+ // SingleStore
390
+
391
+ export const generateSingleStoreDrizzleJson = async (
392
+ imports: Record<string, unknown>,
393
+ prevId?: string,
394
+ casing?: CasingType,
395
+ ): Promise<SingleStoreSchemaKit> => {
396
+ const { prepareFromExports } = await import('./serializer/singlestoreImports');
397
+
398
+ const prepared = prepareFromExports(imports);
399
+
400
+ const id = randomUUID();
401
+
402
+ const snapshot = generateSingleStoreSnapshot(prepared.tables, /* prepared.views, */ casing);
403
+
404
+ return {
405
+ ...snapshot,
406
+ id,
407
+ prevId: prevId ?? originUUID,
408
+ };
409
+ };
410
+
411
+ export const generateSingleStoreMigration = async (
412
+ prev: DrizzleSingleStoreSnapshotJSON,
413
+ cur: DrizzleSingleStoreSnapshotJSON,
414
+ ) => {
415
+ const { applySingleStoreSnapshotsDiff } = await import('./snapshotsDiffer');
416
+
417
+ const validatedPrev = singlestoreSchema.parse(prev);
418
+ const validatedCur = singlestoreSchema.parse(cur);
419
+
420
+ const squashedPrev = squashSingleStoreScheme(validatedPrev);
421
+ const squashedCur = squashSingleStoreScheme(validatedCur);
422
+
423
+ const { sqlStatements } = await applySingleStoreSnapshotsDiff(
424
+ squashedPrev,
425
+ squashedCur,
426
+ tablesResolver,
427
+ columnsResolver,
428
+ /* singleStoreViewsResolver, */
429
+ validatedPrev,
430
+ validatedCur,
431
+ 'push',
432
+ );
433
+
434
+ return sqlStatements;
435
+ };
436
+
437
+ export const pushSingleStoreSchema = async (
438
+ imports: Record<string, unknown>,
439
+ drizzleInstance: SingleStoreDriverDatabase<any>,
440
+ databaseName: string,
441
+ ) => {
442
+ const { applySingleStoreSnapshotsDiff } = await import('./snapshotsDiffer');
443
+ const { logSuggestionsAndReturn } = await import(
444
+ './cli/commands/singlestorePushUtils'
445
+ );
446
+ const { singlestorePushIntrospect } = await import(
447
+ './cli/commands/singlestoreIntrospect'
448
+ );
449
+ const { sql } = await import('drizzle-orm');
450
+
451
+ const db: DB = {
452
+ query: async (query: string) => {
453
+ const res = await drizzleInstance.execute(sql.raw(query));
454
+ return res[0] as unknown as any[];
455
+ },
456
+ };
457
+ const cur = await generateSingleStoreDrizzleJson(imports);
458
+ const { schema: prev } = await singlestorePushIntrospect(db, databaseName, []);
459
+
460
+ const validatedPrev = singlestoreSchema.parse(prev);
461
+ const validatedCur = singlestoreSchema.parse(cur);
462
+
463
+ const squashedPrev = squashSingleStoreScheme(validatedPrev);
464
+ const squashedCur = squashSingleStoreScheme(validatedCur);
465
+
466
+ const { statements } = await applySingleStoreSnapshotsDiff(
467
+ squashedPrev,
468
+ squashedCur,
469
+ tablesResolver,
470
+ columnsResolver,
471
+ /* singleStoreViewsResolver, */
472
+ validatedPrev,
473
+ validatedCur,
474
+ 'push',
475
+ );
476
+
477
+ const { shouldAskForApprove, statementsToExecute, infoToPrint } = await logSuggestionsAndReturn(
478
+ db,
479
+ statements,
480
+ validatedCur,
481
+ validatedPrev,
482
+ );
483
+
484
+ return {
485
+ hasDataLoss: shouldAskForApprove,
486
+ warnings: infoToPrint,
487
+ statementsToExecute,
488
+ apply: async () => {
489
+ for (const dStmnt of statementsToExecute) {
490
+ await db.query(dStmnt);
491
+ }
492
+ },
493
+ };
494
+ };
495
+
496
+ export const upPgSnapshot = (snapshot: Record<string, unknown>) => {
497
+ if (snapshot.version === '5') {
498
+ return upPgV7(upPgV6(snapshot));
499
+ }
500
+ if (snapshot.version === '6') {
501
+ return upPgV7(snapshot);
502
+ }
503
+ return snapshot;
504
+ };
@@ -0,0 +1,2 @@
1
+ const _ = '';
2
+ export default _;
@@ -0,0 +1,52 @@
1
+ import { Dialect } from '../../schemaValidator';
2
+ import { prepareOutFolder, validateWithReport } from '../../utils';
3
+
4
+ export const checkHandler = (out: string, dialect: Dialect) => {
5
+ const { snapshots } = prepareOutFolder(out, dialect);
6
+ const report = validateWithReport(snapshots, dialect);
7
+
8
+ if (report.nonLatest.length > 0) {
9
+ console.log(
10
+ report.nonLatest
11
+ .map((it) => {
12
+ return `${it} is not of the latest version, please run "drizzle-kit up"`;
13
+ })
14
+ .join('\n'),
15
+ );
16
+ process.exit(1);
17
+ }
18
+
19
+ if (report.malformed.length) {
20
+ const message = report.malformed
21
+ .map((it) => {
22
+ return `${it} data is malformed`;
23
+ })
24
+ .join('\n');
25
+ console.log(message);
26
+ }
27
+
28
+ const collisionEntries = Object.entries(report.idsMap).filter(
29
+ (it) => it[1].snapshots.length > 1,
30
+ );
31
+
32
+ const message = collisionEntries
33
+ .map((it) => {
34
+ const data = it[1];
35
+ return `[${
36
+ data.snapshots.join(
37
+ ', ',
38
+ )
39
+ }] are pointing to a parent snapshot: ${data.parent}/snapshot.json which is a collision.`;
40
+ })
41
+ .join('\n');
42
+
43
+ if (message) {
44
+ console.log(message);
45
+ }
46
+
47
+ const abort = report.malformed.length!! || collisionEntries.length > 0;
48
+
49
+ if (abort) {
50
+ process.exit(1);
51
+ }
52
+ };
@@ -0,0 +1,60 @@
1
+ import chalk from 'chalk';
2
+ import { readFileSync, rmSync, writeFileSync } from 'fs';
3
+ import fs from 'fs';
4
+ import { render } from 'hanji';
5
+ import { join } from 'path';
6
+ import { Journal } from '../../utils';
7
+ import { DropMigrationView } from '../views';
8
+ import { embeddedMigrations } from './migrate';
9
+
10
+ export const dropMigration = async ({
11
+ out,
12
+ bundle,
13
+ }: {
14
+ out: string;
15
+ bundle: boolean;
16
+ }) => {
17
+ const metaFilePath = join(out, 'meta', '_journal.json');
18
+ const journal = JSON.parse(readFileSync(metaFilePath, 'utf-8')) as Journal;
19
+
20
+ if (journal.entries.length === 0) {
21
+ console.log(
22
+ `[${chalk.blue('i')}] no migration entries found in ${metaFilePath}`,
23
+ );
24
+ return;
25
+ }
26
+
27
+ const result = await render(new DropMigrationView(journal.entries));
28
+ if (result.status === 'aborted') return;
29
+
30
+ delete journal.entries[journal.entries.indexOf(result.data!)];
31
+
32
+ const resultJournal: Journal = {
33
+ ...journal,
34
+ entries: journal.entries.filter(Boolean),
35
+ };
36
+ const sqlFilePath = join(out, `${result.data.tag}.sql`);
37
+ const snapshotFilePath = join(
38
+ out,
39
+ 'meta',
40
+ `${result.data.tag.split('_')[0]}_snapshot.json`,
41
+ );
42
+ rmSync(sqlFilePath);
43
+ rmSync(snapshotFilePath);
44
+ writeFileSync(metaFilePath, JSON.stringify(resultJournal, null, 2));
45
+
46
+ if (bundle) {
47
+ fs.writeFileSync(
48
+ join(out, `migrations.js`),
49
+ embeddedMigrations(resultJournal),
50
+ );
51
+ }
52
+
53
+ console.log(
54
+ `[${chalk.green('✓')}] ${
55
+ chalk.bold(
56
+ result.data.tag,
57
+ )
58
+ } migration successfully dropped`,
59
+ );
60
+ };