All files / src/utils flattenReducer.js

0% Statements 0/14
0% Branches 0/16
0% Functions 0/3
0% Lines 0/14

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37                                                                         
const flattedReducer = (...args) => {
  const initialState = typeof args[0] !== 'function' && args.shift();
  const reducers = args;
 
  if (typeof initialState === 'undefined') {
    throw new TypeError(
      'The initial state may not be undefined. If you do not want to set a value for this reducer, you can use null instead of undefined.'
    );
  }
 
  return (prevState, value, ...args) => {
    const prevStateIsUndefined = typeof prevState === 'undefined';
    const valueIsUndefined = typeof value === 'undefined';
 
    if (prevStateIsUndefined && valueIsUndefined && initialState) {
      return initialState;
    }
 
    return reducers.reduce(
      (newState, reducer, index) => {
        if (typeof reducer === 'undefined') {
          throw new TypeError(
            `An undefined reducer was passed in at index ${index}`
          );
        }
 
        return reducer(newState, value, ...args);
      },
      prevStateIsUndefined && !valueIsUndefined && initialState
        ? initialState
        : prevState
    );
  };
};
 
export default flattedReducer;