{"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":["pipe","schema","meta","context","compile"]}