@gabliam/web-core
Version:
Gabliam plugin for add web-core
77 lines (76 loc) • 2.9 kB
JavaScript
;
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;