0.1.3 #4

Merged
Thilawyn merged 74 commits from next into master 2024-03-24 22:24:25 +01:00
3 changed files with 58 additions and 110 deletions
Showing only changes of commit 440ad80bc3 - Show all commits

View File

@@ -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
}

View File

@@ -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

View File

@@ -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