icrosil/remob

View on GitHub
src/redux/combineRemob.js

Summary

Maintainability
A
0 mins
Test Coverage
import mapValues from 'lodash/mapValues';
import isObject from 'lodash/isObject';

import Reducer from './Reducer';

export const registeredRemobs = {};

const defaultCombiner = () => {
  throw new Error('You forgot to combineReducers');
};

let combineReducers;

export const setCombiner = combiner => {
  combineReducers = combiner;
};

/**
 * combineRemob gathers reducers from simple reducers and remobs
 * @method
 * @param  {Object} remobs stores
 */
export default remobs => {
  const reducers = mapValues(remobs, (Remob, remobName) => {
    if (isObject(Remob) && Remob instanceof Reducer) {
      if (registeredRemobs[remobName]) {
        throw new Error(`remob ${remobName} already registered, for safety reasons pls use another name`);
      }
      registeredRemobs[remobName] = Remob;
      return Remob.reducer;
    }
    return Remob;
  });
  return (combineReducers || defaultCombiner)(reducers);
};