@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 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 deterministic checksum validation (plus an optional reset strategy for client DBs).
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 can be replayed into a
56
- scratch in-memory database. Syncular hashes the actual SQL trace emitted by the
57
- migration instead of the JavaScript source, which avoids bundle/minifier drift.
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 browser/service-worker or otherwise
60
- runtime-specific migrations where Syncular cannot safely create the matching
61
- scratch database. Disabled migrations still track version/application state, but
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
 
@@ -1,11 +1,9 @@
1
- import { type Kysely as KyselyInstance } from 'kysely';
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 getMigrationChecksumAlgorithm<DB>(migration: ParsedMigration<DB>): MigrationChecksumAlgorithm;
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
@@ -1 +1 @@
1
- {"version":3,"file":"checksum.d.ts","sourceRoot":"","sources":["../src/checksum.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,MAAM,IAAI,cAAc,EAM9B,MAAM,QAAQ,CAAC;AAEhB,OAAO,KAAK,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,wBAAwB,EACxB,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;AA0bhE,wBAAgB,6BAA6B,CAAC,EAAE,EAC9C,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,GACrB,wBAAwB,GAAG,IAAI,CAajC;AAED,wBAAsB,oBAAoB,CAAC,EAAE,EAC3C,UAAU,EAAE,iBAAiB,CAAC,EAAE,CAAC,EACjC,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC,EAC9B,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuBxB;AAED,wBAAgB,0BAA0B,CAAC,EAAE,EAC3C,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC,GAC7B,MAAM,CAER;AAED,wBAAgB,6BAA6B,CAAC,EAAE,EAC9C,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC,GAC7B,0BAA0B,CAM5B"}
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
- class TracingConnection {
119
- #inner;
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 async function getMigrationChecksum(migrations, migration, dialect) {
117
+ export function getStoredDeterministicChecksum(migration, checksums) {
331
118
  if (migration.checksum === 'disabled') {
332
- return null;
119
+ return DISABLED_MIGRATION_CHECKSUM;
333
120
  }
334
- let dialectCache = checksumCache.get(migration);
335
- if (!dialectCache) {
336
- dialectCache = new Map();
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
- if (dialectCache.has(dialect)) {
340
- return dialectCache.get(dialect) ?? null;
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 getLegacyMigrationChecksum(migration) {
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
@@ -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":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoBH,OAAO,KAAK,EAKV,oBAAoB,EACpB,mBAAmB,EACnB,6BAA6B,EAC7B,4BAA4B,EAC7B,MAAM,SAAS,CAAC;AA8GjB;;;;;;;;;;;;;;;;;;;;;;;;;;;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,CAgLvC;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"}
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, getMigrationChecksum, getMigrationChecksumAlgorithm, inferMigrationChecksumDialect, LEGACY_SOURCE_MIGRATION_CHECKSUM_ALGORITHM, SQL_TRACE_MIGRATION_CHECKSUM_ALGORITHM, } from './checksum.js';
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 requireChecksumDialect(options) {
23
- const dialect = inferMigrationChecksumDialect(options.db);
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, dialect) {
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 === SQL_TRACE_MIGRATION_CHECKSUM_ALGORITHM) {
49
- return await getStoredChecksumForMigration(options, migration, dialect);
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, checksumDialect);
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, checksumDialect);
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, checksumDialect);
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
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' */
@@ -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,wBAAwB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE7D,MAAM,MAAM,0BAA0B,GAClC,kBAAkB,GAClB,cAAc,GACd,UAAU,CAAC;AAEf;;GAEG;AACH,MAAM,WAAW,6BAA6B,CAAC,EAAE,GAAG,OAAO;IACzD,kDAAkD;IAClD,EAAE,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IACpB,mDAAmD;IACnD,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IACtB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAClC;AAED,4EAA4E;AAC5E,MAAM,MAAM,mBAAmB,CAAC,EAAE,GAAG,OAAO,IAC1C,6BAA6B,CAAC,EAAE,CAAC,CAAC;AAEpC;;GAEG;AACH,MAAM,MAAM,eAAe,CAAC,EAAE,GAAG,OAAO,IAAI,MAAM,CAChD,MAAM,EACN,mBAAmB,CAAC,EAAE,CAAC,CACxB,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,EAAE,GAAG,OAAO;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,EAAE,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IACpB,+BAA+B;IAC/B,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IACtB,2EAA2E;IAC3E,QAAQ,EAAE,qBAAqB,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,EAAE,GAAG,OAAO;IAC7C,gCAAgC;IAChC,UAAU,EAAE,eAAe,CAAC,EAAE,CAAC,EAAE,CAAC;IAClC,sCAAsC;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,sCAAsC;IACtC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC;CAChE;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,0BAA0B,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,EAAE,GAAG,OAAO;IAChD,+BAA+B;IAC/B,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACf,iDAAiD;IACjD,UAAU,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAClC,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6EAA6E;IAC7E,kBAAkB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACvC;+EAC2E;IAC3E,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,6CAA6C;IAC7C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,6CAA6C;IAC7C,cAAc,EAAE,MAAM,CAAC;IACvB,yDAAyD;IACzD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B,CAAC,EAAE,GAAG,OAAO,CACzD,SAAQ,oBAAoB,CAAC,EAAE,CAAC;IAChC,4DAA4D;IAC5D,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,4BAA6B,SAAQ,mBAAmB;IACvE,kEAAkE;IAClE,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB"}
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-245",
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
- MigrationChecksumDialect,
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
- class TracingConnection implements DatabaseConnection {
168
- readonly #inner: DatabaseConnection;
169
- readonly #sink: TraceSink;
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 normalizeParameterValue(value: unknown): unknown {
337
- if (typeof value === 'bigint') {
338
- return { type: 'bigint', value: value.toString() };
339
- }
340
- if (value instanceof Date) {
341
- return { type: 'date', value: value.toISOString() };
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
- async function createSqliteChecksumDb<DB>(sink: TraceSink): Promise<{
364
- db: Kysely<DB>;
365
- dispose: () => Promise<void>;
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
- try {
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
- return {
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
- `Deterministic migration checksums for sqlite require an in-memory sqlite runtime in this environment. ${message}`
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
- inferMigrationChecksumDialect,
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
- if (migration.checksum === 'disabled') {
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 === SQL_TRACE_MIGRATION_CHECKSUM_ALGORITHM) {
113
- return await getStoredChecksumForMigration(options, migration, dialect);
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(migration),
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' */