0.1.2 #3

Merged
Thilawyn merged 136 commits from next into master 2024-03-11 19:44:21 +01:00
Showing only changes of commit aa15e053a7 - Show all commits

View File

@@ -1,5 +1,5 @@
import { Trait, TraitExpression, TraitExpressionBuilder } from "@thilawyn/traitify-ts" 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 { 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,43 +10,13 @@ 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 readonly Trait<any, any, any, any>[],
> >
extends TraitExpressionBuilder<Superclass, Traits> { extends TraitExpressionBuilder<Superclass, Traits> {
declare ["constructor"]: typeof ZodSchemaClassBuilder
extends< extends<
Super extends AbstractClass<object> Super extends AbstractClass<object>
>( >(
@@ -54,31 +24,12 @@ extends TraitExpressionBuilder<Superclass, Traits> {
this: ZodSchemaClassBuilder<typeof TraitExpression.NullSuperclass, Traits>, this: ZodSchemaClassBuilder<typeof TraitExpression.NullSuperclass, Traits>,
superclass: Super, superclass: Super,
) { ) {
return new ZodSchemaClassBuilder( return new this.constructor(
superclass, superclass,
this.expressionTraits, 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< schema<
Superclass extends AbstractClass<object, []> & { schema?: never, defaultValues?: never }, 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 ( Schemas as unknown as (
AbstractClass< AbstractClass<
InstanceType<Superclass> & Values, InstanceType<Superclass> & Values,
@@ -171,7 +122,7 @@ extends TraitExpressionBuilder<Superclass, Traits> {
readonly dejsonifySchema = dejsonifySchema readonly dejsonifySchema = dejsonifySchema
} }
return new ZodSchemaClassBuilder( return new this.constructor(
JsonifiableSchemas as unknown as ( JsonifiableSchemas as unknown as (
AbstractClass< AbstractClass<
InstanceType<Superclass> & JsonifiableSchemas, 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>
>
}