0.1.3 #4

Merged
Thilawyn merged 74 commits from next into master 2024-03-24 22:24:25 +01:00
Showing only changes of commit 7f1e9693f2 - Show all commits

View File

@@ -6,75 +6,91 @@ import { z } from "zod"
type JsonifiedEffectOptionSomeBrand = "@thilawyn/zod-schema-class/JsonifiedEffectOptionSome"
export const option = <S extends z.ZodTypeAny>(schema: S) =>
z.union([option.some(schema), option.none(schema)])
export function option<S extends z.ZodTypeAny>(schema: S) {
return z.union([option.some(schema), option.none(schema)])
}
export module option {
export function some<
InnerS extends z.ZodTypeAny
>(
schema: InnerS
) {
return z
.custom<Option.Some<z.output<InnerS>>>(v => Option.isOption(v) && Option.isSome(v), "Not an Option.Some")
.pipe(z.object({ value: schema }).passthrough())
.transform<Option.Some<z.output<InnerS>>>(identity)
}
export module some {
export function jsonify<
InnerS extends z.ZodTypeAny,
JsonifiedInnerS extends z.ZodTypeAny = InnerS,
>(
schema: ZodEffectOptionSome<InnerS>,
jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity,
) {
return schema
.transform(v => Option.getOrThrow(v))
.pipe(jsonifySchema(effectOptionSomeInnerSchema(schema)))
.brand<JsonifiedEffectOptionSomeBrand>()
}
export function dejsonify<
InnerS extends z.ZodTypeAny,
DejsonifiedInnerS extends z.ZodTypeAny = InnerS,
>(
schema: ZodEffectOptionSome<InnerS>,
dejsonifySchema: (schema: InnerS) => DejsonifiedInnerS = identity,
) {
return z
.custom<z.input<DejsonifiedInnerS> & z.BRAND<JsonifiedEffectOptionSomeBrand>>()
.pipe(dejsonifySchema(effectOptionSomeInnerSchema(schema)))
.transform(v => Option.some<z.output<DejsonifiedInnerS>>(v))
.pipe(schema)
}
}
const some = <
InnerS extends z.ZodTypeAny
>(schema: InnerS) => z
.custom<Option.Some<z.output<InnerS>>>(v => Option.isOption(v) && Option.isSome(v), "Not an Option.Some")
.pipe(z.object({ value: schema }).passthrough())
.transform<Option.Some<z.output<InnerS>>>(identity)
export function none<
InnerS extends z.ZodTypeAny | unknown = unknown
>(
_schema?: InnerS
) {
return z.custom<
Option.None<
InnerS extends z.ZodTypeAny
? z.output<InnerS>
: unknown
>
>(v => Option.isOption(v) && Option.isNone(v), "Not an Option.None")
}
some.jsonify = <
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>()
export module none {
export function jsonify<
InnerS extends z.ZodTypeAny,
JsonifiedInnerS extends z.ZodTypeAny = InnerS,
>(
schema: ZodEffectOptionNone<InnerS>,
_jsonifySchema?: (schema: InnerS) => JsonifiedInnerS,
) {
return schema.transform(() => null)
}
some.dejsonify = <
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)
option.some = some
const none = <
InnerS extends z.ZodTypeAny | unknown = unknown
>(_schema?: InnerS) =>
z.custom<
Option.None<
InnerS extends z.ZodTypeAny
? z.output<InnerS>
: unknown
>
>(v => Option.isOption(v) && Option.isNone(v), "Not an Option.None")
none.jsonify = <
InnerS extends z.ZodTypeAny,
JsonifiedInnerS extends z.ZodTypeAny = InnerS,
>(
schema: ZodEffectOptionNone<InnerS>,
_jsonifySchema?: (schema: InnerS) => JsonifiedInnerS,
) =>
schema.transform(() => null),
none.dejsonify = <
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),
option.none = none
export function dejsonify<
InnerS extends z.ZodTypeAny,
DejsonifiedInnerS extends z.ZodTypeAny = InnerS,
>(
schema: ZodEffectOptionNone<InnerS>,
_dejsonifySchema?: (schema: InnerS) => DejsonifiedInnerS,
) {
return z
.null()
.transform(() => Option.none<z.output<DejsonifiedInnerS>>())
.pipe(schema)
}
}
}
export type ZodEffectOption<S extends z.ZodTypeAny> = ReturnType<typeof option<S>>