@prismicio/types-internal
Version:
Prismic types for Custom Types and Prismic Data
25 lines (21 loc) • 941 B
text/typescript
import { isRight } from "fp-ts/lib/Either"
import * as t from "io-ts"
import { EmptyArray, EmptyObject } from "./BasicTypes"
export const DefaultOrElse = <I, A, O = A>(inputValidator: t.Type<I>) => {
return (codec: t.Type<A, O>) =>
new t.Type<A | null, O | undefined>(
`DefaultOrElse<${inputValidator.name}, ${codec.name}>`,
(u: unknown): u is A | null => null === u || codec.is(u),
(u: unknown, c) => {
if (isRight(inputValidator.validate(u, c))) return t.success(null)
return codec.validate(u, c)
},
(chunk) => (chunk ? codec.encode(chunk) : undefined),
)
}
export const NullOrElse = <A, O = A>(codec: t.Type<A, O>) =>
DefaultOrElse<null, A, O>(t.null)(codec)
export const EmptyObjectOrElse = <A, O = A>(codec: t.Type<A, O>) =>
DefaultOrElse<Record<never, never>, A, O>(EmptyObject)(codec)
export const EmptyArrayOrElse = <A, O = A>(codec: t.Type<A, O>) =>
DefaultOrElse<never[], A, O>(EmptyArray)(codec)