0.1.2 #3
@@ -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>
|
||||||
),
|
),
|
||||||
|
|
||||||
|
|||||||
59
src/builders/ZodSchemaClassExtender.ts
Normal file
59
src/builders/ZodSchemaClassExtender.ts
Normal 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>,
|
||||||
|
]>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
: {}
|
: {}
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user