Working jsonifyOption.some
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
Julien Valverdé
2024-03-20 13:56:27 +01:00
parent 4ac60d3b18
commit 28a80f799c
3 changed files with 20 additions and 9 deletions

View File

@@ -20,6 +20,10 @@ export const option = {
>>(v => Option.isOption(v) && Option.isNone(v), "Not an Option"), >>(v => Option.isOption(v) && Option.isNone(v), "Not an Option"),
} as const } as const
export type ZodEffectOption<S extends z.ZodTypeAny> = ReturnType<typeof option.option<S>> export type ZodEffectOption<S extends z.ZodTypeAny> = ReturnType<typeof option.option<S>>
export type ZodEffectOptionSome<S extends z.ZodTypeAny> = ReturnType<typeof option.some<S>> export type ZodEffectOptionSome<S extends z.ZodTypeAny> = ReturnType<typeof option.some<S>>
export type ZodEffectOptionNone<S extends z.ZodTypeAny> = ReturnType<typeof option.none<S>> export type ZodEffectOptionNone<S extends z.ZodTypeAny> = ReturnType<typeof option.none<S>>
export const effectOptionSomeInnerType = <S extends z.ZodTypeAny>(schema: ZodEffectOptionSome<S>): S =>
schema._def.schema._def.out.shape.value

View File

@@ -3,7 +3,7 @@ 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 { effect } from "../effect"
import { ZodEffectOption } from "../effect/option" import { ZodEffectOption, ZodEffectOptionSome, effectOptionSomeInnerType } 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">
@@ -13,19 +13,21 @@ export const jsonifyOption = {
option: < option: <
S extends ZodEffectOption<T>, S extends ZodEffectOption<T>,
T extends z.ZodTypeAny, T extends z.ZodTypeAny,
Jsonify, // Jsonify extends (schema: z.ZodType<>),
>( >(
schema: S | ZodEffectOption<T>, schema: S | ZodEffectOption<T>,
) => ) =>
(schema as S).transform(v => Option.getOrNull(v)), (schema as S).transform(v => Option.getOrNull(v)),
some: < some: <
S extends ReturnType<typeof effect.option.some<T>>, InnerS extends z.ZodTypeAny,
T extends z.ZodSchema, JsonifiedInnerS extends z.ZodTypeAny = InnerS,
>( >(
schema: S | ReturnType<typeof effect.option.some<T>> schema: ZodEffectOptionSome<InnerS>,
) => jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity,
(schema as S).transform(v => Option.getOrThrow(v)), ) => schema
.transform(v => Option.getOrThrow(v))
.pipe(jsonifySchema(effectOptionSomeInnerType(schema))),
none: < none: <
S extends ReturnType<typeof effect.option.none<T>>, S extends ReturnType<typeof effect.option.none<T>>,

View File

@@ -7,6 +7,8 @@ import { dejsonify, jsonify } from "./schema/jsonified"
import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effect } from "./schema/lib" import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effect } from "./schema/lib"
import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject"
import { satisfies } from "effect/Function" import { satisfies } from "effect/Function"
import { identity } from "lodash-es"
import { jsonifyBigIntSchema } from "./schema/jsonified/bigint"
const userExp = ZodSchemaClass( const userExp = ZodSchemaClass(
@@ -35,9 +37,12 @@ const t = z.literal("prout")
const optionT = effect.option.option(t) const optionT = effect.option.option(t)
const someT = optionT._def.options[0] satisfies ZodEffectOptionSome<typeof t> const someT = optionT._def.options[0] satisfies ZodEffectOptionSome<typeof t>
const jsonifiedOption = jsonify.option.some( const jsonifiedBigIntOption = jsonify.option.some(
effect.option.some(z.literal("prout")) effect.option.some(z.bigint()),
jsonifyBigIntSchema,
) )
type T = z.output<typeof jsonifiedBigIntOption>
const jsonifiedUserExp = JsonifiedZodSchemaClass(User, { const jsonifiedUserExp = JsonifiedZodSchemaClass(User, {
jsonifySchema: s => s.extend({ jsonifySchema: s => s.extend({