diff --git a/src/utils/composeStores.js b/src/utils/composeStores.js index d8c4420546..bee472fbcc 100644 --- a/src/utils/composeStores.js +++ b/src/utils/composeStores.js @@ -1,11 +1,18 @@ -import mapValues from '../utils/mapValues'; -import pick from '../utils/pick'; +import mapValues from './mapValues'; +import pick from './pick'; + +// UNDEF = undefined; +const UNDEF = void 0; export default function composeStores(stores) { const finalStores = pick(stores, (val) => typeof val === 'function'); return function Composition(atom = {}, action) { - return mapValues(finalStores, (store, key) => - store(atom[key], action) - ); + return mapValues(finalStores, (store, key) => { + const state = store(atom[key], action); + if (state === UNDEF) { + throw new Error(`Store ${key} returns undefined. By default store should return original state.`); + } + return state; + }); }; } diff --git a/test/composeStores.spec.js b/test/composeStores.spec.js index 551b275e59..3c7305f47a 100644 --- a/test/composeStores.spec.js +++ b/test/composeStores.spec.js @@ -1,6 +1,9 @@ import expect from 'expect'; import { composeStores } from '../src'; +// UNDEF = undefined; +const UNDEF = void 0; + describe('Utils', () => { describe('composeStores', () => { it('should return a store that maps state keys to reducer functions', () => { @@ -27,5 +30,29 @@ describe('Utils', () => { expect(Object.keys(store({}, {type: 'push'}))).toEqual(['stack']); }); + it('should throw an error if undefined return from store', () => { + const store = composeStores({ + stack: (state = []) => state, + bad: (state = [], action) => { + if (action.type === 'something') { + return state; + } + } + }); + expect(() => store({}, {type: '@@testType'})).toThrow(); + }); + it('should throw an error if undefined return not by default', () => { + const store = composeStores({ + stack: (state = []) => state, + bad: (state = 1, action) => { + if (action.type === 'something') { + return UNDEF; + } + return state; + } + }); + expect(store({}, {type: '@@testType'})).toEqual({stack: [], bad: 1}); + expect(() => store({}, {type: 'something'})).toThrow(); + }); }); });