From 5297468d170259345f828ef2a08a467351b6ca18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 6 Feb 2024 03:32:52 +0100 Subject: [PATCH] ZodSchemaClass.old.ts --- src/ZodSchemaClass.old.ts | 148 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 src/ZodSchemaClass.old.ts diff --git a/src/ZodSchemaClass.old.ts b/src/ZodSchemaClass.old.ts new file mode 100644 index 0000000..3b79414 --- /dev/null +++ b/src/ZodSchemaClass.old.ts @@ -0,0 +1,148 @@ +import { Effect, pipe } from "effect" +import { AbstractClass, Class as ConcreteClass, Opaque } from "type-fest" +import { z } from "zod" +import { DefinedDefaultValuesTag, NewZodSchemaInstanceArgs, NewZodSchemaInstanceInput, TZodSchemaClass } from "." +import { Class, ClassesInstances, ClassesStaticMembers, GetClassType, MergeInheritanceTree, MergeInheritanceTreeWithoutOverriding, parseZodTypeEffect } from "./util" + + +export function ZodSchemaClassOf< + Super extends AbstractClass, + + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, + + Values extends {}, + DefaultValues extends Partial, +>( + of: Super, + + { schema, defaultValues }: { + schema: z.ZodObject + defaultValues: Opaque + }, +) { + type TZodSchemaClassImpl = TZodSchemaClass< + SchemaT, + SchemaUnknownKeys, + SchemaCatchall, + + Values, + DefaultValues + > + + return class extends (of as unknown as ConcreteClass) { + static readonly schema = schema + static readonly defaultValues = defaultValues + + constructor(values: Values) { + super() + Object.assign(this, values) + } + + static create( + ...[values, params]: NewZodSchemaInstanceArgs< + NewZodSchemaInstanceInput + > + ) { + return new this( + this.schema.parse({ ...this.defaultValues, ...values }, params) + ) + } + + static async createPromise( + ...[values, params]: NewZodSchemaInstanceArgs< + NewZodSchemaInstanceInput + > + ) { + return new this( + await this.schema.parseAsync({ ...this.defaultValues, ...values }, params) + ) + } + + static createEffect( + ...[values, params]: NewZodSchemaInstanceArgs< + NewZodSchemaInstanceInput + > + ) { + return pipe( + parseZodTypeEffect( + this.schema, + { ...this.defaultValues, ...values }, + params, + ), + + Effect.map(values => new this(values)), + ) + } + + static extend< + ExtendedSchemaT extends z.ZodRawShape, + ExtendedSchemaUnknownKeys extends z.UnknownKeysParam, + ExtendedSchemaCatchall extends z.ZodTypeAny, + + ExtendedValues extends Values, + ExtendedDefaultValues extends Partial, + >( + props: { + schema: (props: { + schema: z.ZodObject + shape: SchemaT + }) => z.ZodObject + + defaultValues: (defaultValues: DefaultValues) => Opaque + }, + ) { + const schema = props.schema({ + schema: this.schema, + shape: this.schema.shape, + }) + + const defaultValues = props.defaultValues(this.defaultValues) + + return class extends (this as unknown as ConcreteClass) { + static readonly schema = schema + static readonly defaultValues = defaultValues + } + } + } as unknown as ( + Class< + GetClassType, + + MergeInheritanceTreeWithoutOverriding< + ClassesInstances<[ + Super, + TZodSchemaClassImpl, + ]> + > & + + ConstructorParameters + > & + + MergeInheritanceTree< + ClassesStaticMembers<[ + Super, + TZodSchemaClassImpl, + ]> + > + ) +} + + +class DefaultRoot {} + +export function ZodSchemaClass< + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, + + Values extends {}, + DefaultValues extends Partial, +>( + props: { + schema: z.ZodObject + defaultValues: Opaque + }, +) { + return ZodSchemaClassOf(DefaultRoot, props) +}