From a2a92f483a098fabe2c0454410482e380ce8ba88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 17 Jan 2024 20:23:25 +0100 Subject: [PATCH] makeSchemableClassObservable --- src/observable/index.ts | 1 + .../makeSchemableClassObservable.ts | 29 +++++++++++++++++++ src/tests.ts | 3 ++ 3 files changed, 33 insertions(+) create mode 100644 src/observable/makeSchemableClassObservable.ts diff --git a/src/observable/index.ts b/src/observable/index.ts index e69de29..6f219a5 100644 --- a/src/observable/index.ts +++ b/src/observable/index.ts @@ -0,0 +1 @@ +export * from "./makeSchemableClassObservable" diff --git a/src/observable/makeSchemableClassObservable.ts b/src/observable/makeSchemableClassObservable.ts new file mode 100644 index 0000000..7b5fcb7 --- /dev/null +++ b/src/observable/makeSchemableClassObservable.ts @@ -0,0 +1,29 @@ +import { mapValues } from "lodash-es" +import { makeObservable, observable } from "mobx" +import { AbstractConstructor } from "type-fest" +import { z } from "zod" +import { SchemableClass } from ".." + + +export function makeSchemableClassObservable< + C extends SchemableClass, + + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, + + Values extends {}, + DefaultValues extends Partial, +>( + extend: C | SchemableClass +) { + return class extends (extend as AbstractConstructor) { + constructor(...args: any[]) { + super(...args) + + makeObservable(this, + mapValues(this.schema.shape, () => observable) + ) + } + } as unknown as C +} diff --git a/src/tests.ts b/src/tests.ts index 1ddf878..6015710 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -2,6 +2,7 @@ import { pipeInto } from "ts-functional-pipe" import { z } from "zod" import { defineDefaultValues, extendSchemableClass, makeSchemableClass, newSchemable } from "." import { dejsonifyBigIntSchema, dejsonifySchemable, jsonifyBigIntSchema, makeJsonifiableSchemableClass } from "./jsonifiable" +import { makeSchemableClassObservable } from "./observable" const UserLevel = z.enum(["User", "Admin"]) @@ -20,6 +21,8 @@ class User extends pipeInto( }), }), + v => makeSchemableClassObservable(v), + v => makeJsonifiableSchemableClass(v, { jsonifySchema: ({ schema, shape }) => schema.extend({ id: jsonifyBigIntSchema(shape.id)