{"version":3,"sources":["../../../../src/api/base/pipes.ts"],"sourcesContent":["import { createErrorHandler, PipeError } from './errors'\nimport type { Context, Entry, JsonSchemaBuilder, Pipe, PipeCompiledFn, PipeErrorHandler, PipeFn, PipeMeta, PipeOutput } from './types'\nimport { getRandomValue } from '../../utils/functions'\nimport type { JsonSchema } from '../../utils/types'\n\nexport function walk<T>(pipe: Pipe<any, any>, init: T, nodeFn: (cur: Pipe<any, any>, acc: T) => T) {\n\tlet acc: T = init\n\tconst pipes: Pipe<any, any>[] = [pipe]\n\twhile (pipe) {\n\t\tconst prev = pipe.prev\n\t\tif (!prev) break\n\t\tpipes.push(prev)\n\t\tpipe = prev\n\t}\n\tfor (const pipe of pipes.reverse()) acc = nodeFn(pipe, acc)\n\treturn acc\n}\n\nexport function context<T extends Pipe<any, any>>(pipe: T): Context {\n\treturn walk(pipe, {} as Context, (p, acc) => ({ ...acc, ...p.context() }))\n}\n\nexport function assert<T extends Pipe<any, any>>(pipe: T, input: unknown): PipeOutput<T> {\n\tconst result = validate(pipe, input)\n\tif (!result.valid) throw result.error\n\treturn result.value\n}\n\nexport function validate<T extends Pipe<any, any>>(\n\tpipe: T,\n\tinput: unknown,\n): { value: PipeOutput<T>; valid: true } | { error: PipeError; valid: false } {\n\ttry {\n\t\tconst fn = pipe.__compiled ?? compile(pipe)\n\t\tconst res = fn(input) as ReturnType<PipeCompiledFn<T>>\n\t\treturn res instanceof PipeError ? { error: res, valid: false } : { value: res, valid: true }\n\t} catch (error) {\n\t\tif (error instanceof PipeError) return { error, valid: false }\n\t\treturn { error: PipeError.root(error instanceof Error ? error.message : `${error}`, input, undefined), valid: false }\n\t}\n}\n\nexport function schema<T extends Pipe<any, any>>(pipe: T, schema: JsonSchema = {}): JsonSchema {\n\tconst cont = context(pipe)\n\treturn walk(pipe, schema, (p, acc) => ({ ...acc, ...p.schema(cont) }))\n}\n\nexport function meta<T extends Pipe<any, any>>(p: T, meta: PipeMeta): T {\n\treturn p.pipe(standard(() => [], { schema: () => meta })) as T\n}\n\nexport function compile<T extends Pipe<any, any>>(pipe: T, opts: { allErrors?: boolean } = {}): PipeCompiledFn<T> {\n\tconst inputStr = 'input'\n\tconst contextStr = 'context'\n\tconst { lines, context } = compilePipeToString({\n\t\tpipe,\n\t\tinput: inputStr,\n\t\tcontext: contextStr,\n\t\tfailEarly: !opts.allErrors,\n\t\tbase: [`return ${inputStr}`],\n\t})\n\tconst allLines = [\n\t\t`return (${inputStr}) => {`,\n\t\t...lines.filter((l) => l.trim() !== '').map((l) => `\\t${l}`),\n\t\t`\tthrow PipeError.root('unhandled root validation', ${inputStr})`,\n\t\t`}`,\n\t]\n\tpipe.__compiled = new Function(contextStr, 'PipeError', allLines.join('\\n'))(context, PipeError)\n\treturn pipe.__compiled!\n}\n\nexport function standard<I, O>(\n\tcompile: Pipe<I, O>['compile'],\n\tconfig: {\n\t\tcontext?: Context\n\t\tschema?: (context: Context) => JsonSchemaBuilder\n\t} = {},\n): Pipe<I, O> {\n\tconst piper: Pipe<I, O> = {\n\t\tcontext: () => config.context ?? ({} as any),\n\t\tschema: (context: Context) => config.schema?.(context) ?? ({} as any),\n\t\tpipe: (...entries: Entry<any, any>[]) => {\n\t\t\tdelete piper.__compiled\n\t\t\tlet pipe = piper\n\t\t\tfor (const cur of entries) {\n\t\t\t\tconst p = typeof cur === 'function' ? define(cur, config) : cur\n\t\t\t\tp.prev = pipe\n\t\t\t\tpipe = p\n\t\t\t}\n\t\t\treturn pipe\n\t\t},\n\t\tcompile,\n\t\t'~standard': {\n\t\t\tversion: 1,\n\t\t\tvendor: 'valleyed',\n\t\t\tvalidate(value) {\n\t\t\t\tconst validity = validate(piper, value)\n\t\t\t\tif (validity.valid) return { value: validity.value }\n\t\t\t\treturn {\n\t\t\t\t\tissues: validity.error.messages.map(({ message, path }) => ({\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t\tpath: path ? path.split('.') : undefined,\n\t\t\t\t\t})),\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t}\n\treturn piper\n}\n\nexport function define<I, O>(\n\tfn: PipeFn<I, O>,\n\tconfig: {\n\t\tcontext?: Context\n\t\tschema?: (context: Context) => JsonSchemaBuilder\n\t} = {},\n): Pipe<I, O> {\n\tconst key = `define_${getRandomValue()}`\n\treturn standard<I, O>(\n\t\t({ input, context, path }, opts) => [\n\t\t\t`${input} = ${context}['${key}'](${input})`,\n\t\t\topts.wrapError(`${input} instanceof PipeError`, `PipeError.wrap(${path}, ${input})`),\n\t\t],\n\t\t{\n\t\t\tcontext: { ...config?.context, [key]: fn },\n\t\t\tschema: config?.schema,\n\t\t},\n\t)\n}\n\nexport function compileNested(\n\tdata: {\n\t\tpipe: Pipe<any, any>\n\t\terrorType?: Parameters<typeof createErrorHandler>[1]\n\t\topts: Required<Pick<Parameters<Pipe<any, any>['compile']>[1], 'rootContext' | 'failEarly' | 'path' | 'wrapError'>>\n\t} & { input: string; key?: string },\n) {\n\tconst random = getRandomValue()\n\tconst { lines, context } = compilePipeToString({\n\t\t...data.opts,\n\t\twrapError: createErrorHandler(data.input, data.errorType ?? data.opts.wrapError.type),\n\t\tpipe: data.pipe,\n\t\tinput: data.input,\n\t\tcontext: `context[\\`${random}\\`]`,\n\t\tpath: [data.opts.path, 'key' in data ? data.key : ''].filter(Boolean).join('.') || undefined,\n\t})\n\tdata.opts.rootContext[random] = context\n\treturn lines\n}\n\nfunction compilePipeToString({\n\tpipe,\n\tinput,\n\tcontext: contextStr,\n\tfailEarly = false,\n\tpath = '',\n\trootContext,\n\twrapError = createErrorHandler(input, 'return'),\n\tbase = [],\n}: {\n\tpipe: Pipe<any, any>\n\tinput: string\n\tcontext: string\n\tfailEarly?: boolean\n\tpath?: string\n\trootContext?: Context\n\twrapError?: PipeErrorHandler\n\tbase?: string[]\n}) {\n\tconst ctx = context(pipe)\n\trootContext ??= ctx\n\tconst compiled = walk(pipe, <ReturnType<Pipe<any, any>['compile']>[]>[], (p, acc) => {\n\t\tacc.push(\n\t\t\tp.compile(\n\t\t\t\t{ input, context: contextStr, path: `${path ? `'${path}'` : undefined}` },\n\t\t\t\t{ rootContext, failEarly, path, wrapError },\n\t\t\t),\n\t\t)\n\t\treturn acc\n\t})\n\tconst lines = mergePipeLines(base, compiled.flat())\n\treturn { lines, context: ctx }\n}\n\nfunction mergePipeLines(base: string[], lines: ReturnType<Pipe<any, any>['compile']>) {\n\treturn (Array.isArray(lines) ? lines : [lines]).reduceRight<string[]>((acc, cur) => {\n\t\tif (typeof cur === 'string') acc.unshift(cur)\n\t\telse if (typeof cur === 'function') acc = cur(acc)\n\t\treturn acc\n\t}, base)\n}\n"],"mappings":"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","names":["createErrorHandler","PipeError","getRandomValue","walk","pipe","init","nodeFn","acc","pipes","prev","context","p","assert","input","result","validate","res","compile","error","schema","cont","meta","standard","opts","inputStr","contextStr","lines","compilePipeToString","allLines","l","config","piper","entries","cur","define","value","validity","message","path","fn","key","compileNested","data","random","failEarly","rootContext","wrapError","base","ctx","compiled","mergePipeLines"]}