From fdd267adb0cb22696c563fbd78c2299b94d00000 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 26 Feb 2024 00:54:21 +0100 Subject: [PATCH] ZodSchemaClassExtender work --- src/builders/ZodSchemaClassExtender.ts | 153 +++++++++++++----------- src/tests.ts | 3 + src/traits/ExtendableZodSchemaObject.ts | 2 +- 3 files changed, 85 insertions(+), 73 deletions(-) diff --git a/src/builders/ZodSchemaClassExtender.ts b/src/builders/ZodSchemaClassExtender.ts index fc24961..cfd2eaa 100644 --- a/src/builders/ZodSchemaClassExtender.ts +++ b/src/builders/ZodSchemaClassExtender.ts @@ -7,15 +7,20 @@ import { ZodSchemaAbstractClass } from "../shapes/ZodSchemaClass" import { Extend, Override, StaticMembers } from "../util" -export class ZodSchemaClassExtender> { +export class ZodSchemaClassExtender< + Superclass extends AbstractClass, + Subclass extends AbstractClass, +> { declare ["constructor"]: typeof ZodSchemaClassExtender - constructor(readonly superclass: Superclass) {} + constructor( + readonly superclass: Superclass, + readonly subclass: Subclass, + ) {} schema< - Super extends ZodSchemaAbstractClass, - SuperInstance extends SuperValues, + Super extends ZodSchemaAbstractClass, SuperSchemaT extends z.ZodRawShape, SuperSchemaUnknownKeys extends z.UnknownKeysParam, @@ -32,7 +37,8 @@ export class ZodSchemaClassExtender> { DefaultValues extends Partial, >( this: ZodSchemaClassExtender< - Super | ZodSchemaAbstractClass + Super | ZodSchemaAbstractClass, + any >, props: { @@ -49,9 +55,11 @@ export class ZodSchemaClassExtender> { } return new this.constructor( + this.superclass, + Schemas as unknown as AbstractClass< Simplify< - Extend<[SuperInstance, Values]> + Extend<[InstanceType, Values]> >, [values: Values] @@ -66,10 +74,58 @@ export class ZodSchemaClassExtender> { } jsonifiable< - Super extends ( - ZodSchemaAbstractClass & - JsonifiableZodSchemaAbstractClass< - SuperInstance, + /** Superclass jsonifiable schemas */ + Super extends JsonifiableZodSchemaAbstractClass< + any, + + SuperJsonifySchemaT, + SuperJsonifySchemaUnknownKeys, + SuperJsonifySchemaCatchall, + + SuperDejsonifySchemaT, + SuperDejsonifySchemaUnknownKeys, + SuperDejsonifySchemaCatchall, + + SuperJsonifiedValues, + SuperValues + >, + + SuperJsonifySchemaT extends z.ZodRawShape, + SuperJsonifySchemaUnknownKeys extends z.UnknownKeysParam, + SuperJsonifySchemaCatchall extends z.ZodTypeAny, + + SuperDejsonifySchemaT extends z.ZodRawShape, + SuperDejsonifySchemaUnknownKeys extends z.UnknownKeysParam, + SuperDejsonifySchemaCatchall extends z.ZodTypeAny, + + SuperJsonifiedValues extends JsonifiableObject, + SuperValues extends object, + + /** New schemas */ + Self extends ZodSchemaAbstractClass, + + SelfSchemaT extends z.ZodRawShape, + SelfSchemaUnknownKeys extends z.UnknownKeysParam, + SelfSchemaCatchall extends z.ZodTypeAny, + + SelfValues extends object, + SelfDefaultValues extends Partial, + + /* New jsonifiable schemas */ + JsonifySchemaT extends z.ZodRawShape, + JsonifySchemaUnknownKeys extends z.UnknownKeysParam, + JsonifySchemaCatchall extends z.ZodTypeAny, + + DejsonifySchemaT extends z.ZodRawShape, + DejsonifySchemaUnknownKeys extends z.UnknownKeysParam, + DejsonifySchemaCatchall extends z.ZodTypeAny, + + JsonifiedValues extends SuperJsonifiedValues, + Values extends SelfValues, + >( + this: ZodSchemaClassExtender< + Super | JsonifiableZodSchemaAbstractClass< + any, SuperJsonifySchemaT, SuperJsonifySchemaUnknownKeys, @@ -81,76 +137,27 @@ export class ZodSchemaClassExtender> { SuperJsonifiedValues, SuperValues - > - ), + >, - SuperInstance extends SuperValues, - - SuperSchemaT extends z.ZodRawShape, - SuperSchemaUnknownKeys extends z.UnknownKeysParam, - SuperSchemaCatchall extends z.ZodTypeAny, - - SuperValues extends object, - SuperDefaultValues extends Partial, - - SuperJsonifySchemaT extends z.ZodRawShape, - SuperJsonifySchemaUnknownKeys extends z.UnknownKeysParam, - SuperJsonifySchemaCatchall extends z.ZodTypeAny, - - SuperDejsonifySchemaT extends z.ZodRawShape, - SuperDejsonifySchemaUnknownKeys extends z.UnknownKeysParam, - SuperDejsonifySchemaCatchall extends z.ZodTypeAny, - - SuperJsonifiedValues extends JsonifiableObject, - - /* New jsonifiable schemas */ - JsonifySchemaT extends z.ZodRawShape, - JsonifySchemaUnknownKeys extends z.UnknownKeysParam, - JsonifySchemaCatchall extends z.ZodTypeAny, - - DejsonifySchemaT extends z.ZodRawShape, - DejsonifySchemaUnknownKeys extends z.UnknownKeysParam, - DejsonifySchemaCatchall extends z.ZodTypeAny, - - JsonifiedValues extends SuperJsonifiedValues, - Values extends SuperValues, - >( - this: ZodSchemaClassExtender< - Super | ( - ZodSchemaAbstractClass & - JsonifiableZodSchemaAbstractClass< - SuperInstance, - - SuperJsonifySchemaT, - SuperJsonifySchemaUnknownKeys, - SuperJsonifySchemaCatchall, - - SuperDejsonifySchemaT, - SuperDejsonifySchemaUnknownKeys, - SuperDejsonifySchemaCatchall, - - SuperJsonifiedValues, - SuperValues - > - ) + Self | ZodSchemaAbstractClass >, props: { jsonifySchema: ( - schema: Super["schema"], + schema: Self["schema"], jsonifySchema: Super["jsonifySchema"], ) => z.ZodObject dejsonifySchema: ( - schema: Super["schema"], + schema: Self["schema"], dejsonifySchema: Super["dejsonifySchema"], ) => z.ZodObject }, ) { - const jsonifySchema = props.jsonifySchema(this.superclass.schema, this.superclass.jsonifySchema) - const dejsonifySchema = props.dejsonifySchema(this.superclass.schema, this.superclass.dejsonifySchema) + const jsonifySchema = props.jsonifySchema(this.subclass.schema, this.superclass.jsonifySchema) + const dejsonifySchema = props.dejsonifySchema(this.subclass.schema, this.superclass.dejsonifySchema) - class JsonifiableSchemas extends (this.superclass as AbstractClass) { + class JsonifiableSchemas extends (this.subclass as AbstractClass) { static readonly jsonifySchema = jsonifySchema readonly jsonifySchema = jsonifySchema static readonly dejsonifySchema = dejsonifySchema @@ -158,30 +165,32 @@ export class ZodSchemaClassExtender> { } return new this.constructor( + this.superclass, + JsonifiableSchemas as unknown as AbstractClass< Simplify< - Override<[SuperInstance, JsonifiableSchemas]> + Override<[InstanceType, JsonifiableSchemas]> >, ConstructorParameters< - ZodSchemaAbstractClass + ZodSchemaAbstractClass > > & Simplify< Override<[ - StaticMembers, + StaticMembers, StaticMembers, ]> - > + >, ) } toClass() { - return this.superclass + return this.subclass } toExpressionBuilder() { - return expression.extends(this.superclass) + return expression.extends(this.subclass) } } diff --git a/src/tests.ts b/src/tests.ts index fe55b25..fcb3f79 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -46,6 +46,9 @@ const AdminUserProto = User.extend() }), defaultValues: v => ({ ...v, name: "Admin" as const }), }) + .jsonifiable({ + + }) class AdminUser extends AdminUserProto.toClass() {} diff --git a/src/traits/ExtendableZodSchemaObject.ts b/src/traits/ExtendableZodSchemaObject.ts index d9803a3..243e1b4 100644 --- a/src/traits/ExtendableZodSchemaObject.ts +++ b/src/traits/ExtendableZodSchemaObject.ts @@ -10,7 +10,7 @@ export const ExtendableZodSchemaObject = trait >( this: Self ) { - return new ZodSchemaClassExtender(this) + return new ZodSchemaClassExtender(this, this) } }) .build()