typedux
Version:
Slightly adjusted Redux (awesome by default) for TS
58 lines • 1.98 kB
JavaScript
import { isFunction, getProperty } from "./index";
import { getLogger } from '@3fv/logger-proxy';
import { isDev } from "../dev";
const log = getLogger(__filename);
/**
* A reloadable proxy between a target object
* and the end consumer.
*
* Implemented specifically for hot loading
*/
export class VariableProxy {
constructor(target, ignoredProps = []) {
this.ignoredProps = ignoredProps;
this.proxy = {};
this.changeTarget(target);
}
addProxies(o) {
if (!o)
return;
let keys = Object.getOwnPropertyNames(o);
if (log.isInfoEnabled() && isDev) {
log.info("Creating proxy for", keys);
}
keys.forEach((prop) => {
if (!/(constructor|prototype|__proto__)/.test(prop) &&
!this.proxy[prop] &&
this.ignoredProps.indexOf(prop) < 0) {
if (isFunction(this.target[prop])) {
this.proxy[prop] = (...args) => {
return this.target[prop].apply(this.target, args);
};
}
else {
Object.defineProperty(this.proxy, prop, {
get: () => {
return this.target[prop];
},
set: (newVal) => {
return this.target[prop] = newVal;
}
});
}
}
});
}
changeTarget(target) {
this.target = target;
// Update the proxy to ensure all methods are available
// this.addProxies(_.get(this,'target'))
let proto = getProperty(this, 'target.constructor.prototype');
while (proto) {
this.addProxies(proto);
proto = getProperty(proto, '__proto__');
}
// this.addProxies(_.get(this,'target.__proto__'))
}
}
//# sourceMappingURL=VariableProxy.js.map