diff --git a/src/utils/composeStores.js b/src/utils/composeStores.js index d8c4420546d..72655c87d46 100644 --- a/src/utils/composeStores.js +++ b/src/utils/composeStores.js @@ -1,11 +1,15 @@ -import mapValues from '../utils/mapValues'; -import pick from '../utils/pick'; +import mapValues from './mapValues'; +import pick from './pick'; 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 === undefined) { + 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 551b275e59a..405ae028e05 100644 --- a/test/composeStores.spec.js +++ b/test/composeStores.spec.js @@ -27,5 +27,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 undefined; + } + return state; + } + }); + expect(store({}, {type: '@@testType'})).toEqual({stack: [], bad: 1}); + expect(() => store({}, {type: 'something'})).toThrow(); + }); }); });