@nanocollective/json-up
Advanced tools
| import type { z } from "zod"; | ||
| import type { Migration } from "./types.js"; | ||
| import type { AsyncMigration, Migration } from "./types.js"; | ||
| /** | ||
@@ -16,2 +16,15 @@ * Type helper for creating standalone migrations with proper type inference. | ||
| export declare function createMigration<TInput, TOutput extends z.ZodTypeAny>(migration: Migration<TInput, TOutput>): Migration<TInput, TOutput>; | ||
| /** | ||
| * Type helper for creating standalone async migrations with proper type inference. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const migration = createAsyncMigration({ | ||
| * version: 1, | ||
| * schema: z.object({ name: z.string(), key: z.string() }), | ||
| * up: async () => ({ name: "", key: await generateKey() }), | ||
| * }); | ||
| * ``` | ||
| */ | ||
| export declare function createAsyncMigration<TInput, TOutput extends z.ZodTypeAny>(migration: AsyncMigration<TInput, TOutput>): AsyncMigration<TInput, TOutput>; | ||
| //# sourceMappingURL=create-migration.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"create-migration.d.ts","sourceRoot":"","sources":["../src/create-migration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,SAAS,CAAC,CAAC,UAAU,EACnE,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAE5B"} | ||
| {"version":3,"file":"create-migration.d.ts","sourceRoot":"","sources":["../src/create-migration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,SAAS,CAAC,CAAC,UAAU,EACnE,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAE5B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,SAAS,CAAC,CAAC,UAAU,EACxE,SAAS,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,GACxC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAEjC"} |
@@ -16,2 +16,17 @@ /** | ||
| } | ||
| /** | ||
| * Type helper for creating standalone async migrations with proper type inference. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const migration = createAsyncMigration({ | ||
| * version: 1, | ||
| * schema: z.object({ name: z.string(), key: z.string() }), | ||
| * up: async () => ({ name: "", key: await generateKey() }), | ||
| * }); | ||
| * ``` | ||
| */ | ||
| export function createAsyncMigration(migration) { | ||
| return migration; | ||
| } | ||
| //# sourceMappingURL=create-migration.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"create-migration.js","sourceRoot":"","sources":["../src/create-migration.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAC9B,SAAqC;IAErC,OAAO,SAAS,CAAC;AAClB,CAAC"} | ||
| {"version":3,"file":"create-migration.js","sourceRoot":"","sources":["../src/create-migration.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAC9B,SAAqC;IAErC,OAAO,SAAS,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CACnC,SAA0C;IAE1C,OAAO,SAAS,CAAC;AAClB,CAAC"} |
| import type { z } from "zod"; | ||
| import type { AnyMigration, Migration } from "./types.js"; | ||
| import type { AnyAsyncMigration, AnyMigration, AsyncMigration, Migration } from "./types.js"; | ||
| /** | ||
@@ -42,3 +42,51 @@ * Builder interface for creating type-safe migration chains. | ||
| export declare function createMigrations(): MigrationBuilder<unknown, readonly []>; | ||
| /** | ||
| * Builder interface for creating migration chains that support async `up()` functions. | ||
| * Each `.add()` call accepts both sync and async `up()` functions. | ||
| */ | ||
| interface AsyncMigrationBuilder<TPrevOutput, TAccumulated extends readonly AnyAsyncMigration[]> { | ||
| /** | ||
| * Add a migration to the chain. | ||
| * The `up()` function can be sync or async. | ||
| * The input type is inferred from the previous migration's output. | ||
| */ | ||
| add<TSchema extends z.ZodTypeAny>(migration: { | ||
| version: number; | ||
| schema: TSchema; | ||
| up: (state: TPrevOutput) => z.infer<TSchema> | Promise<z.infer<TSchema>>; | ||
| }): AsyncMigrationBuilder<z.infer<TSchema>, readonly [...TAccumulated, AsyncMigration<TPrevOutput, TSchema>]>; | ||
| /** | ||
| * Build and return the migrations array. | ||
| */ | ||
| build(): TAccumulated; | ||
| } | ||
| /** | ||
| * Creates a builder for migration chains that support async `up()` functions. | ||
| * | ||
| * Use this instead of `createMigrations()` when any migration needs to perform | ||
| * async operations. The built migrations should be passed to `migrateAsync()`. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const migrations = createAsyncMigrations() | ||
| * .add({ | ||
| * version: 1, | ||
| * schema: z.object({ name: z.string() }), | ||
| * up: (state) => ({ name: state.name ?? "" }), | ||
| * }) | ||
| * .add({ | ||
| * version: 2, | ||
| * schema: z.object({ name: z.string(), key: z.string() }), | ||
| * up: async (state) => ({ | ||
| * name: state.name, | ||
| * key: await generateKey(), | ||
| * }), | ||
| * }) | ||
| * .build(); | ||
| * | ||
| * const result = await migrateAsync({ state, migrations }); | ||
| * ``` | ||
| */ | ||
| export declare function createAsyncMigrations(): AsyncMigrationBuilder<unknown, readonly []>; | ||
| export {}; | ||
| //# sourceMappingURL=create-migrations.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"create-migrations.d.ts","sourceRoot":"","sources":["../src/create-migrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE1D;;;GAGG;AACH,UAAU,gBAAgB,CAAC,WAAW,EAAE,YAAY,SAAS,SAAS,YAAY,EAAE;IACnF;;;OAGG;IACH,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE;QAC5C,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,OAAO,CAAC;QAChB,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;KAC7C,GAAG,gBAAgB,CACnB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAChB,SAAS,CAAC,GAAG,YAAY,EAAE,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAC3D,CAAC;IAEF;;OAEG;IACH,KAAK,IAAI,YAAY,CAAC;CACtB;AAiCD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,IAAI,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAEzE"} | ||
| {"version":3,"file":"create-migrations.d.ts","sourceRoot":"","sources":["../src/create-migrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE7F;;;GAGG;AACH,UAAU,gBAAgB,CAAC,WAAW,EAAE,YAAY,SAAS,SAAS,YAAY,EAAE;IACnF;;;OAGG;IACH,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE;QAC5C,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,OAAO,CAAC;QAChB,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;KAC7C,GAAG,gBAAgB,CACnB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAChB,SAAS,CAAC,GAAG,YAAY,EAAE,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAC3D,CAAC;IAEF;;OAEG;IACH,KAAK,IAAI,YAAY,CAAC;CACtB;AAiCD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,IAAI,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAEzE;AAED;;;GAGG;AACH,UAAU,qBAAqB,CAAC,WAAW,EAAE,YAAY,SAAS,SAAS,iBAAiB,EAAE;IAC7F;;;;OAIG;IACH,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE;QAC5C,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,OAAO,CAAC;QAChB,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;KACzE,GAAG,qBAAqB,CACxB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAChB,SAAS,CAAC,GAAG,YAAY,EAAE,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAChE,CAAC;IAEF;;OAEG;IACH,KAAK,IAAI,YAAY,CAAC;CACtB;AAiCD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,qBAAqB,IAAI,qBAAqB,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAEnF"} |
@@ -37,2 +37,46 @@ /** | ||
| } | ||
| /** | ||
| * Internal async builder implementation. | ||
| */ | ||
| function createAsyncBuilder(migrations) { | ||
| return { | ||
| add(migration) { | ||
| const newMigrations = [...migrations, migration]; | ||
| return createAsyncBuilder(newMigrations); | ||
| }, | ||
| build() { | ||
| return migrations; | ||
| }, | ||
| }; | ||
| } | ||
| /** | ||
| * Creates a builder for migration chains that support async `up()` functions. | ||
| * | ||
| * Use this instead of `createMigrations()` when any migration needs to perform | ||
| * async operations. The built migrations should be passed to `migrateAsync()`. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const migrations = createAsyncMigrations() | ||
| * .add({ | ||
| * version: 1, | ||
| * schema: z.object({ name: z.string() }), | ||
| * up: (state) => ({ name: state.name ?? "" }), | ||
| * }) | ||
| * .add({ | ||
| * version: 2, | ||
| * schema: z.object({ name: z.string(), key: z.string() }), | ||
| * up: async (state) => ({ | ||
| * name: state.name, | ||
| * key: await generateKey(), | ||
| * }), | ||
| * }) | ||
| * .build(); | ||
| * | ||
| * const result = await migrateAsync({ state, migrations }); | ||
| * ``` | ||
| */ | ||
| export function createAsyncMigrations() { | ||
| return createAsyncBuilder([]); | ||
| } | ||
| //# sourceMappingURL=create-migrations.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"create-migrations.js","sourceRoot":"","sources":["../src/create-migrations.ts"],"names":[],"mappings":"AA2BA;;GAEG;AACH,SAAS,aAAa,CACrB,UAAwB;IAExB,OAAO;QACN,GAAG,CAA+B,SAIjC;YAIA,MAAM,aAAa,GAAG,CAAC,GAAG,UAAU,EAAE,SAAS,CAG9C,CAAC;YACF,OAAO,aAAa,CAGlB,aAAa,CAAC,CAAC;QAClB,CAAC;QAED,KAAK;YACJ,OAAO,UAAU,CAAC;QACnB,CAAC;KACD,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,gBAAgB;IAC/B,OAAO,aAAa,CAAuB,EAAW,CAAC,CAAC;AACzD,CAAC"} | ||
| {"version":3,"file":"create-migrations.js","sourceRoot":"","sources":["../src/create-migrations.ts"],"names":[],"mappings":"AA2BA;;GAEG;AACH,SAAS,aAAa,CACrB,UAAwB;IAExB,OAAO;QACN,GAAG,CAA+B,SAIjC;YAIA,MAAM,aAAa,GAAG,CAAC,GAAG,UAAU,EAAE,SAAS,CAG9C,CAAC;YACF,OAAO,aAAa,CAGlB,aAAa,CAAC,CAAC;QAClB,CAAC;QAED,KAAK;YACJ,OAAO,UAAU,CAAC;QACnB,CAAC;KACD,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,gBAAgB;IAC/B,OAAO,aAAa,CAAuB,EAAW,CAAC,CAAC;AACzD,CAAC;AA2BD;;GAEG;AACH,SAAS,kBAAkB,CAC1B,UAAwB;IAExB,OAAO;QACN,GAAG,CAA+B,SAIjC;YAIA,MAAM,aAAa,GAAG,CAAC,GAAG,UAAU,EAAE,SAAS,CAG9C,CAAC;YACF,OAAO,kBAAkB,CAGvB,aAAa,CAAC,CAAC;QAClB,CAAC;QAED,KAAK;YACJ,OAAO,UAAU,CAAC;QACnB,CAAC;KACD,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,qBAAqB;IACpC,OAAO,kBAAkB,CAAuB,EAAW,CAAC,CAAC;AAC9D,CAAC"} |
+5
-5
@@ -1,7 +0,7 @@ | ||
| export { createMigration } from "./create-migration.js"; | ||
| export { createMigrations } from "./create-migrations.js"; | ||
| export { createAsyncMigration, createMigration } from "./create-migration.js"; | ||
| export { createAsyncMigrations, createMigrations } from "./create-migrations.js"; | ||
| export { MigrationError, ValidationError, VersionError } from "./errors.js"; | ||
| export type { MigrateOptions } from "./migrate.js"; | ||
| export { migrate } from "./migrate.js"; | ||
| export type { AnyMigration, InferMigrationInput, LastMigrationOutput, Migration, WithVersion, } from "./types.js"; | ||
| export type { MigrateAsyncOptions, MigrateOptions } from "./migrate.js"; | ||
| export { migrate, migrateAsync } from "./migrate.js"; | ||
| export type { AnyAsyncMigration, AnyMigration, AsyncMigration, InferAsyncMigrationInput, InferMigrationInput, LastAsyncMigrationOutput, LastMigrationOutput, Migration, WithVersion, } from "./types.js"; | ||
| //# sourceMappingURL=index.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC5E,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EACX,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,SAAS,EACT,WAAW,GACX,MAAM,YAAY,CAAC"} | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEjF,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC5E,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EACX,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,SAAS,EACT,WAAW,GACX,MAAM,YAAY,CAAC"} |
+3
-3
| // Types | ||
| // Functions | ||
| export { createMigration } from "./create-migration.js"; | ||
| export { createMigrations } from "./create-migrations.js"; | ||
| export { createAsyncMigration, createMigration } from "./create-migration.js"; | ||
| export { createAsyncMigrations, createMigrations } from "./create-migrations.js"; | ||
| // Errors | ||
| export { MigrationError, ValidationError, VersionError } from "./errors.js"; | ||
| export { migrate } from "./migrate.js"; | ||
| export { migrate, migrateAsync } from "./migrate.js"; | ||
| //# sourceMappingURL=index.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AAER,YAAY;AACZ,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,SAAS;AACT,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE5E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AAER,YAAY;AACZ,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACjF,SAAS;AACT,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE5E,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"} |
+37
-1
@@ -1,2 +0,2 @@ | ||
| import type { AnyMigration, LastMigrationOutput, WithVersion } from "./types.js"; | ||
| import type { AnyAsyncMigration, AnyMigration, LastAsyncMigrationOutput, LastMigrationOutput, WithVersion } from "./types.js"; | ||
| /** | ||
@@ -32,2 +32,38 @@ * Options for the migrate function. | ||
| export declare function migrate<TMigrations extends readonly AnyMigration[], TKey extends string = "_version">(options: MigrateOptions<TMigrations, TKey>): WithVersion<LastMigrationOutput<TMigrations>, TKey>; | ||
| /** | ||
| * Options for the migrateAsync function. | ||
| */ | ||
| export interface MigrateAsyncOptions<TMigrations extends readonly AnyAsyncMigration[], TKey extends string = "_version"> { | ||
| /** The state object to migrate */ | ||
| state: unknown; | ||
| /** Array of migrations to apply (sync or async `up()` functions) */ | ||
| migrations: TMigrations; | ||
| /** The key used to store the version (default: "_version") */ | ||
| key?: TKey; | ||
| } | ||
| /** | ||
| * Migrates a state object through a series of migrations, supporting async `up()` functions. | ||
| * | ||
| * Works identically to `migrate()` but awaits each `up()` call, allowing migrations | ||
| * to perform async operations (database calls, network requests, etc.). | ||
| * | ||
| * Sync migrations built with `createMigrations()` can also be passed here since | ||
| * `Migration` is structurally compatible with `AsyncMigration`. | ||
| * | ||
| * @param options - Migration options | ||
| * @returns A promise resolving to the migrated state with the version field | ||
| * | ||
| * @throws {VersionError} If migrations array is empty or unsorted | ||
| * @throws {MigrationError} If an `up()` function throws or rejects | ||
| * @throws {ValidationError} If schema validation fails | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const result = await migrateAsync({ | ||
| * state: { _version: 1, name: "hello" }, | ||
| * migrations, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| export declare function migrateAsync<TMigrations extends readonly AnyAsyncMigration[], TKey extends string = "_version">(options: MigrateAsyncOptions<TMigrations, TKey>): Promise<WithVersion<LastAsyncMigrationOutput<TMigrations>, TKey>>; | ||
| //# sourceMappingURL=migrate.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEjF;;GAEG;AACH,MAAM,WAAW,cAAc,CAC9B,WAAW,SAAS,SAAS,YAAY,EAAE,EAC3C,IAAI,SAAS,MAAM,GAAG,UAAU;IAEhC,kCAAkC;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,mCAAmC;IACnC,UAAU,EAAE,WAAW,CAAC;IACxB,8DAA8D;IAC9D,GAAG,CAAC,EAAE,IAAI,CAAC;CACX;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,OAAO,CACtB,WAAW,SAAS,SAAS,YAAY,EAAE,EAC3C,IAAI,SAAS,MAAM,GAAG,UAAU,EAC/B,OAAO,EAAE,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,WAAW,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CA8DjG"} | ||
| {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,iBAAiB,EACjB,YAAY,EACZ,wBAAwB,EACxB,mBAAmB,EACnB,WAAW,EACX,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,cAAc,CAC9B,WAAW,SAAS,SAAS,YAAY,EAAE,EAC3C,IAAI,SAAS,MAAM,GAAG,UAAU;IAEhC,kCAAkC;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,mCAAmC;IACnC,UAAU,EAAE,WAAW,CAAC;IACxB,8DAA8D;IAC9D,GAAG,CAAC,EAAE,IAAI,CAAC;CACX;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,OAAO,CACtB,WAAW,SAAS,SAAS,YAAY,EAAE,EAC3C,IAAI,SAAS,MAAM,GAAG,UAAU,EAC/B,OAAO,EAAE,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,WAAW,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CA8DjG;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB,CACnC,WAAW,SAAS,SAAS,iBAAiB,EAAE,EAChD,IAAI,SAAS,MAAM,GAAG,UAAU;IAEhC,kCAAkC;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,oEAAoE;IACpE,UAAU,EAAE,WAAW,CAAC;IACxB,8DAA8D;IAC9D,GAAG,CAAC,EAAE,IAAI,CAAC;CACX;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,YAAY,CACjC,WAAW,SAAS,SAAS,iBAAiB,EAAE,EAChD,IAAI,SAAS,MAAM,GAAG,UAAU,EAEhC,OAAO,EAAE,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,GAC7C,OAAO,CAAC,WAAW,CAAC,wBAAwB,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC,CA8DnE"} |
+73
-0
@@ -70,2 +70,75 @@ import { z } from "zod"; | ||
| } | ||
| /** | ||
| * Migrates a state object through a series of migrations, supporting async `up()` functions. | ||
| * | ||
| * Works identically to `migrate()` but awaits each `up()` call, allowing migrations | ||
| * to perform async operations (database calls, network requests, etc.). | ||
| * | ||
| * Sync migrations built with `createMigrations()` can also be passed here since | ||
| * `Migration` is structurally compatible with `AsyncMigration`. | ||
| * | ||
| * @param options - Migration options | ||
| * @returns A promise resolving to the migrated state with the version field | ||
| * | ||
| * @throws {VersionError} If migrations array is empty or unsorted | ||
| * @throws {MigrationError} If an `up()` function throws or rejects | ||
| * @throws {ValidationError} If schema validation fails | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const result = await migrateAsync({ | ||
| * state: { _version: 1, name: "hello" }, | ||
| * migrations, | ||
| * }); | ||
| * ``` | ||
| */ | ||
| export async function migrateAsync(options) { | ||
| const { state, migrations, key = "_version" } = options; | ||
| // Validate migrations array | ||
| if (migrations.length === 0) { | ||
| throw new VersionError("Migrations array cannot be empty"); | ||
| } | ||
| // Check migrations are sorted by version | ||
| for (let i = 1; i < migrations.length; i++) { | ||
| const prev = migrations[i - 1]; | ||
| const curr = migrations[i]; | ||
| if (prev && curr && prev.version >= curr.version) { | ||
| throw new VersionError(`Migrations must be sorted by version in ascending order. Found version ${prev.version} before ${curr.version}`); | ||
| } | ||
| } | ||
| // Get current version from state | ||
| let currentVersion = 0; | ||
| if (state !== null && typeof state === "object" && key in state) { | ||
| const version = state[key]; | ||
| if (typeof version === "number") { | ||
| currentVersion = version; | ||
| } | ||
| } | ||
| // Find migrations to apply | ||
| const migrationsToApply = migrations.filter((m) => m.version > currentVersion); | ||
| // Run migrations sequentially | ||
| let currentState = state; | ||
| for (const migration of migrationsToApply) { | ||
| // Run the up function (await handles both sync and async) | ||
| let result; | ||
| try { | ||
| result = await migration.up(currentState); | ||
| } | ||
| catch (error) { | ||
| throw new MigrationError(migration.version, error); | ||
| } | ||
| // Add version to result | ||
| if (result !== null && typeof result === "object") { | ||
| result[key] = migration.version; | ||
| } | ||
| // Validate against schema with version field | ||
| const schemaWithVersion = migration.schema.and(z.object({ [key]: z.literal(migration.version) })); | ||
| const parseResult = schemaWithVersion.safeParse(result); | ||
| if (!parseResult.success) { | ||
| throw new ValidationError(migration.version, parseResult.error.issues); | ||
| } | ||
| currentState = parseResult.data; | ||
| } | ||
| return currentState; | ||
| } | ||
| //# sourceMappingURL=migrate.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAkB5E;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,OAAO,CAGrB,OAA0C;IAC3C,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,GAAG,UAAkB,EAAE,GAAG,OAAO,CAAC;IAEhE,4BAA4B;IAC5B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,YAAY,CAAC,kCAAkC,CAAC,CAAC;IAC5D,CAAC;IAED,yCAAyC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClD,MAAM,IAAI,YAAY,CACrB,0EAA0E,IAAI,CAAC,OAAO,WAAW,IAAI,CAAC,OAAO,EAAE,CAC/G,CAAC;QACH,CAAC;IACF,CAAC;IAED,iCAAiC;IACjC,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;QACjE,MAAM,OAAO,GAAI,KAAiC,CAAC,GAAG,CAAC,CAAC;QACxD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YACjC,cAAc,GAAG,OAAO,CAAC;QAC1B,CAAC;IACF,CAAC;IAED,2BAA2B;IAC3B,MAAM,iBAAiB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,cAAc,CAAC,CAAC;IAE/E,8BAA8B;IAC9B,IAAI,YAAY,GAAY,KAAK,CAAC;IAElC,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE,CAAC;QAC3C,sBAAsB;QACtB,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACJ,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,cAAc,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC;QAED,wBAAwB;QACxB,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAClD,MAAkC,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC;QAC9D,CAAC;QAED,6CAA6C;QAC7C,MAAM,iBAAiB,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAC7C,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CACjD,CAAC;QAEF,MAAM,WAAW,GAAG,iBAAiB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,eAAe,CAAC,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxE,CAAC;QAED,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC;IACjC,CAAC;IAED,OAAO,YAAmE,CAAC;AAC5E,CAAC"} | ||
| {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAwB5E;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,OAAO,CAGrB,OAA0C;IAC3C,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,GAAG,UAAkB,EAAE,GAAG,OAAO,CAAC;IAEhE,4BAA4B;IAC5B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,YAAY,CAAC,kCAAkC,CAAC,CAAC;IAC5D,CAAC;IAED,yCAAyC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClD,MAAM,IAAI,YAAY,CACrB,0EAA0E,IAAI,CAAC,OAAO,WAAW,IAAI,CAAC,OAAO,EAAE,CAC/G,CAAC;QACH,CAAC;IACF,CAAC;IAED,iCAAiC;IACjC,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;QACjE,MAAM,OAAO,GAAI,KAAiC,CAAC,GAAG,CAAC,CAAC;QACxD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YACjC,cAAc,GAAG,OAAO,CAAC;QAC1B,CAAC;IACF,CAAC;IAED,2BAA2B;IAC3B,MAAM,iBAAiB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,cAAc,CAAC,CAAC;IAE/E,8BAA8B;IAC9B,IAAI,YAAY,GAAY,KAAK,CAAC;IAElC,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE,CAAC;QAC3C,sBAAsB;QACtB,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACJ,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,cAAc,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC;QAED,wBAAwB;QACxB,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAClD,MAAkC,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC;QAC9D,CAAC;QAED,6CAA6C;QAC7C,MAAM,iBAAiB,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAC7C,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CACjD,CAAC;QAEF,MAAM,WAAW,GAAG,iBAAiB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,eAAe,CAAC,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxE,CAAC;QAED,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC;IACjC,CAAC;IAED,OAAO,YAAmE,CAAC;AAC5E,CAAC;AAiBD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAIjC,OAA+C;IAE/C,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,GAAG,UAAkB,EAAE,GAAG,OAAO,CAAC;IAEhE,4BAA4B;IAC5B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,YAAY,CAAC,kCAAkC,CAAC,CAAC;IAC5D,CAAC;IAED,yCAAyC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClD,MAAM,IAAI,YAAY,CACrB,0EAA0E,IAAI,CAAC,OAAO,WAAW,IAAI,CAAC,OAAO,EAAE,CAC/G,CAAC;QACH,CAAC;IACF,CAAC;IAED,iCAAiC;IACjC,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;QACjE,MAAM,OAAO,GAAI,KAAiC,CAAC,GAAG,CAAC,CAAC;QACxD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YACjC,cAAc,GAAG,OAAO,CAAC;QAC1B,CAAC;IACF,CAAC;IAED,2BAA2B;IAC3B,MAAM,iBAAiB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,cAAc,CAAC,CAAC;IAE/E,8BAA8B;IAC9B,IAAI,YAAY,GAAY,KAAK,CAAC;IAElC,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE,CAAC;QAC3C,0DAA0D;QAC1D,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACJ,MAAM,GAAG,MAAM,SAAS,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,cAAc,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC;QAED,wBAAwB;QACxB,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAClD,MAAkC,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC;QAC9D,CAAC;QAED,6CAA6C;QAC7C,MAAM,iBAAiB,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAC7C,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CACjD,CAAC;QAEF,MAAM,WAAW,GAAG,iBAAiB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,eAAe,CAAC,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxE,CAAC;QAED,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC;IACjC,CAAC;IAED,OAAO,YAAwE,CAAC;AACjF,CAAC"} |
+27
-0
@@ -29,2 +29,29 @@ import type { z } from "zod"; | ||
| /** | ||
| * A migration that can have an async `up()` function. | ||
| * Sync `up()` functions are also accepted (T is a subtype of T | Promise<T>). | ||
| */ | ||
| export type AsyncMigration<TInput = unknown, TOutput extends z.ZodTypeAny = z.ZodTypeAny> = { | ||
| version: number; | ||
| schema: TOutput; | ||
| up: (state: TInput) => z.infer<TOutput> | Promise<z.infer<TOutput>>; | ||
| }; | ||
| /** | ||
| * An async migration with any input/output types. Used for array constraints. | ||
| */ | ||
| export type AnyAsyncMigration = AsyncMigration<any, any>; | ||
| /** | ||
| * Infers the input type of the first async migration in a tuple. | ||
| */ | ||
| export type InferAsyncMigrationInput<T extends readonly AnyAsyncMigration[]> = T extends readonly [ | ||
| AsyncMigration<infer TInput, z.ZodTypeAny>, | ||
| ...AnyAsyncMigration[] | ||
| ] ? TInput : unknown; | ||
| /** | ||
| * Infers the output type of the last async migration in a tuple. | ||
| */ | ||
| export type LastAsyncMigrationOutput<T extends readonly AnyAsyncMigration[]> = T extends readonly [ | ||
| ...any[], | ||
| AsyncMigration<infer _TInput, infer TOutput> | ||
| ] ? z.infer<TOutput> : unknown; | ||
| /** | ||
| * Helper type to add version key to an object type. | ||
@@ -31,0 +58,0 @@ */ |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B;;GAEG;AACH,MAAM,MAAM,SAAS,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,SAAS,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,IAAI;IACtF,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;CACxC,CAAC;AAEF;;GAEG;AAEH,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAE/C;;GAEG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,SAAS,YAAY,EAAE,IAAI,CAAC,SAAS,SAAS;IACvF,SAAS,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC;IACrC,GAAG,YAAY,EAAE;CACjB,GACE,MAAM,GACN,OAAO,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,SAAS,YAAY,EAAE,IAAI,CAAC,SAAS,SAAS;IAEvF,GAAG,GAAG,EAAE;IACR,SAAS,CAAC,MAAM,OAAO,EAAE,MAAM,OAAO,CAAC;CACvC,GACE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAChB,OAAO,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,IAAI,CAAC,GAAG;KAAG,CAAC,IAAI,CAAC,GAAG,MAAM;CAAE,CAAC"} | ||
| {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B;;GAEG;AACH,MAAM,MAAM,SAAS,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,SAAS,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,IAAI;IACtF,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;CACxC,CAAC;AAEF;;GAEG;AAEH,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAE/C;;GAEG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,SAAS,YAAY,EAAE,IAAI,CAAC,SAAS,SAAS;IACvF,SAAS,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC;IACrC,GAAG,YAAY,EAAE;CACjB,GACE,MAAM,GACN,OAAO,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,SAAS,YAAY,EAAE,IAAI,CAAC,SAAS,SAAS;IAEvF,GAAG,GAAG,EAAE;IACR,SAAS,CAAC,MAAM,OAAO,EAAE,MAAM,OAAO,CAAC;CACvC,GACE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAChB,OAAO,CAAC;AAEX;;;GAGG;AACH,MAAM,MAAM,cAAc,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,SAAS,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,IAAI;IAC3F,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;CACpE,CAAC;AAEF;;GAEG;AAEH,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAEzD;;GAEG;AACH,MAAM,MAAM,wBAAwB,CAAC,CAAC,SAAS,SAAS,iBAAiB,EAAE,IAAI,CAAC,SAAS,SAAS;IACjG,cAAc,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC;IAC1C,GAAG,iBAAiB,EAAE;CACtB,GACE,MAAM,GACN,OAAO,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,wBAAwB,CAAC,CAAC,SAAS,SAAS,iBAAiB,EAAE,IAAI,CAAC,SAAS,SAAS;IAEjG,GAAG,GAAG,EAAE;IACR,cAAc,CAAC,MAAM,OAAO,EAAE,MAAM,OAAO,CAAC;CAC5C,GACE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAChB,OAAO,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,IAAI,CAAC,GAAG;KAAG,CAAC,IAAI,CAAC,GAAG,MAAM;CAAE,CAAC"} |
+1
-1
| { | ||
| "name": "@nanocollective/json-up", | ||
| "version": "0.1.3", | ||
| "version": "0.2.0", | ||
| "description": "A TypeScript JSON migration tool with Zod schema validation", | ||
@@ -5,0 +5,0 @@ "type": "module", |
+28
-0
@@ -10,2 +10,3 @@ # json-up | ||
| - **Fluent builder API** for migration chains | ||
| - **Async migration support** for migrations that need async operations | ||
| - **Automatic version tracking** | ||
@@ -51,2 +52,29 @@ - **Zero runtime dependencies** (only Zod as peer) | ||
| ### Async migrations | ||
| When your migrations need to perform async operations, use the async API: | ||
| ```typescript | ||
| import { createAsyncMigrations, migrateAsync } from "@nanocollective/json-up"; | ||
| import { z } from "zod"; | ||
| const migrations = createAsyncMigrations() | ||
| .add({ | ||
| version: 1, | ||
| schema: z.object({ name: z.string() }), | ||
| up: (data) => ({ name: data.name ?? "" }), | ||
| }) | ||
| .add({ | ||
| version: 2, | ||
| schema: z.object({ name: z.string(), key: z.string() }), | ||
| up: async (data) => ({ | ||
| name: data.name, | ||
| key: await generateKey(), | ||
| }), | ||
| }) | ||
| .build(); | ||
| const result = await migrateAsync({ state, migrations }); | ||
| ``` | ||
| ## Documentation | ||
@@ -53,0 +81,0 @@ |
37112
65.48%573
80.76%94
42.42%