All checks were successful
continuous-integration/drone/push Build is passing
Co-authored-by: Julien Valverdé <julien.valverde@mailo.com> Reviewed-on: https://git.jvalver.de/Thilawyn/zod-schema-class/pulls/3
134 lines
5.5 KiB
TypeScript
134 lines
5.5 KiB
TypeScript
import { Trait, TraitExpressionBuilder, expression } from "@thilawyn/traitify-ts"
|
|
import { AbstractClass } from "type-fest"
|
|
import { EmptyObject } from "type-fest/source/empty-object"
|
|
import { JsonifiableObject } from "type-fest/source/jsonifiable"
|
|
import { z } from "zod"
|
|
import { JsonifiableZodSchemaObject } from "../traits/JsonifiableZodSchemaObject"
|
|
import { ZodSchemaObject } from "../traits/ZodSchemaObject"
|
|
|
|
|
|
export class ZodSchemaClassBuilder<
|
|
Superclass extends AbstractClass<object>,
|
|
const Traits extends readonly Trait<any, any, any, any>[],
|
|
Schemas extends object,
|
|
> {
|
|
declare ["constructor"]: typeof ZodSchemaClassBuilder
|
|
|
|
constructor(
|
|
protected readonly expression: TraitExpressionBuilder<Superclass, Traits>,
|
|
protected readonly schemas: Schemas,
|
|
) {}
|
|
|
|
|
|
schema<
|
|
SchemaT extends z.ZodRawShape,
|
|
SchemaUnknownKeys extends z.UnknownKeysParam,
|
|
SchemaCatchall extends z.ZodTypeAny,
|
|
|
|
SchemaWithDefaultValuesT extends z.ZodRawShape,
|
|
SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam,
|
|
SchemaWithDefaultValuesCatchall extends z.ZodTypeAny,
|
|
|
|
Values extends object,
|
|
PartialValues extends Partial<Values>,
|
|
>(
|
|
this: ZodSchemaClassBuilder<Superclass, Traits, EmptyObject>,
|
|
|
|
props: {
|
|
schema: z.ZodObject<SchemaT, SchemaUnknownKeys, SchemaCatchall, Values, Values>
|
|
|
|
schemaWithDefaultValues: (
|
|
schema: z.ZodObject<SchemaT, SchemaUnknownKeys, SchemaCatchall, Values, Values>
|
|
) => z.ZodObject<SchemaWithDefaultValuesT, SchemaWithDefaultValuesUnknownKeys, SchemaWithDefaultValuesCatchall, Values, PartialValues>
|
|
},
|
|
) {
|
|
const schema = props.schema
|
|
const schemaWithDefaultValues = props.schemaWithDefaultValues(props.schema)
|
|
|
|
abstract class ZodSchemaObjectConstructor {
|
|
constructor(values: Values) {
|
|
Object.assign(this, values)
|
|
}
|
|
}
|
|
|
|
return new this.constructor(
|
|
this.expression
|
|
.extends(ZodSchemaObjectConstructor as AbstractClass<Values, [values: Values]>)
|
|
.expresses(ZodSchemaObject(schema, schemaWithDefaultValues)),
|
|
|
|
{ schema, schemaWithDefaultValues } as const,
|
|
)
|
|
}
|
|
|
|
jsonifiable<
|
|
S extends {
|
|
readonly schema: z.ZodObject<SchemaT, SchemaUnknownKeys, SchemaCatchall, Values, Values>,
|
|
readonly schemaWithDefaultValues: z.ZodObject<SchemaWithDefaultValuesT, SchemaWithDefaultValuesUnknownKeys, SchemaWithDefaultValuesCatchall, Values, PartialValues>,
|
|
jsonifySchema?: never
|
|
dejsonifySchema?: never
|
|
},
|
|
|
|
SchemaT extends z.ZodRawShape,
|
|
SchemaUnknownKeys extends z.UnknownKeysParam,
|
|
SchemaCatchall extends z.ZodTypeAny,
|
|
|
|
SchemaWithDefaultValuesT extends z.ZodRawShape,
|
|
SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam,
|
|
SchemaWithDefaultValuesCatchall extends z.ZodTypeAny,
|
|
|
|
Values extends object,
|
|
PartialValues extends Partial<Values>,
|
|
|
|
JsonifySchemaT extends z.ZodRawShape,
|
|
JsonifySchemaUnknownKeys extends z.UnknownKeysParam,
|
|
JsonifySchemaCatchall extends z.ZodTypeAny,
|
|
|
|
DejsonifySchemaT extends z.ZodRawShape,
|
|
DejsonifySchemaUnknownKeys extends z.UnknownKeysParam,
|
|
DejsonifySchemaCatchall extends z.ZodTypeAny,
|
|
|
|
JsonifiedValues extends JsonifiableObject,
|
|
>(
|
|
this: ZodSchemaClassBuilder<Superclass, Traits, S | {
|
|
readonly schema: z.ZodObject<SchemaT, SchemaUnknownKeys, SchemaCatchall, Values, Values>,
|
|
readonly schemaWithDefaultValues: z.ZodObject<SchemaWithDefaultValuesT, SchemaWithDefaultValuesUnknownKeys, SchemaWithDefaultValuesCatchall, Values, PartialValues>,
|
|
jsonifySchema?: never
|
|
dejsonifySchema?: never
|
|
}>,
|
|
|
|
props: {
|
|
jsonifySchema: (
|
|
schema: z.ZodObject<SchemaT, SchemaUnknownKeys, SchemaCatchall, Values, Values>
|
|
) => z.ZodObject<JsonifySchemaT, JsonifySchemaUnknownKeys, JsonifySchemaCatchall, JsonifiedValues, Values>
|
|
|
|
dejsonifySchema: (
|
|
schema: z.ZodObject<SchemaT, SchemaUnknownKeys, SchemaCatchall, Values, Values>
|
|
) => z.ZodObject<DejsonifySchemaT, DejsonifySchemaUnknownKeys, DejsonifySchemaCatchall, Values, JsonifiedValues>
|
|
},
|
|
) {
|
|
const jsonifySchema = props.jsonifySchema(this.schemas.schema)
|
|
const dejsonifySchema = props.dejsonifySchema(this.schemas.schema)
|
|
|
|
return new this.constructor(
|
|
this.expression.expresses(
|
|
JsonifiableZodSchemaObject(
|
|
this.schemas.schema,
|
|
this.schemas.schemaWithDefaultValues,
|
|
jsonifySchema,
|
|
dejsonifySchema,
|
|
)
|
|
),
|
|
|
|
{ ...this.schemas as S, jsonifySchema, dejsonifySchema } as const,
|
|
)
|
|
}
|
|
|
|
|
|
toExpression() {
|
|
return this.expression
|
|
}
|
|
}
|
|
|
|
|
|
export const zodSchemaClass = new ZodSchemaClassBuilder(expression, {})
|