From ac5e6e444e1f67b4afdc465ad297c8703cdb0924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 24 Feb 2024 05:48:07 +0100 Subject: [PATCH] ZodSchemaClassBuilder work --- src/ZodSchemaClass.ts | 53 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/src/ZodSchemaClass.ts b/src/ZodSchemaClass.ts index 50fb98a..70d1be3 100644 --- a/src/ZodSchemaClass.ts +++ b/src/ZodSchemaClass.ts @@ -1,5 +1,5 @@ import { Trait, TraitExpression, TraitExpressionBuilder } from "@thilawyn/traitify-ts" -import { AbstractClass } from "type-fest" +import { AbstractClass, IsEqual } from "type-fest" import { JsonifiableObject } from "type-fest/source/jsonifiable" import { z } from "zod" import { ZodSchemaAbstractClass } from "./shapes/ZodSchemaClass" @@ -10,6 +10,38 @@ 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[], @@ -28,6 +60,25 @@ extends TraitExpressionBuilder { ) } + 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 },