import { BaseSchema, Schema } from "../../Schema"; import { getSchemaUtils } from "../schema-utils"; export type SchemaGetter> = () => SchemaType | Promise; export function lazy(getter: SchemaGetter>): Schema { const baseSchema = constructLazyBaseSchema(getter); return { ...baseSchema, ...getSchemaUtils(baseSchema), }; } export function constructLazyBaseSchema( getter: SchemaGetter> ): BaseSchema { return { parse: async (raw, opts) => (await getMemoizedSchema(getter)).parse(raw, opts), json: async (parsed, opts) => (await getMemoizedSchema(getter)).json(parsed, opts), getType: async () => (await getMemoizedSchema(getter)).getType(), }; } type MemoizedGetter> = SchemaGetter & { __zurg_memoized?: SchemaType }; export async function getMemoizedSchema>( getter: SchemaGetter ): Promise { const castedGetter = getter as MemoizedGetter; if (castedGetter.__zurg_memoized == null) { castedGetter.__zurg_memoized = await getter(); } return castedGetter.__zurg_memoized; }