Skip to content

Commit d248e7a

Browse files
EskiMojo14markerikson
authored andcommitted
Remove middleware array option
1 parent a98875c commit d248e7a

File tree

5 files changed

+116
-101
lines changed

5 files changed

+116
-101
lines changed

packages/toolkit/src/configureStore.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export interface ConfigureStoreOptions<
5353
* @example `middleware: (gDM) => gDM().concat(logger, apiMiddleware, yourCustomMiddleware)`
5454
* @see https://redux-toolkit.js.org/api/getDefaultMiddleware#intended-usage
5555
*/
56-
middleware?: ((getDefaultMiddleware: GetDefaultMiddleware<S>) => M) | M
56+
middleware?: (getDefaultMiddleware: GetDefaultMiddleware<S>) => M
5757

5858
/**
5959
* Whether to enable Redux DevTools integration. Defaults to `true`.
@@ -121,7 +121,7 @@ export function configureStore<
121121

122122
const {
123123
reducer = undefined,
124-
middleware = getDefaultMiddleware(),
124+
middleware,
125125
devTools = true,
126126
preloadedState = undefined,
127127
enhancers = undefined,
@@ -139,15 +139,21 @@ export function configureStore<
139139
)
140140
}
141141

142-
let finalMiddleware = middleware
143-
if (typeof finalMiddleware === 'function') {
144-
finalMiddleware = finalMiddleware(getDefaultMiddleware)
142+
if (!IS_PRODUCTION && middleware && typeof middleware !== 'function') {
143+
throw new Error('"middleware" field must be a callback')
144+
}
145+
146+
let finalMiddleware: Tuple<Middlewares<S>>
147+
if (typeof middleware === 'function') {
148+
finalMiddleware = middleware(getDefaultMiddleware)
145149

146150
if (!IS_PRODUCTION && !Array.isArray(finalMiddleware)) {
147151
throw new Error(
148152
'when using a middleware builder function, an array of middleware must be returned'
149153
)
150154
}
155+
} else {
156+
finalMiddleware = getDefaultMiddleware()
151157
}
152158
if (
153159
!IS_PRODUCTION &&

packages/toolkit/src/tests/configureStore.test.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ describe('configureStore', async () => {
110110
describe('given no middleware', () => {
111111
it('calls createStore without any middleware', () => {
112112
expect(
113-
configureStore({ middleware: new Tuple(), reducer })
113+
configureStore({ middleware: () => new Tuple(), reducer })
114114
).toBeInstanceOf(Object)
115115
expect(redux.applyMiddleware).toHaveBeenCalledWith()
116116
expect(mockDevtoolsCompose).toHaveBeenCalled() // @remap-prod-remove-line-line
@@ -122,6 +122,15 @@ describe('configureStore', async () => {
122122
})
123123
})
124124

125+
describe('given an array of middleware', () => {
126+
it('throws an error requiring a callback', () => {
127+
// @ts-expect-error
128+
expect(() => configureStore({ middleware: [], reducer })).toThrow(
129+
'"middleware" field must be a callback'
130+
)
131+
})
132+
})
133+
125134
describe('given undefined middleware', () => {
126135
it('calls createStore with default middleware', () => {
127136
expect(configureStore({ middleware: undefined, reducer })).toBeInstanceOf(
@@ -162,20 +171,12 @@ describe('configureStore', async () => {
162171
})
163172
})
164173

165-
describe('given custom middleware that contains non-functions', () => {
166-
it('throws an error', () => {
167-
expect(() =>
168-
configureStore({ middleware: [true] as any, reducer })
169-
).toThrow('each middleware provided to configureStore must be a function')
170-
})
171-
})
172-
173174
describe('given custom middleware', () => {
174175
it('calls createStore with custom middleware and without default middleware', () => {
175176
const thank: Redux.Middleware = (_store) => (next) => (action) =>
176177
next(action)
177178
expect(
178-
configureStore({ middleware: new Tuple(thank), reducer })
179+
configureStore({ middleware: () => new Tuple(thank), reducer })
179180
).toBeInstanceOf(Object)
180181
expect(redux.applyMiddleware).toHaveBeenCalledWith(thank)
181182
expect(mockDevtoolsCompose).toHaveBeenCalled() // @remap-prod-remove-line-line
@@ -330,7 +331,7 @@ describe('configureStore', async () => {
330331
it("doesn't warn when middleware enhancer is excluded if no middlewares provided", () => {
331332
const store = configureStore({
332333
reducer,
333-
middleware: new Tuple(),
334+
middleware: () => new Tuple(),
334335
enhancers: () => new Tuple(dummyEnhancer),
335336
})
336337

packages/toolkit/src/tests/configureStore.typetest.ts

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -74,19 +74,19 @@ const _anyMiddleware: any = () => () => () => {}
7474

7575
configureStore({
7676
reducer: () => 0,
77-
middleware: new Tuple(middleware),
77+
middleware: () => new Tuple(middleware),
7878
})
7979

8080
configureStore({
8181
reducer: () => 0,
8282
// @ts-expect-error
83-
middleware: [middleware],
83+
middleware: () => [middleware],
8484
})
8585

8686
configureStore({
8787
reducer: () => 0,
8888
// @ts-expect-error
89-
middleware: new Tuple('not middleware'),
89+
middleware: () => new Tuple('not middleware'),
9090
})
9191
}
9292

@@ -520,7 +520,7 @@ const _anyMiddleware: any = () => () => () => {}
520520
{
521521
const store = configureStore({
522522
reducer: reducerA,
523-
middleware: new Tuple(),
523+
middleware: () => new Tuple(),
524524
})
525525
// @ts-expect-error
526526
store.dispatch(thunkA())
@@ -533,7 +533,7 @@ const _anyMiddleware: any = () => () => () => {}
533533
{
534534
const store = configureStore({
535535
reducer: reducerA,
536-
middleware: new Tuple(thunk as ThunkMiddleware<StateA>),
536+
middleware: () => new Tuple(thunk as ThunkMiddleware<StateA>),
537537
})
538538
store.dispatch(thunkA())
539539
// @ts-expect-error
@@ -545,9 +545,8 @@ const _anyMiddleware: any = () => () => () => {}
545545
{
546546
const store = configureStore({
547547
reducer: reducerA,
548-
middleware: new Tuple(
549-
0 as unknown as Middleware<(a: StateA) => boolean, StateA>
550-
),
548+
middleware: () =>
549+
new Tuple(0 as unknown as Middleware<(a: StateA) => boolean, StateA>),
551550
})
552551
const result: boolean = store.dispatch(5)
553552
// @ts-expect-error
@@ -566,7 +565,7 @@ const _anyMiddleware: any = () => () => () => {}
566565
>
567566
const store = configureStore({
568567
reducer: reducerA,
569-
middleware,
568+
middleware: () => middleware,
570569
})
571570

572571
const result: 'A' = store.dispatch('a')

packages/toolkit/src/tests/getDefaultMiddleware.test.ts

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -147,17 +147,18 @@ describe('getDefaultMiddleware', () => {
147147
it('allows passing options to immutableCheck', () => {
148148
let immutableCheckWasCalled = false
149149

150-
const middleware = getDefaultMiddleware({
151-
thunk: false,
152-
immutableCheck: {
153-
isImmutable: () => {
154-
immutableCheckWasCalled = true
155-
return true
150+
const middleware = () =>
151+
getDefaultMiddleware({
152+
thunk: false,
153+
immutableCheck: {
154+
isImmutable: () => {
155+
immutableCheckWasCalled = true
156+
return true
157+
},
156158
},
157-
},
158-
serializableCheck: false,
159-
actionCreatorCheck: false,
160-
})
159+
serializableCheck: false,
160+
actionCreatorCheck: false,
161+
})
161162

162163
const reducer = () => ({})
163164

@@ -172,17 +173,18 @@ describe('getDefaultMiddleware', () => {
172173
it('allows passing options to serializableCheck', () => {
173174
let serializableCheckWasCalled = false
174175

175-
const middleware = getDefaultMiddleware({
176-
thunk: false,
177-
immutableCheck: false,
178-
serializableCheck: {
179-
isSerializable: () => {
180-
serializableCheckWasCalled = true
181-
return true
176+
const middleware = () =>
177+
getDefaultMiddleware({
178+
thunk: false,
179+
immutableCheck: false,
180+
serializableCheck: {
181+
isSerializable: () => {
182+
serializableCheckWasCalled = true
183+
return true
184+
},
182185
},
183-
},
184-
actionCreatorCheck: false,
185-
})
186+
actionCreatorCheck: false,
187+
})
186188

187189
const reducer = () => ({})
188190

@@ -200,17 +202,18 @@ describe('getDefaultMiddleware', () => {
200202
it('allows passing options to actionCreatorCheck', () => {
201203
let actionCreatorCheckWasCalled = false
202204

203-
const middleware = getDefaultMiddleware({
204-
thunk: false,
205-
immutableCheck: false,
206-
serializableCheck: false,
207-
actionCreatorCheck: {
208-
isActionCreator: (action: unknown): action is Function => {
209-
actionCreatorCheckWasCalled = true
210-
return false
205+
const middleware = () =>
206+
getDefaultMiddleware({
207+
thunk: false,
208+
immutableCheck: false,
209+
serializableCheck: false,
210+
actionCreatorCheck: {
211+
isActionCreator: (action: unknown): action is Function => {
212+
actionCreatorCheckWasCalled = true
213+
return false
214+
},
211215
},
212-
},
213-
})
216+
})
214217

215218
const reducer = () => ({})
216219

0 commit comments

Comments
 (0)