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>