This commit is contained in:
@@ -2,11 +2,12 @@ import { Option } from "effect"
|
|||||||
import { identity } from "lodash-es"
|
import { identity } from "lodash-es"
|
||||||
import { Jsonifiable, Opaque } from "type-fest"
|
import { Jsonifiable, Opaque } from "type-fest"
|
||||||
import { z } from "zod"
|
import { z } from "zod"
|
||||||
import { effect } from "../effect"
|
|
||||||
import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effectOptionNoneSchema, effectOptionSomeInnerSchema, effectOptionSomeSchema } from "../effect/option"
|
import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effectOptionNoneSchema, effectOptionSomeInnerSchema, effectOptionSomeSchema } from "../effect/option"
|
||||||
|
|
||||||
|
|
||||||
export type JsonifiedEffectOption<T extends Jsonifiable> = Opaque<T | null, "@thilawyn/zod-schema-class/JsonifiedEffectOption">
|
export type JsonifiedEffectOption<T extends Jsonifiable> = Opaque<T | null, "@thilawyn/zod-schema-class/JsonifiedEffectOption">
|
||||||
|
export type JsonifiedEffectOptionSome<T> = Opaque<T, "@thilawyn/zod-schema-class/JsonifiedEffectOptionSome">
|
||||||
|
export type JsonifiedEffectOptionNone = Opaque<null, "@thilawyn/zod-schema-class/JsonifiedEffectOptionNone">
|
||||||
|
|
||||||
|
|
||||||
export const jsonifyOption = {
|
export const jsonifyOption = {
|
||||||
@@ -21,6 +22,39 @@ export const jsonifyOption = {
|
|||||||
jsonifyOption.none(effectOptionNoneSchema(schema), jsonifySchema),
|
jsonifyOption.none(effectOptionNoneSchema(schema), jsonifySchema),
|
||||||
]),
|
]),
|
||||||
|
|
||||||
|
some: <
|
||||||
|
InnerS extends z.ZodTypeAny,
|
||||||
|
JsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
||||||
|
>(
|
||||||
|
schema: ZodEffectOptionSome<InnerS>,
|
||||||
|
jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity,
|
||||||
|
) => schema
|
||||||
|
.transform(v => Option.getOrThrow(v))
|
||||||
|
.pipe(jsonifySchema(effectOptionSomeInnerSchema(schema)))
|
||||||
|
.transform<JsonifiedEffectOptionSome<z.output<JsonifiedInnerS>>>(identity),
|
||||||
|
|
||||||
|
none: <
|
||||||
|
InnerS extends z.ZodTypeAny,
|
||||||
|
JsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
||||||
|
>(
|
||||||
|
schema: ZodEffectOptionNone<InnerS>,
|
||||||
|
_jsonifySchema?: (schema: InnerS) => JsonifiedInnerS,
|
||||||
|
) =>
|
||||||
|
schema.transform(() => null as JsonifiedEffectOptionNone),
|
||||||
|
} as const
|
||||||
|
|
||||||
|
export const dejsonifyOption = {
|
||||||
|
option: <
|
||||||
|
InnerS extends z.ZodTypeAny,
|
||||||
|
JsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
||||||
|
>(
|
||||||
|
schema: ZodEffectOption<InnerS>,
|
||||||
|
jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity,
|
||||||
|
) => z.union([
|
||||||
|
jsonifyOption.some(effectOptionSomeSchema(schema), jsonifySchema),
|
||||||
|
jsonifyOption.none(effectOptionNoneSchema(schema), jsonifySchema),
|
||||||
|
]),
|
||||||
|
|
||||||
some: <
|
some: <
|
||||||
InnerS extends z.ZodTypeAny,
|
InnerS extends z.ZodTypeAny,
|
||||||
JsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
JsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
||||||
@@ -38,34 +72,5 @@ export const jsonifyOption = {
|
|||||||
schema: ZodEffectOptionNone<InnerS>,
|
schema: ZodEffectOptionNone<InnerS>,
|
||||||
_jsonifySchema?: (schema: InnerS) => JsonifiedInnerS,
|
_jsonifySchema?: (schema: InnerS) => JsonifiedInnerS,
|
||||||
) =>
|
) =>
|
||||||
schema.transform(() => null),
|
z.null().pipe(schema),
|
||||||
} as const
|
|
||||||
|
|
||||||
export const dejsonifyOption = {
|
|
||||||
option: <
|
|
||||||
S extends ReturnType<typeof effect.option.option<T>>,
|
|
||||||
T extends z.ZodSchema,
|
|
||||||
>(
|
|
||||||
schema: S | ReturnType<typeof effect.option.option<T>>
|
|
||||||
) => z
|
|
||||||
.custom<JsonifiedEffectOption<T>>(identity)
|
|
||||||
.pipe(
|
|
||||||
z.
|
|
||||||
),
|
|
||||||
|
|
||||||
some: <
|
|
||||||
S extends ReturnType<typeof effect.option.some<T>>,
|
|
||||||
T extends z.ZodSchema,
|
|
||||||
>(
|
|
||||||
schema: S | ReturnType<typeof effect.option.some<T>>
|
|
||||||
) =>
|
|
||||||
(schema as S).transform(v => Option.getOrThrow(v)),
|
|
||||||
|
|
||||||
none: <
|
|
||||||
S extends ReturnType<typeof effect.option.none<T>>,
|
|
||||||
T extends z.ZodSchema | unknown = unknown,
|
|
||||||
>(
|
|
||||||
schema: S | ReturnType<typeof effect.option.none<T>>
|
|
||||||
) =>
|
|
||||||
(schema as S).transform(() => null),
|
|
||||||
} as const
|
} as const
|
||||||
|
|||||||
Reference in New Issue
Block a user