From 2dad6e08738d88c9f1343c4b6321ff56537ba312 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 9 Jan 2024 05:32:27 +0100 Subject: [PATCH] makeSchemableClassFrom work --- src/extendSchemableClass.ts | 4 +-- src/index.ts | 1 + src/makeSchemableClass.ts | 62 +++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 src/makeSchemableClass.ts diff --git a/src/extendSchemableClass.ts b/src/extendSchemableClass.ts index b1d6480..2d06f72 100644 --- a/src/extendSchemableClass.ts +++ b/src/extendSchemableClass.ts @@ -60,14 +60,14 @@ export function extendSchemableClass< readonly defaultValues = defaultValues } as unknown as ( ClassKind< - Omit & + Omit, "schema" | "defaultValues" | keyof ExtendSchemaValues> & { readonly schema: typeof schema, readonly defaultValues: typeof defaultValues, } & SchemaValues, - ConstructorParameters + Parameters<(values: SchemaValues) => void> > & Omit, "schema" | "defaultValues"> & diff --git a/src/index.ts b/src/index.ts index 086aabb..9e51df9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,2 +1,3 @@ export * from "./SchemableClass" export * from "./extendSchemableClass" +export * from "./makeSchemableClass" diff --git a/src/makeSchemableClass.ts b/src/makeSchemableClass.ts new file mode 100644 index 0000000..5352bd2 --- /dev/null +++ b/src/makeSchemableClass.ts @@ -0,0 +1,62 @@ +import { AbstractClass, Class } from "type-fest" +import { z } from "zod" +import { StaticMembers } from "./util" + + +export function makeSchemableClassFrom< + C extends AbstractClass, + + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, + SchemaValues extends {}, + DefaultValues extends Partial, +>( + extend: C, + + schema: z.ZodObject< + SchemaT, + SchemaUnknownKeys, + SchemaCatchall, + SchemaValues, + SchemaValues + >, + + defaultValues: DefaultValues, +) { + type ClassKind = ( + C extends Class + ? Class + : AbstractClass + ) + + return class extends (extend as unknown as Class) { + static readonly schema = schema + readonly schema = schema + + static readonly defaultValues = defaultValues + readonly defaultValues = defaultValues + + constructor(values: SchemaValues) { + super() + Object.assign(this, values) + } + } as unknown as ( + ClassKind< + Omit, "schema" | "defaultValues"> & + { + readonly schema: typeof schema, + readonly defaultValues: typeof defaultValues, + } & + SchemaValues, + + Parameters<(values: SchemaValues) => void> + > & + + Omit, "schema" | "defaultValues"> & + { + readonly schema: typeof schema, + readonly defaultValues: typeof defaultValues, + } + ) +}