ts-aspect
Version:
Simplistic library for Aspect Oriented Programming in TypeScript
48 lines (47 loc) • 2.03 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.UseAspect = void 0;
const util_1 = require("util");
const proxyFunc_1 = require("../proxyFunc");
const TsAspectProperty_1 = require("../TsAspectProperty");
function UseAspect(advice, aspect) {
return function (target, propertyKey, descriptor) {
var _a, _b;
let tsAspectProp = (0, TsAspectProperty_1.getTsAspectProp)(target);
if (!tsAspectProp) {
tsAspectProp = {};
(0, TsAspectProperty_1.setTsAspectProp)(target, tsAspectProp);
}
const propertyKeyString = propertyKey.toString();
if (!tsAspectProp[propertyKeyString]) {
const originalMethod = descriptor.value;
tsAspectProp[propertyKeyString] = {
originalMethod,
adviceAspectMap: new Map(),
};
descriptor.value = function (...args) {
const tsAspectProp = (0, TsAspectProperty_1.getTsAspectProp)(target);
if (tsAspectProp) {
if (util_1.types.isAsyncFunction(originalMethod)) {
return (0, proxyFunc_1.asyncProxyFunc)(this, propertyKeyString, tsAspectProp[propertyKeyString], ...args);
}
else {
return (0, proxyFunc_1.proxyFunc)(this, propertyKeyString, tsAspectProp[propertyKeyString], ...args);
}
}
return originalMethod(...args);
};
}
const { adviceAspectMap } = tsAspectProp[propertyKeyString];
if (!adviceAspectMap.has(advice)) {
adviceAspectMap.set(advice, []);
}
if (typeof aspect === 'function') {
(_a = adviceAspectMap.get(advice)) === null || _a === void 0 ? void 0 : _a.push(new aspect());
}
else {
(_b = adviceAspectMap.get(advice)) === null || _b === void 0 ? void 0 : _b.push(aspect);
}
};
}
exports.UseAspect = UseAspect;