diff --git a/src/schema/effect/option.ts b/src/schema/effect/option.ts index baca6ee..5b8c7f1 100644 --- a/src/schema/effect/option.ts +++ b/src/schema/effect/option.ts @@ -20,6 +20,10 @@ export const option = { >>(v => Option.isOption(v) && Option.isNone(v), "Not an Option"), } as const + export type ZodEffectOption = ReturnType> export type ZodEffectOptionSome = ReturnType> export type ZodEffectOptionNone = ReturnType> + +export const effectOptionSomeInnerType = (schema: ZodEffectOptionSome): S => + schema._def.schema._def.out.shape.value diff --git a/src/schema/jsonified/option.ts b/src/schema/jsonified/option.ts index 543706d..c2c58f0 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 } from "../effect/option" +import { ZodEffectOption, ZodEffectOptionSome, effectOptionSomeInnerType } from "../effect/option" export type JsonifiedEffectOption = Opaque @@ -13,19 +13,21 @@ export const jsonifyOption = { option: < S extends ZodEffectOption, T extends z.ZodTypeAny, - Jsonify, + // Jsonify extends (schema: z.ZodType<>), >( schema: S | ZodEffectOption, ) => (schema as S).transform(v => Option.getOrNull(v)), some: < - S extends ReturnType>, - T extends z.ZodSchema, + InnerS extends z.ZodTypeAny, + JsonifiedInnerS extends z.ZodTypeAny = InnerS, >( - schema: S | ReturnType> - ) => - (schema as S).transform(v => Option.getOrThrow(v)), + schema: ZodEffectOptionSome, + jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, + ) => schema + .transform(v => Option.getOrThrow(v)) + .pipe(jsonifySchema(effectOptionSomeInnerType(schema))), none: < S extends ReturnType>, diff --git a/src/tests.ts b/src/tests.ts index 4e2caff..0bd9fce 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -7,6 +7,8 @@ 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" const userExp = ZodSchemaClass( @@ -35,9 +37,12 @@ const t = z.literal("prout") const optionT = effect.option.option(t) const someT = optionT._def.options[0] satisfies ZodEffectOptionSome -const jsonifiedOption = jsonify.option.some( - effect.option.some(z.literal("prout")) +const jsonifiedBigIntOption = jsonify.option.some( + effect.option.some(z.bigint()), + jsonifyBigIntSchema, ) +type T = z.output + const jsonifiedUserExp = JsonifiedZodSchemaClass(User, { jsonifySchema: s => s.extend({