This commit is contained in:
@@ -1,14 +1,6 @@
|
|||||||
import { dejsonifyOption, jsonifyOption } from "./jsonifiedOption"
|
import { option as optionModule } from "./option"
|
||||||
import { option } from "./option"
|
|
||||||
|
|
||||||
|
|
||||||
export const effect = {
|
export module effect {
|
||||||
option,
|
export const option = optionModule
|
||||||
|
}
|
||||||
jsonify: {
|
|
||||||
option: jsonifyOption
|
|
||||||
} as const,
|
|
||||||
dejsonify: {
|
|
||||||
option: dejsonifyOption
|
|
||||||
} as const,
|
|
||||||
} as const
|
|
||||||
|
|||||||
@@ -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"
|
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)])
|
return z.union([option.some(schema), option.none(schema)])
|
||||||
}
|
}
|
||||||
|
|
||||||
export module option {
|
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<
|
export function some<
|
||||||
InnerS extends z.ZodTypeAny
|
InnerS extends z.ZodTypeAny
|
||||||
>(
|
>(
|
||||||
@@ -23,16 +60,23 @@ export module option {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export module some {
|
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<
|
export function jsonify<
|
||||||
InnerS extends z.ZodTypeAny,
|
InnerS extends z.ZodTypeAny,
|
||||||
JsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
JsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
||||||
>(
|
>(
|
||||||
schema: ZodEffectOptionSome<InnerS>,
|
schema: Some<InnerS>,
|
||||||
jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity,
|
jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity,
|
||||||
) {
|
) {
|
||||||
return schema
|
return schema
|
||||||
.transform(v => Option.getOrThrow(v))
|
.transform(v => Option.getOrThrow(v))
|
||||||
.pipe(jsonifySchema(effectOptionSomeInnerSchema(schema)))
|
.pipe(jsonifySchema(getInnerSchema(schema)))
|
||||||
.brand<JsonifiedEffectOptionSomeBrand>()
|
.brand<JsonifiedEffectOptionSomeBrand>()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,12 +84,12 @@ export module option {
|
|||||||
InnerS extends z.ZodTypeAny,
|
InnerS extends z.ZodTypeAny,
|
||||||
DejsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
DejsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
||||||
>(
|
>(
|
||||||
schema: ZodEffectOptionSome<InnerS>,
|
schema: Some<InnerS>,
|
||||||
dejsonifySchema: (schema: InnerS) => DejsonifiedInnerS = identity,
|
dejsonifySchema: (schema: InnerS) => DejsonifiedInnerS = identity,
|
||||||
) {
|
) {
|
||||||
return z
|
return z
|
||||||
.custom<z.input<DejsonifiedInnerS> & z.BRAND<JsonifiedEffectOptionSomeBrand>>()
|
.custom<z.input<DejsonifiedInnerS> & z.BRAND<JsonifiedEffectOptionSomeBrand>>()
|
||||||
.pipe(dejsonifySchema(effectOptionSomeInnerSchema(schema)))
|
.pipe(dejsonifySchema(getInnerSchema(schema)))
|
||||||
.transform(v => Option.some<z.output<DejsonifiedInnerS>>(v))
|
.transform(v => Option.some<z.output<DejsonifiedInnerS>>(v))
|
||||||
.pipe(schema)
|
.pipe(schema)
|
||||||
}
|
}
|
||||||
@@ -67,11 +111,14 @@ export module option {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export module none {
|
export module none {
|
||||||
|
export type None<InnerS extends z.ZodTypeAny> = ReturnType<typeof none<InnerS>>
|
||||||
|
|
||||||
|
|
||||||
export function jsonify<
|
export function jsonify<
|
||||||
InnerS extends z.ZodTypeAny,
|
InnerS extends z.ZodTypeAny,
|
||||||
JsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
JsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
||||||
>(
|
>(
|
||||||
schema: ZodEffectOptionNone<InnerS>,
|
schema: None<InnerS>,
|
||||||
_jsonifySchema?: (schema: InnerS) => JsonifiedInnerS,
|
_jsonifySchema?: (schema: InnerS) => JsonifiedInnerS,
|
||||||
) {
|
) {
|
||||||
return schema.transform(() => null)
|
return schema.transform(() => null)
|
||||||
@@ -81,7 +128,7 @@ export module option {
|
|||||||
InnerS extends z.ZodTypeAny,
|
InnerS extends z.ZodTypeAny,
|
||||||
DejsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
DejsonifiedInnerS extends z.ZodTypeAny = InnerS,
|
||||||
>(
|
>(
|
||||||
schema: ZodEffectOptionNone<InnerS>,
|
schema: None<InnerS>,
|
||||||
_dejsonifySchema?: (schema: InnerS) => DejsonifiedInnerS,
|
_dejsonifySchema?: (schema: InnerS) => DejsonifiedInnerS,
|
||||||
) {
|
) {
|
||||||
return z
|
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