extendWithZodSchema tests
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Julien Valverdé
2024-01-08 06:36:24 +01:00
parent 0817f85f5d
commit 39b7555a44
2 changed files with 103 additions and 1 deletions

View File

@@ -1,6 +1,6 @@
{ {
"name": "@thilawyn/schemable-class", "name": "@thilawyn/schemable-class",
"version": "0.1.0", "version": "0.1.1",
"type": "module", "type": "module",
"publishConfig": { "publishConfig": {
"registry": "https://git.jvalver.de/api/packages/thilawyn/npm/" "registry": "https://git.jvalver.de/api/packages/thilawyn/npm/"

102
src/extendWithZodSchema.ts Normal file
View File

@@ -0,0 +1,102 @@
import { AbstractClass, Class } from "type-fest"
import { z } from "zod"
import { StaticMembers } from "./util"
type SchemableClass<
SchemaT extends z.ZodRawShape,
SchemaUnknownKeys extends z.UnknownKeysParam,
SchemaCatchall extends z.ZodTypeAny,
SchemaValues extends {},
> = (
AbstractClass<
{
readonly schema: z.ZodObject<
SchemaT,
SchemaUnknownKeys,
SchemaCatchall,
SchemaValues,
SchemaValues
>
} & SchemaValues,
any[]
> & {
readonly schema: z.ZodObject<
SchemaT,
SchemaUnknownKeys,
SchemaCatchall,
SchemaValues,
SchemaValues
>
}
)
export function extendWithZodSchema<
C extends SchemableClass<
ExtendSchemaT,
ExtendSchemaUnknownKeys,
ExtendSchemaCatchall,
ExtendSchemaValues
>,
ExtendSchemaT extends z.ZodRawShape,
ExtendSchemaUnknownKeys extends z.UnknownKeysParam,
ExtendSchemaCatchall extends z.ZodTypeAny,
ExtendSchemaValues extends {},
SchemaT extends z.ZodRawShape,
SchemaUnknownKeys extends z.UnknownKeysParam,
SchemaCatchall extends z.ZodTypeAny,
SchemaValues extends ExtendSchemaValues,
>(
extend: C | SchemableClass<
ExtendSchemaT,
ExtendSchemaUnknownKeys,
ExtendSchemaCatchall,
ExtendSchemaValues
>,
schema: z.ZodObject<
SchemaT,
SchemaUnknownKeys,
SchemaCatchall,
SchemaValues,
SchemaValues
>,
) {
const class_ = class extends extend {
static readonly schema = schema
readonly schema = schema
}
return class_ as unknown as (
Class<
Omit<C, "schema"> &
{ readonly schema: typeof schema } &
SchemaValues,
ConstructorParameters<C>
> &
Omit<StaticMembers<C>, "schema"> &
{ readonly schema: typeof schema }
)
}
const Test1Schema = z.object({ prout: z.string() })
class Test1 {
static readonly schema = Test1Schema
readonly schema = Test1Schema
prout: string = "heugneu"
}
const Test2Schema = Test1.schema.extend({ prout: z.literal("ruquier"), ruquier: z.number() })
const Test2 = extendWithZodSchema(Test1, Test2Schema)
Test2.schema
new Test2().schema