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)