ZodSchemaClassBuilder work
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Julien Valverdé
2024-02-24 05:48:07 +01:00
parent 9a9b0edf5b
commit ac5e6e444e

View File

@@ -1,5 +1,5 @@
import { Trait, TraitExpression, TraitExpressionBuilder } from "@thilawyn/traitify-ts" 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 { JsonifiableObject } from "type-fest/source/jsonifiable"
import { z } from "zod" import { z } from "zod"
import { ZodSchemaAbstractClass } from "./shapes/ZodSchemaClass" import { ZodSchemaAbstractClass } from "./shapes/ZodSchemaClass"
@@ -10,6 +10,38 @@ import { JsonifiableZodSchemaObject } from "./traits/JsonifiableZodSchemaObject"
import { StaticMembers } from "./util" import { StaticMembers } from "./util"
type SpreadSupertraits<Traits> = (
Traits extends [
infer El extends Trait<any, any, any, any>,
...infer Rest,
]
? [
...Trait.Supertraits<El>,
El,
...SpreadSupertraits<Rest>,
]
: []
)
type TraitsUniq<Traits> = (
Traits extends [
...infer Rest,
infer El extends Trait<any, any, any, any>,
]
? IsTraitInTupleFromRight<Rest, El> extends true
? TraitsUniq<Rest>
: [...TraitsUniq<Rest>, El]
: []
)
type IsTraitInTupleFromRight<Traits, T> = (
Traits extends [...infer Rest, infer El]
? IsEqual<El, T> extends true
? true
: IsTraitInTupleFromRight<Rest, T>
: false
)
export class ZodSchemaClassBuilder< export class ZodSchemaClassBuilder<
Superclass extends AbstractClass<object>, Superclass extends AbstractClass<object>,
const Traits extends Trait<any, any, any, any>[], const Traits extends Trait<any, any, any, any>[],
@@ -28,6 +60,25 @@ extends TraitExpressionBuilder<Superclass, Traits> {
) )
} }
expresses<
const T extends Trait<
TraitExpression<
typeof TraitExpression.NullSuperclass,
Trait<any, any, any, any>[]
>,
any,
any,
any
>[]
>(
...traits: T
): TraitExpressionBuilder<
Superclass,
TraitsUniq<[...Traits, ...SpreadSupertraits<T>]>
> {
return super.expresses(...traits)
}
schema< schema<
Superclass extends AbstractClass<object, []> & { schema?: never, defaultValues?: never }, Superclass extends AbstractClass<object, []> & { schema?: never, defaultValues?: never },