proxify-method
Version:
Project for flexible extension of the existing functionality
82 lines • 3.61 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.chainProxify = exports.proxify = void 0;
const async_proxify_1 = require("./async.proxify");
const sync_proxify_1 = require("./sync.proxify");
const utils_1 = require("./utils");
function proxify(result, chainMehod, fromResult = false) {
if ((typeof result).includes('function')) {
result = result();
}
if ((typeof result) === 'object' && result.then) {
return async_proxify_1.proxifyAsync(result, chainMehod, fromResult);
}
return sync_proxify_1.proxifySync(result, chainMehod, fromResult);
}
exports.proxify = proxify;
function initChainModel(ctx, proxityPattern, chainMehod, resultFromChain, base) {
const baseObj = ctx[base];
const ownProps = Object.getOwnPropertyNames(baseObj);
let onlyMethods = ownProps
.filter((p) => (typeof baseObj[p]) === 'function' && !(p === 'constructor'));
if (proxityPattern) {
onlyMethods = onlyMethods.filter((m) => m.match(proxityPattern));
}
onlyMethods.forEach((m) => {
const currentMethod = baseObj[m];
baseObj[m] = function (...args) {
return proxify(currentMethod.call(this, ...args), chainMehod, resultFromChain);
};
});
}
function initContextChainModel(ctx, proxityPattern, chainMehod, resultFromChain) {
initChainModel(ctx, proxityPattern, chainMehod, resultFromChain, '__proto__');
}
function initPrototyeChainModel(ctx, proxityPattern, chainMehod, resultFromChain) {
initChainModel(ctx, proxityPattern, chainMehod, resultFromChain, 'prototype');
}
function setUpChain(name, asserter, _chainMehod = {}) {
if ((typeof name).includes('function') && name.name) {
asserter = name;
name = name.name;
}
if (!(typeof asserter).includes('function')) {
throw new Error('asserter should be a function');
}
_chainMehod[name] = asserter;
return {
chainProxify: (name, asserter) => setUpChain(name, asserter, _chainMehod),
initContextChainModel: (ctx, proxityPattern = null) => {
if (utils_1.isString(proxityPattern)) {
proxityPattern = new RegExp(proxityPattern);
}
const resultFromChain = setUpChain.resultFromChain;
// back to default condition, should be disabled = false
setUpChain.resultFromChain = false;
initContextChainModel(ctx, proxityPattern, _chainMehod, resultFromChain);
},
initPrototyeChainModel: (ctx, proxityPattern = null) => {
if (utils_1.isString(proxityPattern)) {
proxityPattern = new RegExp(proxityPattern);
}
const resultFromChain = setUpChain.resultFromChain;
// back to default condition, should be disabled = false
setUpChain.resultFromChain = false;
initPrototyeChainModel(ctx, proxityPattern, _chainMehod, resultFromChain);
},
// TODO backward compatibility
initChainModel: (ctx, proxityPattern = null) => {
if (utils_1.isString(proxityPattern)) {
proxityPattern = new RegExp(proxityPattern);
}
const resultFromChain = setUpChain.resultFromChain;
// back to default condition, should be disabled = false
setUpChain.resultFromChain = false;
initContextChainModel(ctx, proxityPattern, _chainMehod, resultFromChain);
},
};
}
setUpChain.resultFromChain = false;
const chainProxify = setUpChain;
exports.chainProxify = chainProxify;
//# sourceMappingURL=index.js.map
;