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

This commit is contained in:
Julien Valverdé
2024-02-25 04:32:09 +01:00
parent 34ae4b9375
commit e7c65c0a07
3 changed files with 72 additions and 13 deletions

View File

@@ -18,7 +18,7 @@ extends TraitExpressionBuilder<Superclass, Traits> {
declare ["constructor"]: typeof ZodSchemaClassBuilder declare ["constructor"]: typeof ZodSchemaClassBuilder
schema< schema<
Superclass extends AbstractClass<object, []> & { schema?: never, defaultValues?: never }, Super extends AbstractClass<object, []> & { schema?: never, defaultValues?: never },
SchemaT extends z.ZodRawShape, SchemaT extends z.ZodRawShape,
SchemaUnknownKeys extends z.UnknownKeysParam, SchemaUnknownKeys extends z.UnknownKeysParam,
@@ -27,7 +27,7 @@ extends TraitExpressionBuilder<Superclass, Traits> {
Values extends object, Values extends object,
DefaultValues extends Partial<Values>, DefaultValues extends Partial<Values>,
>( >(
this: ZodSchemaClassBuilder<Superclass, Traits>, this: ZodSchemaClassBuilder<Super, Traits>,
{ schema, defaultValues }: { { schema, defaultValues }: {
schema: z.ZodObject<SchemaT, SchemaUnknownKeys, SchemaCatchall, Values, Values> schema: z.ZodObject<SchemaT, SchemaUnknownKeys, SchemaCatchall, Values, Values>
@@ -47,10 +47,10 @@ extends TraitExpressionBuilder<Superclass, Traits> {
return new this.constructor( return new this.constructor(
Schemas as unknown as ( Schemas as unknown as (
AbstractClass< AbstractClass<
InstanceType<Superclass> & Values, InstanceType<Super> & Values,
ConstructorParameters<typeof Schemas> ConstructorParameters<typeof Schemas>
> & > &
StaticMembers<Superclass> & StaticMembers<Super> &
StaticMembers<typeof Schemas> StaticMembers<typeof Schemas>
), ),
@@ -63,7 +63,7 @@ extends TraitExpressionBuilder<Superclass, Traits> {
} }
jsonifiable< jsonifiable<
Superclass extends ZodSchemaAbstractClass<Instance, SchemaT, SchemaUnknownKeys, SchemaCatchall, Values, DefaultValues> Super extends ZodSchemaAbstractClass<Instance, SchemaT, SchemaUnknownKeys, SchemaCatchall, Values, DefaultValues>
& { jsonifySchema?: never, dejsonifySchema?: never }, & { jsonifySchema?: never, dejsonifySchema?: never },
Instance extends Values, Instance extends Values,
@@ -85,7 +85,7 @@ extends TraitExpressionBuilder<Superclass, Traits> {
JsonifiedValues extends JsonifiableObject, JsonifiedValues extends JsonifiableObject,
>( >(
this: ZodSchemaClassBuilder< this: ZodSchemaClassBuilder<
Superclass | ZodSchemaAbstractClass<Instance, SchemaT, SchemaUnknownKeys, SchemaCatchall, Values, DefaultValues>, Super | ZodSchemaAbstractClass<Instance, SchemaT, SchemaUnknownKeys, SchemaCatchall, Values, DefaultValues>,
Traits Traits
>, >,
@@ -112,12 +112,12 @@ extends TraitExpressionBuilder<Superclass, Traits> {
return new this.constructor( return new this.constructor(
JsonifiableSchemas as unknown as ( JsonifiableSchemas as unknown as (
AbstractClass< AbstractClass<
InstanceType<Superclass> & JsonifiableSchemas, Instance & JsonifiableSchemas,
// TODO: for some reason, ConstructorParameters<Superclass> does not work here. Maybe try to find a fix? // TODO: for some reason, ConstructorParameters<Super> does not work here. Maybe try to find a fix?
ConstructorParameters<ZodSchemaAbstractClass<Instance, SchemaT, SchemaUnknownKeys, SchemaCatchall, Values, DefaultValues>> ConstructorParameters<ZodSchemaAbstractClass<Instance, SchemaT, SchemaUnknownKeys, SchemaCatchall, Values, DefaultValues>>
> & > &
StaticMembers<Superclass> & StaticMembers<Super> &
StaticMembers<typeof JsonifiableSchemas> StaticMembers<typeof JsonifiableSchemas>
), ),

View File

@@ -0,0 +1,59 @@
import { AbstractClass } from "type-fest"
import { z } from "zod"
import { ZodSchemaAbstractClass } from "../shapes/ZodSchemaClass"
import { Extend, StaticMembers } from "../util"
export class ZodSchemaClassExtender<Superclass extends AbstractClass<object>> {
declare ["constructor"]: typeof ZodSchemaClassExtender
constructor(readonly superclass: Superclass) {}
schema<
Super extends ZodSchemaAbstractClass<SuperInstance, SuperSchemaT, SuperSchemaUnknownKeys, SuperSchemaCatchall, SuperValues, SuperDefaultValues>,
SuperInstance extends SuperValues,
SuperSchemaT extends z.ZodRawShape,
SuperSchemaUnknownKeys extends z.UnknownKeysParam,
SuperSchemaCatchall extends z.ZodTypeAny,
SuperValues extends object,
SuperDefaultValues extends Partial<SuperValues>,
SchemaT extends z.ZodRawShape,
SchemaUnknownKeys extends z.UnknownKeysParam,
SchemaCatchall extends z.ZodTypeAny,
Values extends SuperValues,
DefaultValues extends Partial<Values>,
>(
this: ZodSchemaClassExtender<
Super | ZodSchemaAbstractClass<SuperInstance, SuperSchemaT, SuperSchemaUnknownKeys, SuperSchemaCatchall, SuperValues, SuperDefaultValues>
>,
props: {
schema: (schema: Super["schema"]) => z.ZodObject<SchemaT, SchemaUnknownKeys, SchemaCatchall, Values, Values>
defaultValues: (defaultValues: SuperDefaultValues) => DefaultValues
},
) {
const schema = props.schema(this.superclass.schema)
const defaultValues = props.defaultValues(this.superclass.defaultValues)
class Schemas extends (this.superclass as AbstractClass<object, any[]>) {
static readonly schema = schema
static readonly defaultValues = defaultValues
}
return new this.constructor(
this.superclass as unknown as AbstractClass<
Extend<[SuperInstance, Schemas]>,
[values: Values]
> &
Extend<[
StaticMembers<Super>,
StaticMembers<typeof Schemas>,
]>
)
}
}

View File

@@ -6,18 +6,18 @@
export type CommonKeys<A, B> = Extract<keyof A, keyof B> export type CommonKeys<A, B> = Extract<keyof A, keyof B>
export type Extend<T extends readonly object[]> = ( export type Extend<T extends readonly object[]> = (
T extends [ T extends readonly [
infer Super, infer Super,
infer Self, infer Self,
...infer Rest extends object[], ...infer Rest extends readonly object[],
] ]
? Pick<Self, CommonKeys<Self, Super>> extends Pick<Super, CommonKeys<Self, Super>> ? Pick<Self, CommonKeys<Self, Super>> extends Pick<Super, CommonKeys<Self, Super>>
? Extend<[ ? Extend<readonly [
Omit<Super, CommonKeys<Self, Super>> & Self, Omit<Super, CommonKeys<Self, Super>> & Self,
...Rest, ...Rest,
]> ]>
: never : never
: T extends [infer Self] : T extends readonly [infer Self]
? Self ? Self
: {} : {}
) )