From 6d1eddae5579786c71fd74be3138da7a48fdb703 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 17 Jan 2024 19:42:18 +0100 Subject: [PATCH] ObservableSchemable --- bun.lockb | Bin 160399 -> 160736 bytes package.json | 1 + src/observable/ObservableSchemable.ts | 27 ++++++++++++++++++++++++++ src/observable/index.ts | 1 + src/tests.ts | 8 +++++++- 5 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 src/observable/ObservableSchemable.ts create mode 100644 src/observable/index.ts diff --git a/bun.lockb b/bun.lockb index 6e480f417ea87a3ec7eb6f758ea54b36b9ff880c..ab7c9a9ec429c424afa7003cbaaa1125192f08a5 100755 GIT binary patch delta 27675 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 delta 27202 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 b#2@x_yl$7fF(&W9AJv~#-i@Es#VP*}FjyJA diff --git a/package.json b/package.json index 7800bca..e70368d 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "decimal.js": "^10.4.3", "effect": "^2.0.2", "lodash-es": "^4.17.21", + "mobx": "^6.12.0", "type-fest": "^4.9.0", "zod": "^3.22.4" }, diff --git a/src/observable/ObservableSchemable.ts b/src/observable/ObservableSchemable.ts new file mode 100644 index 0000000..56be1f5 --- /dev/null +++ b/src/observable/ObservableSchemable.ts @@ -0,0 +1,27 @@ +import { trait } from "@thilawyn/thilatrait" +import { mapValues } from "lodash-es" +import { makeObservable } from "mobx" +import { z } from "zod" + + +export const ObservableSchemable = trait(Parent => { + abstract class ObservableSchemable extends Parent { + abstract readonly schema: z.ZodObject< + z.ZodRawShape, + z.UnknownKeysParam, + z.ZodTypeAny, + z.objectOutputType, + z.objectInputType + > + + // constructor(...args: any[]) { + // super(...args) + + // makeObservable(this, + // mapValues(this.schema.shape, () => observable) as AnnotationsMap<$Config["values"], never> + // ) + // } + } + + return ObservableSchemable +}) diff --git a/src/observable/index.ts b/src/observable/index.ts new file mode 100644 index 0000000..9ccfcad --- /dev/null +++ b/src/observable/index.ts @@ -0,0 +1 @@ +export * from "./ObservableSchemable" diff --git a/src/tests.ts b/src/tests.ts index 5d8ee9f..db106b1 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -2,6 +2,8 @@ import { pipeInto } from "ts-functional-pipe" import { z } from "zod" import { defineDefaultValues, extendSchemableClass, makeSchemableClass, newSchemable } from "." import { dejsonifyBigIntSchema, dejsonifySchemable, jsonifyBigIntSchema, makeJsonifiableSchemableClass } from "./jsonifiable" +import { extendsAndExpresses } from "@thilawyn/thilatrait" +import { ObservableSchemable } from "./observable" const UserLevel = z.enum(["User", "Admin"]) @@ -29,12 +31,16 @@ class User extends pipeInto( id: dejsonifyBigIntSchema(shape.id) }), }), + + v => extendsAndExpresses(v, ObservableSchemable), ) {} -User.defaultValues +User.schema const user1 = newSchemable(User, { id: 1n, name: "User" }) +user1.schema + const jsonifiedUser1 = user1.jsonify() console.log(jsonifiedUser1) console.log(dejsonifySchemable(User, jsonifiedUser1))