From b7e224d89b3f391ee51141e4885ad59417147772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 9 Mar 2024 03:17:12 +0100 Subject: [PATCH] ZodSchemaClassBuilder work --- src/builders/ZodSchemaClassBuilder.ts | 67 ++++++++++++++++++--------- src/tests.ts | 10 ++-- 2 files changed, 52 insertions(+), 25 deletions(-) diff --git a/src/builders/ZodSchemaClassBuilder.ts b/src/builders/ZodSchemaClassBuilder.ts index c70acbd..e0f5d50 100644 --- a/src/builders/ZodSchemaClassBuilder.ts +++ b/src/builders/ZodSchemaClassBuilder.ts @@ -1,18 +1,23 @@ import { Trait, TraitExpressionBuilder, expression } from "@thilawyn/traitify-ts" import { AbstractClass } from "type-fest" +import { EmptyObject } from "type-fest/source/empty-object" import { JsonifiableObject } from "type-fest/source/jsonifiable" import { z } from "zod" import { JsonifiableZodSchemaObject } from "../traits/JsonifiableZodSchemaObject" -import { ZodSchemaObject, ZodSchemaObjectTrait } from "../traits/ZodSchemaObject" +import { ZodSchemaObject } from "../traits/ZodSchemaObject" export class ZodSchemaClassBuilder< - Superclass extends AbstractClass, + Superclass extends AbstractClass, const Traits extends readonly Trait[], + Schemas extends object, > { declare ["constructor"]: typeof ZodSchemaClassBuilder - constructor(readonly expression: TraitExpressionBuilder) {} + constructor( + protected readonly expression: TraitExpressionBuilder, + protected readonly schemas: Schemas, + ) {} schema< @@ -27,9 +32,9 @@ export class ZodSchemaClassBuilder< Values extends object, PartialValues extends Partial, >( - this: ZodSchemaClassBuilder, + this: ZodSchemaClassBuilder, - { schema, schemaWithDefaultValues }: { + props: { schema: z.ZodObject schemaWithDefaultValues: ( @@ -45,16 +50,23 @@ export class ZodSchemaClassBuilder< return new this.constructor( this.expression - .extends( - ZodSchemaObjectConstructor as AbstractClass - ) - .expresses(ZodSchemaObject(schema, schemaWithDefaultValues(schema))) + .extends(ZodSchemaObjectConstructor as AbstractClass) + .expresses(ZodSchemaObject(props.schema, props.schemaWithDefaultValues(props.schema))), + + { + schema: props.schema, + schemaWithDefaultValues: props.schemaWithDefaultValues(props.schema), + } as const, ) } jsonifiable< - Super extends AbstractClass, - T extends readonly [ZodSchemaObjectTrait], + S extends { + readonly schema: z.ZodObject, + readonly schemaWithDefaultValues: z.ZodObject, + jsonifySchema?: never + dejsonifySchema?: never + }, SchemaT extends z.ZodRawShape, SchemaUnknownKeys extends z.UnknownKeysParam, @@ -77,10 +89,12 @@ export class ZodSchemaClassBuilder< JsonifiedValues extends JsonifiableObject, >( - this: ZodSchemaClassBuilder< - Super, - T | readonly [ZodSchemaObjectTrait] - >, + this: ZodSchemaClassBuilder, + readonly schemaWithDefaultValues: z.ZodObject, + jsonifySchema?: never + dejsonifySchema?: never + }>, props: { jsonifySchema: ( @@ -95,15 +109,26 @@ export class ZodSchemaClassBuilder< return new this.constructor( this.expression.expresses( JsonifiableZodSchemaObject( - this.expression.expressionSuperclass.schema, - this.expression.expressionSuperclass.schemaWithDefaultValues, - props.jsonifySchema(this.expression.expressionSuperclass.schema), - props.dejsonifySchema(this.expression.expressionSuperclass.schema), + this.schemas.schema, + this.schemas.schemaWithDefaultValues, + props.jsonifySchema(this.schemas.schema), + props.dejsonifySchema(this.schemas.schema), ) - ) + ), + + { + ...this.schemas as S, + jsonifySchema: props.jsonifySchema(this.schemas.schema), + dejsonifySchema: props.dejsonifySchema(this.schemas.schema), + } as const, ) } + + + toExpression() { + return this.expression + } } -export const zodSchemaClass = new ZodSchemaClassBuilder(expression) +export const zodSchemaClass = new ZodSchemaClassBuilder(expression, {}) diff --git a/src/tests.ts b/src/tests.ts index 296e483..2f2644d 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,6 +1,7 @@ import { Implements } from "@thilawyn/traitify-ts" import { z } from "zod" import { zodSchemaClass } from "./builders/ZodSchemaClassBuilder" +import { dejsonify, jsonify } from "./schema/jsonify" import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" @@ -20,14 +21,14 @@ const exp = zodSchemaClass }) .jsonifiable({ jsonifySchema: s => s.extend({ - + id: jsonify.bigint(s.shape.id) }), dejsonifySchema: s => s.extend({ - + id: dejsonify.bigint(s.shape.id) }), }) - .expression + .toExpression() .expresses(MobXObservableZodSchemaObject) .build() @@ -39,7 +40,8 @@ const inst = User.create({ id: 1n, name: "User" }, ) // console.log(inst.name) const instEffect = User.createEffect({ id: 1n, name: "User" }) -// const jsonifiedUser = await inst.jsonifyPromise() +const jsonifiedUser = await inst.jsonifyPromise() + // const AdminUserProto = User.extend() // .schema({