eunomia-controller
Version:
96 lines (69 loc) • 2.79 kB
JavaScript
;
var _conformsTo = require('lodash/conformsTo');
var _conformsTo2 = _interopRequireDefault(_conformsTo);
var _isEmpty = require('lodash/isEmpty');
var _isEmpty2 = _interopRequireDefault(_isEmpty);
var _isFunction = require('lodash/isFunction');
var _isFunction2 = _interopRequireDefault(_isFunction);
var _isObject = require('lodash/isObject');
var _isObject2 = _interopRequireDefault(_isObject);
var _isString = require('lodash/isString');
var _isString2 = _interopRequireDefault(_isString);
var _invariant = require('invariant');
var _invariant2 = _interopRequireDefault(_invariant);
var _warning = require('warning');
var _warning2 = _interopRequireDefault(_warning);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Validate the shape of redux store
*/
function checkStore(store) {
var shape = {
dispatch: _isFunction2.default,
subscribe: _isFunction2.default,
getState: _isFunction2.default,
replaceReducer: _isFunction2.default,
runSaga: _isFunction2.default,
asyncReducers: _isObject2.default
};
(0, _invariant2.default)((0, _conformsTo2.default)(store, shape), '(app/utils...) asyncInjectors: Expected a valid redux store');
}
/**
* Inject an asynchronously loaded reducer
*/
function injectAsyncReducer(store, isValid, createReducer) {
return function injectReducer(name, asyncReducer) {
if (!isValid) checkStore(store);
(0, _invariant2.default)((0, _isString2.default)(name) && !(0, _isEmpty2.default)(name) && (0, _isFunction2.default)(asyncReducer), '(app/utils...) injectAsyncReducer: Expected `asyncReducer` to be a reducer function');
if (Reflect.has(store.asyncReducers, name)) return;
store.asyncReducers[name] = asyncReducer; // eslint-disable-line no-param-reassign
store.replaceReducer(createReducer(store.asyncReducers));
};
}
/**
* Inject an asynchronously loaded saga
*/
function injectAsyncSagas(store, isValid) {
return function injectSagas(sagas) {
if (!isValid) checkStore(store);
(0, _invariant2.default)(Array.isArray(sagas), '(app/utils...) injectAsyncSagas: Expected `sagas` to be an array of generator functions');
(0, _warning2.default)(!(0, _isEmpty2.default)(sagas), '(app/utils...) injectAsyncSagas: Received an empty `sagas` array');
sagas.map(store.runSaga);
};
}
/**
* Helper for creating injectors
*/
function getAsyncInjectors(store, createReducer) {
checkStore(store);
return {
injectReducer: injectAsyncReducer(store, true, createReducer),
injectSagas: injectAsyncSagas(store, true)
};
}
module.exports = {
checkStore: checkStore,
injectAsyncReducer: injectAsyncReducer,
injectAsyncSagas: injectAsyncSagas,
getAsyncInjectors: getAsyncInjectors
};