ZodSchemaClassBuilder work
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
Julien Valverdé
2024-02-24 23:11:24 +01:00
parent ac5e6e444e
commit aa15e053a7

View File

@@ -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> = (
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>[],
const Traits extends readonly Trait<any, any, any, any>[],
>
extends TraitExpressionBuilder<Superclass, Traits> {
declare ["constructor"]: typeof ZodSchemaClassBuilder
extends<
Super extends AbstractClass<object>
>(
@@ -54,31 +24,12 @@ extends TraitExpressionBuilder<Superclass, Traits> {
this: ZodSchemaClassBuilder<typeof TraitExpression.NullSuperclass, Traits>,
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, 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 },
@@ -106,7 +57,7 @@ extends TraitExpressionBuilder<Superclass, Traits> {
}
}
return new ZodSchemaClassBuilder(
return new this.constructor(
Schemas as unknown as (
AbstractClass<
InstanceType<Superclass> & Values,
@@ -171,7 +122,7 @@ extends TraitExpressionBuilder<Superclass, Traits> {
readonly dejsonifySchema = dejsonifySchema
}
return new ZodSchemaClassBuilder(
return new this.constructor(
JsonifiableSchemas as unknown as (
AbstractClass<
InstanceType<Superclass> & JsonifiableSchemas,
@@ -191,3 +142,25 @@ extends TraitExpressionBuilder<Superclass, Traits> {
)
}
}
export interface ZodSchemaClassBuilder<
Superclass extends AbstractClass<object>,
Traits extends readonly Trait<any, any, any, any>[],
> {
expresses<
const T extends readonly Trait<
TraitExpression<
typeof TraitExpression.NullSuperclass,
readonly Trait<any, any, any, any>[]
>,
any,
any,
any
>[]
>(
...traits: T
): ZodSchemaClassBuilder<
Superclass,
TraitExpressionBuilder.ExpressesReturnTypeTraits<Traits, T>
>
}