From 61669bc902176dfbe322a150de26481ab13938da Mon Sep 17 00:00:00 2001 From: Kristofer Selbekk Date: Thu, 27 Sep 2018 08:31:08 +0200 Subject: [PATCH] fix: Throw error if createStore is passed several enhancers This commit adds a check for whether the user is passing several enhancers to the `createStore` function. Fixes #3114. --- package-lock.json | 43 ++++++++++++++++++++++++++++++---------- src/createStore.js | 11 ++++++++++ test/createStore.spec.js | 16 +++++++++++++++ 3 files changed, 59 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2220ff23aba..5dcc0504730 100644 --- a/package-lock.json +++ b/package-lock.json @@ -327,7 +327,8 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", @@ -337,7 +338,8 @@ "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -454,7 +456,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -466,6 +469,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -591,7 +595,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -603,6 +608,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -724,6 +730,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -8010,12 +8017,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -8030,17 +8039,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -8157,7 +8169,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -8169,6 +8182,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -8183,6 +8197,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -8190,12 +8205,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -8214,6 +8231,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -8294,7 +8312,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -8306,6 +8325,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -8427,6 +8447,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", diff --git a/src/createStore.js b/src/createStore.js index 4d928ecd5de..d6da637c440 100644 --- a/src/createStore.js +++ b/src/createStore.js @@ -29,6 +29,17 @@ import isPlainObject from './utils/isPlainObject' * and subscribe to changes. */ export default function createStore(reducer, preloadedState, enhancer) { + if ( + (typeof preloadedState === 'function' && typeof enhancer === 'function') || + (typeof enhancer === 'function' && typeof arguments[3] === 'function') + ) { + throw new Error( + 'It looks like you are passing several store enhancers to ' + + 'createStore(). This is not supported. Instead, compose them ' + + 'together to a single function' + ) + } + if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') { enhancer = preloadedState preloadedState = undefined diff --git a/test/createStore.spec.js b/test/createStore.spec.js index d0d57a1e79b..6a837c0d1d9 100644 --- a/test/createStore.spec.js +++ b/test/createStore.spec.js @@ -761,4 +761,20 @@ describe('createStore', () => { expect(console.error.mock.calls.length).toBe(0) console.error = originalConsoleError }) + + it('throws if passing several enhancer functions without preloaded state', () => { + const rootReducer = combineReducers(reducers) + const dummyEnhancer = f => f + expect(() => + createStore(rootReducer, dummyEnhancer, dummyEnhancer) + ).toThrow() + }) + + it('throws if passing several enhancer functions with preloaded state', () => { + const rootReducer = combineReducers(reducers) + const dummyEnhancer = f => f + expect(() => + createStore(rootReducer, { todos: [] }, dummyEnhancer, dummyEnhancer) + ).toThrow() + }) })