{"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":["pipes_exports","__export","assert","compile","compileNested","context","define","meta","schema","standard","validate","walk","__toCommonJS","import_errors","import_functions","pipe","init","nodeFn","acc","pipes","prev","p","input","result","res","error","cont","opts","inputStr","contextStr","lines","compilePipeToString","allLines","l","config","piper","entries","cur","value","validity","message","path","fn","key","data","random","failEarly","rootContext","wrapError","base","ctx","compiled","mergePipeLines"]}