@syncular/migrations 0.0.6-244 → 0.0.6-245
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 +29 -5
- package/dist/checksum.d.ts +11 -0
- package/dist/checksum.d.ts.map +1 -0
- package/dist/checksum.js +355 -0
- package/dist/checksum.js.map +1 -0
- package/dist/define.d.ts +22 -18
- package/dist/define.d.ts.map +1 -1
- package/dist/define.js +39 -166
- package/dist/define.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/runner.d.ts +8 -2
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +69 -15
- package/dist/runner.js.map +1 -1
- package/dist/tracking.d.ts.map +1 -1
- package/dist/tracking.js +32 -3
- package/dist/tracking.js.map +1 -1
- package/dist/types.d.ts +13 -15
- package/dist/types.d.ts.map +1 -1
- package/package.json +9 -2
- package/src/checksum.ts +528 -0
- package/src/define.ts +49 -201
- package/src/index.ts +1 -0
- package/src/runner.ts +134 -19
- package/src/tracking.ts +36 -3
- package/src/types.ts +19 -16
package/dist/define.js
CHANGED
|
@@ -12,146 +12,46 @@ function parseVersionKey(key) {
|
|
|
12
12
|
const version = Number.parseInt(match[1], 10);
|
|
13
13
|
return Number.isNaN(version) ? null : version;
|
|
14
14
|
}
|
|
15
|
-
/**
|
|
16
|
-
* Normalize a function source string for checksum comparison.
|
|
17
|
-
* Strips comments and collapses whitespace so that formatting-only
|
|
18
|
-
* changes don't break checksums.
|
|
19
|
-
*/
|
|
20
|
-
function stripCommentsPreservingStrings(source) {
|
|
21
|
-
let out = '';
|
|
22
|
-
let i = 0;
|
|
23
|
-
let mode = 'code';
|
|
24
|
-
while (i < source.length) {
|
|
25
|
-
const char = source[i];
|
|
26
|
-
const next = source[i + 1];
|
|
27
|
-
if (mode === 'lineComment') {
|
|
28
|
-
if (char === '\n') {
|
|
29
|
-
out += '\n';
|
|
30
|
-
mode = 'code';
|
|
31
|
-
}
|
|
32
|
-
i += 1;
|
|
33
|
-
continue;
|
|
34
|
-
}
|
|
35
|
-
if (mode === 'blockComment') {
|
|
36
|
-
if (char === '*' && next === '/') {
|
|
37
|
-
i += 2;
|
|
38
|
-
mode = 'code';
|
|
39
|
-
continue;
|
|
40
|
-
}
|
|
41
|
-
if (char === '\n') {
|
|
42
|
-
out += '\n';
|
|
43
|
-
}
|
|
44
|
-
i += 1;
|
|
45
|
-
continue;
|
|
46
|
-
}
|
|
47
|
-
if (mode === 'singleQuote') {
|
|
48
|
-
out += char;
|
|
49
|
-
if (char === '\\' && next !== undefined) {
|
|
50
|
-
out += next;
|
|
51
|
-
i += 2;
|
|
52
|
-
continue;
|
|
53
|
-
}
|
|
54
|
-
if (char === "'") {
|
|
55
|
-
mode = 'code';
|
|
56
|
-
}
|
|
57
|
-
i += 1;
|
|
58
|
-
continue;
|
|
59
|
-
}
|
|
60
|
-
if (mode === 'doubleQuote') {
|
|
61
|
-
out += char;
|
|
62
|
-
if (char === '\\' && next !== undefined) {
|
|
63
|
-
out += next;
|
|
64
|
-
i += 2;
|
|
65
|
-
continue;
|
|
66
|
-
}
|
|
67
|
-
if (char === '"') {
|
|
68
|
-
mode = 'code';
|
|
69
|
-
}
|
|
70
|
-
i += 1;
|
|
71
|
-
continue;
|
|
72
|
-
}
|
|
73
|
-
if (mode === 'template') {
|
|
74
|
-
out += char;
|
|
75
|
-
if (char === '\\' && next !== undefined) {
|
|
76
|
-
out += next;
|
|
77
|
-
i += 2;
|
|
78
|
-
continue;
|
|
79
|
-
}
|
|
80
|
-
if (char === '`') {
|
|
81
|
-
mode = 'code';
|
|
82
|
-
}
|
|
83
|
-
i += 1;
|
|
84
|
-
continue;
|
|
85
|
-
}
|
|
86
|
-
if (char === '/' && next === '/') {
|
|
87
|
-
mode = 'lineComment';
|
|
88
|
-
i += 2;
|
|
89
|
-
continue;
|
|
90
|
-
}
|
|
91
|
-
if (char === '/' && next === '*') {
|
|
92
|
-
mode = 'blockComment';
|
|
93
|
-
i += 2;
|
|
94
|
-
continue;
|
|
95
|
-
}
|
|
96
|
-
if (char === "'") {
|
|
97
|
-
mode = 'singleQuote';
|
|
98
|
-
out += char;
|
|
99
|
-
i += 1;
|
|
100
|
-
continue;
|
|
101
|
-
}
|
|
102
|
-
if (char === '"') {
|
|
103
|
-
mode = 'doubleQuote';
|
|
104
|
-
out += char;
|
|
105
|
-
i += 1;
|
|
106
|
-
continue;
|
|
107
|
-
}
|
|
108
|
-
if (char === '`') {
|
|
109
|
-
mode = 'template';
|
|
110
|
-
out += char;
|
|
111
|
-
i += 1;
|
|
112
|
-
continue;
|
|
113
|
-
}
|
|
114
|
-
out += char;
|
|
115
|
-
i += 1;
|
|
116
|
-
}
|
|
117
|
-
return out;
|
|
118
|
-
}
|
|
119
|
-
function normalizeSource(source) {
|
|
120
|
-
return stripCommentsPreservingStrings(source)
|
|
121
|
-
.replace(/\s+/g, ' ') // collapse whitespace
|
|
122
|
-
.trim();
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Compute a simple checksum for a migration function.
|
|
126
|
-
* Used to detect if a migration has changed after being applied.
|
|
127
|
-
*/
|
|
128
|
-
function computeChecksum(fn) {
|
|
129
|
-
const fnStr = normalizeSource(fn.toString());
|
|
130
|
-
let hash = 0;
|
|
131
|
-
for (let i = 0; i < fnStr.length; i++) {
|
|
132
|
-
hash = (hash * 31 + fnStr.charCodeAt(i)) >>> 0;
|
|
133
|
-
}
|
|
134
|
-
return hash.toString(16).padStart(8, '0');
|
|
135
|
-
}
|
|
136
15
|
function isMigrationDefinitionObject(value) {
|
|
137
16
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
138
17
|
}
|
|
18
|
+
function normalizeChecksumMode(key, checksum) {
|
|
19
|
+
if (checksum === undefined) {
|
|
20
|
+
return 'deterministic';
|
|
21
|
+
}
|
|
22
|
+
if (checksum === 'deterministic' || checksum === 'disabled') {
|
|
23
|
+
return checksum;
|
|
24
|
+
}
|
|
25
|
+
throw new Error(`Invalid migration "${key}": "checksum" must be "deterministic" or "disabled" when provided.`);
|
|
26
|
+
}
|
|
139
27
|
/**
|
|
140
28
|
* Define versioned migrations with automatic version parsing and sorting.
|
|
141
29
|
*
|
|
142
30
|
* @example
|
|
143
31
|
* ```typescript
|
|
144
32
|
* export const migrations = defineMigrations({
|
|
145
|
-
* v1:
|
|
146
|
-
*
|
|
147
|
-
* .
|
|
148
|
-
*
|
|
149
|
-
*
|
|
33
|
+
* v1: {
|
|
34
|
+
* up: async (db) => {
|
|
35
|
+
* await db.schema.createTable('tasks')
|
|
36
|
+
* .addColumn('id', 'text', col => col.primaryKey())
|
|
37
|
+
* .addColumn('title', 'text', col => col.notNull())
|
|
38
|
+
* .execute();
|
|
39
|
+
* },
|
|
40
|
+
* down: async (db) => {
|
|
41
|
+
* await db.schema.dropTable('tasks').ifExists().execute();
|
|
42
|
+
* },
|
|
150
43
|
* },
|
|
151
|
-
* v2:
|
|
152
|
-
*
|
|
153
|
-
* .
|
|
154
|
-
*
|
|
44
|
+
* v2: {
|
|
45
|
+
* up: async (db) => {
|
|
46
|
+
* await db.schema.alterTable('tasks')
|
|
47
|
+
* .addColumn('priority', 'integer', col => col.defaultTo(0))
|
|
48
|
+
* .execute();
|
|
49
|
+
* },
|
|
50
|
+
* down: async (db) => {
|
|
51
|
+
* await db.schema.alterTable('tasks')
|
|
52
|
+
* .dropColumn('priority')
|
|
53
|
+
* .execute();
|
|
54
|
+
* },
|
|
155
55
|
* },
|
|
156
56
|
* });
|
|
157
57
|
* ```
|
|
@@ -166,33 +66,23 @@ export function defineMigrations(versionedMigrations) {
|
|
|
166
66
|
if (version < 1) {
|
|
167
67
|
throw new Error(`Invalid migration version ${version}: versions must be >= 1`);
|
|
168
68
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
: definition;
|
|
172
|
-
const down = isMigrationDefinitionObject(definition)
|
|
173
|
-
? definition.down
|
|
174
|
-
: undefined;
|
|
175
|
-
const compatibleChecksums = isMigrationDefinitionObject(definition)
|
|
176
|
-
? (definition.compatibleChecksums ?? [])
|
|
177
|
-
: [];
|
|
178
|
-
if (typeof up !== 'function') {
|
|
179
|
-
throw new Error(`Invalid migration "${key}": expected an async function or { up, down? } object.`);
|
|
69
|
+
if (!isMigrationDefinitionObject(definition)) {
|
|
70
|
+
throw new Error(`Invalid migration "${key}": expected a { up, down } object. Shorthand migration functions are not supported.`);
|
|
180
71
|
}
|
|
181
|
-
|
|
182
|
-
|
|
72
|
+
const { up, down } = definition;
|
|
73
|
+
const checksum = normalizeChecksumMode(key, definition.checksum);
|
|
74
|
+
if (typeof up !== 'function') {
|
|
75
|
+
throw new Error(`Invalid migration "${key}": "up" must be a function.`);
|
|
183
76
|
}
|
|
184
|
-
if (
|
|
185
|
-
|
|
186
|
-
throw new Error(`Invalid migration "${key}": "compatibleChecksums" must be an array of non-empty strings when provided.`);
|
|
77
|
+
if (typeof down !== 'function') {
|
|
78
|
+
throw new Error(`Invalid migration "${key}": "down" must be a function.`);
|
|
187
79
|
}
|
|
188
80
|
migrations.push({
|
|
189
81
|
version,
|
|
190
82
|
name: key,
|
|
191
83
|
up,
|
|
192
84
|
down,
|
|
193
|
-
|
|
194
|
-
...new Set(compatibleChecksums.map((v) => v.trim())),
|
|
195
|
-
],
|
|
85
|
+
checksum,
|
|
196
86
|
});
|
|
197
87
|
}
|
|
198
88
|
// Sort by version number
|
|
@@ -212,21 +102,4 @@ export function defineMigrations(versionedMigrations) {
|
|
|
212
102
|
},
|
|
213
103
|
};
|
|
214
104
|
}
|
|
215
|
-
/**
|
|
216
|
-
* Get the checksum for a migration.
|
|
217
|
-
*/
|
|
218
|
-
export function getMigrationChecksum(migration) {
|
|
219
|
-
return computeChecksum(migration.up);
|
|
220
|
-
}
|
|
221
|
-
/**
|
|
222
|
-
* Get the accepted checksums for a migration, including the current checksum.
|
|
223
|
-
*/
|
|
224
|
-
export function getCompatibleMigrationChecksums(migration) {
|
|
225
|
-
return [
|
|
226
|
-
...new Set([
|
|
227
|
-
getMigrationChecksum(migration),
|
|
228
|
-
...migration.compatibleChecksums,
|
|
229
|
-
]),
|
|
230
|
-
];
|
|
231
|
-
}
|
|
232
105
|
//# sourceMappingURL=define.js.map
|
package/dist/define.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH;;GAEG;AACH,SAAS,eAAe,CAAC,GAAW;IAClC,oCAAoC;IACpC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AAChD,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
|
package/dist/runner.d.ts
CHANGED
|
@@ -10,8 +10,14 @@ import type { RunMigrationsOptions, RunMigrationsResult, RunMigrationsToVersionO
|
|
|
10
10
|
* import { defineMigrations, runMigrations } from '@syncular/migrations';
|
|
11
11
|
*
|
|
12
12
|
* const migrations = defineMigrations({
|
|
13
|
-
* v1:
|
|
14
|
-
*
|
|
13
|
+
* v1: {
|
|
14
|
+
* up: async (db) => { ... },
|
|
15
|
+
* down: async (db) => { ... },
|
|
16
|
+
* },
|
|
17
|
+
* v2: {
|
|
18
|
+
* up: async (db) => { ... },
|
|
19
|
+
* down: async (db) => { ... },
|
|
20
|
+
* },
|
|
15
21
|
* });
|
|
16
22
|
*
|
|
17
23
|
* const result = await runMigrations({
|
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;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"}
|
package/dist/runner.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @syncular/migrations - Migration runner
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
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';
|
|
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();
|
|
@@ -13,6 +13,43 @@ function isAlreadyExistsSchemaError(error) {
|
|
|
13
13
|
return (message.includes('already exists') ||
|
|
14
14
|
(message.includes('relation') && message.includes('exists')));
|
|
15
15
|
}
|
|
16
|
+
function isDeterministicMigration(migration) {
|
|
17
|
+
return migration.checksum === 'deterministic';
|
|
18
|
+
}
|
|
19
|
+
function getDeterministicMigrations(migrations) {
|
|
20
|
+
return migrations.migrations.filter(isDeterministicMigration);
|
|
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;
|
|
40
|
+
}
|
|
41
|
+
async function getChecksumForAlgorithm(options, migration, algorithm, dialect) {
|
|
42
|
+
if (algorithm === DISABLED_MIGRATION_CHECKSUM_ALGORITHM) {
|
|
43
|
+
return DISABLED_MIGRATION_CHECKSUM;
|
|
44
|
+
}
|
|
45
|
+
if (algorithm === LEGACY_SOURCE_MIGRATION_CHECKSUM_ALGORITHM) {
|
|
46
|
+
return getLegacyMigrationChecksum(migration);
|
|
47
|
+
}
|
|
48
|
+
if (algorithm === SQL_TRACE_MIGRATION_CHECKSUM_ALGORITHM) {
|
|
49
|
+
return await getStoredChecksumForMigration(options, migration, dialect);
|
|
50
|
+
}
|
|
51
|
+
throw new Error(`Unsupported migration checksum algorithm: ${algorithm}`);
|
|
52
|
+
}
|
|
16
53
|
async function runWithMigrationQueue(queueKey, task) {
|
|
17
54
|
const previous = migrationRunQueues.get(queueKey) ?? Promise.resolve();
|
|
18
55
|
let release;
|
|
@@ -40,8 +77,14 @@ async function runWithMigrationQueue(queueKey, task) {
|
|
|
40
77
|
* import { defineMigrations, runMigrations } from '@syncular/migrations';
|
|
41
78
|
*
|
|
42
79
|
* const migrations = defineMigrations({
|
|
43
|
-
* v1:
|
|
44
|
-
*
|
|
80
|
+
* v1: {
|
|
81
|
+
* up: async (db) => { ... },
|
|
82
|
+
* down: async (db) => { ... },
|
|
83
|
+
* },
|
|
84
|
+
* v2: {
|
|
85
|
+
* up: async (db) => { ... },
|
|
86
|
+
* down: async (db) => { ... },
|
|
87
|
+
* },
|
|
45
88
|
* });
|
|
46
89
|
*
|
|
47
90
|
* const result = await runMigrations({
|
|
@@ -91,14 +134,24 @@ export async function runMigrationsToVersion(options) {
|
|
|
91
134
|
const revertedVersions = [];
|
|
92
135
|
let wasReset = false;
|
|
93
136
|
let recoveredFromSchemaConflict = false;
|
|
137
|
+
const deterministicMigrations = getDeterministicMigrations(migrations);
|
|
138
|
+
const checksumDialect = deterministicMigrations.length > 0
|
|
139
|
+
? requireChecksumDialect(options)
|
|
140
|
+
: null;
|
|
94
141
|
// Check for checksum mismatches up-front when reset mode is enabled
|
|
95
142
|
if (onChecksumMismatch === 'reset' && applied.length > 0) {
|
|
96
|
-
|
|
143
|
+
let hasMismatch = false;
|
|
144
|
+
for (const migration of deterministicMigrations) {
|
|
97
145
|
const existing = appliedByVersion.get(migration.version);
|
|
98
|
-
if (!existing)
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
146
|
+
if (!existing) {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const currentChecksum = await getChecksumForAlgorithm(options, migration, existing.checksum_algorithm, checksumDialect);
|
|
150
|
+
if (existing.checksum !== currentChecksum) {
|
|
151
|
+
hasMismatch = true;
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
102
155
|
if (hasMismatch) {
|
|
103
156
|
// Let caller drop application tables first
|
|
104
157
|
await options.beforeReset?.(db);
|
|
@@ -115,9 +168,11 @@ export async function runMigrationsToVersion(options) {
|
|
|
115
168
|
if (!existing) {
|
|
116
169
|
continue;
|
|
117
170
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
171
|
+
if (migration.checksum === 'disabled') {
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
const currentChecksum = await getChecksumForAlgorithm(options, migration, existing.checksum_algorithm, checksumDialect);
|
|
175
|
+
if (existing.checksum !== currentChecksum) {
|
|
121
176
|
throw new Error(`Migration v${migration.version} (${migration.name}) has changed since it was applied. ` +
|
|
122
177
|
`Stored checksum ${existing.checksum} is not compatible with current checksum ${currentChecksum}. ` +
|
|
123
178
|
'Migrations must not be modified after being applied.');
|
|
@@ -156,10 +211,12 @@ export async function runMigrationsToVersion(options) {
|
|
|
156
211
|
index = -1;
|
|
157
212
|
continue;
|
|
158
213
|
}
|
|
214
|
+
const checksum = await getStoredChecksumForMigration(options, migration, checksumDialect);
|
|
159
215
|
await recordAppliedMigration(db, trackingTable, {
|
|
160
216
|
version: migration.version,
|
|
161
217
|
name: migration.name,
|
|
162
|
-
checksum
|
|
218
|
+
checksum,
|
|
219
|
+
checksum_algorithm: getMigrationChecksumAlgorithm(migration),
|
|
163
220
|
});
|
|
164
221
|
appliedVersions.push(migration.version);
|
|
165
222
|
}
|
|
@@ -170,9 +227,6 @@ export async function runMigrationsToVersion(options) {
|
|
|
170
227
|
if (!migration) {
|
|
171
228
|
throw new Error(`Cannot revert migration v${version}: migration is not defined in current migration set.`);
|
|
172
229
|
}
|
|
173
|
-
if (typeof migration.down !== 'function') {
|
|
174
|
-
throw new Error(`Cannot revert migration v${version} (${migration.name}): down migration is not defined.`);
|
|
175
|
-
}
|
|
176
230
|
await migration.down(db);
|
|
177
231
|
await removeAppliedMigration(db, trackingTable, version);
|
|
178
232
|
revertedVersions.push(version);
|
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
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,2BAA2B,EAC3B,qCAAqC,EACrC,0BAA0B,EAC1B,oBAAoB,EACpB,6BAA6B,EAC7B,6BAA6B,EAC7B,0CAA0C,EAC1C,sCAAsC,GACvC,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gCAAgC,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAYpB,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAyB,CAAC;AAE5D,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAc;IAChD,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,OAAO,CACL,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAClC,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAC7D,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAK,SAA8B;IAClE,OAAO,SAAS,CAAC,QAAQ,KAAK,eAAe,CAAC;AAChD,CAAC;AAED,SAAS,0BAA0B,CACjC,UAAiC;IAEjC,OAAO,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,sBAAsB,CAC7B,OAAiC;IAEjC,MAAM,OAAO,GAAG,6BAA6B,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAE1D,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,mFAAmF;QACjF,8FAA8F,CACjG,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,6BAA6B,CAC1C,OAAiC,EACjC,SAA8B,EAC9B,OAAwC;IAExC,IAAI,SAAS,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QACtC,OAAO,2BAA2B,CAAC;IACrC,CAAC;IAED,MAAM,eAAe,GAAG,OAAO,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CACzC,OAAO,CAAC,UAAU,EAClB,SAAS,EACT,eAAe,CAChB,CAAC;IAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,cAAc,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,IAAI,sEAAsE,CACzH,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,OAAiC,EACjC,SAA8B,EAC9B,SAAqC,EACrC,OAAwC;IAExC,IAAI,SAAS,KAAK,qCAAqC,EAAE,CAAC;QACxD,OAAO,2BAA2B,CAAC;IACrC,CAAC;IAED,IAAI,SAAS,KAAK,0CAA0C,EAAE,CAAC;QAC7D,OAAO,0BAA0B,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,SAAS,KAAK,sCAAsC,EAAE,CAAC;QACzD,OAAO,MAAM,6BAA6B,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,6CAA6C,SAAS,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,QAAgB,EAChB,IAAsB;IAEtB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IACvE,IAAI,OAAoB,CAAC;IACzB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC5C,OAAO,GAAG,OAAO,CAAC;IACpB,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;IAC1C,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAEvC,MAAM,QAAQ,CAAC;IACf,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,EAAE,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,OAAO,EAAE,CAAC;QACV,IAAI,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;YAC9C,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAiC;IAEjC,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC;QAC1C,GAAG,OAAO;QACV,aAAa,EAAE,OAAO,CAAC,UAAU,CAAC,cAAc;KACjD,CAAC,CAAC;IACH,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAA0C;IAE1C,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAClD,MAAM,aAAa,GACjB,OAAO,CAAC,aAAa,IAAI,gCAAgC,CAAC;IAC5D,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,OAAO,CAAC;IACjE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CACb,0BAA0B,aAAa,2CAA2C,CACnF,CAAC;IACJ,CAAC;IACD,IAAI,aAAa,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CACb,0BAA0B,aAAa,gCAAgC,UAAU,CAAC,cAAc,GAAG,CACpG,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,mFAAmF;IACnF,OAAO,qBAAqB,CAAC,YAAY,aAAa,EAAE,EAAE,KAAK,IAAI,EAAE;QACnE,+BAA+B;QAC/B,MAAM,mBAAmB,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QAE7C,iCAAiC;QACjC,IAAI,OAAO,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QAC5D,IAAI,gBAAgB,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnE,MAAM,eAAe,GAAa,EAAE,CAAC;QACrC,MAAM,gBAAgB,GAAa,EAAE,CAAC;QACtC,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,2BAA2B,GAAG,KAAK,CAAC;QACxC,MAAM,uBAAuB,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAC;QACvE,MAAM,eAAe,GACnB,uBAAuB,CAAC,MAAM,GAAG,CAAC;YAChC,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC;YACjC,CAAC,CAAC,IAAI,CAAC;QAEX,oEAAoE;QACpE,IAAI,kBAAkB,KAAK,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzD,IAAI,WAAW,GAAG,KAAK,CAAC;YAExB,KAAK,MAAM,SAAS,IAAI,uBAAuB,EAAE,CAAC;gBAChD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBACzD,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,SAAS;gBACX,CAAC;gBAED,MAAM,eAAe,GAAG,MAAM,uBAAuB,CACnD,OAAO,EACP,SAAS,EACT,QAAQ,CAAC,kBAAkB,EAC3B,eAAe,CAChB,CAAC;gBACF,IAAI,QAAQ,CAAC,QAAQ,KAAK,eAAe,EAAE,CAAC;oBAC1C,WAAW,GAAG,IAAI,CAAC;oBACnB,MAAM;gBACR,CAAC;YACH,CAAC;YAED,IAAI,WAAW,EAAE,CAAC;gBAChB,2CAA2C;gBAC3C,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;gBAChC,gDAAgD;gBAChD,MAAM,sBAAsB,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;gBAChD,QAAQ,GAAG,IAAI,CAAC;gBAEhB,mCAAmC;gBACnC,OAAO,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;gBACxD,gBAAgB,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAED,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACzD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,SAAS;YACX,CAAC;YAED,IAAI,SAAS,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;gBACtC,SAAS;YACX,CAAC;YAED,MAAM,eAAe,GAAG,MAAM,uBAAuB,CACnD,OAAO,EACP,SAAS,EACT,QAAQ,CAAC,kBAAkB,EAC3B,eAAe,CAChB,CAAC;YAEF,IAAI,QAAQ,CAAC,QAAQ,KAAK,eAAe,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CACb,cAAc,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,IAAI,sCAAsC;oBACtF,mBAAmB,QAAQ,CAAC,QAAQ,4CAA4C,eAAe,IAAI;oBACnG,sDAAsD,CACzD,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,cAAc,GAClB,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAEhE,IAAI,aAAa,GAAG,cAAc,EAAE,CAAC;YACnC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;gBACrE,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC,KAAK,CAAE,CAAC;gBAChD,IAAI,SAAS,CAAC,OAAO,IAAI,cAAc,EAAE,CAAC;oBACxC,SAAS;gBACX,CAAC;gBACD,IAAI,SAAS,CAAC,OAAO,GAAG,aAAa,EAAE,CAAC;oBACtC,MAAM;gBACR,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBACzB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,sBAAsB,GAC1B,kBAAkB,KAAK,OAAO;wBAC9B,OAAO,WAAW,KAAK,UAAU;wBACjC,CAAC,2BAA2B;wBAC5B,0BAA0B,CAAC,KAAK,CAAC,CAAC;oBAEpC,IAAI,CAAC,sBAAsB,EAAE,CAAC;wBAC5B,MAAM,KAAK,CAAC;oBACd,CAAC;oBAED,mEAAmE;oBACnE,kDAAkD;oBAClD,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC;oBACtB,MAAM,sBAAsB,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;oBAChD,QAAQ,GAAG,IAAI,CAAC;oBAChB,2BAA2B,GAAG,IAAI,CAAC;oBACnC,OAAO,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;oBACxD,gBAAgB,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC/D,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;oBAC3B,KAAK,GAAG,CAAC,CAAC,CAAC;oBACX,SAAS;gBACX,CAAC;gBAED,MAAM,QAAQ,GAAG,MAAM,6BAA6B,CAClD,OAAO,EACP,SAAS,EACT,eAAe,CAChB,CAAC;gBAEF,MAAM,sBAAsB,CAAC,EAAE,EAAE,aAAa,EAAE;oBAC9C,OAAO,EAAE,SAAS,CAAC,OAAO;oBAC1B,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,QAAQ;oBACR,kBAAkB,EAAE,6BAA6B,CAAC,SAAS,CAAC;iBAC7D,CAAC,CAAC;gBACH,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;aAAM,IAAI,aAAa,GAAG,cAAc,EAAE,CAAC;YAC1C,KACE,IAAI,OAAO,GAAG,cAAc,EAC5B,OAAO,GAAG,aAAa,EACvB,OAAO,IAAI,CAAC,EACZ,CAAC;gBACD,MAAM,SAAS,GAAG,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACnD,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,MAAM,IAAI,KAAK,CACb,4BAA4B,OAAO,sDAAsD,CAC1F,CAAC;gBACJ,CAAC;gBACD,MAAM,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACzB,MAAM,sBAAsB,CAAC,EAAE,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;gBACzD,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,eAAe;YACxB,QAAQ,EAAE,gBAAgB;YAC1B,cAAc,EAAE,aAAa;YAC7B,QAAQ;SACT,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAA+B,EAC/B,aAAsB;IAEtB,MAAM,SAAS,GAAG,aAAa,IAAI,gCAAgC,CAAC;IACpE,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACnC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,OAAO,CAAC;AAC9C,CAAC"}
|
package/dist/tracking.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracking.d.ts","sourceRoot":"","sources":["../src/tracking.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAO,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"tracking.d.ts","sourceRoot":"","sources":["../src/tracking.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAO,MAAM,QAAQ,CAAC;AAE1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAejD;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,EAAE,EAC1C,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,UAAU,SAAS,MAAM,EACtE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EACd,SAAS,EAAE,UAAU,GACpB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAU9B;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,EAAE,EAAE,UAAU,SAAS,MAAM,EACxE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EACd,SAAS,EAAE,UAAU,EACrB,SAAS,EAAE,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,GAC/C,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,EAAE,EAAE,UAAU,SAAS,MAAM,EACxE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EACd,SAAS,EAAE,UAAU,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,EAAE,EAC7C,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,UAAU,SAAS,MAAM,EACnE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EACd,SAAS,EAAE,UAAU,GACpB,OAAO,CAAC,MAAM,CAAC,CAIjB"}
|
package/dist/tracking.js
CHANGED
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
* @syncular/migrations - Migration tracking table helpers
|
|
3
3
|
*/
|
|
4
4
|
import { sql } from 'kysely';
|
|
5
|
+
import { LEGACY_SOURCE_MIGRATION_CHECKSUM_ALGORITHM } from './checksum.js';
|
|
6
|
+
function isDuplicateColumnError(error) {
|
|
7
|
+
if (!(error instanceof Error)) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
const message = error.message.toLowerCase();
|
|
11
|
+
return (message.includes('duplicate column') ||
|
|
12
|
+
message.includes('already exists') ||
|
|
13
|
+
(message.includes('column') && message.includes('exists')));
|
|
14
|
+
}
|
|
5
15
|
/**
|
|
6
16
|
* Ensure the migration tracking table exists.
|
|
7
17
|
*/
|
|
@@ -13,7 +23,19 @@ export async function ensureTrackingTable(db, tableName) {
|
|
|
13
23
|
.addColumn('name', 'text', (col) => col.notNull())
|
|
14
24
|
.addColumn('applied_at', 'text', (col) => col.notNull())
|
|
15
25
|
.addColumn('checksum', 'text', (col) => col.notNull())
|
|
26
|
+
.addColumn('checksum_algorithm', 'text', (col) => col.notNull())
|
|
16
27
|
.execute();
|
|
28
|
+
try {
|
|
29
|
+
await sql `
|
|
30
|
+
alter table ${sql.table(tableName)}
|
|
31
|
+
add column checksum_algorithm text not null default ${sql.raw(`'${LEGACY_SOURCE_MIGRATION_CHECKSUM_ALGORITHM}'`)}
|
|
32
|
+
`.execute(db);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
if (!isDuplicateColumnError(error)) {
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
17
39
|
}
|
|
18
40
|
/**
|
|
19
41
|
* Get all applied migrations from the tracking table.
|
|
@@ -21,7 +43,7 @@ export async function ensureTrackingTable(db, tableName) {
|
|
|
21
43
|
export async function getAppliedMigrations(db, tableName) {
|
|
22
44
|
await ensureTrackingTable(db, tableName);
|
|
23
45
|
const result = await sql `
|
|
24
|
-
select version, name, applied_at, checksum
|
|
46
|
+
select version, name, applied_at, checksum, checksum_algorithm
|
|
25
47
|
from ${sql.table(tableName)}
|
|
26
48
|
order by version asc
|
|
27
49
|
`.execute(db);
|
|
@@ -33,12 +55,19 @@ export async function getAppliedMigrations(db, tableName) {
|
|
|
33
55
|
export async function recordAppliedMigration(db, tableName, migration) {
|
|
34
56
|
await ensureTrackingTable(db, tableName);
|
|
35
57
|
await sql `
|
|
36
|
-
insert into ${sql.table(tableName)} (
|
|
58
|
+
insert into ${sql.table(tableName)} (
|
|
59
|
+
version,
|
|
60
|
+
name,
|
|
61
|
+
applied_at,
|
|
62
|
+
checksum,
|
|
63
|
+
checksum_algorithm
|
|
64
|
+
)
|
|
37
65
|
values (
|
|
38
66
|
${migration.version},
|
|
39
67
|
${migration.name},
|
|
40
68
|
${new Date().toISOString()},
|
|
41
|
-
${migration.checksum}
|
|
69
|
+
${migration.checksum},
|
|
70
|
+
${migration.checksum_algorithm}
|
|
42
71
|
)
|
|
43
72
|
`.execute(db);
|
|
44
73
|
}
|
package/dist/tracking.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracking.js","sourceRoot":"","sources":["../src/tracking.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAe,GAAG,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"tracking.js","sourceRoot":"","sources":["../src/tracking.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -6,6 +6,9 @@ import type { Kysely } from 'kysely';
|
|
|
6
6
|
* A single migration function that modifies the database schema.
|
|
7
7
|
*/
|
|
8
8
|
export type MigrationFn<DB = unknown> = (db: Kysely<DB>) => Promise<void>;
|
|
9
|
+
export type MigrationChecksumMode = 'deterministic' | 'disabled';
|
|
10
|
+
export type MigrationChecksumDialect = 'sqlite' | 'postgres';
|
|
11
|
+
export type MigrationChecksumAlgorithm = 'legacy_source_v1' | 'sql_trace_v1' | 'disabled';
|
|
9
12
|
/**
|
|
10
13
|
* A reversible migration definition.
|
|
11
14
|
*/
|
|
@@ -13,18 +16,12 @@ export interface ReversibleMigrationDefinition<DB = unknown> {
|
|
|
13
16
|
/** Apply schema/data changes for this version. */
|
|
14
17
|
up: MigrationFn<DB>;
|
|
15
18
|
/** Revert schema/data changes for this version. */
|
|
16
|
-
down
|
|
17
|
-
/**
|
|
18
|
-
|
|
19
|
-
* copies of this migration.
|
|
20
|
-
*/
|
|
21
|
-
compatibleChecksums?: string[];
|
|
19
|
+
down: MigrationFn<DB>;
|
|
20
|
+
/** Controls whether this migration participates in checksum validation. */
|
|
21
|
+
checksum?: MigrationChecksumMode;
|
|
22
22
|
}
|
|
23
|
-
/**
|
|
24
|
-
|
|
25
|
-
* an object with explicit up/down handlers.
|
|
26
|
-
*/
|
|
27
|
-
export type MigrationDefinition<DB = unknown> = MigrationFn<DB> | ReversibleMigrationDefinition<DB>;
|
|
23
|
+
/** A migration definition must explicitly provide both up/down handlers. */
|
|
24
|
+
export type MigrationDefinition<DB = unknown> = ReversibleMigrationDefinition<DB>;
|
|
28
25
|
/**
|
|
29
26
|
* Record of versioned migrations keyed by version string (e.g., 'v1', 'v2').
|
|
30
27
|
*/
|
|
@@ -37,10 +34,10 @@ export interface ParsedMigration<DB = unknown> {
|
|
|
37
34
|
name: string;
|
|
38
35
|
/** Up migration function. */
|
|
39
36
|
up: MigrationFn<DB>;
|
|
40
|
-
/**
|
|
41
|
-
down
|
|
42
|
-
/**
|
|
43
|
-
|
|
37
|
+
/** Down migration function. */
|
|
38
|
+
down: MigrationFn<DB>;
|
|
39
|
+
/** Controls whether this migration participates in checksum validation. */
|
|
40
|
+
checksum: MigrationChecksumMode;
|
|
44
41
|
}
|
|
45
42
|
/**
|
|
46
43
|
* Result of defineMigrations() - contains migrations and metadata.
|
|
@@ -61,6 +58,7 @@ export interface MigrationStateRow {
|
|
|
61
58
|
name: string;
|
|
62
59
|
applied_at: string;
|
|
63
60
|
checksum: string;
|
|
61
|
+
checksum_algorithm: MigrationChecksumAlgorithm;
|
|
64
62
|
}
|
|
65
63
|
/**
|
|
66
64
|
* Options for running migrations.
|