From a68376485ba19fdc19f58a8f030aea8c37cefcb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 9 Jan 2024 23:21:33 +0100 Subject: [PATCH] Working newSchemable --- src/SchemableClass.ts | 49 ++++++++++++++++++++++++++++++------------- src/index.ts | 1 + src/newSchemable.ts | 21 ++++++++++++------- src/tests.ts | 7 ++++--- 4 files changed, 52 insertions(+), 26 deletions(-) diff --git a/src/SchemableClass.ts b/src/SchemableClass.ts index fb2144b..ece592b 100644 --- a/src/SchemableClass.ts +++ b/src/SchemableClass.ts @@ -1,36 +1,55 @@ -import { AbstractClass } from "type-fest" +import { AbstractClass, Class as ConcreteClass } from "type-fest" import { z } from "zod" +export type ClassType = "AbstractClass" | "Class" + +type Class< + Type extends ClassType, + T, + Arguments extends unknown[] = any[], +> = ( + Type extends "AbstractClass" + ? AbstractClass + : Type extends "Class" + ? ConcreteClass + : never +) + + export type SchemableClass< SchemaT extends z.ZodRawShape, SchemaUnknownKeys extends z.UnknownKeysParam, SchemaCatchall extends z.ZodTypeAny, - SchemaValues extends {}, - DefaultValues extends Partial, + Values extends {}, + DefaultValues extends Partial, + + Type extends ClassType = "AbstractClass" > = ( - AbstractClass< + Class< + Type, + { readonly schema: z.ZodObject< SchemaT, SchemaUnknownKeys, SchemaCatchall, - SchemaValues, - SchemaValues + Values, + Values > readonly defaultValues: DefaultValues - } & SchemaValues, + } & Values, - Parameters<(values: SchemaValues) => void> + Parameters<(values: Values) => never> > & { readonly schema: z.ZodObject< SchemaT, SchemaUnknownKeys, SchemaCatchall, - SchemaValues, - SchemaValues + Values, + Values > readonly defaultValues: DefaultValues @@ -39,12 +58,12 @@ export type SchemableClass< export type SchemableClassInput< - SchemaValues extends {}, - DefaultValues extends Partial, + Values extends {}, + DefaultValues extends Partial, > = { - [Key in Exclude]: SchemaValues[Key] + [Key in Exclude]: Values[Key] } & { - [Key in keyof DefaultValues]?: Key extends keyof SchemaValues - ? SchemaValues[Key] + [Key in keyof DefaultValues]?: Key extends keyof Values + ? Values[Key] : never } diff --git a/src/index.ts b/src/index.ts index 9e51df9..7df42bc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,4 @@ export * from "./SchemableClass" export * from "./extendSchemableClass" export * from "./makeSchemableClass" +export * from "./newSchemable" diff --git a/src/newSchemable.ts b/src/newSchemable.ts index 183f995..7764693 100644 --- a/src/newSchemable.ts +++ b/src/newSchemable.ts @@ -18,29 +18,34 @@ export const newSchemable = < SchemaT, SchemaUnknownKeys, SchemaCatchall, - SchemaValues, - DefaultValues + Values, + DefaultValues, + "Class" >, SchemaT extends z.ZodRawShape, SchemaUnknownKeys extends z.UnknownKeysParam, SchemaCatchall extends z.ZodTypeAny, - SchemaValues extends {}, - DefaultValues extends Partial, + + Values extends {}, + DefaultValues extends Partial, >( class_: C | SchemableClass< SchemaT, SchemaUnknownKeys, SchemaCatchall, - SchemaValues, - DefaultValues + Values, + DefaultValues, + "Class" >, ...[values, params]: NewSchemableArgs< - SchemableClassInput + SchemableClassInput > ) => - new class_() + new class_( + class_.schema.parse({ ...class_.defaultValues, ...values }, params) + ) as InstanceType // export const newSchemablePromise = async < diff --git a/src/tests.ts b/src/tests.ts index 3399d68..a88318b 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,5 +1,5 @@ import { z } from "zod" -import { SchemableClassInput, extendSchemableClass, makeSchemableClass, makeSchemableClassFrom } from "." +import { SchemableClassInput, extendSchemableClass, makeSchemableClass, makeSchemableClassFrom, newSchemable } from "." // class Test1 { @@ -33,7 +33,8 @@ new Test2({ prout: "ruquier", ruquier: 69 }) class Test3 extends Test2 { } -console.log(new Test3({ prout: "ruquier", ruquier: 69 })) - type Test = SchemableClassInput, typeof Test3.defaultValues> + +const test3inst = newSchemable(Test3, { ruquier: 48 }) +console.log(test3inst)