From 54de41cf97d4da290a01412c83d92f6af3908d43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 30 Dec 2023 03:32:36 +0100 Subject: [PATCH] makeSchemaClass --- bun.lockb | Bin 150218 -> 150232 bytes src/index.ts | 1 + src/makeSchemaClass.ts | 48 +++++++++++++++++++++++++++++++++++++++++ src/tests.ts | 14 ++++++++++++ src/util.ts | 9 ++++++++ 5 files changed, 72 insertions(+) create mode 100644 src/makeSchemaClass.ts create mode 100644 src/tests.ts diff --git a/bun.lockb b/bun.lockb index 692b0f6e2e5e15465484758c10d9eb64860dd447..c02ea2e3fb71feee257f82c5cd59dd9893eb69c1 100755 GIT binary patch delta 12943 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 + { + schema: schemaWithDefaultValues + }: { + schema: z.ZodObject< + SchemaWithDefaultValuesT, + SchemaWithDefaultValuesUnknownKeys, + SchemaWithDefaultValuesCatchall, + SchemaWithDefaultValuesOutput, + SchemaWithDefaultValuesInput + > + } +) { + + const schema = zodObjectRemoveDefaults(schemaWithDefaultValues) + + class SchemaObject { + static readonly schema = schema + static readonly schemaWithDefaultValues = schemaWithDefaultValues + + readonly schema = schema + readonly schemaWithDefaultValues = schemaWithDefaultValues + + constructor(data: z.output) { + Object.assign(this, data) + } + } + + return SchemaObject as ( + Class< + SchemaObject & z.output, + ConstructorParameters + > & + StaticMembers + ) + +} diff --git a/src/tests.ts b/src/tests.ts new file mode 100644 index 0000000..1c2b569 --- /dev/null +++ b/src/tests.ts @@ -0,0 +1,14 @@ +import { z } from "zod" +import { makeSchemaClass } from "./makeSchemaClass" + + +const UserSchema = z.object({ + /** User ID */ + id: z.bigint().default(-1n) +}) + + +const UserSchemaObject = makeSchemaClass({ schema: UserSchema }) + +const user = new UserSchemaObject({ id: 1n }) +user.id diff --git a/src/util.ts b/src/util.ts index 7ab75c7..2cf7b08 100644 --- a/src/util.ts +++ b/src/util.ts @@ -3,6 +3,15 @@ import { mapValues } from "lodash-es" import { z } from "zod" +/** + * Represents the static members of a class. + * @template C - The class type. + */ +export type StaticMembers = { + [Key in keyof C as Key extends "prototype" ? never : Key]: C[Key] +} + + /** * Removes default values from a ZodObject schema and returns a new schema. *