0.1.3 #4
@@ -1,14 +1,6 @@
|
||||
import { dejsonifyOption, jsonifyOption } from "./jsonifiedOption"
|
||||
import { option } from "./option"
|
||||
import { option as optionModule } from "./option"
|
||||
|
||||
|
||||
export const effect = {
|
||||
option,
|
||||
|
||||
jsonify: {
|
||||
option: jsonifyOption
|
||||
} as const,
|
||||
dejsonify: {
|
||||
option: dejsonifyOption
|
||||
} as const,
|
||||
} as const
|
||||
export module effect {
|
||||
export const option = optionModule
|
||||
}
|
||||
|
||||
@@ -1,77 +0,0 @@
|
||||
import { Option } from "effect"
|
||||
import { identity } from "lodash-es"
|
||||
import { z } from "zod"
|
||||
import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effectOptionNoneSchema, effectOptionSomeInnerSchema, effectOptionSomeSchema } from "./option"
|
||||
|
||||
|
||||
export type JsonifiedEffectOptionSomeBrand = "@thilawyn/zod-schema-class/JsonifiedEffectOptionSome"
|
||||
|
||||
|
||||
export const jsonifyOption = {
|
||||
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: <
|
||||
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)))
|
||||
.brand<JsonifiedEffectOptionSomeBrand>(),
|
||||
|
||||
none: <
|
||||
InnerS extends z.ZodTypeAny,
|
||||
JsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
||||
>(
|
||||
schema: ZodEffectOptionNone<InnerS>,
|
||||
_jsonifySchema?: (schema: InnerS) => JsonifiedInnerS,
|
||||
) =>
|
||||
schema.transform(() => null),
|
||||
} as const
|
||||
|
||||
export const dejsonifyOption = {
|
||||
option: <
|
||||
InnerS extends z.ZodTypeAny,
|
||||
DejsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
||||
>(
|
||||
schema: ZodEffectOption<InnerS>,
|
||||
dejsonifySchema: (schema: InnerS) => DejsonifiedInnerS = identity,
|
||||
) => z.union([
|
||||
dejsonifyOption.some(effectOptionSomeSchema(schema), dejsonifySchema),
|
||||
dejsonifyOption.none(effectOptionNoneSchema(schema), dejsonifySchema),
|
||||
]),
|
||||
|
||||
some: <
|
||||
InnerS extends z.ZodTypeAny,
|
||||
DejsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
||||
>(
|
||||
schema: ZodEffectOptionSome<InnerS>,
|
||||
dejsonifySchema: (schema: InnerS) => DejsonifiedInnerS = identity,
|
||||
) => z
|
||||
.custom<z.input<DejsonifiedInnerS> & z.BRAND<JsonifiedEffectOptionSomeBrand>>()
|
||||
.pipe(dejsonifySchema(effectOptionSomeInnerSchema(schema)))
|
||||
.transform(v => Option.some<z.output<DejsonifiedInnerS>>(v))
|
||||
.pipe(schema),
|
||||
|
||||
none: <
|
||||
InnerS extends z.ZodTypeAny,
|
||||
DejsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
||||
>(
|
||||
schema: ZodEffectOptionNone<InnerS>,
|
||||
_dejsonifySchema?: (schema: InnerS) => DejsonifiedInnerS,
|
||||
) => z
|
||||
.null()
|
||||
.transform(() => Option.none<z.output<DejsonifiedInnerS>>())
|
||||
.pipe(schema),
|
||||
} as const
|
||||
@@ -6,11 +6,48 @@ import { z } from "zod"
|
||||
type JsonifiedEffectOptionSomeBrand = "@thilawyn/zod-schema-class/JsonifiedEffectOptionSome"
|
||||
|
||||
|
||||
export function option<S extends z.ZodTypeAny>(schema: S) {
|
||||
export function option<InnerS extends z.ZodTypeAny>(schema: InnerS) {
|
||||
return z.union([option.some(schema), option.none(schema)])
|
||||
}
|
||||
|
||||
export module option {
|
||||
export type Option<InnerS extends z.ZodTypeAny> = ReturnType<typeof option<InnerS>>
|
||||
|
||||
function getSomeSchema<InnerS extends z.ZodTypeAny>(schema: Option<InnerS>): some.Some<InnerS> {
|
||||
return schema.options[0]
|
||||
}
|
||||
function getNoneSchema<InnerS extends z.ZodTypeAny>(schema: Option<InnerS>): none.None<InnerS> {
|
||||
return schema.options[1]
|
||||
}
|
||||
|
||||
|
||||
export function jsonify<
|
||||
InnerS extends z.ZodTypeAny,
|
||||
JsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
||||
>(
|
||||
schema: Option<InnerS>,
|
||||
jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity,
|
||||
) {
|
||||
return z.union([
|
||||
some.jsonify(getSomeSchema(schema), jsonifySchema),
|
||||
none.jsonify(getNoneSchema(schema), jsonifySchema),
|
||||
])
|
||||
}
|
||||
|
||||
export function dejsonify<
|
||||
InnerS extends z.ZodTypeAny,
|
||||
DejsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
||||
>(
|
||||
schema: Option<InnerS>,
|
||||
dejsonifySchema: (schema: InnerS) => DejsonifiedInnerS = identity,
|
||||
) {
|
||||
return z.union([
|
||||
some.dejsonify(getSomeSchema(schema), dejsonifySchema),
|
||||
none.dejsonify(getNoneSchema(schema), dejsonifySchema),
|
||||
])
|
||||
}
|
||||
|
||||
|
||||
export function some<
|
||||
InnerS extends z.ZodTypeAny
|
||||
>(
|
||||
@@ -23,16 +60,23 @@ export module option {
|
||||
}
|
||||
|
||||
export module some {
|
||||
export type Some<InnerS extends z.ZodTypeAny> = ReturnType<typeof some<InnerS>>
|
||||
|
||||
function getInnerSchema<InnerS extends z.ZodTypeAny>(schema: Some<InnerS>): InnerS {
|
||||
return schema._def.schema._def.out.shape.value
|
||||
}
|
||||
|
||||
|
||||
export function jsonify<
|
||||
InnerS extends z.ZodTypeAny,
|
||||
JsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
||||
>(
|
||||
schema: ZodEffectOptionSome<InnerS>,
|
||||
schema: Some<InnerS>,
|
||||
jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity,
|
||||
) {
|
||||
return schema
|
||||
.transform(v => Option.getOrThrow(v))
|
||||
.pipe(jsonifySchema(effectOptionSomeInnerSchema(schema)))
|
||||
.pipe(jsonifySchema(getInnerSchema(schema)))
|
||||
.brand<JsonifiedEffectOptionSomeBrand>()
|
||||
}
|
||||
|
||||
@@ -40,12 +84,12 @@ export module option {
|
||||
InnerS extends z.ZodTypeAny,
|
||||
DejsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
||||
>(
|
||||
schema: ZodEffectOptionSome<InnerS>,
|
||||
schema: Some<InnerS>,
|
||||
dejsonifySchema: (schema: InnerS) => DejsonifiedInnerS = identity,
|
||||
) {
|
||||
return z
|
||||
.custom<z.input<DejsonifiedInnerS> & z.BRAND<JsonifiedEffectOptionSomeBrand>>()
|
||||
.pipe(dejsonifySchema(effectOptionSomeInnerSchema(schema)))
|
||||
.pipe(dejsonifySchema(getInnerSchema(schema)))
|
||||
.transform(v => Option.some<z.output<DejsonifiedInnerS>>(v))
|
||||
.pipe(schema)
|
||||
}
|
||||
@@ -67,11 +111,14 @@ export module option {
|
||||
}
|
||||
|
||||
export module none {
|
||||
export type None<InnerS extends z.ZodTypeAny> = ReturnType<typeof none<InnerS>>
|
||||
|
||||
|
||||
export function jsonify<
|
||||
InnerS extends z.ZodTypeAny,
|
||||
JsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
||||
>(
|
||||
schema: ZodEffectOptionNone<InnerS>,
|
||||
schema: None<InnerS>,
|
||||
_jsonifySchema?: (schema: InnerS) => JsonifiedInnerS,
|
||||
) {
|
||||
return schema.transform(() => null)
|
||||
@@ -81,7 +128,7 @@ export module option {
|
||||
InnerS extends z.ZodTypeAny,
|
||||
DejsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
||||
>(
|
||||
schema: ZodEffectOptionNone<InnerS>,
|
||||
schema: None<InnerS>,
|
||||
_dejsonifySchema?: (schema: InnerS) => DejsonifiedInnerS,
|
||||
) {
|
||||
return z
|
||||
@@ -91,17 +138,3 @@ export module option {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export type ZodEffectOption<S extends z.ZodTypeAny> = ReturnType<typeof option<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 const effectOptionSomeSchema = <S extends z.ZodTypeAny>(schema: ZodEffectOption<S>): ZodEffectOptionSome<S> =>
|
||||
schema.options[0]
|
||||
|
||||
export const effectOptionNoneSchema = <S extends z.ZodTypeAny>(schema: ZodEffectOption<S>): ZodEffectOptionNone<S> =>
|
||||
schema.options[1]
|
||||
|
||||
export const effectOptionSomeInnerSchema = <S extends z.ZodTypeAny>(schema: ZodEffectOptionSome<S>): S =>
|
||||
schema._def.schema._def.out.shape.value
|
||||
|
||||
Reference in New Issue
Block a user