UNPKG

lpi-multireducer

Version:

A utility to wrap many copies of a single Redux reducer into a single key-based reducer.

68 lines (49 loc) 2.42 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); 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; }; exports.default = immutableMultireducer; var _immutable = require('immutable'); var _immutable2 = _interopRequireDefault(_immutable); var _key = require('./key'); var _initAction = require('./initAction'); var _initAction2 = _interopRequireDefault(_initAction); 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; } function immutableMultireducer(reducers, reducerKey) { var isCustomMountPoint = void 0; if (typeof reducers === 'function') { if (!reducerKey) { throw new Error('No key specified for custom mounting of reducer'); } else { isCustomMountPoint = true; } } var initialState = isCustomMountPoint ? reducers(undefined, _initAction2.default) : new _immutable2.default.Map(reducers).map(function (reducer) { return reducer(undefined, _initAction2.default); }); return function () { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState; var action = arguments[1]; if (action && action.meta && action.meta[_key.key]) { var actionReducerKey = action.meta[_key.key]; // custom mount point if (isCustomMountPoint && (reducerKey === actionReducerKey || _key.KEY_ALL === actionReducerKey)) { if (_key.KEY_ALL === actionReducerKey) { var _extends2; return reducers(state, _extends({}, action, { meta: _extends({}, action.meta, (_extends2 = {}, _defineProperty(_extends2, _key.key, reducerKey), _defineProperty(_extends2, _key.KEY_ALL, true), _extends2)) })); } return reducers(state, action); } // usual multireducer mounting var reducer = reducers[actionReducerKey]; if (reducer) { return state.set(actionReducerKey, reducer(state.get(actionReducerKey), action)); } } return state; }; }