@syncular/migrations 0.0.6-225 → 0.0.6-228
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 +14 -2
- 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/naming.d.ts +38 -0
- package/dist/naming.d.ts.map +1 -0
- package/dist/naming.js +60 -0
- package/dist/naming.js.map +1 -0
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +3 -3
- package/dist/runner.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +1 -0
- package/src/naming.ts +106 -0
- package/src/runner.ts +4 -3
package/README.md
CHANGED
|
@@ -11,7 +11,11 @@ npm install @syncular/migrations
|
|
|
11
11
|
## Usage
|
|
12
12
|
|
|
13
13
|
```ts
|
|
14
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
createMigrationTrackingTableName,
|
|
16
|
+
defineMigrations,
|
|
17
|
+
runMigrations,
|
|
18
|
+
} from '@syncular/migrations';
|
|
15
19
|
|
|
16
20
|
export const migrations = defineMigrations({
|
|
17
21
|
v1: async (db) => {
|
|
@@ -22,9 +26,17 @@ export const migrations = defineMigrations({
|
|
|
22
26
|
},
|
|
23
27
|
});
|
|
24
28
|
|
|
25
|
-
await runMigrations({
|
|
29
|
+
await runMigrations({
|
|
30
|
+
db,
|
|
31
|
+
migrations,
|
|
32
|
+
trackingTable: createMigrationTrackingTableName(['my_app', 'client']),
|
|
33
|
+
});
|
|
26
34
|
```
|
|
27
35
|
|
|
36
|
+
Use `createMigrationTrackingTableName(...)` whenever you want a custom table.
|
|
37
|
+
It keeps names lowercase, predictable, and consistently suffixed with
|
|
38
|
+
`migration_state`.
|
|
39
|
+
|
|
28
40
|
## Documentation
|
|
29
41
|
|
|
30
42
|
- Schema migrations: https://syncular.dev/docs/build/migrations
|
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,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
|
|
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"}
|
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,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
|
|
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"}
|
package/dist/naming.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @syncular/migrations - Migration tracking table naming helpers
|
|
3
|
+
*/
|
|
4
|
+
export type MigrationTrackingTableNamePart = string | number | null | undefined | false;
|
|
5
|
+
export interface CreateMigrationTrackingTableNameOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Optional namespace prefix placed before the scope segments.
|
|
8
|
+
* Defaults to `sync`.
|
|
9
|
+
*/
|
|
10
|
+
namespace?: MigrationTrackingTableNamePart | readonly MigrationTrackingTableNamePart[];
|
|
11
|
+
/**
|
|
12
|
+
* Optional suffix segments appended after `migration_state`.
|
|
13
|
+
*/
|
|
14
|
+
suffix?: MigrationTrackingTableNamePart | readonly MigrationTrackingTableNamePart[];
|
|
15
|
+
}
|
|
16
|
+
export declare const DEFAULT_MIGRATION_TRACKING_TABLE = "sync_migration_state";
|
|
17
|
+
/**
|
|
18
|
+
* Create a stable migration tracking table name.
|
|
19
|
+
*
|
|
20
|
+
* The generated name always includes the `migration_state` suffix and
|
|
21
|
+
* normalizes segments to lowercase snake_case.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* createMigrationTrackingTableName()
|
|
25
|
+
* // => 'sync_migration_state'
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* createMigrationTrackingTableName('server')
|
|
29
|
+
* // => 'sync_server_migration_state'
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* createMigrationTrackingTableName(['spaces', 'billing'], {
|
|
33
|
+
* suffix: ['prod', 'v2'],
|
|
34
|
+
* })
|
|
35
|
+
* // => 'sync_spaces_billing_migration_state_prod_v2'
|
|
36
|
+
*/
|
|
37
|
+
export declare function createMigrationTrackingTableName(scope?: MigrationTrackingTableNamePart | readonly MigrationTrackingTableNamePart[], options?: CreateMigrationTrackingTableNameOptions): string;
|
|
38
|
+
//# sourceMappingURL=naming.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../src/naming.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,8BAA8B,GACtC,MAAM,GACN,MAAM,GACN,IAAI,GACJ,SAAS,GACT,KAAK,CAAC;AAEV,MAAM,WAAW,uCAAuC;IACtD;;;OAGG;IACH,SAAS,CAAC,EACN,8BAA8B,GAC9B,SAAS,8BAA8B,EAAE,CAAC;IAC9C;;OAEG;IACH,MAAM,CAAC,EACH,8BAA8B,GAC9B,SAAS,8BAA8B,EAAE,CAAC;CAC/C;AAED,eAAO,MAAM,gCAAgC,yBAAyB,CAAC;AAqCvE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gCAAgC,CAC9C,KAAK,CAAC,EACF,8BAA8B,GAC9B,SAAS,8BAA8B,EAAE,EAC7C,OAAO,GAAE,uCAA4C,GACpD,MAAM,CAgBR"}
|
package/dist/naming.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @syncular/migrations - Migration tracking table naming helpers
|
|
3
|
+
*/
|
|
4
|
+
export const DEFAULT_MIGRATION_TRACKING_TABLE = 'sync_migration_state';
|
|
5
|
+
function normalizeTrackingTableNamePart(part) {
|
|
6
|
+
if (part === null || part === undefined || part === false) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
const normalized = String(part)
|
|
10
|
+
.trim()
|
|
11
|
+
.toLowerCase()
|
|
12
|
+
.replace(/[^a-z0-9]+/g, '_')
|
|
13
|
+
.replace(/^_+|_+$/g, '')
|
|
14
|
+
.replace(/_+/g, '_');
|
|
15
|
+
return normalized.length > 0 ? normalized : null;
|
|
16
|
+
}
|
|
17
|
+
function normalizeTrackingTableNameParts(input) {
|
|
18
|
+
if (Array.isArray(input)) {
|
|
19
|
+
return input
|
|
20
|
+
.map((part) => normalizeTrackingTableNamePart(part))
|
|
21
|
+
.filter((part) => part !== null);
|
|
22
|
+
}
|
|
23
|
+
const normalized = normalizeTrackingTableNamePart(input);
|
|
24
|
+
return normalized ? [normalized] : [];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create a stable migration tracking table name.
|
|
28
|
+
*
|
|
29
|
+
* The generated name always includes the `migration_state` suffix and
|
|
30
|
+
* normalizes segments to lowercase snake_case.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* createMigrationTrackingTableName()
|
|
34
|
+
* // => 'sync_migration_state'
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* createMigrationTrackingTableName('server')
|
|
38
|
+
* // => 'sync_server_migration_state'
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* createMigrationTrackingTableName(['spaces', 'billing'], {
|
|
42
|
+
* suffix: ['prod', 'v2'],
|
|
43
|
+
* })
|
|
44
|
+
* // => 'sync_spaces_billing_migration_state_prod_v2'
|
|
45
|
+
*/
|
|
46
|
+
export function createMigrationTrackingTableName(scope, options = {}) {
|
|
47
|
+
const namespace = options.namespace === undefined ? ['sync'] : options.namespace;
|
|
48
|
+
const segments = [
|
|
49
|
+
...normalizeTrackingTableNameParts(namespace),
|
|
50
|
+
...normalizeTrackingTableNameParts(scope),
|
|
51
|
+
'migration',
|
|
52
|
+
'state',
|
|
53
|
+
...normalizeTrackingTableNameParts(options.suffix),
|
|
54
|
+
];
|
|
55
|
+
if (segments.length === 0) {
|
|
56
|
+
return DEFAULT_MIGRATION_TRACKING_TABLE;
|
|
57
|
+
}
|
|
58
|
+
return segments.join('_');
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=naming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../src/naming.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyBH,MAAM,CAAC,MAAM,gCAAgC,GAAG,sBAAsB,CAAC;AAEvE,SAAS,8BAA8B,CACrC,IAAoC,EACrB;IACf,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;SAC5B,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEvB,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AAAA,CAClD;AAED,SAAS,+BAA+B,CACtC,KAGa,EACH;IACV,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK;aACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC;aACnD,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,UAAU,GAAG,8BAA8B,CAC/C,KAAuC,CACxC,CAAC;IACF,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAAA,CACvC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,gCAAgC,CAC9C,KAE6C,EAC7C,OAAO,GAA4C,EAAE,EAC7C;IACR,MAAM,SAAS,GACb,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACjE,MAAM,QAAQ,GAAG;QACf,GAAG,+BAA+B,CAAC,SAAS,CAAC;QAC7C,GAAG,+BAA+B,CAAC,KAAK,CAAC;QACzC,WAAW;QACX,OAAO;QACP,GAAG,+BAA+B,CAAC,OAAO,CAAC,MAAM,CAAC;KACnD,CAAC;IAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,gCAAgC,CAAC;IAC1C,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAAA,CAC3B"}
|
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;AAWH,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACnB,6BAA6B,EAC7B,4BAA4B,EAC7B,MAAM,SAAS,CAAC;AAuCjB;;;;;;;;;;;;;;;;;;;;;GAqBG;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,CAiJvC;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
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* @syncular/migrations - Migration runner
|
|
3
3
|
*/
|
|
4
4
|
import { getMigrationChecksum } from './define.js';
|
|
5
|
+
import { DEFAULT_MIGRATION_TRACKING_TABLE } from './naming.js';
|
|
5
6
|
import { clearAppliedMigrations, ensureTrackingTable, getAppliedMigrations, recordAppliedMigration, removeAppliedMigration, } from './tracking.js';
|
|
6
|
-
const DEFAULT_TRACKING_TABLE = 'sync_migration_state';
|
|
7
7
|
const migrationRunQueues = new Map();
|
|
8
8
|
function toErrorMessage(error) {
|
|
9
9
|
return error instanceof Error ? error.message : String(error);
|
|
@@ -70,7 +70,7 @@ export async function runMigrations(options) {
|
|
|
70
70
|
*/
|
|
71
71
|
export async function runMigrationsToVersion(options) {
|
|
72
72
|
const { db, migrations, targetVersion } = options;
|
|
73
|
-
const trackingTable = options.trackingTable ??
|
|
73
|
+
const trackingTable = options.trackingTable ?? DEFAULT_MIGRATION_TRACKING_TABLE;
|
|
74
74
|
const onChecksumMismatch = options.onChecksumMismatch ?? 'error';
|
|
75
75
|
const beforeReset = options.beforeReset;
|
|
76
76
|
if (!Number.isInteger(targetVersion) || targetVersion < 0) {
|
|
@@ -189,7 +189,7 @@ export async function runMigrationsToVersion(options) {
|
|
|
189
189
|
* Get the current schema version without running any migrations.
|
|
190
190
|
*/
|
|
191
191
|
export async function getSchemaVersion(db, trackingTable) {
|
|
192
|
-
const tableName = trackingTable ??
|
|
192
|
+
const tableName = trackingTable ?? DEFAULT_MIGRATION_TRACKING_TABLE;
|
|
193
193
|
const applied = await getAppliedMigrations(db, tableName);
|
|
194
194
|
if (applied.length === 0)
|
|
195
195
|
return 0;
|
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,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAQpB,MAAM,
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
package/src/naming.ts
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @syncular/migrations - Migration tracking table naming helpers
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export type MigrationTrackingTableNamePart =
|
|
6
|
+
| string
|
|
7
|
+
| number
|
|
8
|
+
| null
|
|
9
|
+
| undefined
|
|
10
|
+
| false;
|
|
11
|
+
|
|
12
|
+
export interface CreateMigrationTrackingTableNameOptions {
|
|
13
|
+
/**
|
|
14
|
+
* Optional namespace prefix placed before the scope segments.
|
|
15
|
+
* Defaults to `sync`.
|
|
16
|
+
*/
|
|
17
|
+
namespace?:
|
|
18
|
+
| MigrationTrackingTableNamePart
|
|
19
|
+
| readonly MigrationTrackingTableNamePart[];
|
|
20
|
+
/**
|
|
21
|
+
* Optional suffix segments appended after `migration_state`.
|
|
22
|
+
*/
|
|
23
|
+
suffix?:
|
|
24
|
+
| MigrationTrackingTableNamePart
|
|
25
|
+
| readonly MigrationTrackingTableNamePart[];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export const DEFAULT_MIGRATION_TRACKING_TABLE = 'sync_migration_state';
|
|
29
|
+
|
|
30
|
+
function normalizeTrackingTableNamePart(
|
|
31
|
+
part: MigrationTrackingTableNamePart
|
|
32
|
+
): string | null {
|
|
33
|
+
if (part === null || part === undefined || part === false) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const normalized = String(part)
|
|
38
|
+
.trim()
|
|
39
|
+
.toLowerCase()
|
|
40
|
+
.replace(/[^a-z0-9]+/g, '_')
|
|
41
|
+
.replace(/^_+|_+$/g, '')
|
|
42
|
+
.replace(/_+/g, '_');
|
|
43
|
+
|
|
44
|
+
return normalized.length > 0 ? normalized : null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function normalizeTrackingTableNameParts(
|
|
48
|
+
input:
|
|
49
|
+
| MigrationTrackingTableNamePart
|
|
50
|
+
| readonly MigrationTrackingTableNamePart[]
|
|
51
|
+
| undefined
|
|
52
|
+
): string[] {
|
|
53
|
+
if (Array.isArray(input)) {
|
|
54
|
+
return input
|
|
55
|
+
.map((part) => normalizeTrackingTableNamePart(part))
|
|
56
|
+
.filter((part): part is string => part !== null);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const normalized = normalizeTrackingTableNamePart(
|
|
60
|
+
input as MigrationTrackingTableNamePart
|
|
61
|
+
);
|
|
62
|
+
return normalized ? [normalized] : [];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Create a stable migration tracking table name.
|
|
67
|
+
*
|
|
68
|
+
* The generated name always includes the `migration_state` suffix and
|
|
69
|
+
* normalizes segments to lowercase snake_case.
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* createMigrationTrackingTableName()
|
|
73
|
+
* // => 'sync_migration_state'
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* createMigrationTrackingTableName('server')
|
|
77
|
+
* // => 'sync_server_migration_state'
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* createMigrationTrackingTableName(['spaces', 'billing'], {
|
|
81
|
+
* suffix: ['prod', 'v2'],
|
|
82
|
+
* })
|
|
83
|
+
* // => 'sync_spaces_billing_migration_state_prod_v2'
|
|
84
|
+
*/
|
|
85
|
+
export function createMigrationTrackingTableName(
|
|
86
|
+
scope?:
|
|
87
|
+
| MigrationTrackingTableNamePart
|
|
88
|
+
| readonly MigrationTrackingTableNamePart[],
|
|
89
|
+
options: CreateMigrationTrackingTableNameOptions = {}
|
|
90
|
+
): string {
|
|
91
|
+
const namespace =
|
|
92
|
+
options.namespace === undefined ? ['sync'] : options.namespace;
|
|
93
|
+
const segments = [
|
|
94
|
+
...normalizeTrackingTableNameParts(namespace),
|
|
95
|
+
...normalizeTrackingTableNameParts(scope),
|
|
96
|
+
'migration',
|
|
97
|
+
'state',
|
|
98
|
+
...normalizeTrackingTableNameParts(options.suffix),
|
|
99
|
+
];
|
|
100
|
+
|
|
101
|
+
if (segments.length === 0) {
|
|
102
|
+
return DEFAULT_MIGRATION_TRACKING_TABLE;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return segments.join('_');
|
|
106
|
+
}
|
package/src/runner.ts
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { getMigrationChecksum } from './define';
|
|
6
|
+
import { DEFAULT_MIGRATION_TRACKING_TABLE } from './naming';
|
|
6
7
|
import {
|
|
7
8
|
clearAppliedMigrations,
|
|
8
9
|
ensureTrackingTable,
|
|
@@ -17,7 +18,6 @@ import type {
|
|
|
17
18
|
RunMigrationsToVersionResult,
|
|
18
19
|
} from './types';
|
|
19
20
|
|
|
20
|
-
const DEFAULT_TRACKING_TABLE = 'sync_migration_state';
|
|
21
21
|
const migrationRunQueues = new Map<string, Promise<void>>();
|
|
22
22
|
|
|
23
23
|
function toErrorMessage(error: unknown): string {
|
|
@@ -98,7 +98,8 @@ export async function runMigrationsToVersion<DB>(
|
|
|
98
98
|
options: RunMigrationsToVersionOptions<DB>
|
|
99
99
|
): Promise<RunMigrationsToVersionResult> {
|
|
100
100
|
const { db, migrations, targetVersion } = options;
|
|
101
|
-
const trackingTable =
|
|
101
|
+
const trackingTable =
|
|
102
|
+
options.trackingTable ?? DEFAULT_MIGRATION_TRACKING_TABLE;
|
|
102
103
|
const onChecksumMismatch = options.onChecksumMismatch ?? 'error';
|
|
103
104
|
const beforeReset = options.beforeReset;
|
|
104
105
|
if (!Number.isInteger(targetVersion) || targetVersion < 0) {
|
|
@@ -249,7 +250,7 @@ export async function getSchemaVersion<DB>(
|
|
|
249
250
|
db: import('kysely').Kysely<DB>,
|
|
250
251
|
trackingTable?: string
|
|
251
252
|
): Promise<number> {
|
|
252
|
-
const tableName = trackingTable ??
|
|
253
|
+
const tableName = trackingTable ?? DEFAULT_MIGRATION_TRACKING_TABLE;
|
|
253
254
|
const applied = await getAppliedMigrations(db, tableName);
|
|
254
255
|
if (applied.length === 0) return 0;
|
|
255
256
|
return applied[applied.length - 1]!.version;
|