UNPKG

funpermaproxy

Version:

Functional permaproxy — proxying an object mediated through a getter function

35 lines (32 loc) 1.68 kB
/*** * Rewritten version of {@link https://github.com/MatrixAI/js-permaproxy} * The original code was under Apache-2.0 license, as of 11.05.2019. * Differences from the original: * * 1. Instead of an object reference and property name, uses getter function. * 2. Rewritten in arrow functions */ function _permaproxy(directGetter, fallbackTarget) { const getter = () => directGetter() || fallbackTarget; return new Proxy(fallbackTarget, { getPrototypeOf: (_) => Reflect.getPrototypeOf(getter()), setPrototypeOf: (_, prototype) => Reflect.setPrototypeOf(getter(), prototype), isExtensible: (_) => Reflect.isExtensible(getter()), preventExtensions: (_) => Reflect.preventExtensions(getter()), getOwnPropertyDescriptor: (_, property) => Reflect.getOwnPropertyDescriptor(getter(), property), defineProperty: (_, property, descriptor) => Reflect.defineProperty(getter(), property, descriptor), has: (_, property) => Reflect.has(getter(), property), get: (_, property) => { const target = getter(); const value = Reflect.get(target, property); return (typeof value === 'function') ? value.bind(target) : value; }, set: (_, property, value) => Reflect.set(getter(), property, value), deleteProperty: (_, property) => Reflect.deleteProperty(getter(), property), ownKeys: (_) => Reflect.ownKeys(getter()), construct: (_, argArray, newTarget) => Reflect.construct(getter(), argArray, newTarget), apply: (_, thisArg, args) => Reflect.apply(getter(), thisArg, args), }); } module.exports = (getter) => _permaproxy(getter, {}); module.exports.callable = (getter) => _permaproxy(getter, function () {});