diff --git a/src/traits/InstantiableZodSchemaObject.ts b/src/traits/InstantiableZodSchemaObject.ts index fbfe244..2560cfc 100644 --- a/src/traits/InstantiableZodSchemaObject.ts +++ b/src/traits/InstantiableZodSchemaObject.ts @@ -1,30 +1,17 @@ import { abstract, trait } from "@thilawyn/traitify-ts" import { Effect, pipe } from "effect" -import { Class } from "type-fest" import { z } from "zod" import { NewZodSchemaInstanceArgs, NewZodSchemaInstanceInput } from ".." +import { ZodSchemaClass } from "../types/ZodSchemaClass" import { parseZodTypeEffect } from "../util" -export type ZodSchemaClassStatic< - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - Values extends {}, - DefaultValues extends Partial, -> = { - readonly schema: z.ZodObject - readonly defaultValues: DefaultValues -} - - export const InstantiableZodSchemaObject = trait( abstract(), Super => class InstantiableZodSchemaObject extends Super { static create< - Self extends Class & ZodSchemaClassStatic, + Self extends ZodSchemaClass, SchemaT extends z.ZodRawShape, SchemaUnknownKeys extends z.UnknownKeysParam, @@ -33,7 +20,7 @@ export const InstantiableZodSchemaObject = trait( Values extends {}, DefaultValues extends Partial, >( - this: Self | Class & ZodSchemaClassStatic, + this: Self | ZodSchemaClass, ...[values, params]: NewZodSchemaInstanceArgs< NewZodSchemaInstanceInput @@ -45,7 +32,7 @@ export const InstantiableZodSchemaObject = trait( } static async createPromise< - Self extends Class & ZodSchemaClassStatic, + Self extends ZodSchemaClass, SchemaT extends z.ZodRawShape, SchemaUnknownKeys extends z.UnknownKeysParam, @@ -54,7 +41,7 @@ export const InstantiableZodSchemaObject = trait( Values extends {}, DefaultValues extends Partial, >( - this: Self | Class & ZodSchemaClassStatic, + this: Self | ZodSchemaClass, ...[values, params]: NewZodSchemaInstanceArgs< NewZodSchemaInstanceInput @@ -62,11 +49,11 @@ export const InstantiableZodSchemaObject = trait( ) { return new this( await this.schema.parseAsync({ ...this.defaultValues, ...values }, params) - ) as Promise> + ) as InstanceType } static createEffect< - Self extends Class & ZodSchemaClassStatic, + Self extends ZodSchemaClass, SchemaT extends z.ZodRawShape, SchemaUnknownKeys extends z.UnknownKeysParam, @@ -75,7 +62,7 @@ export const InstantiableZodSchemaObject = trait( Values extends {}, DefaultValues extends Partial, >( - this: Self | Class & ZodSchemaClassStatic, + this: Self | ZodSchemaClass, ...[values, params]: NewZodSchemaInstanceArgs< NewZodSchemaInstanceInput diff --git a/src/types/ZodSchemaClass.ts b/src/types/ZodSchemaClass.ts new file mode 100644 index 0000000..ab678da --- /dev/null +++ b/src/types/ZodSchemaClass.ts @@ -0,0 +1,39 @@ +import { AbstractClass, Class } from "type-fest" +import { z } from "zod" + + +export type ZodSchemaClass< + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, + + Values extends {}, + DefaultValues extends Partial, +> = ( + Class & + ZodSchemaClassStatic +) + +export type ZodSchemaAbstractClass< + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, + + Values extends {}, + DefaultValues extends Partial, +> = ( + AbstractClass & + ZodSchemaClassStatic +) + +export type ZodSchemaClassStatic< + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, + + Values extends {}, + DefaultValues extends Partial, +> = { + readonly schema: z.ZodObject + readonly defaultValues: DefaultValues +}