From 53dfd254f798131646fddb77cb1f378d6baa3443 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 20 Mar 2024 14:17:32 +0100 Subject: [PATCH] Jsonify option work --- src/schema/jsonified/option.ts | 25 ++++++++++++++----------- src/tests.ts | 19 ++++++++++--------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/schema/jsonified/option.ts b/src/schema/jsonified/option.ts index c2c58f0..c26a375 100644 --- a/src/schema/jsonified/option.ts +++ b/src/schema/jsonified/option.ts @@ -3,7 +3,7 @@ import { identity } from "lodash-es" import { Jsonifiable, Opaque } from "type-fest" import { z } from "zod" import { effect } from "../effect" -import { ZodEffectOption, ZodEffectOptionSome, effectOptionSomeInnerType } from "../effect/option" +import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effectOptionSomeInnerType } from "../effect/option" export type JsonifiedEffectOption = Opaque @@ -11,13 +11,15 @@ export type JsonifiedEffectOption = Opaque, - T extends z.ZodTypeAny, - // Jsonify extends (schema: z.ZodType<>), + InnerS extends z.ZodTypeAny, + JsonifiedInnerS extends z.ZodTypeAny = InnerS, >( - schema: S | ZodEffectOption, - ) => - (schema as S).transform(v => Option.getOrNull(v)), + schema: ZodEffectOption, + jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, + ) => z.union([ + jsonifyOption.some(schema._def.options[0], jsonifySchema), + jsonifyOption.none(schema._def.options[1], jsonifySchema), + ]), some: < InnerS extends z.ZodTypeAny, @@ -30,12 +32,13 @@ export const jsonifyOption = { .pipe(jsonifySchema(effectOptionSomeInnerType(schema))), none: < - S extends ReturnType>, - T extends z.ZodSchema | unknown = unknown, + InnerS extends z.ZodTypeAny, + JsonifiedInnerS extends z.ZodTypeAny = InnerS, >( - schema: S | ReturnType> + schema: ZodEffectOptionNone, + _jsonifySchema?: (schema: InnerS) => JsonifiedInnerS, ) => - (schema as S).transform(() => null), + schema.transform(() => null), } as const export const dejsonifyOption = { diff --git a/src/tests.ts b/src/tests.ts index 0bd9fce..a8486c5 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -4,11 +4,9 @@ import { z } from "zod" import { JsonifiedZodSchemaClass } from "./JsonifiedZodSchemaClass" import { ZodSchemaClass } from "./ZodSchemaClass" import { dejsonify, jsonify } from "./schema/jsonified" -import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effect } from "./schema/lib" -import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" -import { satisfies } from "effect/Function" -import { identity } from "lodash-es" import { jsonifyBigIntSchema } from "./schema/jsonified/bigint" +import { effect } from "./schema/lib" +import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" const userExp = ZodSchemaClass( @@ -33,15 +31,18 @@ const userInst = User.create({ id: Option.some(1n), name: "User" }) const userInstEffect = User.createEffect({ id: Option.some(1n), name: "User" }) -const t = z.literal("prout") -const optionT = effect.option.option(t) -const someT = optionT._def.options[0] satisfies ZodEffectOptionSome +const jsonifiedBigIntOption = jsonify.option.option( + effect.option.option(z.bigint()), + jsonifyBigIntSchema, +) +type T1 = z.output -const jsonifiedBigIntOption = jsonify.option.some( + +const jsonifiedBigIntOptionSome = jsonify.option.some( effect.option.some(z.bigint()), jsonifyBigIntSchema, ) -type T = z.output +type T2 = z.output const jsonifiedUserExp = JsonifiedZodSchemaClass(User, {