diff --git a/src/ZodSchemaClass.ts b/src/ZodSchemaClass.ts new file mode 100644 index 0000000..320b695 --- /dev/null +++ b/src/ZodSchemaClass.ts @@ -0,0 +1,36 @@ +import { z } from "zod" +import { ZodSchemaObject } from "./lib" +import { expression } from "@thilawyn/traitify-ts" +import { AbstractClass } from "type-fest" + + +export function ZodSchemaClass< + SchemaT extends z.ZodRawShape, + SchemaCatchall extends z.ZodTypeAny, + SchemaWithDefaultValuesT extends z.ZodRawShape, + SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, + + Values extends object, + PartialValues extends Partial, +>( + props: { + schema: z.ZodObject + + schemaWithDefaultValues: ( + schema: z.ZodObject + ) => z.ZodObject + } +) { + const schema = props.schema + const schemaWithDefaultValues = props.schemaWithDefaultValues(props.schema) + + abstract class ZodSchemaObjectConstructor { + constructor(values: Values) { + Object.assign(this, values) + } + } + + return expression + .extends(ZodSchemaObjectConstructor as AbstractClass) + .expresses(ZodSchemaObject(schema, schemaWithDefaultValues)) +} diff --git a/src/traits/ZodSchemaObject.ts b/src/traits/ZodSchemaObject.ts index 10fc6ad..d6efdf6 100644 --- a/src/traits/ZodSchemaObject.ts +++ b/src/traits/ZodSchemaObject.ts @@ -12,13 +12,13 @@ type CreateArgs = ( export const ZodSchemaObject = < - SchemaT extends z.ZodRawShape, - SchemaCatchall extends z.ZodTypeAny, - SchemaWithDefaultValuesT extends z.ZodRawShape, - SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, + SchemaT extends z.ZodRawShape, + SchemaCatchall extends z.ZodTypeAny, + SchemaWithDefaultValuesT extends z.ZodRawShape, + SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, - Values extends object, - PartialValues extends Partial, + Values extends object, + PartialValues extends Partial, >( schema: z.ZodObject, schemaWithDefaultValues: z.ZodObject,