Files
zod-schema-class/src/makeSchemableClass.ts
Julien Valverdé 6ae87887db
All checks were successful
continuous-integration/drone/push Build is passing
Fixed makeSchemableClassFrom
2024-01-10 00:00:58 +01:00

86 lines
2.2 KiB
TypeScript

import { AbstractClass, Class as ConcreteClass } from "type-fest"
import { z } from "zod"
import { StaticMembers } from "./util"
export function makeSchemableClassFrom<
C extends AbstractClass<any, []>,
SchemaT extends z.ZodRawShape,
SchemaUnknownKeys extends z.UnknownKeysParam,
SchemaCatchall extends z.ZodTypeAny,
Values extends {},
DefaultValues extends Partial<Values>,
>(
extend: C,
schema: z.ZodObject<
SchemaT,
SchemaUnknownKeys,
SchemaCatchall,
Values,
Values
>,
defaultValues: DefaultValues,
) {
type Class<T, Arguments extends unknown[]> = (
C extends ConcreteClass<any>
? ConcreteClass<T, Arguments>
: AbstractClass<T, Arguments>
)
return class extends (extend as unknown as ConcreteClass<any, []>) {
static readonly schema = schema
readonly schema = schema
static readonly defaultValues = defaultValues
readonly defaultValues = defaultValues
constructor(values: Values) {
super()
Object.assign(this, values)
}
} as unknown as (
Class<
Omit<InstanceType<C>, "schema" | "defaultValues"> &
{
readonly schema: typeof schema,
readonly defaultValues: typeof defaultValues,
} &
Values,
Parameters<(values: Values) => void>
> &
Omit<StaticMembers<C>, "schema" | "defaultValues"> &
{
readonly schema: typeof schema,
readonly defaultValues: typeof defaultValues,
}
)
}
export function makeSchemableClass<
SchemaT extends z.ZodRawShape,
SchemaUnknownKeys extends z.UnknownKeysParam,
SchemaCatchall extends z.ZodTypeAny,
Values extends {},
DefaultValues extends Partial<Values>,
>(
schema: z.ZodObject<
SchemaT,
SchemaUnknownKeys,
SchemaCatchall,
Values,
Values
>,
defaultValues: DefaultValues,
) {
return makeSchemableClassFrom(Object, schema, defaultValues)
}