From dce10c3b6d98f84f810fef58d5dd5e10c2d3a4ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 23 Feb 2024 22:49:52 +0100 Subject: [PATCH] JsonifiableZodSchemaObject --- src/shapes/JsonifiableZodSchemaClass.ts | 6 +- src/traits/JsonifiableZodSchemaObject.ts | 115 +++++++++++++++++++++++ 2 files changed, 118 insertions(+), 3 deletions(-) create mode 100644 src/traits/JsonifiableZodSchemaObject.ts diff --git a/src/shapes/JsonifiableZodSchemaClass.ts b/src/shapes/JsonifiableZodSchemaClass.ts index 36abdfc..107fc5c 100644 --- a/src/shapes/JsonifiableZodSchemaClass.ts +++ b/src/shapes/JsonifiableZodSchemaClass.ts @@ -18,7 +18,7 @@ export type JsonifiableZodSchemaClass< JsonifiedValues extends JsonifiableObject, > = ( Class & - JsonifiableZodSchemaClassStatic< + JsonifiableZodSchemas< JsonifySchemaT, JsonifySchemaUnknownKeys, JsonifySchemaCatchall, @@ -47,7 +47,7 @@ export type JsonifiableZodSchemaAbstractClass< JsonifiedValues extends JsonifiableObject, > = ( AbstractClass & - JsonifiableZodSchemaClassStatic< + JsonifiableZodSchemas< JsonifySchemaT, JsonifySchemaUnknownKeys, JsonifySchemaCatchall, @@ -61,7 +61,7 @@ export type JsonifiableZodSchemaAbstractClass< > ) -export type JsonifiableZodSchemaClassStatic< +export type JsonifiableZodSchemas< JsonifySchemaT extends z.ZodRawShape, JsonifySchemaUnknownKeys extends z.UnknownKeysParam, JsonifySchemaCatchall extends z.ZodTypeAny, diff --git a/src/traits/JsonifiableZodSchemaObject.ts b/src/traits/JsonifiableZodSchemaObject.ts new file mode 100644 index 0000000..9cc7866 --- /dev/null +++ b/src/traits/JsonifiableZodSchemaObject.ts @@ -0,0 +1,115 @@ +import { trait } from "@thilawyn/traitify-ts" +import { Effect } from "effect" +import { JsonifiableObject } from "type-fest/source/jsonifiable" +import { z } from "zod" +import { JsonifiableZodSchemaClass, JsonifiableZodSchemas } from "../shapes/JsonifiableZodSchemaClass" +import { parseZodTypeEffect } from "../util" + + +export const JsonifiableZodSchemaObject = trait + .implement(Super => class JsonifiableZodSchemaObject extends Super { + jsonify< + JsonifySchemaT extends z.ZodRawShape, + JsonifySchemaUnknownKeys extends z.UnknownKeysParam, + JsonifySchemaCatchall extends z.ZodTypeAny, + + DejsonifySchemaT extends z.ZodRawShape, + DejsonifySchemaUnknownKeys extends z.UnknownKeysParam, + DejsonifySchemaCatchall extends z.ZodTypeAny, + + Values extends object, + JsonifiedValues extends JsonifiableObject, + >( + this: Values & JsonifiableZodSchemas< + JsonifySchemaT, + JsonifySchemaUnknownKeys, + JsonifySchemaCatchall, + + DejsonifySchemaT, + DejsonifySchemaUnknownKeys, + DejsonifySchemaCatchall, + + Values, + JsonifiedValues + >, + + params?: Partial, + ) { + return this.jsonifySchema.parse(this, params) + } + + static async dejsonifyPromise< + Instance extends Values, + + JsonifySchemaT extends z.ZodRawShape, + JsonifySchemaUnknownKeys extends z.UnknownKeysParam, + JsonifySchemaCatchall extends z.ZodTypeAny, + + DejsonifySchemaT extends z.ZodRawShape, + DejsonifySchemaUnknownKeys extends z.UnknownKeysParam, + DejsonifySchemaCatchall extends z.ZodTypeAny, + + Values extends object, + JsonifiedValues extends JsonifiableObject, + >( + this: JsonifiableZodSchemaClass< + Instance, + + JsonifySchemaT, + JsonifySchemaUnknownKeys, + JsonifySchemaCatchall, + + DejsonifySchemaT, + DejsonifySchemaUnknownKeys, + DejsonifySchemaCatchall, + + Values, + JsonifiedValues + >, + + values: JsonifiedValues, + params?: Partial, + ) { + return new this( + await this.dejsonifySchema.parseAsync(values, params) + ) + } + + static dejsonifyEffect< + Instance extends Values, + + JsonifySchemaT extends z.ZodRawShape, + JsonifySchemaUnknownKeys extends z.UnknownKeysParam, + JsonifySchemaCatchall extends z.ZodTypeAny, + + DejsonifySchemaT extends z.ZodRawShape, + DejsonifySchemaUnknownKeys extends z.UnknownKeysParam, + DejsonifySchemaCatchall extends z.ZodTypeAny, + + Values extends object, + JsonifiedValues extends JsonifiableObject, + >( + this: JsonifiableZodSchemaClass< + Instance, + + JsonifySchemaT, + JsonifySchemaUnknownKeys, + JsonifySchemaCatchall, + + DejsonifySchemaT, + DejsonifySchemaUnknownKeys, + DejsonifySchemaCatchall, + + Values, + JsonifiedValues + >, + + values: JsonifiedValues, + params?: Partial, + ) { + return parseZodTypeEffect(this.dejsonifySchema, values, params).pipe( + Effect.map(values => new this(values)), + ) + } + }) + .build()