0.1.2 #3
@@ -1,59 +1,13 @@
|
|||||||
import { Effect, pipe } from "effect"
|
import { Effect, pipe } from "effect"
|
||||||
import { AbstractClass, Class as ConcreteClass, Opaque } from "type-fest"
|
import { AbstractClass, Class, Opaque } from "type-fest"
|
||||||
import { z } from "zod"
|
import { z } from "zod"
|
||||||
import { DefinedDefaultValuesTag, NewZodSchemaInstanceArgs, NewZodSchemaInstanceInput, TZodSchemaClass } from "."
|
import { DefinedDefaultValuesTag, NewZodSchemaInstanceArgs, NewZodSchemaInstanceInput, TZodSchemaClass } from "."
|
||||||
import { Class, ClassesInstances, ClassesStaticMembers, GetClassType, MergeInheritanceTree, MergeInheritanceTreeWithoutOverriding, parseZodTypeEffect } from "./util"
|
import { ClassesInstances, ClassesStaticMembers, GetClassType, MergeInheritanceTree, MergeInheritanceTreeWithoutOverriding, parseZodTypeEffect } from "./util"
|
||||||
import { abstract, trait } from "@thilawyn/traitify-ts"
|
import { Trait, abstract, trait } from "@thilawyn/traitify-ts"
|
||||||
|
|
||||||
|
|
||||||
export const InstantiableZodSchemaObject = <
|
|
||||||
SchemaT extends z.ZodRawShape,
|
|
||||||
SchemaUnknownKeys extends z.UnknownKeysParam,
|
|
||||||
SchemaCatchall extends z.ZodTypeAny,
|
|
||||||
|
|
||||||
Values extends {},
|
type T = Trait.Class<typeof InstantiableZodSchemaObject>
|
||||||
DefaultValues extends Partial<Values>,
|
|
||||||
>() => trait(
|
|
||||||
abstract(),
|
|
||||||
|
|
||||||
Super => class InstantiableZodSchemaObject extends Super {
|
|
||||||
static create(
|
|
||||||
...[values, params]: NewZodSchemaInstanceArgs<
|
|
||||||
NewZodSchemaInstanceInput<Values, DefaultValues>
|
|
||||||
>
|
|
||||||
) {
|
|
||||||
return new this(
|
|
||||||
this.schema.parse({ ...this.defaultValues, ...values }, params)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
static async createPromise(
|
|
||||||
...[values, params]: NewZodSchemaInstanceArgs<
|
|
||||||
NewZodSchemaInstanceInput<Values, DefaultValues>
|
|
||||||
>
|
|
||||||
) {
|
|
||||||
return new this(
|
|
||||||
await this.schema.parseAsync({ ...this.defaultValues, ...values }, params)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
static createEffect(
|
|
||||||
...[values, params]: NewZodSchemaInstanceArgs<
|
|
||||||
NewZodSchemaInstanceInput<Values, DefaultValues>
|
|
||||||
>
|
|
||||||
) {
|
|
||||||
return pipe(
|
|
||||||
parseZodTypeEffect(
|
|
||||||
this.schema,
|
|
||||||
{ ...this.defaultValues, ...values },
|
|
||||||
params,
|
|
||||||
),
|
|
||||||
|
|
||||||
Effect.map(values => new this(values)),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
export function ZodSchemaClassOf<
|
export function ZodSchemaClassOf<
|
||||||
|
|||||||
95
src/traits/InstantiableZodSchemaObject.ts
Normal file
95
src/traits/InstantiableZodSchemaObject.ts
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
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 { parseZodTypeEffect } from "../util"
|
||||||
|
|
||||||
|
|
||||||
|
type ZodSchemaClassStatic<
|
||||||
|
SchemaT extends z.ZodRawShape,
|
||||||
|
SchemaUnknownKeys extends z.UnknownKeysParam,
|
||||||
|
SchemaCatchall extends z.ZodTypeAny,
|
||||||
|
|
||||||
|
Values extends {},
|
||||||
|
DefaultValues extends Partial<Values>,
|
||||||
|
> = {
|
||||||
|
readonly schema: z.ZodObject<SchemaT, SchemaUnknownKeys, SchemaCatchall, Values, Values>
|
||||||
|
readonly defaultValues: DefaultValues
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export const InstantiableZodSchemaObject = trait(
|
||||||
|
abstract(),
|
||||||
|
|
||||||
|
Super => class InstantiableZodSchemaObject extends Super {
|
||||||
|
static create<
|
||||||
|
Self extends Class<any, any[]> & ZodSchemaClassStatic<SchemaT, SchemaUnknownKeys, SchemaCatchall, Values, DefaultValues>,
|
||||||
|
|
||||||
|
SchemaT extends z.ZodRawShape,
|
||||||
|
SchemaUnknownKeys extends z.UnknownKeysParam,
|
||||||
|
SchemaCatchall extends z.ZodTypeAny,
|
||||||
|
|
||||||
|
Values extends {},
|
||||||
|
DefaultValues extends Partial<Values>,
|
||||||
|
>(
|
||||||
|
this: Self,
|
||||||
|
|
||||||
|
...[values, params]: NewZodSchemaInstanceArgs<
|
||||||
|
NewZodSchemaInstanceInput<Values, DefaultValues>
|
||||||
|
>
|
||||||
|
) {
|
||||||
|
return new this(
|
||||||
|
this.schema.parse({ ...this.defaultValues, ...values }, params)
|
||||||
|
) as InstanceType<Self>
|
||||||
|
}
|
||||||
|
|
||||||
|
static async createPromise<
|
||||||
|
Self extends Class<any, any[]> & ZodSchemaClassStatic<SchemaT, SchemaUnknownKeys, SchemaCatchall, Values, DefaultValues>,
|
||||||
|
|
||||||
|
SchemaT extends z.ZodRawShape,
|
||||||
|
SchemaUnknownKeys extends z.UnknownKeysParam,
|
||||||
|
SchemaCatchall extends z.ZodTypeAny,
|
||||||
|
|
||||||
|
Values extends {},
|
||||||
|
DefaultValues extends Partial<Values>,
|
||||||
|
>(
|
||||||
|
this: Self,
|
||||||
|
|
||||||
|
...[values, params]: NewZodSchemaInstanceArgs<
|
||||||
|
NewZodSchemaInstanceInput<Values, DefaultValues>
|
||||||
|
>
|
||||||
|
) {
|
||||||
|
return new this(
|
||||||
|
await this.schema.parseAsync({ ...this.defaultValues, ...values }, params)
|
||||||
|
) as Promise<InstanceType<Self>>
|
||||||
|
}
|
||||||
|
|
||||||
|
static createEffect<
|
||||||
|
Self extends Class<any, any[]> & ZodSchemaClassStatic<SchemaT, SchemaUnknownKeys, SchemaCatchall, Values, DefaultValues>,
|
||||||
|
|
||||||
|
SchemaT extends z.ZodRawShape,
|
||||||
|
SchemaUnknownKeys extends z.UnknownKeysParam,
|
||||||
|
SchemaCatchall extends z.ZodTypeAny,
|
||||||
|
|
||||||
|
Values extends {},
|
||||||
|
DefaultValues extends Partial<Values>,
|
||||||
|
>(
|
||||||
|
this: Self,
|
||||||
|
|
||||||
|
...[values, params]: NewZodSchemaInstanceArgs<
|
||||||
|
NewZodSchemaInstanceInput<Values, DefaultValues>
|
||||||
|
>
|
||||||
|
) {
|
||||||
|
return pipe(
|
||||||
|
parseZodTypeEffect(
|
||||||
|
this.schema,
|
||||||
|
{ ...this.defaultValues, ...values },
|
||||||
|
params,
|
||||||
|
),
|
||||||
|
|
||||||
|
Effect.map(values => new this(values) as InstanceType<Self>),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user