0.1.2 #3
@@ -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>
|
||||||
|
>
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user