ts-aspect
Version:
Simplistic library for Aspect Oriented Programming in TypeScript
41 lines (40 loc) • 1.64 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.addAspect = void 0;
const util_1 = require("util");
const proxyFunc_1 = require("./proxyFunc");
const TsAspectProperty_1 = require("./TsAspectProperty");
function addAspect(target, methodName, advice, aspect) {
var _a;
let tsAspectProp = (0, TsAspectProperty_1.getTsAspectProp)(target);
if (!tsAspectProp) {
tsAspectProp = {};
(0, TsAspectProperty_1.setTsAspectProp)(target, tsAspectProp);
}
if (!tsAspectProp[methodName]) {
const originalMethod = Reflect.get(target, methodName);
tsAspectProp[methodName] = {
originalMethod,
adviceAspectMap: new Map(),
};
const wrapperFunc = function (...args) {
const tsAspectProp = (0, TsAspectProperty_1.getTsAspectProp)(target);
if (tsAspectProp) {
if (util_1.types.isAsyncFunction(originalMethod)) {
return (0, proxyFunc_1.asyncProxyFunc)(target, methodName, tsAspectProp[methodName], ...args);
}
else {
return (0, proxyFunc_1.proxyFunc)(target, methodName, tsAspectProp[methodName], ...args);
}
}
return originalMethod(...args);
};
Reflect.set(target, methodName, wrapperFunc);
}
const { adviceAspectMap } = tsAspectProp[methodName];
if (!adviceAspectMap.has(advice)) {
adviceAspectMap.set(advice, []);
}
(_a = adviceAspectMap.get(advice)) === null || _a === void 0 ? void 0 : _a.push(aspect);
}
exports.addAspect = addAspect;