From 674f96ab5259e9e7242dde18ac0e835315417117 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 9 Jan 2024 22:04:17 +0100 Subject: [PATCH] SchemableClassInput --- src/SchemableClass.ts | 12 +++++++ src/newSchemable.ts | 73 +++++++++++++++++++++++++++++++++++++++++++ src/tests.ts | 5 ++- 3 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 src/newSchemable.ts diff --git a/src/SchemableClass.ts b/src/SchemableClass.ts index 6758472..fb2144b 100644 --- a/src/SchemableClass.ts +++ b/src/SchemableClass.ts @@ -36,3 +36,15 @@ export type SchemableClass< readonly defaultValues: DefaultValues } ) + + +export type SchemableClassInput< + SchemaValues extends {}, + DefaultValues extends Partial, +> = { + [Key in Exclude]: SchemaValues[Key] +} & { + [Key in keyof DefaultValues]?: Key extends keyof SchemaValues + ? SchemaValues[Key] + : never +} diff --git a/src/newSchemable.ts b/src/newSchemable.ts new file mode 100644 index 0000000..183f995 --- /dev/null +++ b/src/newSchemable.ts @@ -0,0 +1,73 @@ +import { Effect, pipe } from "effect" +import { HasRequiredKeys } from "type-fest" +import { z } from "zod" +import { SchemableClass, SchemableClassInput } from "." +import { parseZodTypeEffect } from "./util" + + +type ParamsArgs = [] | [Partial] + +type NewSchemableArgs = + HasRequiredKeys extends true + ? [Input, ...ParamsArgs] + : [] | [Input, ...ParamsArgs] + + +export const newSchemable = < + C extends SchemableClass< + SchemaT, + SchemaUnknownKeys, + SchemaCatchall, + SchemaValues, + DefaultValues + >, + + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, + SchemaValues extends {}, + DefaultValues extends Partial, +>( + class_: C | SchemableClass< + SchemaT, + SchemaUnknownKeys, + SchemaCatchall, + SchemaValues, + DefaultValues + >, + + ...[values, params]: NewSchemableArgs< + SchemableClassInput + > +) => + new class_() + + +// 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 09d8037..3399d68 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,5 +1,5 @@ import { z } from "zod" -import { extendSchemableClass, makeSchemableClass, makeSchemableClassFrom } from "." +import { SchemableClassInput, extendSchemableClass, makeSchemableClass, makeSchemableClassFrom } from "." // class Test1 { @@ -34,3 +34,6 @@ class Test3 extends Test2 { } console.log(new Test3({ prout: "ruquier", ruquier: 69 })) + + +type Test = SchemableClassInput, typeof Test3.defaultValues>