extension-methods
Version:
This library allows you to create extension methods for a given object the fatest way
53 lines (52 loc) • 2.07 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getExtender = exports.extendClass = exports.extend = exports.defaultCookFunction = void 0;
function defaultCookFunction(value, target) {
return value.bind(target);
}
exports.defaultCookFunction = defaultCookFunction;
/**
* Returns an instance of Extender<P> to be used to extend objects
* @typeparam P Type of the ProxyReference
* @param proxyReference The ProxyReference from where the extension method will be retrieved
* @param cookFunction a function to prepare functions to be returned. By default, all functions returns bound with target
* @param priority defines wether object will have priority in method choosing: target object (default) or the extender
*/
function getExtender(proxyReference, cookFunction = defaultCookFunction, priority = 'object') {
return {
get: priority === 'object'
? (target, name, proxy) => {
const value = name in target ? target[name] : proxyReference[name];
return typeof value === 'function'
? cookFunction(value, target, proxy)
: value;
}
: (target, name, proxy) => {
const value = name in proxyReference
? proxyReference[name]
: target[name];
return typeof value === 'function'
? cookFunction(value, target, proxy)
: value;
},
};
}
exports.getExtender = getExtender;
/**
* @typeparam RealObject the type of the object referenced
* @typeparam Extension the type of Extender
* @param obj the object to be extended
* @param extender the Extender instance
*/
function extend(obj, extender) {
return new Proxy(obj, extender);
}
exports.extend = extend;
function extendClass(classRef, extender) {
return new Proxy(classRef, {
construct(target, argArray) {
return extend(new target(...argArray), extender);
},
});
}
exports.extendClass = extendClass;