diff --git a/src/schema/effect/index.ts b/src/schema/effect/index.ts index 904b057..7d00ecc 100644 --- a/src/schema/effect/index.ts +++ b/src/schema/effect/index.ts @@ -4,3 +4,5 @@ import { option } from "./option" export const effect = { option, } as const + +export { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome } from "./option" diff --git a/src/schema/effect/option.ts b/src/schema/effect/option.ts index 98ff4bc..baca6ee 100644 --- a/src/schema/effect/option.ts +++ b/src/schema/effect/option.ts @@ -19,3 +19,7 @@ export const option = { : unknown >>(v => Option.isOption(v) && Option.isNone(v), "Not an Option"), } as const + +export type ZodEffectOption = ReturnType> +export type ZodEffectOptionSome = ReturnType> +export type ZodEffectOptionNone = ReturnType> diff --git a/src/schema/jsonified/option.ts b/src/schema/jsonified/option.ts index 3e68732..543706d 100644 --- a/src/schema/jsonified/option.ts +++ b/src/schema/jsonified/option.ts @@ -1,19 +1,21 @@ import { Option } from "effect" +import { identity } from "lodash-es" +import { Jsonifiable, Opaque } from "type-fest" import { z } from "zod" import { effect } from "../effect" -import { Opaque } from "type-fest" -import { identity } from "lodash-es" +import { ZodEffectOption } from "../effect/option" -export type JsonifiedEffectOption = Opaque +export type JsonifiedEffectOption = Opaque export const jsonifyOption = { option: < - S extends ReturnType>, + S extends ZodEffectOption, T extends z.ZodTypeAny, + Jsonify, >( - schema: S | ReturnType> + schema: S | ZodEffectOption, ) => (schema as S).transform(v => Option.getOrNull(v)), diff --git a/src/tests.ts b/src/tests.ts index 3f93b47..4e2caff 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -4,8 +4,9 @@ import { z } from "zod" import { JsonifiedZodSchemaClass } from "./JsonifiedZodSchemaClass" import { ZodSchemaClass } from "./ZodSchemaClass" import { dejsonify, jsonify } from "./schema/jsonified" -import { effect } from "./schema/lib" +import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effect } from "./schema/lib" import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" +import { satisfies } from "effect/Function" const userExp = ZodSchemaClass( @@ -30,6 +31,10 @@ 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 jsonifiedOption = jsonify.option.some( effect.option.some(z.literal("prout")) )