remx
Version:
Opinionated mobx
63 lines (55 loc) • 2.15 kB
JavaScript
var _mobx=require('mobx');var mobx=_interopRequireWildcard(_mobx);
var _lodash=require('lodash.isobjectlike');var _lodash2=_interopRequireDefault(_lodash);
var _immutableDate=require('../utils/immutableDate');var _immutableDate2=_interopRequireDefault(_immutableDate);
var _isReactUpdating=require('../utils/isReactUpdating');
var _globalState=require('./globalState');
var _isDev=require('../utils/isDev');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj;}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key];}}newObj.default=obj;return newObj;}}
var alreadyProxiedObjects=new WeakMap();
function proxify(obj){
alreadyProxiedObjects.set(obj,true);
var tracker=createObservableMap(obj);
var handler={
ownKeys:function ownKeys(target){
tracker.keys();
return Reflect.ownKeys(target);
},
get:function get(target,prop){
if(typeof prop!=='string'&&typeof prop!=='symbol'){
return undefined;
}
if((0,_isDev.isDev)()&&(0,_isReactUpdating.isReactUpdating)()&&!(0,_globalState.isRenderingObserver)()&&(0,_globalState.isAccessStateStrictMode)()){
console.error('[REMX] attempted to access prop \''+
prop+'\' in react component untracked by remx');
}
tracker.get(prop);
return target[prop];
},
set:function set(target,prop,value){
var newValue=value;
if((0,_lodash2.default)(value)&&!alreadyProxiedObjects.has(value)){
newValue=proxify(value);
}
target[prop]=newValue;
tracker.set(prop,newValue);
return true;
}};
var proxiedObject=new Proxy(obj,handler);
alreadyProxiedObjects.set(proxiedObject,true);
return proxiedObject;
}
var createObservableMap=function createObservableMap(obj){
var tracker=mobx.observable.map({},{deep:false});
Object.keys(obj).forEach(function(key){
var value=obj[key];
if((0,_lodash2.default)(value)&&!alreadyProxiedObjects.has(value)&&value instanceof Date===false){
obj[key]=proxify(value);
}
if(value instanceof Date){
obj[key]=(0,_immutableDate2.default)(value);
}
tracker.set(key,value);
});
return tracker;
};
module.exports={
proxify:proxify};