UNPKG

@gabliam/web-core

Version:
77 lines (76 loc) 2.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.extractPipes = exports.createPipeResolver = exports.isPipe = void 0; const core_1 = require("@gabliam/core"); const bad_pipe_error_1 = require("./errors/bad-pipe-error"); const web_configuration_1 = require("./web-configuration"); const metadatas_1 = require("./metadatas"); const composePipe = (...fns) => async (val, type) => fns.reduce((prevFn, nextFn) => (0, core_1.toPromise)(prevFn).then((v) => (0, core_1.toPromise)(nextFn(v, type))), Promise.resolve(val)); function isPipe(value) { return value && typeof value.transform === 'function'; } exports.isPipe = isPipe; const createPipeResolver = (container) => function pipeResolver(pipe) { if (isPipe(pipe)) { return pipe; } try { // test if the interceptor is a ServiceIdentifier return container.get(pipe); } catch (_a) { if (pipe.name === undefined) { return pipe; } try { // test if interceptor is constructable const t = new pipe(); if (!isPipe(t)) { throw new bad_pipe_error_1.BadPipeError(t); } container.bind(pipe).to(pipe).inSingletonScope(); return container.get(pipe); } catch (e) { if (e instanceof bad_pipe_error_1.BadPipeError) { throw e; } else { throw new bad_pipe_error_1.BadPipeError(pipe); } } } }; exports.createPipeResolver = createPipeResolver; const defaultPipe = (value) => Promise.resolve(value); const extractPipes = (container, controller, key, index, addGlobal = true) => { const pipeIds = []; const target = controller.constructor; if (addGlobal) { const webConfiguration = container.get(web_configuration_1.WebConfiguration); pipeIds.push(...webConfiguration.globalPipes); } (core_1.reflection.annotationsOfDecorator(target, metadatas_1.UsePipes) || []).forEach((pipe) => { pipeIds.push(...pipe.ids); }); (core_1.reflection.propMetadataOfDecorator(target, metadatas_1.UsePipes)[key] || []).forEach((pipe) => pipeIds.push(...pipe.ids)); ((core_1.reflection.parametersOfDecorator(target, key, metadatas_1.UsePipes)[index] || []).slice(-1) || []).forEach((deco) => { deco.forEach((d) => pipeIds.push(...d.ids)); }); if (pipeIds.length === 0) { return defaultPipe; } const pipeResolver = (0, exports.createPipeResolver)(container); const pipes = []; for (const pipeId of pipeIds) { const pipe = pipeResolver(pipeId); if (isPipe(pipe)) { pipes.push(pipe.transform.bind(pipe)); } } if (pipes.length === 0) { return defaultPipe; } return composePipe(...pipes); }; exports.extractPipes = extractPipes;