UNPKG

@prismicio/types-internal

Version:
25 lines (21 loc) 941 B
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)