UNPKG

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
"use strict"; 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;