diff --git a/src/index.ts b/src/index.ts index a850a00..17d8b56 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,2 +1,3 @@ export * from "./SchemableClass" export * from "./makeSchemableClass" +export * from "./newSchemable" diff --git a/src/newSchemable.ts b/src/newSchemable.ts index 873d667..955d0f3 100644 --- a/src/newSchemable.ts +++ b/src/newSchemable.ts @@ -1,11 +1,13 @@ +import { Effect, pipe } from "effect" import { HasRequiredKeys } from "type-fest" import { z } from "zod" import { SchemableClass, SchemableConfig } from "." +import { parseZodTypeEffect } from "./util" type ParamsArgs = [] | [Partial] -type NewEntityArgs = +type NewSchemableArgs = HasRequiredKeys extends true ? [Input, ...ParamsArgs] : [] | [Input, ...ParamsArgs] @@ -16,6 +18,34 @@ export const newSchemable = < $Config extends SchemableConfig, >( class_: C | SchemableClass<$Config>, - ...[values, params]: NewEntityArgs<$Config["input"]> + ...[values, params]: NewSchemableArgs<$Config["input"]> ) => - new class_(class_.schemaWithDefaultValues.parse(values || {}, params)) + new class_(class_.schemaWithDefaultValues.parse(values || {}, params)) as InstanceType + +export const newSchemablePromise = async < + C extends SchemableClass<$Config>, + $Config extends SchemableConfig, +>( + class_: C | SchemableClass<$Config>, + ...[values, params]: NewSchemableArgs<$Config["input"]> +) => + new class_(await class_.schemaWithDefaultValues.parseAsync(values || {}, params)) as InstanceType + +export const newSchemableEffect = < + C extends SchemableClass<$Config>, + $Config extends SchemableConfig, +>( + class_: C | SchemableClass<$Config>, + ...[values, params]: NewSchemableArgs<$Config["input"]> +) => pipe( + parseZodTypeEffect< + z.output, + z.input + >( + class_.schemaWithDefaultValues, + values || {}, + params, + ), + + Effect.map(values => new class_(values) as InstanceType), +) diff --git a/src/tests.ts b/src/tests.ts index 29278e0..2dc332c 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,6 +1,5 @@ import { z } from "zod" -import { makeSchemableClass } from "." -import { newSchemable } from "./newSchemable" +import { makeSchemableClass, newSchemable } from "." const UserSchema = z.object({