impr(local storage with schema): add fallback value copy to migrate parameters

!nuf
This commit is contained in:
Miodec 2024-09-19 14:07:35 +02:00
parent 1d7e7bbb91
commit 09ce4bd672

View file

@ -1,16 +1,17 @@
import { ZodError, ZodIssue } from "zod";
import { deepClone } from "./misc";
export class LocalStorageWithSchema<T> {
private key: string;
private schema: Zod.Schema<T>;
private fallback: T;
private migrate?: (value: unknown, zodIssues: ZodIssue[]) => T;
private migrate?: (value: unknown, zodIssues: ZodIssue[], fallback: T) => T;
constructor(options: {
key: string;
schema: Zod.Schema<T>;
fallback: T;
migrate?: (value: unknown, zodIssues: ZodIssue[]) => T;
migrate?: (value: unknown, zodIssues: ZodIssue[], fallback: T) => T;
}) {
this.key = options.key;
this.schema = options.schema;
@ -50,7 +51,11 @@ export class LocalStorageWithSchema<T> {
let newValue = this.fallback;
if (this.migrate) {
const migrated = this.migrate(jsonParsed, schemaParsed.error.issues);
const migrated = this.migrate(
jsonParsed,
schemaParsed.error.issues,
deepClone(this.fallback)
);
const parse = this.schema.safeParse(migrated);
if (parse.success) {
newValue = migrated;