@syncular/migrations 0.0.6-245 → 0.0.6-246
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/README.md +24 -17
- package/dist/checksum.d.ts +3 -5
- package/dist/checksum.d.ts.map +1 -1
- package/dist/checksum.js +16 -229
- package/dist/checksum.js.map +1 -1
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +10 -29
- package/dist/runner.js.map +1 -1
- package/dist/types.d.ts +3 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -8
- package/src/checksum.ts +28 -366
- package/src/runner.ts +13 -54
- package/src/types.ts +4 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @syncular/migrations
|
|
2
2
|
|
|
3
|
-
Versioned migration utilities for Syncular apps. Provides `defineMigrations()` and `runMigrations()` with migration tracking and
|
|
3
|
+
Versioned migration utilities for Syncular apps. Provides `defineMigrations()` and `runMigrations()` with migration tracking and optional generated checksum validation (plus an optional reset strategy for client DBs).
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
@@ -13,13 +13,27 @@ npm install @syncular/migrations
|
|
|
13
13
|
```ts
|
|
14
14
|
import {
|
|
15
15
|
createMigrationTrackingTableName,
|
|
16
|
-
defineMigrations,
|
|
17
16
|
runMigrations,
|
|
18
17
|
} from '@syncular/migrations';
|
|
18
|
+
import { migrations } from './migrations';
|
|
19
|
+
import { migrationChecksums } from './migrations.checksums.generated';
|
|
20
|
+
|
|
21
|
+
await runMigrations({
|
|
22
|
+
db,
|
|
23
|
+
migrations,
|
|
24
|
+
checksums: migrationChecksums,
|
|
25
|
+
trackingTable: createMigrationTrackingTableName(['my_app', 'client']),
|
|
26
|
+
});
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Define the migrations in a separate source module, for example:
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
// migrations.ts
|
|
33
|
+
import { defineMigrations } from '@syncular/migrations';
|
|
19
34
|
|
|
20
35
|
export const migrations = defineMigrations({
|
|
21
36
|
v1: {
|
|
22
|
-
checksum: 'deterministic',
|
|
23
37
|
up: async (db) => {
|
|
24
38
|
await db.schema.createTable('tasks').addColumn('id', 'text').execute();
|
|
25
39
|
},
|
|
@@ -28,7 +42,6 @@ export const migrations = defineMigrations({
|
|
|
28
42
|
},
|
|
29
43
|
},
|
|
30
44
|
v2: {
|
|
31
|
-
checksum: 'deterministic',
|
|
32
45
|
up: async (db) => {
|
|
33
46
|
await db.schema
|
|
34
47
|
.alterTable('tasks')
|
|
@@ -40,26 +53,20 @@ export const migrations = defineMigrations({
|
|
|
40
53
|
},
|
|
41
54
|
},
|
|
42
55
|
});
|
|
43
|
-
|
|
44
|
-
await runMigrations({
|
|
45
|
-
db,
|
|
46
|
-
migrations,
|
|
47
|
-
trackingTable: createMigrationTrackingTableName(['my_app', 'client']),
|
|
48
|
-
});
|
|
49
56
|
```
|
|
50
57
|
|
|
51
58
|
Use `createMigrationTrackingTableName(...)` whenever you want a custom table.
|
|
52
59
|
It keeps names lowercase, predictable, and consistently suffixed with
|
|
53
60
|
`migration_state`.
|
|
54
61
|
|
|
55
|
-
Use `checksum: 'deterministic'` for migrations that
|
|
56
|
-
|
|
57
|
-
|
|
62
|
+
Use `checksum: 'deterministic'` for migrations that have a generated checksum
|
|
63
|
+
manifest. Generate that manifest with `@syncular/typegen`; `runMigrations`
|
|
64
|
+
compares the stored checksum against the generated SQL-trace checksum at
|
|
65
|
+
runtime.
|
|
58
66
|
|
|
59
|
-
Use `checksum: 'disabled'` for
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
they skip checksum creation and mismatch checks.
|
|
67
|
+
Use `checksum: 'disabled'` for migrations that cannot be replayed safely during
|
|
68
|
+
build-time checksum generation. Disabled migrations still track
|
|
69
|
+
version/application state, but they skip checksum creation and mismatch checks.
|
|
63
70
|
|
|
64
71
|
## Documentation
|
|
65
72
|
|
package/dist/checksum.d.ts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { DefinedMigrations, MigrationChecksumAlgorithm, MigrationChecksumDialect, ParsedMigration } from './types';
|
|
1
|
+
import type { MigrationChecksumAlgorithm, MigrationChecksums, ParsedMigration } from './types';
|
|
3
2
|
export declare const DISABLED_MIGRATION_CHECKSUM = "__syncular_checksum_disabled__";
|
|
4
3
|
export declare const LEGACY_SOURCE_MIGRATION_CHECKSUM_ALGORITHM = "legacy_source_v1";
|
|
5
4
|
export declare const SQL_TRACE_MIGRATION_CHECKSUM_ALGORITHM = "sql_trace_v1";
|
|
6
5
|
export declare const DISABLED_MIGRATION_CHECKSUM_ALGORITHM = "disabled";
|
|
7
|
-
export declare function inferMigrationChecksumDialect<DB>(db: KyselyInstance<DB>): MigrationChecksumDialect | null;
|
|
8
|
-
export declare function getMigrationChecksum<DB>(migrations: DefinedMigrations<DB>, migration: ParsedMigration<DB>, dialect: MigrationChecksumDialect): Promise<string | null>;
|
|
9
6
|
export declare function getLegacyMigrationChecksum<DB>(migration: ParsedMigration<DB>): string;
|
|
10
|
-
export declare function
|
|
7
|
+
export declare function getStoredDeterministicChecksum<DB>(migration: ParsedMigration<DB>, checksums: MigrationChecksums | undefined): string;
|
|
8
|
+
export declare function getMigrationChecksumAlgorithm<DB>(migration: ParsedMigration<DB>, checksums: MigrationChecksums | undefined): MigrationChecksumAlgorithm;
|
|
11
9
|
//# sourceMappingURL=checksum.d.ts.map
|
package/dist/checksum.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checksum.d.ts","sourceRoot":"","sources":["../src/checksum.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"checksum.d.ts","sourceRoot":"","sources":["../src/checksum.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0BAA0B,EAC1B,kBAAkB,EAClB,eAAe,EAChB,MAAM,SAAS,CAAC;AAEjB,eAAO,MAAM,2BAA2B,mCAAmC,CAAC;AAC5E,eAAO,MAAM,0CAA0C,qBAAqB,CAAC;AAC7E,eAAO,MAAM,sCAAsC,iBAAiB,CAAC;AACrE,eAAO,MAAM,qCAAqC,aAAa,CAAC;AAmIhE,wBAAgB,0BAA0B,CAAC,EAAE,EAC3C,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC,GAC7B,MAAM,CAER;AAED,wBAAgB,8BAA8B,CAAC,EAAE,EAC/C,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC,EAC9B,SAAS,EAAE,kBAAkB,GAAG,SAAS,GACxC,MAAM,CAsBR;AAED,wBAAgB,6BAA6B,CAAC,EAAE,EAC9C,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC,EAC9B,SAAS,EAAE,kBAAkB,GAAG,SAAS,GACxC,0BAA0B,CAa5B"}
|
package/dist/checksum.js
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
import { PGlite } from '@electric-sql/pglite';
|
|
2
|
-
import { Kysely, PostgresAdapter, SqliteAdapter, SqliteDialect, } from 'kysely';
|
|
3
|
-
import { PGliteDialect } from 'kysely-pglite-dialect';
|
|
4
1
|
export const DISABLED_MIGRATION_CHECKSUM = '__syncular_checksum_disabled__';
|
|
5
2
|
export const LEGACY_SOURCE_MIGRATION_CHECKSUM_ALGORITHM = 'legacy_source_v1';
|
|
6
3
|
export const SQL_TRACE_MIGRATION_CHECKSUM_ALGORITHM = 'sql_trace_v1';
|
|
7
4
|
export const DISABLED_MIGRATION_CHECKSUM_ALGORITHM = 'disabled';
|
|
8
|
-
const checksumCache = new WeakMap();
|
|
9
5
|
function stripCommentsPreservingStrings(source) {
|
|
10
6
|
let out = '';
|
|
11
7
|
let index = 0;
|
|
@@ -115,241 +111,32 @@ function hashString(value) {
|
|
|
115
111
|
function normalizeLegacySource(source) {
|
|
116
112
|
return stripCommentsPreservingStrings(source).replace(/\s+/g, ' ').trim();
|
|
117
113
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
#sink;
|
|
121
|
-
constructor(inner, sink) {
|
|
122
|
-
this.#inner = inner;
|
|
123
|
-
this.#sink = sink;
|
|
124
|
-
}
|
|
125
|
-
unwrap() {
|
|
126
|
-
return this.#inner;
|
|
127
|
-
}
|
|
128
|
-
async executeQuery(compiledQuery) {
|
|
129
|
-
if (this.#sink.enabled) {
|
|
130
|
-
this.#sink.entries.push(serializeCompiledQuery(compiledQuery));
|
|
131
|
-
}
|
|
132
|
-
return await this.#inner.executeQuery(compiledQuery);
|
|
133
|
-
}
|
|
134
|
-
async *streamQuery(compiledQuery, chunkSize) {
|
|
135
|
-
if (this.#sink.enabled) {
|
|
136
|
-
this.#sink.entries.push(serializeCompiledQuery(compiledQuery));
|
|
137
|
-
}
|
|
138
|
-
for await (const result of this.#inner.streamQuery(compiledQuery, chunkSize)) {
|
|
139
|
-
yield result;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
class TracingDriver {
|
|
144
|
-
#inner;
|
|
145
|
-
#sink;
|
|
146
|
-
#innerToWrapped = new Map();
|
|
147
|
-
constructor(inner, sink) {
|
|
148
|
-
this.#inner = inner;
|
|
149
|
-
this.#sink = sink;
|
|
150
|
-
}
|
|
151
|
-
async init() {
|
|
152
|
-
await this.#inner.init();
|
|
153
|
-
}
|
|
154
|
-
async acquireConnection() {
|
|
155
|
-
return this.#wrapConnection(await this.#inner.acquireConnection());
|
|
156
|
-
}
|
|
157
|
-
async beginTransaction(connection, settings) {
|
|
158
|
-
await this.#inner.beginTransaction(this.#unwrapConnection(connection), settings);
|
|
159
|
-
}
|
|
160
|
-
async commitTransaction(connection) {
|
|
161
|
-
await this.#inner.commitTransaction(this.#unwrapConnection(connection));
|
|
162
|
-
}
|
|
163
|
-
async rollbackTransaction(connection) {
|
|
164
|
-
await this.#inner.rollbackTransaction(this.#unwrapConnection(connection));
|
|
165
|
-
}
|
|
166
|
-
async savepoint(connection, savepointName, compileQuery) {
|
|
167
|
-
if (!this.#inner.savepoint) {
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
await this.#inner.savepoint(this.#unwrapConnection(connection), savepointName, compileQuery);
|
|
171
|
-
}
|
|
172
|
-
async rollbackToSavepoint(connection, savepointName, compileQuery) {
|
|
173
|
-
if (!this.#inner.rollbackToSavepoint) {
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
await this.#inner.rollbackToSavepoint(this.#unwrapConnection(connection), savepointName, compileQuery);
|
|
177
|
-
}
|
|
178
|
-
async releaseSavepoint(connection, savepointName, compileQuery) {
|
|
179
|
-
if (!this.#inner.releaseSavepoint) {
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
await this.#inner.releaseSavepoint(this.#unwrapConnection(connection), savepointName, compileQuery);
|
|
183
|
-
}
|
|
184
|
-
async releaseConnection(connection) {
|
|
185
|
-
const unwrapped = this.#unwrapConnection(connection);
|
|
186
|
-
if (connection instanceof TracingConnection) {
|
|
187
|
-
this.#innerToWrapped.delete(unwrapped);
|
|
188
|
-
}
|
|
189
|
-
await this.#inner.releaseConnection(unwrapped);
|
|
190
|
-
}
|
|
191
|
-
async destroy() {
|
|
192
|
-
this.#innerToWrapped.clear();
|
|
193
|
-
await this.#inner.destroy();
|
|
194
|
-
}
|
|
195
|
-
#wrapConnection(connection) {
|
|
196
|
-
const existing = this.#innerToWrapped.get(connection);
|
|
197
|
-
if (existing) {
|
|
198
|
-
return existing;
|
|
199
|
-
}
|
|
200
|
-
const wrapped = new TracingConnection(connection, this.#sink);
|
|
201
|
-
this.#innerToWrapped.set(connection, wrapped);
|
|
202
|
-
return wrapped;
|
|
203
|
-
}
|
|
204
|
-
#unwrapConnection(connection) {
|
|
205
|
-
if (connection instanceof TracingConnection) {
|
|
206
|
-
return connection.unwrap();
|
|
207
|
-
}
|
|
208
|
-
return connection;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
function createTracingDialect(baseDialect, sink) {
|
|
212
|
-
return {
|
|
213
|
-
createDriver: () => new TracingDriver(baseDialect.createDriver(), sink),
|
|
214
|
-
createAdapter: () => baseDialect.createAdapter(),
|
|
215
|
-
createQueryCompiler: () => baseDialect.createQueryCompiler(),
|
|
216
|
-
createIntrospector: (db) => baseDialect.createIntrospector(db),
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
|
-
function serializeCompiledQuery(compiledQuery) {
|
|
220
|
-
return JSON.stringify({
|
|
221
|
-
sql: compiledQuery.sql,
|
|
222
|
-
parameters: compiledQuery.parameters.map((value) => normalizeParameterValue(value)),
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
function normalizeParameterValue(value) {
|
|
226
|
-
if (typeof value === 'bigint') {
|
|
227
|
-
return { type: 'bigint', value: value.toString() };
|
|
228
|
-
}
|
|
229
|
-
if (value instanceof Date) {
|
|
230
|
-
return { type: 'date', value: value.toISOString() };
|
|
231
|
-
}
|
|
232
|
-
if (value instanceof Uint8Array) {
|
|
233
|
-
return { type: 'bytes', value: Array.from(value) };
|
|
234
|
-
}
|
|
235
|
-
if (Array.isArray(value)) {
|
|
236
|
-
return value.map((entry) => normalizeParameterValue(entry));
|
|
237
|
-
}
|
|
238
|
-
if (value && typeof value === 'object') {
|
|
239
|
-
return Object.fromEntries(Object.entries(value)
|
|
240
|
-
.sort(([left], [right]) => left.localeCompare(right))
|
|
241
|
-
.map(([key, entry]) => [key, normalizeParameterValue(entry)]));
|
|
242
|
-
}
|
|
243
|
-
return value;
|
|
244
|
-
}
|
|
245
|
-
function hashTrace(entries) {
|
|
246
|
-
return hashString(entries.join('\n'));
|
|
247
|
-
}
|
|
248
|
-
async function createSqliteChecksumDb(sink) {
|
|
249
|
-
try {
|
|
250
|
-
const bunSqliteSpecifier = 'bun:sqlite';
|
|
251
|
-
const sqliteModule = await import(bunSqliteSpecifier);
|
|
252
|
-
const dialectModule = await import('kysely-bun-sqlite');
|
|
253
|
-
const sqliteDb = new sqliteModule.Database(':memory:');
|
|
254
|
-
const dialect = createTracingDialect(new dialectModule.BunSqliteDialect({ database: sqliteDb }), sink);
|
|
255
|
-
return {
|
|
256
|
-
db: new Kysely({ dialect }),
|
|
257
|
-
dispose: async () => {
|
|
258
|
-
sqliteDb.close();
|
|
259
|
-
},
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
|
-
catch {
|
|
263
|
-
// Fall back to better-sqlite3 outside Bun.
|
|
264
|
-
}
|
|
265
|
-
try {
|
|
266
|
-
const sqliteModule = await import('better-sqlite3');
|
|
267
|
-
const sqliteDb = new sqliteModule.default(':memory:');
|
|
268
|
-
const dialect = createTracingDialect(new SqliteDialect({ database: sqliteDb }), sink);
|
|
269
|
-
return {
|
|
270
|
-
db: new Kysely({ dialect }),
|
|
271
|
-
dispose: async () => {
|
|
272
|
-
sqliteDb.close();
|
|
273
|
-
},
|
|
274
|
-
};
|
|
275
|
-
}
|
|
276
|
-
catch (error) {
|
|
277
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
278
|
-
throw new Error(`Deterministic migration checksums for sqlite require an in-memory sqlite runtime in this environment. ${message}`);
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
async function createPostgresChecksumDb(sink) {
|
|
282
|
-
const pglite = await PGlite.create();
|
|
283
|
-
const dialect = createTracingDialect(new PGliteDialect(pglite), sink);
|
|
284
|
-
return {
|
|
285
|
-
db: new Kysely({ dialect }),
|
|
286
|
-
dispose: async () => {
|
|
287
|
-
await pglite.close();
|
|
288
|
-
},
|
|
289
|
-
};
|
|
290
|
-
}
|
|
291
|
-
async function createChecksumDb(dialect, sink) {
|
|
292
|
-
if (dialect === 'postgres') {
|
|
293
|
-
return await createPostgresChecksumDb(sink);
|
|
294
|
-
}
|
|
295
|
-
return await createSqliteChecksumDb(sink);
|
|
296
|
-
}
|
|
297
|
-
async function computeDeterministicChecksum(migrations, migration, dialect) {
|
|
298
|
-
const sink = { enabled: false, entries: [] };
|
|
299
|
-
const { db, dispose } = await createChecksumDb(dialect, sink);
|
|
300
|
-
try {
|
|
301
|
-
for (const current of migrations.migrations) {
|
|
302
|
-
if (current.version > migration.version) {
|
|
303
|
-
break;
|
|
304
|
-
}
|
|
305
|
-
sink.enabled = current.version === migration.version;
|
|
306
|
-
await current.up(db);
|
|
307
|
-
sink.enabled = false;
|
|
308
|
-
if (current.version === migration.version) {
|
|
309
|
-
break;
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
return hashTrace(sink.entries);
|
|
313
|
-
}
|
|
314
|
-
finally {
|
|
315
|
-
await db.destroy();
|
|
316
|
-
await dispose();
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
export function inferMigrationChecksumDialect(db) {
|
|
320
|
-
const adapter = db.getExecutor().adapter;
|
|
321
|
-
const adapterName = adapter.constructor.name;
|
|
322
|
-
if (adapter instanceof SqliteAdapter || adapterName === 'SqliteAdapter') {
|
|
323
|
-
return 'sqlite';
|
|
324
|
-
}
|
|
325
|
-
if (adapter instanceof PostgresAdapter || adapterName === 'PostgresAdapter') {
|
|
326
|
-
return 'postgres';
|
|
327
|
-
}
|
|
328
|
-
return null;
|
|
114
|
+
export function getLegacyMigrationChecksum(migration) {
|
|
115
|
+
return hashString(normalizeLegacySource(migration.up.toString()));
|
|
329
116
|
}
|
|
330
|
-
export
|
|
117
|
+
export function getStoredDeterministicChecksum(migration, checksums) {
|
|
331
118
|
if (migration.checksum === 'disabled') {
|
|
332
|
-
return
|
|
119
|
+
return DISABLED_MIGRATION_CHECKSUM;
|
|
333
120
|
}
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
checksumCache.set(migration, dialectCache);
|
|
121
|
+
if (!checksums) {
|
|
122
|
+
throw new Error(`Migration v${migration.version} (${migration.name}) requires generated checksums. ` +
|
|
123
|
+
'Generate a checksum manifest with @syncular/typegen and pass it to runMigrations({ checksums }).');
|
|
338
124
|
}
|
|
339
|
-
|
|
340
|
-
|
|
125
|
+
const checksum = checksums[String(migration.version)];
|
|
126
|
+
if (!checksum) {
|
|
127
|
+
throw new Error(`Missing generated checksum for migration v${migration.version} (${migration.name}). ` +
|
|
128
|
+
'Regenerate the checksum manifest before running migrations.');
|
|
341
129
|
}
|
|
342
|
-
const checksum = await computeDeterministicChecksum(migrations, migration, dialect);
|
|
343
|
-
dialectCache.set(dialect, checksum);
|
|
344
130
|
return checksum;
|
|
345
131
|
}
|
|
346
|
-
export function
|
|
347
|
-
return hashString(normalizeLegacySource(migration.up.toString()));
|
|
348
|
-
}
|
|
349
|
-
export function getMigrationChecksumAlgorithm(migration) {
|
|
132
|
+
export function getMigrationChecksumAlgorithm(migration, checksums) {
|
|
350
133
|
if (migration.checksum === 'disabled') {
|
|
351
134
|
return DISABLED_MIGRATION_CHECKSUM_ALGORITHM;
|
|
352
135
|
}
|
|
136
|
+
if (!checksums) {
|
|
137
|
+
throw new Error(`Migration v${migration.version} (${migration.name}) requires generated checksums. ` +
|
|
138
|
+
'Generate a checksum manifest with @syncular/typegen and pass it to runMigrations({ checksums }).');
|
|
139
|
+
}
|
|
353
140
|
return SQL_TRACE_MIGRATION_CHECKSUM_ALGORITHM;
|
|
354
141
|
}
|
|
355
142
|
//# sourceMappingURL=checksum.js.map
|
package/dist/checksum.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checksum.js","sourceRoot":"","sources":["../src/checksum.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"checksum.js","sourceRoot":"","sources":["../src/checksum.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,2BAA2B,GAAG,gCAAgC,CAAC;AAC5E,MAAM,CAAC,MAAM,0CAA0C,GAAG,kBAAkB,CAAC;AAC7E,MAAM,CAAC,MAAM,sCAAsC,GAAG,cAAc,CAAC;AACrE,MAAM,CAAC,MAAM,qCAAqC,GAAG,UAAU,CAAC;AAEhE,SAAS,8BAA8B,CAAC,MAAc;IACpD,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,IAAI,GAMa,MAAM,CAAC;IAE5B,OAAO,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAE/B,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAC3B,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,GAAG,IAAI,IAAI,CAAC;gBACZ,IAAI,GAAG,MAAM,CAAC;YAChB,CAAC;YACD,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;YAC5B,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjC,KAAK,IAAI,CAAC,CAAC;gBACX,IAAI,GAAG,MAAM,CAAC;gBACd,SAAS;YACX,CAAC;YACD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,GAAG,IAAI,IAAI,CAAC;YACd,CAAC;YACD,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAC3B,GAAG,IAAI,IAAI,CAAC;YACZ,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACxC,GAAG,IAAI,IAAI,CAAC;gBACZ,KAAK,IAAI,CAAC,CAAC;gBACX,SAAS;YACX,CAAC;YACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,IAAI,GAAG,MAAM,CAAC;YAChB,CAAC;YACD,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAC3B,GAAG,IAAI,IAAI,CAAC;YACZ,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACxC,GAAG,IAAI,IAAI,CAAC;gBACZ,KAAK,IAAI,CAAC,CAAC;gBACX,SAAS;YACX,CAAC;YACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,IAAI,GAAG,MAAM,CAAC;YAChB,CAAC;YACD,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,GAAG,IAAI,IAAI,CAAC;YACZ,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACxC,GAAG,IAAI,IAAI,CAAC;gBACZ,KAAK,IAAI,CAAC,CAAC;gBACX,SAAS;YACX,CAAC;YACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,IAAI,GAAG,MAAM,CAAC;YAChB,CAAC;YACD,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjC,IAAI,GAAG,aAAa,CAAC;YACrB,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjC,IAAI,GAAG,cAAc,CAAC;YACtB,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,IAAI,GAAG,aAAa,CAAC;YACrB,GAAG,IAAI,IAAI,CAAC;YACZ,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,IAAI,GAAG,aAAa,CAAC;YACrB,GAAG,IAAI,IAAI,CAAC;YACZ,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,IAAI,GAAG,UAAU,CAAC;YAClB,GAAG,IAAI,IAAI,CAAC;YACZ,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,GAAG,IAAI,IAAI,CAAC;QACZ,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAc;IAC3C,OAAO,8BAA8B,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,SAA8B;IAE9B,OAAO,UAAU,CAAC,qBAAqB,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,SAA8B,EAC9B,SAAyC;IAEzC,IAAI,SAAS,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QACtC,OAAO,2BAA2B,CAAC;IACrC,CAAC;IAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,cAAc,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,IAAI,kCAAkC;YAClF,kGAAkG,CACrG,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAEtD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,6CAA6C,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,IAAI,KAAK;YACpF,6DAA6D,CAChE,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,SAA8B,EAC9B,SAAyC;IAEzC,IAAI,SAAS,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QACtC,OAAO,qCAAqC,CAAC;IAC/C,CAAC;IAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,cAAc,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,IAAI,kCAAkC;YAClF,kGAAkG,CACrG,CAAC;IACJ,CAAC;IAED,OAAO,sCAAsC,CAAC;AAChD,CAAC"}
|
package/dist/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkBH,OAAO,KAAK,EAIV,oBAAoB,EACpB,mBAAmB,EACnB,6BAA6B,EAC7B,4BAA4B,EAC7B,MAAM,SAAS,CAAC;AA4EjB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,aAAa,CAAC,EAAE,EACpC,OAAO,EAAE,oBAAoB,CAAC,EAAE,CAAC,GAChC,OAAO,CAAC,mBAAmB,CAAC,CAU9B;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,EAAE,EAC7C,OAAO,EAAE,6BAA6B,CAAC,EAAE,CAAC,GACzC,OAAO,CAAC,4BAA4B,CAAC,CA4KvC;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,EACvC,EAAE,EAAE,OAAO,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,EAC/B,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CAKjB"}
|
package/dist/runner.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @syncular/migrations - Migration runner
|
|
3
3
|
*/
|
|
4
|
-
import { DISABLED_MIGRATION_CHECKSUM, DISABLED_MIGRATION_CHECKSUM_ALGORITHM, getLegacyMigrationChecksum,
|
|
4
|
+
import { DISABLED_MIGRATION_CHECKSUM, DISABLED_MIGRATION_CHECKSUM_ALGORITHM, getLegacyMigrationChecksum, getMigrationChecksumAlgorithm, getStoredDeterministicChecksum, LEGACY_SOURCE_MIGRATION_CHECKSUM_ALGORITHM, } from './checksum.js';
|
|
5
5
|
import { DEFAULT_MIGRATION_TRACKING_TABLE } from './naming.js';
|
|
6
6
|
import { clearAppliedMigrations, ensureTrackingTable, getAppliedMigrations, recordAppliedMigration, removeAppliedMigration, } from './tracking.js';
|
|
7
7
|
const migrationRunQueues = new Map();
|
|
@@ -19,34 +19,18 @@ function isDeterministicMigration(migration) {
|
|
|
19
19
|
function getDeterministicMigrations(migrations) {
|
|
20
20
|
return migrations.migrations.filter(isDeterministicMigration);
|
|
21
21
|
}
|
|
22
|
-
function
|
|
23
|
-
|
|
24
|
-
if (dialect) {
|
|
25
|
-
return dialect;
|
|
26
|
-
}
|
|
27
|
-
throw new Error('Deterministic migration checksums are not supported for this runtime or dialect. ' +
|
|
28
|
-
'Set `checksum: "disabled"` on these migrations if they must run without checksum validation.');
|
|
29
|
-
}
|
|
30
|
-
async function getStoredChecksumForMigration(options, migration, dialect) {
|
|
31
|
-
if (migration.checksum === 'disabled') {
|
|
32
|
-
return DISABLED_MIGRATION_CHECKSUM;
|
|
33
|
-
}
|
|
34
|
-
const resolvedDialect = dialect ?? requireChecksumDialect(options);
|
|
35
|
-
const checksum = await getMigrationChecksum(options.migrations, migration, resolvedDialect);
|
|
36
|
-
if (!checksum) {
|
|
37
|
-
throw new Error(`Migration v${migration.version} (${migration.name}) is configured for deterministic checksums but did not produce one.`);
|
|
38
|
-
}
|
|
39
|
-
return checksum;
|
|
22
|
+
async function getStoredChecksumForMigration(options, migration) {
|
|
23
|
+
return getStoredDeterministicChecksum(migration, options.checksums);
|
|
40
24
|
}
|
|
41
|
-
async function getChecksumForAlgorithm(options, migration, algorithm
|
|
25
|
+
async function getChecksumForAlgorithm(options, migration, algorithm) {
|
|
42
26
|
if (algorithm === DISABLED_MIGRATION_CHECKSUM_ALGORITHM) {
|
|
43
27
|
return DISABLED_MIGRATION_CHECKSUM;
|
|
44
28
|
}
|
|
45
29
|
if (algorithm === LEGACY_SOURCE_MIGRATION_CHECKSUM_ALGORITHM) {
|
|
46
30
|
return getLegacyMigrationChecksum(migration);
|
|
47
31
|
}
|
|
48
|
-
if (algorithm ===
|
|
49
|
-
return await getStoredChecksumForMigration(options, migration
|
|
32
|
+
if (algorithm === 'sql_trace_v1') {
|
|
33
|
+
return await getStoredChecksumForMigration(options, migration);
|
|
50
34
|
}
|
|
51
35
|
throw new Error(`Unsupported migration checksum algorithm: ${algorithm}`);
|
|
52
36
|
}
|
|
@@ -135,9 +119,6 @@ export async function runMigrationsToVersion(options) {
|
|
|
135
119
|
let wasReset = false;
|
|
136
120
|
let recoveredFromSchemaConflict = false;
|
|
137
121
|
const deterministicMigrations = getDeterministicMigrations(migrations);
|
|
138
|
-
const checksumDialect = deterministicMigrations.length > 0
|
|
139
|
-
? requireChecksumDialect(options)
|
|
140
|
-
: null;
|
|
141
122
|
// Check for checksum mismatches up-front when reset mode is enabled
|
|
142
123
|
if (onChecksumMismatch === 'reset' && applied.length > 0) {
|
|
143
124
|
let hasMismatch = false;
|
|
@@ -146,7 +127,7 @@ export async function runMigrationsToVersion(options) {
|
|
|
146
127
|
if (!existing) {
|
|
147
128
|
continue;
|
|
148
129
|
}
|
|
149
|
-
const currentChecksum = await getChecksumForAlgorithm(options, migration, existing.checksum_algorithm
|
|
130
|
+
const currentChecksum = await getChecksumForAlgorithm(options, migration, existing.checksum_algorithm);
|
|
150
131
|
if (existing.checksum !== currentChecksum) {
|
|
151
132
|
hasMismatch = true;
|
|
152
133
|
break;
|
|
@@ -171,7 +152,7 @@ export async function runMigrationsToVersion(options) {
|
|
|
171
152
|
if (migration.checksum === 'disabled') {
|
|
172
153
|
continue;
|
|
173
154
|
}
|
|
174
|
-
const currentChecksum = await getChecksumForAlgorithm(options, migration, existing.checksum_algorithm
|
|
155
|
+
const currentChecksum = await getChecksumForAlgorithm(options, migration, existing.checksum_algorithm);
|
|
175
156
|
if (existing.checksum !== currentChecksum) {
|
|
176
157
|
throw new Error(`Migration v${migration.version} (${migration.name}) has changed since it was applied. ` +
|
|
177
158
|
`Stored checksum ${existing.checksum} is not compatible with current checksum ${currentChecksum}. ` +
|
|
@@ -211,12 +192,12 @@ export async function runMigrationsToVersion(options) {
|
|
|
211
192
|
index = -1;
|
|
212
193
|
continue;
|
|
213
194
|
}
|
|
214
|
-
const checksum = await getStoredChecksumForMigration(options, migration
|
|
195
|
+
const checksum = await getStoredChecksumForMigration(options, migration);
|
|
215
196
|
await recordAppliedMigration(db, trackingTable, {
|
|
216
197
|
version: migration.version,
|
|
217
198
|
name: migration.name,
|
|
218
199
|
checksum,
|
|
219
|
-
checksum_algorithm: getMigrationChecksumAlgorithm(migration),
|
|
200
|
+
checksum_algorithm: getMigrationChecksumAlgorithm(migration, options.checksums),
|
|
220
201
|
});
|
|
221
202
|
appliedVersions.push(migration.version);
|
|
222
203
|
}
|
package/dist/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,2BAA2B,EAC3B,qCAAqC,EACrC,0BAA0B,EAC1B,
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -7,8 +7,8 @@ import type { Kysely } from 'kysely';
|
|
|
7
7
|
*/
|
|
8
8
|
export type MigrationFn<DB = unknown> = (db: Kysely<DB>) => Promise<void>;
|
|
9
9
|
export type MigrationChecksumMode = 'deterministic' | 'disabled';
|
|
10
|
-
export type MigrationChecksumDialect = 'sqlite' | 'postgres';
|
|
11
10
|
export type MigrationChecksumAlgorithm = 'legacy_source_v1' | 'sql_trace_v1' | 'disabled';
|
|
11
|
+
export type MigrationChecksums = Record<string, string>;
|
|
12
12
|
/**
|
|
13
13
|
* A reversible migration definition.
|
|
14
14
|
*/
|
|
@@ -68,6 +68,8 @@ export interface RunMigrationsOptions<DB = unknown> {
|
|
|
68
68
|
db: Kysely<DB>;
|
|
69
69
|
/** Defined migrations from defineMigrations() */
|
|
70
70
|
migrations: DefinedMigrations<DB>;
|
|
71
|
+
/** Generated deterministic checksums for this migration set. */
|
|
72
|
+
checksums?: MigrationChecksums;
|
|
71
73
|
/** Name of the tracking table (default: 'sync_migration_state') */
|
|
72
74
|
trackingTable?: string;
|
|
73
75
|
/** What to do when a migration's checksum doesn't match. Default: 'error' */
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,EAAE,GAAG,OAAO,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1E,MAAM,MAAM,qBAAqB,GAAG,eAAe,GAAG,UAAU,CAAC;AAEjE,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@syncular/migrations",
|
|
3
|
-
"version": "0.0.6-
|
|
3
|
+
"version": "0.0.6-246",
|
|
4
4
|
"description": "Database migration utilities for Syncular",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Benjamin Kniffler",
|
|
@@ -48,17 +48,11 @@
|
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@syncular/config": "0.0.0",
|
|
51
|
-
"@types/better-sqlite3": "^7.6.13",
|
|
52
51
|
"kysely": "*"
|
|
53
52
|
},
|
|
54
53
|
"files": [
|
|
55
54
|
"dist",
|
|
56
55
|
"src"
|
|
57
56
|
],
|
|
58
|
-
"dependencies": {
|
|
59
|
-
"@electric-sql/pglite": "^0.4.3",
|
|
60
|
-
"better-sqlite3": "^12.8.0",
|
|
61
|
-
"kysely-bun-sqlite": "^0.4.0",
|
|
62
|
-
"kysely-pglite-dialect": "^1.3.1"
|
|
63
|
-
}
|
|
57
|
+
"dependencies": {}
|
|
64
58
|
}
|
package/src/checksum.ts
CHANGED
|
@@ -1,22 +1,6 @@
|
|
|
1
|
-
import { PGlite } from '@electric-sql/pglite';
|
|
2
|
-
import {
|
|
3
|
-
type CompiledQuery,
|
|
4
|
-
type DatabaseConnection,
|
|
5
|
-
type Dialect,
|
|
6
|
-
type Driver,
|
|
7
|
-
Kysely,
|
|
8
|
-
type Kysely as KyselyInstance,
|
|
9
|
-
PostgresAdapter,
|
|
10
|
-
type QueryResult,
|
|
11
|
-
SqliteAdapter,
|
|
12
|
-
SqliteDialect,
|
|
13
|
-
type TransactionSettings,
|
|
14
|
-
} from 'kysely';
|
|
15
|
-
import { PGliteDialect } from 'kysely-pglite-dialect';
|
|
16
1
|
import type {
|
|
17
|
-
DefinedMigrations,
|
|
18
2
|
MigrationChecksumAlgorithm,
|
|
19
|
-
|
|
3
|
+
MigrationChecksums,
|
|
20
4
|
ParsedMigration,
|
|
21
5
|
} from './types';
|
|
22
6
|
|
|
@@ -25,16 +9,6 @@ export const LEGACY_SOURCE_MIGRATION_CHECKSUM_ALGORITHM = 'legacy_source_v1';
|
|
|
25
9
|
export const SQL_TRACE_MIGRATION_CHECKSUM_ALGORITHM = 'sql_trace_v1';
|
|
26
10
|
export const DISABLED_MIGRATION_CHECKSUM_ALGORITHM = 'disabled';
|
|
27
11
|
|
|
28
|
-
interface TraceSink {
|
|
29
|
-
enabled: boolean;
|
|
30
|
-
entries: string[];
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const checksumCache = new WeakMap<
|
|
34
|
-
object,
|
|
35
|
-
Map<MigrationChecksumDialect, string | null>
|
|
36
|
-
>();
|
|
37
|
-
|
|
38
12
|
function stripCommentsPreservingStrings(source: string): string {
|
|
39
13
|
let out = '';
|
|
40
14
|
let index = 0;
|
|
@@ -164,365 +138,53 @@ function normalizeLegacySource(source: string): string {
|
|
|
164
138
|
return stripCommentsPreservingStrings(source).replace(/\s+/g, ' ').trim();
|
|
165
139
|
}
|
|
166
140
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
constructor(inner: DatabaseConnection, sink: TraceSink) {
|
|
172
|
-
this.#inner = inner;
|
|
173
|
-
this.#sink = sink;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
unwrap(): DatabaseConnection {
|
|
177
|
-
return this.#inner;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
async executeQuery<R>(compiledQuery: CompiledQuery): Promise<QueryResult<R>> {
|
|
181
|
-
if (this.#sink.enabled) {
|
|
182
|
-
this.#sink.entries.push(serializeCompiledQuery(compiledQuery));
|
|
183
|
-
}
|
|
184
|
-
return await this.#inner.executeQuery<R>(compiledQuery);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
async *streamQuery<R>(
|
|
188
|
-
compiledQuery: CompiledQuery,
|
|
189
|
-
chunkSize?: number
|
|
190
|
-
): AsyncIterableIterator<QueryResult<R>> {
|
|
191
|
-
if (this.#sink.enabled) {
|
|
192
|
-
this.#sink.entries.push(serializeCompiledQuery(compiledQuery));
|
|
193
|
-
}
|
|
194
|
-
for await (const result of this.#inner.streamQuery<R>(
|
|
195
|
-
compiledQuery,
|
|
196
|
-
chunkSize
|
|
197
|
-
)) {
|
|
198
|
-
yield result;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
class TracingDriver implements Driver {
|
|
204
|
-
readonly #inner: Driver;
|
|
205
|
-
readonly #sink: TraceSink;
|
|
206
|
-
readonly #innerToWrapped = new Map<DatabaseConnection, TracingConnection>();
|
|
207
|
-
|
|
208
|
-
constructor(inner: Driver, sink: TraceSink) {
|
|
209
|
-
this.#inner = inner;
|
|
210
|
-
this.#sink = sink;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
async init(): Promise<void> {
|
|
214
|
-
await this.#inner.init();
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
async acquireConnection(): Promise<DatabaseConnection> {
|
|
218
|
-
return this.#wrapConnection(await this.#inner.acquireConnection());
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
async beginTransaction(
|
|
222
|
-
connection: DatabaseConnection,
|
|
223
|
-
settings: TransactionSettings
|
|
224
|
-
): Promise<void> {
|
|
225
|
-
await this.#inner.beginTransaction(
|
|
226
|
-
this.#unwrapConnection(connection),
|
|
227
|
-
settings
|
|
228
|
-
);
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
async commitTransaction(connection: DatabaseConnection): Promise<void> {
|
|
232
|
-
await this.#inner.commitTransaction(this.#unwrapConnection(connection));
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
async rollbackTransaction(connection: DatabaseConnection): Promise<void> {
|
|
236
|
-
await this.#inner.rollbackTransaction(this.#unwrapConnection(connection));
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
async savepoint?(
|
|
240
|
-
connection: DatabaseConnection,
|
|
241
|
-
savepointName: string,
|
|
242
|
-
compileQuery: Parameters<NonNullable<Driver['savepoint']>>[2]
|
|
243
|
-
): Promise<void> {
|
|
244
|
-
if (!this.#inner.savepoint) {
|
|
245
|
-
return;
|
|
246
|
-
}
|
|
247
|
-
await this.#inner.savepoint(
|
|
248
|
-
this.#unwrapConnection(connection),
|
|
249
|
-
savepointName,
|
|
250
|
-
compileQuery
|
|
251
|
-
);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
async rollbackToSavepoint?(
|
|
255
|
-
connection: DatabaseConnection,
|
|
256
|
-
savepointName: string,
|
|
257
|
-
compileQuery: Parameters<NonNullable<Driver['rollbackToSavepoint']>>[2]
|
|
258
|
-
): Promise<void> {
|
|
259
|
-
if (!this.#inner.rollbackToSavepoint) {
|
|
260
|
-
return;
|
|
261
|
-
}
|
|
262
|
-
await this.#inner.rollbackToSavepoint(
|
|
263
|
-
this.#unwrapConnection(connection),
|
|
264
|
-
savepointName,
|
|
265
|
-
compileQuery
|
|
266
|
-
);
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
async releaseSavepoint?(
|
|
270
|
-
connection: DatabaseConnection,
|
|
271
|
-
savepointName: string,
|
|
272
|
-
compileQuery: Parameters<NonNullable<Driver['releaseSavepoint']>>[2]
|
|
273
|
-
): Promise<void> {
|
|
274
|
-
if (!this.#inner.releaseSavepoint) {
|
|
275
|
-
return;
|
|
276
|
-
}
|
|
277
|
-
await this.#inner.releaseSavepoint(
|
|
278
|
-
this.#unwrapConnection(connection),
|
|
279
|
-
savepointName,
|
|
280
|
-
compileQuery
|
|
281
|
-
);
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
async releaseConnection(connection: DatabaseConnection): Promise<void> {
|
|
285
|
-
const unwrapped = this.#unwrapConnection(connection);
|
|
286
|
-
|
|
287
|
-
if (connection instanceof TracingConnection) {
|
|
288
|
-
this.#innerToWrapped.delete(unwrapped);
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
await this.#inner.releaseConnection(unwrapped);
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
async destroy(): Promise<void> {
|
|
295
|
-
this.#innerToWrapped.clear();
|
|
296
|
-
await this.#inner.destroy();
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
#wrapConnection(connection: DatabaseConnection): DatabaseConnection {
|
|
300
|
-
const existing = this.#innerToWrapped.get(connection);
|
|
301
|
-
if (existing) {
|
|
302
|
-
return existing;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
const wrapped = new TracingConnection(connection, this.#sink);
|
|
306
|
-
this.#innerToWrapped.set(connection, wrapped);
|
|
307
|
-
return wrapped;
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
#unwrapConnection(connection: DatabaseConnection): DatabaseConnection {
|
|
311
|
-
if (connection instanceof TracingConnection) {
|
|
312
|
-
return connection.unwrap();
|
|
313
|
-
}
|
|
314
|
-
return connection;
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
function createTracingDialect(baseDialect: Dialect, sink: TraceSink): Dialect {
|
|
319
|
-
return {
|
|
320
|
-
createDriver: () => new TracingDriver(baseDialect.createDriver(), sink),
|
|
321
|
-
createAdapter: () => baseDialect.createAdapter(),
|
|
322
|
-
createQueryCompiler: () => baseDialect.createQueryCompiler(),
|
|
323
|
-
createIntrospector: (db) => baseDialect.createIntrospector(db),
|
|
324
|
-
};
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
function serializeCompiledQuery(compiledQuery: CompiledQuery): string {
|
|
328
|
-
return JSON.stringify({
|
|
329
|
-
sql: compiledQuery.sql,
|
|
330
|
-
parameters: compiledQuery.parameters.map((value) =>
|
|
331
|
-
normalizeParameterValue(value)
|
|
332
|
-
),
|
|
333
|
-
});
|
|
141
|
+
export function getLegacyMigrationChecksum<DB>(
|
|
142
|
+
migration: ParsedMigration<DB>
|
|
143
|
+
): string {
|
|
144
|
+
return hashString(normalizeLegacySource(migration.up.toString()));
|
|
334
145
|
}
|
|
335
146
|
|
|
336
|
-
function
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
if (
|
|
341
|
-
return
|
|
342
|
-
}
|
|
343
|
-
if (value instanceof Uint8Array) {
|
|
344
|
-
return { type: 'bytes', value: Array.from(value) };
|
|
345
|
-
}
|
|
346
|
-
if (Array.isArray(value)) {
|
|
347
|
-
return value.map((entry) => normalizeParameterValue(entry));
|
|
348
|
-
}
|
|
349
|
-
if (value && typeof value === 'object') {
|
|
350
|
-
return Object.fromEntries(
|
|
351
|
-
Object.entries(value)
|
|
352
|
-
.sort(([left], [right]) => left.localeCompare(right))
|
|
353
|
-
.map(([key, entry]) => [key, normalizeParameterValue(entry)])
|
|
354
|
-
);
|
|
147
|
+
export function getStoredDeterministicChecksum<DB>(
|
|
148
|
+
migration: ParsedMigration<DB>,
|
|
149
|
+
checksums: MigrationChecksums | undefined
|
|
150
|
+
): string {
|
|
151
|
+
if (migration.checksum === 'disabled') {
|
|
152
|
+
return DISABLED_MIGRATION_CHECKSUM;
|
|
355
153
|
}
|
|
356
|
-
return value;
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
function hashTrace(entries: string[]): string {
|
|
360
|
-
return hashString(entries.join('\n'));
|
|
361
|
-
}
|
|
362
154
|
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
try {
|
|
368
|
-
const bunSqliteSpecifier = 'bun:sqlite';
|
|
369
|
-
const sqliteModule = await import(bunSqliteSpecifier);
|
|
370
|
-
const dialectModule = await import('kysely-bun-sqlite');
|
|
371
|
-
const sqliteDb = new sqliteModule.Database(':memory:');
|
|
372
|
-
const dialect = createTracingDialect(
|
|
373
|
-
new dialectModule.BunSqliteDialect({ database: sqliteDb }),
|
|
374
|
-
sink
|
|
155
|
+
if (!checksums) {
|
|
156
|
+
throw new Error(
|
|
157
|
+
`Migration v${migration.version} (${migration.name}) requires generated checksums. ` +
|
|
158
|
+
'Generate a checksum manifest with @syncular/typegen and pass it to runMigrations({ checksums }).'
|
|
375
159
|
);
|
|
376
|
-
|
|
377
|
-
return {
|
|
378
|
-
db: new Kysely<DB>({ dialect }),
|
|
379
|
-
dispose: async () => {
|
|
380
|
-
sqliteDb.close();
|
|
381
|
-
},
|
|
382
|
-
};
|
|
383
|
-
} catch {
|
|
384
|
-
// Fall back to better-sqlite3 outside Bun.
|
|
385
160
|
}
|
|
386
161
|
|
|
387
|
-
|
|
388
|
-
const sqliteModule = await import('better-sqlite3');
|
|
389
|
-
const sqliteDb = new sqliteModule.default(':memory:');
|
|
390
|
-
const dialect = createTracingDialect(
|
|
391
|
-
new SqliteDialect({ database: sqliteDb }),
|
|
392
|
-
sink
|
|
393
|
-
);
|
|
162
|
+
const checksum = checksums[String(migration.version)];
|
|
394
163
|
|
|
395
|
-
|
|
396
|
-
db: new Kysely<DB>({ dialect }),
|
|
397
|
-
dispose: async () => {
|
|
398
|
-
sqliteDb.close();
|
|
399
|
-
},
|
|
400
|
-
};
|
|
401
|
-
} catch (error) {
|
|
402
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
164
|
+
if (!checksum) {
|
|
403
165
|
throw new Error(
|
|
404
|
-
`
|
|
166
|
+
`Missing generated checksum for migration v${migration.version} (${migration.name}). ` +
|
|
167
|
+
'Regenerate the checksum manifest before running migrations.'
|
|
405
168
|
);
|
|
406
169
|
}
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
async function createPostgresChecksumDb<DB>(sink: TraceSink): Promise<{
|
|
410
|
-
db: Kysely<DB>;
|
|
411
|
-
dispose: () => Promise<void>;
|
|
412
|
-
}> {
|
|
413
|
-
const pglite = await PGlite.create();
|
|
414
|
-
const dialect = createTracingDialect(new PGliteDialect(pglite), sink);
|
|
415
|
-
|
|
416
|
-
return {
|
|
417
|
-
db: new Kysely<DB>({ dialect }),
|
|
418
|
-
dispose: async () => {
|
|
419
|
-
await pglite.close();
|
|
420
|
-
},
|
|
421
|
-
};
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
async function createChecksumDb<DB>(
|
|
425
|
-
dialect: MigrationChecksumDialect,
|
|
426
|
-
sink: TraceSink
|
|
427
|
-
): Promise<{
|
|
428
|
-
db: Kysely<DB>;
|
|
429
|
-
dispose: () => Promise<void>;
|
|
430
|
-
}> {
|
|
431
|
-
if (dialect === 'postgres') {
|
|
432
|
-
return await createPostgresChecksumDb<DB>(sink);
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
return await createSqliteChecksumDb<DB>(sink);
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
async function computeDeterministicChecksum<DB>(
|
|
439
|
-
migrations: DefinedMigrations<DB>,
|
|
440
|
-
migration: ParsedMigration<DB>,
|
|
441
|
-
dialect: MigrationChecksumDialect
|
|
442
|
-
): Promise<string> {
|
|
443
|
-
const sink: TraceSink = { enabled: false, entries: [] };
|
|
444
|
-
const { db, dispose } = await createChecksumDb<DB>(dialect, sink);
|
|
445
|
-
|
|
446
|
-
try {
|
|
447
|
-
for (const current of migrations.migrations) {
|
|
448
|
-
if (current.version > migration.version) {
|
|
449
|
-
break;
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
sink.enabled = current.version === migration.version;
|
|
453
|
-
await current.up(db);
|
|
454
|
-
sink.enabled = false;
|
|
455
|
-
|
|
456
|
-
if (current.version === migration.version) {
|
|
457
|
-
break;
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
return hashTrace(sink.entries);
|
|
462
|
-
} finally {
|
|
463
|
-
await db.destroy();
|
|
464
|
-
await dispose();
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
export function inferMigrationChecksumDialect<DB>(
|
|
469
|
-
db: KyselyInstance<DB>
|
|
470
|
-
): MigrationChecksumDialect | null {
|
|
471
|
-
const adapter = db.getExecutor().adapter;
|
|
472
|
-
const adapterName = adapter.constructor.name;
|
|
473
|
-
|
|
474
|
-
if (adapter instanceof SqliteAdapter || adapterName === 'SqliteAdapter') {
|
|
475
|
-
return 'sqlite';
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
if (adapter instanceof PostgresAdapter || adapterName === 'PostgresAdapter') {
|
|
479
|
-
return 'postgres';
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
return null;
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
export async function getMigrationChecksum<DB>(
|
|
486
|
-
migrations: DefinedMigrations<DB>,
|
|
487
|
-
migration: ParsedMigration<DB>,
|
|
488
|
-
dialect: MigrationChecksumDialect
|
|
489
|
-
): Promise<string | null> {
|
|
490
|
-
if (migration.checksum === 'disabled') {
|
|
491
|
-
return null;
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
let dialectCache = checksumCache.get(migration);
|
|
495
|
-
if (!dialectCache) {
|
|
496
|
-
dialectCache = new Map();
|
|
497
|
-
checksumCache.set(migration, dialectCache);
|
|
498
|
-
}
|
|
499
170
|
|
|
500
|
-
if (dialectCache.has(dialect)) {
|
|
501
|
-
return dialectCache.get(dialect) ?? null;
|
|
502
|
-
}
|
|
503
|
-
|
|
504
|
-
const checksum = await computeDeterministicChecksum(
|
|
505
|
-
migrations,
|
|
506
|
-
migration,
|
|
507
|
-
dialect
|
|
508
|
-
);
|
|
509
|
-
|
|
510
|
-
dialectCache.set(dialect, checksum);
|
|
511
171
|
return checksum;
|
|
512
172
|
}
|
|
513
173
|
|
|
514
|
-
export function getLegacyMigrationChecksum<DB>(
|
|
515
|
-
migration: ParsedMigration<DB>
|
|
516
|
-
): string {
|
|
517
|
-
return hashString(normalizeLegacySource(migration.up.toString()));
|
|
518
|
-
}
|
|
519
|
-
|
|
520
174
|
export function getMigrationChecksumAlgorithm<DB>(
|
|
521
|
-
migration: ParsedMigration<DB
|
|
175
|
+
migration: ParsedMigration<DB>,
|
|
176
|
+
checksums: MigrationChecksums | undefined
|
|
522
177
|
): MigrationChecksumAlgorithm {
|
|
523
178
|
if (migration.checksum === 'disabled') {
|
|
524
179
|
return DISABLED_MIGRATION_CHECKSUM_ALGORITHM;
|
|
525
180
|
}
|
|
526
181
|
|
|
182
|
+
if (!checksums) {
|
|
183
|
+
throw new Error(
|
|
184
|
+
`Migration v${migration.version} (${migration.name}) requires generated checksums. ` +
|
|
185
|
+
'Generate a checksum manifest with @syncular/typegen and pass it to runMigrations({ checksums }).'
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
|
|
527
189
|
return SQL_TRACE_MIGRATION_CHECKSUM_ALGORITHM;
|
|
528
190
|
}
|
package/src/runner.ts
CHANGED
|
@@ -6,11 +6,9 @@ import {
|
|
|
6
6
|
DISABLED_MIGRATION_CHECKSUM,
|
|
7
7
|
DISABLED_MIGRATION_CHECKSUM_ALGORITHM,
|
|
8
8
|
getLegacyMigrationChecksum,
|
|
9
|
-
getMigrationChecksum,
|
|
10
9
|
getMigrationChecksumAlgorithm,
|
|
11
|
-
|
|
10
|
+
getStoredDeterministicChecksum,
|
|
12
11
|
LEGACY_SOURCE_MIGRATION_CHECKSUM_ALGORITHM,
|
|
13
|
-
SQL_TRACE_MIGRATION_CHECKSUM_ALGORITHM,
|
|
14
12
|
} from './checksum';
|
|
15
13
|
import { DEFAULT_MIGRATION_TRACKING_TABLE } from './naming';
|
|
16
14
|
import {
|
|
@@ -23,7 +21,6 @@ import {
|
|
|
23
21
|
import type {
|
|
24
22
|
DefinedMigrations,
|
|
25
23
|
MigrationChecksumAlgorithm,
|
|
26
|
-
MigrationChecksumDialect,
|
|
27
24
|
ParsedMigration,
|
|
28
25
|
RunMigrationsOptions,
|
|
29
26
|
RunMigrationsResult,
|
|
@@ -55,51 +52,17 @@ function getDeterministicMigrations<DB>(
|
|
|
55
52
|
return migrations.migrations.filter(isDeterministicMigration);
|
|
56
53
|
}
|
|
57
54
|
|
|
58
|
-
function requireChecksumDialect<DB>(
|
|
59
|
-
options: RunMigrationsOptions<DB>
|
|
60
|
-
): MigrationChecksumDialect {
|
|
61
|
-
const dialect = inferMigrationChecksumDialect(options.db);
|
|
62
|
-
|
|
63
|
-
if (dialect) {
|
|
64
|
-
return dialect;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
throw new Error(
|
|
68
|
-
'Deterministic migration checksums are not supported for this runtime or dialect. ' +
|
|
69
|
-
'Set `checksum: "disabled"` on these migrations if they must run without checksum validation.'
|
|
70
|
-
);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
55
|
async function getStoredChecksumForMigration<DB>(
|
|
74
56
|
options: RunMigrationsOptions<DB>,
|
|
75
|
-
migration: ParsedMigration<DB
|
|
76
|
-
dialect: MigrationChecksumDialect | null
|
|
57
|
+
migration: ParsedMigration<DB>
|
|
77
58
|
): Promise<string> {
|
|
78
|
-
|
|
79
|
-
return DISABLED_MIGRATION_CHECKSUM;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const resolvedDialect = dialect ?? requireChecksumDialect(options);
|
|
83
|
-
const checksum = await getMigrationChecksum(
|
|
84
|
-
options.migrations,
|
|
85
|
-
migration,
|
|
86
|
-
resolvedDialect
|
|
87
|
-
);
|
|
88
|
-
|
|
89
|
-
if (!checksum) {
|
|
90
|
-
throw new Error(
|
|
91
|
-
`Migration v${migration.version} (${migration.name}) is configured for deterministic checksums but did not produce one.`
|
|
92
|
-
);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
return checksum;
|
|
59
|
+
return getStoredDeterministicChecksum(migration, options.checksums);
|
|
96
60
|
}
|
|
97
61
|
|
|
98
62
|
async function getChecksumForAlgorithm<DB>(
|
|
99
63
|
options: RunMigrationsOptions<DB>,
|
|
100
64
|
migration: ParsedMigration<DB>,
|
|
101
|
-
algorithm: MigrationChecksumAlgorithm
|
|
102
|
-
dialect: MigrationChecksumDialect | null
|
|
65
|
+
algorithm: MigrationChecksumAlgorithm
|
|
103
66
|
): Promise<string> {
|
|
104
67
|
if (algorithm === DISABLED_MIGRATION_CHECKSUM_ALGORITHM) {
|
|
105
68
|
return DISABLED_MIGRATION_CHECKSUM;
|
|
@@ -109,8 +72,8 @@ async function getChecksumForAlgorithm<DB>(
|
|
|
109
72
|
return getLegacyMigrationChecksum(migration);
|
|
110
73
|
}
|
|
111
74
|
|
|
112
|
-
if (algorithm ===
|
|
113
|
-
return await getStoredChecksumForMigration(options, migration
|
|
75
|
+
if (algorithm === 'sql_trace_v1') {
|
|
76
|
+
return await getStoredChecksumForMigration(options, migration);
|
|
114
77
|
}
|
|
115
78
|
|
|
116
79
|
throw new Error(`Unsupported migration checksum algorithm: ${algorithm}`);
|
|
@@ -218,10 +181,6 @@ export async function runMigrationsToVersion<DB>(
|
|
|
218
181
|
let wasReset = false;
|
|
219
182
|
let recoveredFromSchemaConflict = false;
|
|
220
183
|
const deterministicMigrations = getDeterministicMigrations(migrations);
|
|
221
|
-
const checksumDialect =
|
|
222
|
-
deterministicMigrations.length > 0
|
|
223
|
-
? requireChecksumDialect(options)
|
|
224
|
-
: null;
|
|
225
184
|
|
|
226
185
|
// Check for checksum mismatches up-front when reset mode is enabled
|
|
227
186
|
if (onChecksumMismatch === 'reset' && applied.length > 0) {
|
|
@@ -236,8 +195,7 @@ export async function runMigrationsToVersion<DB>(
|
|
|
236
195
|
const currentChecksum = await getChecksumForAlgorithm(
|
|
237
196
|
options,
|
|
238
197
|
migration,
|
|
239
|
-
existing.checksum_algorithm
|
|
240
|
-
checksumDialect
|
|
198
|
+
existing.checksum_algorithm
|
|
241
199
|
);
|
|
242
200
|
if (existing.checksum !== currentChecksum) {
|
|
243
201
|
hasMismatch = true;
|
|
@@ -271,8 +229,7 @@ export async function runMigrationsToVersion<DB>(
|
|
|
271
229
|
const currentChecksum = await getChecksumForAlgorithm(
|
|
272
230
|
options,
|
|
273
231
|
migration,
|
|
274
|
-
existing.checksum_algorithm
|
|
275
|
-
checksumDialect
|
|
232
|
+
existing.checksum_algorithm
|
|
276
233
|
);
|
|
277
234
|
|
|
278
235
|
if (existing.checksum !== currentChecksum) {
|
|
@@ -325,15 +282,17 @@ export async function runMigrationsToVersion<DB>(
|
|
|
325
282
|
|
|
326
283
|
const checksum = await getStoredChecksumForMigration(
|
|
327
284
|
options,
|
|
328
|
-
migration
|
|
329
|
-
checksumDialect
|
|
285
|
+
migration
|
|
330
286
|
);
|
|
331
287
|
|
|
332
288
|
await recordAppliedMigration(db, trackingTable, {
|
|
333
289
|
version: migration.version,
|
|
334
290
|
name: migration.name,
|
|
335
291
|
checksum,
|
|
336
|
-
checksum_algorithm: getMigrationChecksumAlgorithm(
|
|
292
|
+
checksum_algorithm: getMigrationChecksumAlgorithm(
|
|
293
|
+
migration,
|
|
294
|
+
options.checksums
|
|
295
|
+
),
|
|
337
296
|
});
|
|
338
297
|
appliedVersions.push(migration.version);
|
|
339
298
|
}
|
package/src/types.ts
CHANGED
|
@@ -11,13 +11,13 @@ export type MigrationFn<DB = unknown> = (db: Kysely<DB>) => Promise<void>;
|
|
|
11
11
|
|
|
12
12
|
export type MigrationChecksumMode = 'deterministic' | 'disabled';
|
|
13
13
|
|
|
14
|
-
export type MigrationChecksumDialect = 'sqlite' | 'postgres';
|
|
15
|
-
|
|
16
14
|
export type MigrationChecksumAlgorithm =
|
|
17
15
|
| 'legacy_source_v1'
|
|
18
16
|
| 'sql_trace_v1'
|
|
19
17
|
| 'disabled';
|
|
20
18
|
|
|
19
|
+
export type MigrationChecksums = Record<string, string>;
|
|
20
|
+
|
|
21
21
|
/**
|
|
22
22
|
* A reversible migration definition.
|
|
23
23
|
*/
|
|
@@ -87,6 +87,8 @@ export interface RunMigrationsOptions<DB = unknown> {
|
|
|
87
87
|
db: Kysely<DB>;
|
|
88
88
|
/** Defined migrations from defineMigrations() */
|
|
89
89
|
migrations: DefinedMigrations<DB>;
|
|
90
|
+
/** Generated deterministic checksums for this migration set. */
|
|
91
|
+
checksums?: MigrationChecksums;
|
|
90
92
|
/** Name of the tracking table (default: 'sync_migration_state') */
|
|
91
93
|
trackingTable?: string;
|
|
92
94
|
/** What to do when a migration's checksum doesn't match. Default: 'error' */
|