From bddbe428a7f63207e2c674edd2eaa0072b522fbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 22 Feb 2024 21:00:14 +0100 Subject: [PATCH] ZodSchemaClassBuilder work --- src/ZodSchemaClass.ts | 159 +++++++++++++++++++++++------------------- 1 file changed, 87 insertions(+), 72 deletions(-) diff --git a/src/ZodSchemaClass.ts b/src/ZodSchemaClass.ts index d18c100..ff34b2e 100644 --- a/src/ZodSchemaClass.ts +++ b/src/ZodSchemaClass.ts @@ -1,7 +1,8 @@ -import { Trait, TraitExpressionBuilder, expression } from "@thilawyn/traitify-ts" +import { Trait, TraitExpressionBuilder } from "@thilawyn/traitify-ts" import { AbstractClass, Simplify } from "type-fest" import { JsonifiableObject } from "type-fest/source/jsonifiable" import { z } from "zod" +import { ZodSchemaClass } from "./shapes/ZodSchemaClass" import { ExtendableZodSchemaObject } from "./traits/ExtendableZodSchemaObject" import { InstantiableZodSchemaObject } from "./traits/InstantiableZodSchemaObject" import { Extend, StaticMembers } from "./util" @@ -81,7 +82,15 @@ extends TraitExpressionBuilder { } jsonifiable< - Superclass extends AbstractClass, + Superclass extends ZodSchemaClass, + Instance extends Values, + + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, + + Values extends object, + DefaultValues extends Partial, JsonifiedValues extends JsonifiableObject, @@ -93,78 +102,84 @@ extends TraitExpressionBuilder { DejsonifySchemaUnknownKeys extends z.UnknownKeysParam, DejsonifySchemaCatchall extends z.ZodTypeAny, >( - this: ZodSchemaClassBuilder, - ) { + this: ZodSchemaClassBuilder< + Superclass | ZodSchemaClass, + Traits + >, - } -} + props: { + jsonifySchema: (props: { + schema: z.ZodObject< + SchemaT, + SchemaUnknownKeys, + SchemaCatchall, + Values, + Values + > - -export function ZodSchemaClassOf< - Superclass extends AbstractClass, - - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - Values extends object, - DefaultValues extends Partial, ->( - of: Superclass, - - { schema, defaultValues }: { - schema: z.ZodObject - defaultValues: DefaultValues - }, -) { - class Schemas extends (of as AbstractClass) { - static readonly schema = schema - static readonly defaultValues = defaultValues - - constructor(values: Values) { - super() - Object.assign(this, values) - } - } - - return expression - .extends(Schemas as unknown as ( - AbstractClass< - InstanceType & - Simplify< - Extend<[Schemas, Values]> - >, - - ConstructorParameters - > & - Simplify< - Extend<[ - StaticMembers, - StaticMembers, - ]> + shape: SchemaT + }) => z.ZodObject< + JsonifySchemaT, + JsonifySchemaUnknownKeys, + JsonifySchemaCatchall, + JsonifiedValues, + Values > - )) - .expresses( - InstantiableZodSchemaObject, - ExtendableZodSchemaObject, + + dejsonifySchema: (props: { + schema: z.ZodObject< + SchemaT, + SchemaUnknownKeys, + SchemaCatchall, + Values, + Values + > + + shape: SchemaT + }) => z.ZodObject< + DejsonifySchemaT, + DejsonifySchemaUnknownKeys, + DejsonifySchemaCatchall, + Values, + JsonifiedValues + > + }, + ) { + const jsonifySchema = props.jsonifySchema({ + schema: this.expressionSuperclass.schema, + shape: this.expressionSuperclass.schema.shape, + }) + const dejsonifySchema = props.dejsonifySchema({ + schema: this.expressionSuperclass.schema, + shape: this.expressionSuperclass.schema.shape, + }) + + class Schemas extends this.expressionSuperclass { + static readonly jsonifySchema = jsonifySchema + static readonly dejsonifySchema = dejsonifySchema + } + + return new ZodSchemaClassBuilder( + Schemas as unknown as ( + AbstractClass< + InstanceType & + Simplify< + Extend<[Schemas, Values]> + >, + + ConstructorParameters + > & + Simplify< + Extend<[ + StaticMembers, + StaticMembers, + ]> + > + ), + + [ + ...this.expressionTraits, + ], ) -} - - -class DefaultRoot {} - -export function ZodSchemaClass< - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - Values extends object, - DefaultValues extends Partial, ->( - props: { - schema: z.ZodObject - defaultValues: DefaultValues - }, -) { - return ZodSchemaClassOf(DefaultRoot, props) + } }