@decaf-ts/db-decorators
Version:
Agnostic database decorators and repository
120 lines • 5.27 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.prefixMethod = prefixMethod;
exports.suffixMethod = suffixMethod;
exports.wrapMethodWithContext = wrapMethodWithContext;
exports.wrapMethodWithContextForUpdate = wrapMethodWithContextForUpdate;
const Context_1 = require("./Context.cjs");
const errors_1 = require("./errors.cjs");
const decorator_validation_1 = require("@decaf-ts/decorator-validation");
/**
* @summary Util method to change a method of an object prefixing it with another
* @param {any} obj The Base Object
* @param {Function} after The original method
* @param {Function} prefix The Prefix method. The output will be used as arguments in the original method
* @param {string} [afterName] When the after function anme cannot be extracted, pass it here
*
* @function prefixMethod
*
* @memberOf module:db-decorators
*/
function prefixMethod(obj, after, prefix, afterName) {
const name = afterName ? afterName : after.name;
obj[name] = new Proxy(obj[name], {
apply: async (target, thisArg, argArray) => {
let results = prefix.call(thisArg, ...argArray);
if (results instanceof Promise)
results = await results;
results = target.call(thisArg, ...results);
if (results instanceof Promise)
results = await results;
return results;
},
});
}
/**
* @summary Util method to change a method of an object suffixing it with another
* @param {any} obj The Base Object
* @param {Function} before The original method
* @param {Function} suffix The Prefix method. The output will be used as arguments in the original method
* @param {string} [beforeName] When the after function anme cannot be extracted, pass it here
*
* @function suffixMethod
*
* @memberOf module:db-decorators.Repository
*/
function suffixMethod(obj, before, suffix, beforeName) {
const name = beforeName ? beforeName : before.name;
obj[name] = new Proxy(obj[name], {
apply: async (target, thisArg, argArray) => {
let results = target.call(thisArg, ...argArray);
if (results instanceof Promise)
results = await results;
results = suffix.call(thisArg, ...results);
if (results instanceof Promise)
results = await results;
return results;
},
});
}
/**
* @summary Util method to wrap a method of an object with additional logic
*
* @param {any} obj The Base Object
* @param {Function} before the method to be prefixed
* @param {Function} method the method to be wrapped
* @param {Function} after The method to be suffixed
* @param {string} [methodName] When the after function anme cannot be extracted, pass it here
*
* @function wrapMethodWithContext
*
* @memberOf module:db-decorators
*/
function wrapMethodWithContext(obj, before, method, after, methodName) {
const name = methodName ? methodName : method.name;
obj[name] = new Proxy(obj[name], {
apply: async (target, thisArg, argArray) => {
let transformedArgs = before.call(thisArg, ...argArray);
if (transformedArgs instanceof Promise)
transformedArgs = await transformedArgs;
const context = transformedArgs[transformedArgs.length - 1];
if (!(context instanceof Context_1.Context))
throw new errors_1.InternalError("Missing a context");
let results = target.call(thisArg, ...transformedArgs);
if (results instanceof Promise)
results = await results;
results = after.call(thisArg, results, context);
if (results instanceof Promise)
results = await results;
return results;
},
});
}
function wrapMethodWithContextForUpdate(obj, before, method, after, methodName) {
const name = methodName ? methodName : method.name;
obj[name] = new Proxy(obj[name], {
apply: async (target, thisArg, argArray) => {
let transformedArgs = before.call(thisArg, ...argArray);
if (transformedArgs instanceof Promise)
transformedArgs = await transformedArgs;
const oldModel = transformedArgs.pop();
const context = transformedArgs[transformedArgs.length - 1];
if (!(context instanceof Context_1.Context))
throw new errors_1.InternalError("Missing a context");
if (context.get("applyUpdateValidation") &&
!context.get("ignoreDevSafeGuards") &&
!(oldModel instanceof decorator_validation_1.Model) &&
(!Array.isArray(oldModel) || !oldModel.every((o) => o instanceof decorator_validation_1.Model))) {
throw new errors_1.InternalError(`No previous versions os models found`);
}
let results = target.call(thisArg, ...transformedArgs);
if (results instanceof Promise)
results = await results;
results = after.call(thisArg, results, oldModel, context);
if (results instanceof Promise)
results = await results;
return results;
},
});
}
//# sourceMappingURL=wrappers.js.map