di-tory
Version:
Compose applications with dependency injection
45 lines (44 loc) • 1.55 kB
JavaScript
const createProxy = (resolver, dummyTarget) => (module) => new Proxy(dummyTarget, {
get: (_, prop) => {
const target = resolver(module);
const value = target[prop];
return typeof value === 'function' ? value.bind(target) : value;
},
set: (_, prop, value) => {
const target = resolver(module);
target[prop] = value;
return true;
},
deleteProperty: (_, prop) => {
const target = resolver(module);
delete target[prop];
return true;
},
has: (_, prop) => Object.prototype.hasOwnProperty.call(resolver(module), prop),
ownKeys: () => {
const target = resolver(module);
return [
...Object.getOwnPropertyNames(target),
...Object.getOwnPropertySymbols(target),
];
},
getOwnPropertyDescriptor: (_, prop) => Object.getOwnPropertyDescriptor(resolver(module), prop),
defineProperty: (_, prop, descriptor) => {
Object.defineProperty(resolver(module), prop, descriptor);
return true;
},
apply: (_, thisArg, args) => {
const target = resolver(module);
return target.apply(thisArg, args);
},
construct: (_, args) => {
const target = resolver(module);
return new target(...args);
},
});
export const noop = () => { };
export class NoClass {
}
export const proxy = (resolver, dummyTarget = {}) => createProxy(resolver, dummyTarget);
proxy.fn = (resolver) => proxy(resolver, noop);
proxy.constructor = (resolver) => proxy(resolver, NoClass);