@pipelab/migration 1.0.0-beta.6 → 1.0.0-beta.8
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/CHANGELOG.md +12 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/models/createMigration.ts +3 -5
package/CHANGELOG.md
CHANGED
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/models/migration.ts","../src/models/createMigration.ts","../src/models/createMigrator.ts"],"mappings":";;;;KAMY,SAAA,MAAe,OAAA,CAAQ,CAAA,IAAK,CAAA;AAAA,KAE5B,WAAA,cAAyB,KAAA,EAAO,IAAA,EAAM,aAAA,aAA0B,SAAA,CAAU,EAAA;AAAA,KAE1E,cAAA;EACV,KAAA;EACA,MAAA,GAAS,MAAA;EACT,MAAA,IAAU,KAAA,OAAY,OAAA,EAAS,MAAA,KAAW,OAAA;AAAA;AAAA,cAU/B,wBAAA,EAEX,OAAA,CAFmC,YAAA;EAAA,kBAEnC,OAAA,CAAA,YAAA;AAAA;AAAA,cAEW,mBAAA,yBAA6C,aAAA,EAAe,MAAA,EAAQ,aAAA,KAAa,OAAA,CAAA,YAAA,CAAA,aAAA;AAAA,KAKlF,eAAA,GAAkB,WAAA,QAAmB,wBAAA;AAAA,KAErC,WAAA,MAAiB,IAAA,CAAK,CAAA,QAAS,eAAA;AAAA,KAE/B,MAAA;AAAA,UAEK,cAAA;EACf,OAAA,EAAS,MAAA;EACT,EAAA,EAAI,WAAA,CAAY,OAAA,EAAS,EAAA;AAAA;AAAA,UAGV,iBAAA;EACf,OAAA,EAAS,MAAA;EACT,EAAA,EAAI,WAAA,CAAY,WAAA,CAAY,OAAA,GAAU,WAAA,CAAY,EAAA;AAAA;AAAA,UAGnC,cAAA;EACf,UAAA,EAAY,cAAA;EACZ,MAAA;EACA,YAAA,GAAe,UAAA;AAAA;AAAA,cAGJ,QAAA,sBAA8B,eAAA,sBAAqC,eAAA;EAC9E,OAAA,EAAS,MAAA;EAET,UAAA,EAAY,MAAA,CAAO,MAAA,EAAQ,cAAA;EAE3B,MAAA;EACA,YAAA,EAAc,WAAA;cAEF,MAAA,EAAQ,cAAA,CAAe,YAAA,EAAc,WAAA;EAYjD,WAAA,CAAA;EAKM,OAAA,CACJ,MAAA,EAAQ,eAAA,cACR,OAAA,GAAU,cAAA,GACT,OAAA,CAAQ,WAAA;EAqEX,SAAA,CAAU,OAAA,EAAS,MAAA,GAAS,MAAA;EAI5B,aAAA,CAAc,OAAA,EAAS,MAAA;AAAA;;;iBClJT,eAAA,
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/models/migration.ts","../src/models/createMigration.ts","../src/models/createMigrator.ts"],"mappings":";;;;KAMY,SAAA,MAAe,OAAA,CAAQ,CAAA,IAAK,CAAA;AAAA,KAE5B,WAAA,cAAyB,KAAA,EAAO,IAAA,EAAM,aAAA,aAA0B,SAAA,CAAU,EAAA;AAAA,KAE1E,cAAA;EACV,KAAA;EACA,MAAA,GAAS,MAAA;EACT,MAAA,IAAU,KAAA,OAAY,OAAA,EAAS,MAAA,KAAW,OAAA;AAAA;AAAA,cAU/B,wBAAA,EAEX,OAAA,CAFmC,YAAA;EAAA,kBAEnC,OAAA,CAAA,YAAA;AAAA;AAAA,cAEW,mBAAA,yBAA6C,aAAA,EAAe,MAAA,EAAQ,aAAA,KAAa,OAAA,CAAA,YAAA,CAAA,aAAA;AAAA,KAKlF,eAAA,GAAkB,WAAA,QAAmB,wBAAA;AAAA,KAErC,WAAA,MAAiB,IAAA,CAAK,CAAA,QAAS,eAAA;AAAA,KAE/B,MAAA;AAAA,UAEK,cAAA;EACf,OAAA,EAAS,MAAA;EACT,EAAA,EAAI,WAAA,CAAY,OAAA,EAAS,EAAA;AAAA;AAAA,UAGV,iBAAA;EACf,OAAA,EAAS,MAAA;EACT,EAAA,EAAI,WAAA,CAAY,WAAA,CAAY,OAAA,GAAU,WAAA,CAAY,EAAA;AAAA;AAAA,UAGnC,cAAA;EACf,UAAA,EAAY,cAAA;EACZ,MAAA;EACA,YAAA,GAAe,UAAA;AAAA;AAAA,cAGJ,QAAA,sBAA8B,eAAA,sBAAqC,eAAA;EAC9E,OAAA,EAAS,MAAA;EAET,UAAA,EAAY,MAAA,CAAO,MAAA,EAAQ,cAAA;EAE3B,MAAA;EACA,YAAA,EAAc,WAAA;cAEF,MAAA,EAAQ,cAAA,CAAe,YAAA,EAAc,WAAA;EAYjD,WAAA,CAAA;EAKM,OAAA,CACJ,MAAA,EAAQ,eAAA,cACR,OAAA,GAAU,cAAA,GACT,OAAA,CAAQ,WAAA;EAqEX,SAAA,CAAU,OAAA,EAAS,MAAA,GAAS,MAAA;EAI5B,aAAA,CAAc,OAAA,EAAS,MAAA;AAAA;;;iBClJT,eAAA,iBAAgC,eAAA,aAA4B,eAAA,CAAA,CAC1E,SAAA,EAAW,iBAAA,CAAkB,OAAA,EAAS,EAAA,IACrC,cAAA,CAAe,OAAA,EAAS,EAAA;AAAA,cAad,YAAA;;;cCtBA,cAAA,wBACU,eAAA,qBACF,eAAA;8BAGW,UAAA,GAAa,UAAA;2BAI/B,cAAA,CAAe,YAAA,EAAc,UAAA,IACpC,QAAA,CAAS,YAAA,EAAc,UAAA;AAAA;AAAA,KAMlB,eAAA,sBACW,eAAA,qBACF,eAAA,IACjB,UAAA,QAAkB,cAAA,CAAe,YAAA,EAAc,UAAA"}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/models/createMigration.ts","../src/utils/object-keys.ts","../src/models/migration.ts","../src/models/createMigrator.ts"],"sourcesContent":["import {\n MigrationFn,\n MigrationObjInput,\n MigrationClass,\n MigrationSchema,\n OmitVersion,\n SemVer,\n} from \"./migration\";\n\nexport function createMigration
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/models/createMigration.ts","../src/utils/object-keys.ts","../src/models/migration.ts","../src/models/createMigrator.ts"],"sourcesContent":["import {\n MigrationFn,\n MigrationObjInput,\n MigrationClass,\n MigrationSchema,\n OmitVersion,\n SemVer,\n} from \"./migration\";\n\nexport function createMigration<Current extends MigrationSchema, Up extends MigrationSchema>(\n migration: MigrationObjInput<Current, Up>,\n): MigrationClass<Current, Up> {\n return {\n version: migration.version,\n up: async (state, nextVersion) => {\n const newState = migration.up\n ? ((await migration.up(state, nextVersion)) as unknown as Up)\n : (state as unknown as Up);\n newState.version = nextVersion as SemVer;\n return newState;\n },\n };\n}\n\nexport const finalVersion = () => {\n throw new Error(\"Unable to go up on the final version!\");\n};\n","export type ObjectKeys<T extends object> = `${Exclude<keyof T, symbol>}`;\n\nexport const objectKeys = Object.keys as <Type extends object>(\n value: Type,\n) => Array<ObjectKeys<Type>>;\nexport const objectEntries = Object.entries as <Type extends Record<PropertyKey, unknown>>(\n value: Type,\n) => Array<[ObjectKeys<Type>, Type[ObjectKeys<Type>]]>;\n","import * as semver from \"semver\";\nimport { coerce } from \"semver\";\nimport { objectKeys } from \"../utils/object-keys\";\nimport { klona } from \"klona\";\nimport { custom, InferOutput, object, ObjectEntries } from \"valibot\";\n\nexport type Awaitable<T> = Promise<T> | T;\n\nexport type MigrationFn<From, To> = (state: From, targetVersion: string) => Awaitable<To>;\n\nexport type MigrateOptions = {\n debug?: boolean;\n target?: SemVer;\n onStep?: (state: any, version: SemVer) => Promise<void> | void;\n};\n\nconst SemverValidator = custom<SemVer>((input) =>\n typeof input === \"string\" ? /^\\d+\\.\\d+\\.\\d+$/.test(input) : false,\n);\n\nexport const SemverVersionValidator = SemverValidator;\n// export const SemverVersionValidator = optional(SemverValidator, '1.0.0')\n\nexport const MigrationSchemaValidator = object({\n version: SemverVersionValidator,\n});\n\nexport const createVersionSchema = <OBJECTENTRIES extends ObjectEntries>(schema: OBJECTENTRIES) =>\n object({\n ...schema,\n });\n\nexport type MigrationSchema = InferOutput<typeof MigrationSchemaValidator>;\n\nexport type OmitVersion<T> = Omit<T, keyof MigrationSchema>;\n\nexport type SemVer = `${number}.${number}.${number}`;\n\nexport interface MigrationClass<Current, Up> {\n version: SemVer;\n up: MigrationFn<Current, Up>;\n}\n\nexport interface MigrationObjInput<Current, Up> {\n version: SemVer;\n up: MigrationFn<OmitVersion<Current>, OmitVersion<Up>>;\n}\n\nexport interface MigratorConfig<InitialState, FinalState> {\n migrations: MigrationClass<any, any>[];\n coerce?: boolean;\n defaultValue?: FinalState;\n}\n\nexport class Migrator<InitialState extends MigrationSchema, OutputState extends MigrationSchema> {\n current: SemVer;\n\n migrations: Record<SemVer, MigrationClass<any, any>> = {};\n\n coerce: boolean;\n defaultValue: OutputState;\n\n constructor(config: MigratorConfig<InitialState, OutputState>) {\n config.migrations.forEach((migration) => {\n this.migrations[migration.version] = migration;\n });\n\n this.defaultValue = config?.defaultValue ?? ({} as OutputState);\n\n const versions = this.getVersions();\n this.current = versions[versions.length - 1];\n this.coerce = config?.coerce ?? true;\n }\n\n getVersions() {\n const keys = objectKeys(this.migrations);\n return semver.sort(keys);\n }\n\n async migrate(\n _state: MigrationSchema | undefined,\n options?: MigrateOptions,\n ): Promise<OutputState> {\n const state = _state ?? this.defaultValue;\n const currentVersion = this.tryCoerce(state.version);\n const targetVersion = this.tryCoerce(options?.target ?? this.current);\n\n if (options?.debug) {\n console.log(\"Migrating from\", currentVersion, \"to\", targetVersion);\n }\n\n let finalState = klona(state) as any; // Using any here because we'll be transforming between versions\n const versions = this.getVersions();\n const currentIndex = versions.indexOf(currentVersion);\n const targetIndex = versions.indexOf(targetVersion);\n\n if (currentIndex === -1) {\n throw new Error(`Current version \"${currentVersion}\" not found in migrations`);\n }\n if (targetIndex === -1) {\n throw new Error(`Target version \"${targetVersion}\" not found in migrations`);\n }\n\n // If we're already at the target version, return the state\n if (currentIndex === targetIndex) {\n return finalState as OutputState;\n }\n\n // Get the migration path\n const isUpgrade = currentIndex < targetIndex;\n\n if (!isUpgrade) {\n return finalState as OutputState;\n }\n\n // Perform migrations\n for (let i = currentIndex; i < targetIndex; i++) {\n const currentVersion = versions[i];\n const nextVersion = versions[i + 1];\n\n if (options?.debug) {\n console.log(\"\\tMigrating to version:\", nextVersion);\n }\n\n const migrationVersion = currentVersion;\n const migration = this.migrations[migrationVersion];\n\n // Remove version before migration\n const { version: _, ...stateWithoutVersion } = finalState;\n\n // Perform migration\n const migratedState = await migration.up(stateWithoutVersion, currentVersion);\n\n // Add new version\n finalState = {\n ...migratedState,\n version: nextVersion,\n };\n\n if (options?.onStep) {\n await options.onStep(finalState, nextVersion);\n }\n\n if (options?.debug) {\n console.log(\"\\tMigrated state:\", finalState);\n }\n }\n\n return finalState as OutputState;\n }\n\n tryCoerce(version: SemVer): SemVer {\n return this.coerce ? ((coerce(version)?.version as SemVer | undefined) ?? version) : version;\n }\n\n needMigration(version: SemVer) {\n const newVersion = this.tryCoerce(version);\n return semver.lt(newVersion, this.current);\n }\n}\n","import { MigratorConfig, Migrator, MigrationSchema } from \"./migration\";\n\nexport const createMigrator = <\n InitialState extends MigrationSchema,\n FinalState extends MigrationSchema,\n>() => {\n return {\n createDefault(defaultState: FinalState): FinalState {\n return defaultState;\n },\n createMigrations(\n config: MigratorConfig<InitialState, FinalState>,\n ): Migrator<InitialState, FinalState> {\n return new Migrator<InitialState, FinalState>(config);\n },\n };\n};\n\nexport type MigratorFactory<\n InitialState extends MigrationSchema,\n FinalState extends MigrationSchema,\n> = ReturnType<typeof createMigrator<InitialState, FinalState>>;\n"],"mappings":";;;;;AASA,SAAgB,gBACd,WAC6B;AAC7B,QAAO;EACL,SAAS,UAAU;EACnB,IAAI,OAAO,OAAO,gBAAgB;GAChC,MAAM,WAAW,UAAU,KACrB,MAAM,UAAU,GAAG,OAAO,YAAY,GACvC;AACL,YAAS,UAAU;AACnB,UAAO;;EAEV;;AAGH,MAAa,qBAAqB;AAChC,OAAM,IAAI,MAAM,wCAAwC;;;;ACvB1D,MAAa,aAAa,OAAO;ACqBO,OAAO,EAC7C,SARsB,QAAgB,UACtC,OAAO,UAAU,WAAW,kBAAkB,KAAK,MAAM,GAAG,MAC7D,EAOA,CAAC;AAEF,MAAa,uBAA4D,WACvE,OAAO,EACL,GAAG,QACJ,CAAC;AAwBJ,IAAa,WAAb,MAAiG;CAC/F;CAEA,aAAuD,EAAE;CAEzD;CACA;CAEA,YAAY,QAAmD;AAC7D,SAAO,WAAW,SAAS,cAAc;AACvC,QAAK,WAAW,UAAU,WAAW;IACrC;AAEF,OAAK,eAAe,QAAQ,gBAAiB,EAAE;EAE/C,MAAM,WAAW,KAAK,aAAa;AACnC,OAAK,UAAU,SAAS,SAAS,SAAS;AAC1C,OAAK,SAAS,QAAQ,UAAU;;CAGlC,cAAc;EACZ,MAAM,OAAO,WAAW,KAAK,WAAW;AACxC,SAAO,OAAO,KAAK,KAAK;;CAG1B,MAAM,QACJ,QACA,SACsB;EACtB,MAAM,QAAQ,UAAU,KAAK;EAC7B,MAAM,iBAAiB,KAAK,UAAU,MAAM,QAAQ;EACpD,MAAM,gBAAgB,KAAK,UAAU,SAAS,UAAU,KAAK,QAAQ;AAErE,MAAI,SAAS,MACX,SAAQ,IAAI,kBAAkB,gBAAgB,MAAM,cAAc;EAGpE,IAAI,aAAa,MAAM,MAAM;EAC7B,MAAM,WAAW,KAAK,aAAa;EACnC,MAAM,eAAe,SAAS,QAAQ,eAAe;EACrD,MAAM,cAAc,SAAS,QAAQ,cAAc;AAEnD,MAAI,iBAAiB,GACnB,OAAM,IAAI,MAAM,oBAAoB,eAAe,2BAA2B;AAEhF,MAAI,gBAAgB,GAClB,OAAM,IAAI,MAAM,mBAAmB,cAAc,2BAA2B;AAI9E,MAAI,iBAAiB,YACnB,QAAO;AAMT,MAAI,EAFc,eAAe,aAG/B,QAAO;AAIT,OAAK,IAAI,IAAI,cAAc,IAAI,aAAa,KAAK;GAC/C,MAAM,iBAAiB,SAAS;GAChC,MAAM,cAAc,SAAS,IAAI;AAEjC,OAAI,SAAS,MACX,SAAQ,IAAI,0BAA2B,YAAY;GAGrD,MAAM,mBAAmB;GACzB,MAAM,YAAY,KAAK,WAAW;GAGlC,MAAM,EAAE,SAAS,GAAG,GAAG,wBAAwB;AAM/C,gBAAa;IACX,GAJoB,MAAM,UAAU,GAAG,qBAAqB,eAAe;IAK3E,SAAS;IACV;AAED,OAAI,SAAS,OACX,OAAM,QAAQ,OAAO,YAAY,YAAY;AAG/C,OAAI,SAAS,MACX,SAAQ,IAAI,oBAAqB,WAAW;;AAIhD,SAAO;;CAGT,UAAU,SAAyB;AACjC,SAAO,KAAK,SAAW,OAAO,QAAQ,EAAE,WAAkC,UAAW;;CAGvF,cAAc,SAAiB;EAC7B,MAAM,aAAa,KAAK,UAAU,QAAQ;AAC1C,SAAO,OAAO,GAAG,YAAY,KAAK,QAAQ;;;;;AC3J9C,MAAa,uBAGN;AACL,QAAO;EACL,cAAc,cAAsC;AAClD,UAAO;;EAET,iBACE,QACoC;AACpC,UAAO,IAAI,SAAmC,OAAO;;EAExD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pipelab/migration",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.8",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Migration utilities for Pipelab data structures",
|
|
6
6
|
"license": "FSL-1.1-MIT",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"@types/semver": "^7.5.8",
|
|
36
36
|
"tsdown": "0.21.2",
|
|
37
37
|
"typescript": "5.9.3",
|
|
38
|
-
"@pipelab/tsconfig": "1.0.0-beta.
|
|
38
|
+
"@pipelab/tsconfig": "1.0.0-beta.8"
|
|
39
39
|
},
|
|
40
40
|
"scripts": {
|
|
41
41
|
"build": "tsdown",
|
|
@@ -7,10 +7,9 @@ import {
|
|
|
7
7
|
SemVer,
|
|
8
8
|
} from "./migration";
|
|
9
9
|
|
|
10
|
-
export function createMigration<
|
|
11
|
-
Current
|
|
12
|
-
|
|
13
|
-
>(migration: MigrationObjInput<Current, Up>): MigrationClass<Current, Up> {
|
|
10
|
+
export function createMigration<Current extends MigrationSchema, Up extends MigrationSchema>(
|
|
11
|
+
migration: MigrationObjInput<Current, Up>,
|
|
12
|
+
): MigrationClass<Current, Up> {
|
|
14
13
|
return {
|
|
15
14
|
version: migration.version,
|
|
16
15
|
up: async (state, nextVersion) => {
|
|
@@ -26,4 +25,3 @@ export function createMigration<
|
|
|
26
25
|
export const finalVersion = () => {
|
|
27
26
|
throw new Error("Unable to go up on the final version!");
|
|
28
27
|
};
|
|
29
|
-
|