UNPKG

eunomia-controller

Version:

86 lines (72 loc) 2.14 kB
import conformsTo from 'lodash/conformsTo'; import isEmpty from 'lodash/isEmpty'; import isFunction from 'lodash/isFunction'; import isObject from 'lodash/isObject'; import isString from 'lodash/isString'; import invariant from 'invariant'; import warning from 'warning'; /** * Validate the shape of redux store */ function checkStore(store) { const shape = { dispatch: isFunction, subscribe: isFunction, getState: isFunction, replaceReducer: isFunction, runSaga: isFunction, asyncReducers: isObject }; invariant( conformsTo(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); invariant( isString(name) && !isEmpty(name) && isFunction(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); invariant( Array.isArray(sagas), '(app/utils...) injectAsyncSagas: Expected `sagas` to be an array of generator functions' ); warning( !isEmpty(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 })