71 lines
1.9 KiB
TypeScript
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)
|
|
}
|