0.1.2 #3
@@ -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> = (
|
||||
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<
|
||||
Superclass extends AbstractClass<object>,
|
||||
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<
|
||||
Superclass extends AbstractClass<object, []> & { schema?: never, defaultValues?: never },
|
||||
|
||||
|
||||
Reference in New Issue
Block a user