UNPKG

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
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;