diff --git a/src/ZodSchemaClass.ts b/src/ZodSchemaClass.ts index 70d1be3..b53c7a7 100644 --- a/src/ZodSchemaClass.ts +++ b/src/ZodSchemaClass.ts @@ -1,5 +1,5 @@ import { Trait, TraitExpression, TraitExpressionBuilder } from "@thilawyn/traitify-ts" -import { AbstractClass, IsEqual } from "type-fest" +import { AbstractClass } from "type-fest" import { JsonifiableObject } from "type-fest/source/jsonifiable" import { z } from "zod" import { ZodSchemaAbstractClass } from "./shapes/ZodSchemaClass" @@ -10,43 +10,13 @@ import { JsonifiableZodSchemaObject } from "./traits/JsonifiableZodSchemaObject" import { StaticMembers } from "./util" -type SpreadSupertraits = ( - Traits extends [ - infer El extends Trait, - ...infer Rest, - ] - ? [ - ...Trait.Supertraits, - El, - ...SpreadSupertraits, - ] - : [] -) - -type TraitsUniq = ( - Traits extends [ - ...infer Rest, - infer El extends Trait, - ] - ? IsTraitInTupleFromRight extends true - ? TraitsUniq - : [...TraitsUniq, El] - : [] -) -type IsTraitInTupleFromRight = ( - Traits extends [...infer Rest, infer El] - ? IsEqual extends true - ? true - : IsTraitInTupleFromRight - : false -) - - export class ZodSchemaClassBuilder< Superclass extends AbstractClass, - const Traits extends Trait[], + const Traits extends readonly Trait[], > extends TraitExpressionBuilder { + declare ["constructor"]: typeof ZodSchemaClassBuilder + extends< Super extends AbstractClass >( @@ -54,31 +24,12 @@ extends TraitExpressionBuilder { this: ZodSchemaClassBuilder, superclass: Super, ) { - return new ZodSchemaClassBuilder( + return new this.constructor( superclass, this.expressionTraits, ) } - expresses< - const T extends Trait< - TraitExpression< - typeof TraitExpression.NullSuperclass, - Trait[] - >, - any, - any, - any - >[] - >( - ...traits: T - ): TraitExpressionBuilder< - Superclass, - TraitsUniq<[...Traits, ...SpreadSupertraits]> - > { - return super.expresses(...traits) - } - schema< Superclass extends AbstractClass & { schema?: never, defaultValues?: never }, @@ -106,7 +57,7 @@ extends TraitExpressionBuilder { } } - return new ZodSchemaClassBuilder( + return new this.constructor( Schemas as unknown as ( AbstractClass< InstanceType & Values, @@ -171,7 +122,7 @@ extends TraitExpressionBuilder { readonly dejsonifySchema = dejsonifySchema } - return new ZodSchemaClassBuilder( + return new this.constructor( JsonifiableSchemas as unknown as ( AbstractClass< InstanceType & JsonifiableSchemas, @@ -191,3 +142,25 @@ extends TraitExpressionBuilder { ) } } + +export interface ZodSchemaClassBuilder< + Superclass extends AbstractClass, + Traits extends readonly Trait[], +> { + expresses< + const T extends readonly Trait< + TraitExpression< + typeof TraitExpression.NullSuperclass, + readonly Trait[] + >, + any, + any, + any + >[] + >( + ...traits: T + ): ZodSchemaClassBuilder< + Superclass, + TraitExpressionBuilder.ExpressesReturnTypeTraits + > +}