Files
zod-schema-class/src/ZodSchemaClass.ts
Julien Valverdé ae4abf6b9c
Some checks failed
continuous-integration/drone/push Build is failing
defaultValues fix
2024-02-08 02:42:02 +01:00

71 lines
1.9 KiB
TypeScript

import { expression } from "@thilawyn/traitify-ts"
import { AbstractClass } from "type-fest"
import { z } from "zod"
import { InstantiableZodSchemaObject } from "./traits/InstantiableZodSchemaObject"
import { Extend, StaticMembers } from "./util"
export function ZodSchemaClassOf<
Superclass extends AbstractClass<{}, []>,
SchemaT extends z.ZodRawShape,
SchemaUnknownKeys extends z.UnknownKeysParam,
SchemaCatchall extends z.ZodTypeAny,
Values extends {},
DefaultValues extends Partial<Values>,
>(
of: Superclass,
{ schema, defaultValues }: {
schema: z.ZodObject<SchemaT, SchemaUnknownKeys, SchemaCatchall, Values, Values>
defaultValues: DefaultValues
},
) {
const exp = expression
.extends(class extends (of as AbstractClass<{}, []>) {
static readonly schema = schema
static readonly defaultValues = defaultValues
constructor(values: Values) {
super()
Object.assign(this, values)
}
})
.expresses(InstantiableZodSchemaObject)
.build()
return exp.extends as AbstractClass<
Extend<[
InstanceType<Superclass>,
InstanceType<typeof exp.extends>,
Values,
]>,
ConstructorParameters<typeof exp.extends>
> &
Extend<[
StaticMembers<Superclass>,
StaticMembers<typeof exp.extends>,
]>
}
class DefaultRoot {}
export function ZodSchemaClass<
SchemaT extends z.ZodRawShape,
SchemaUnknownKeys extends z.UnknownKeysParam,
SchemaCatchall extends z.ZodTypeAny,
Values extends {},
DefaultValues extends Partial<Values>,
>(
props: {
schema: z.ZodObject<SchemaT, SchemaUnknownKeys, SchemaCatchall, Values, Values>
defaultValues: DefaultValues
},
) {
return ZodSchemaClassOf(DefaultRoot, props)
}