redux-injectable-store
Version:
Redux store with injectable reducers for use with bundle splitting, large apps, and SPAs.
65 lines (49 loc) • 2.48 kB
JavaScript
var _extends=Object.assign||function(target){for(var i=1;i<arguments.length;i++){var source=arguments[i];for(var key in source){if(Object.prototype.hasOwnProperty.call(source,key)){target[key]=source[key];}}}return target;};var _redux=require('redux');
var _warning=require('warning');var _warning2=_interopRequireDefault(_warning);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}
var FAKE_INITIAL_REDUCER_NAMESPACE='___';
var IDENTITY_REDUCER=function IDENTITY_REDUCER(){var state=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;return state;};
var defaultWrapReducer=function defaultWrapReducer(reducer){return reducer;};
var makeEmptyReducerMap=function makeEmptyReducerMap(){return _defineProperty({},
FAKE_INITIAL_REDUCER_NAMESPACE,IDENTITY_REDUCER);};
var createInjectableStore=function createInjectableStore(preloadedState,enhancer){var wrapReducer=arguments.length>2&&arguments[2]!==undefined?arguments[2]:defaultWrapReducer;
var reducers=makeEmptyReducerMap();
var store=(0,_redux.createStore)(wrapReducer((0,_redux.combineReducers)(reducers)),preloadedState,enhancer);
var replace=function replace(){
store.replaceReducer(wrapReducer((0,_redux.combineReducers)(reducers)));
};
var clearReducers=function clearReducers(){
reducers=makeEmptyReducerMap();
};
var inject=function inject(namespace,reducer){var force=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;
if(reducers[namespace]!=null&&!force){
(0,_warning2.default)(
false,'Attempted to inject a new reducer in an already existing namespace (\''+
namespace+'\') without `force`. Skipping.');
return;
}
reducers[namespace]=reducer;
replace();
};
var injectAll=function injectAll(reducerMap){var force=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;
var hasChanged=false;
Object.keys(reducerMap).forEach(function(namespace){
if(reducers[namespace]!=null&&!force){
(0,_warning2.default)(
false,
'Attempted to inject a new reducer in an already existing namespace without `force`. Skipping.');
return;
}
reducers[namespace]=reducerMap[namespace];
hasChanged=true;
});
if(hasChanged){
replace();
}
};
return _extends({},
store,{
inject:inject,
injectAll:injectAll,
clearReducers:clearReducers});
};
module.exports=createInjectableStore;