UNPKG

1.36 kBJavaScriptView Raw
1import compose from './compose'
2
3/**
4 * Creates a store enhancer that applies middleware to the dispatch method
5 * of the Redux store. This is handy for a variety of tasks, such as expressing
6 * asynchronous actions in a concise manner, or logging every action payload.
7 *
8 * See `redux-thunk` package as an example of the Redux middleware.
9 *
10 * Because middleware is potentially asynchronous, this should be the first
11 * store enhancer in the composition chain.
12 *
13 * Note that each middleware will be given the `dispatch` and `getState` functions
14 * as named arguments.
15 *
16 * @param {...Function} middlewares The middleware chain to be applied.
17 * @returns {Function} A store enhancer applying the middleware.
18 */
19export default function applyMiddleware(...middlewares) {
20 return createStore => (...args) => {
21 const store = createStore(...args)
22 let dispatch = () => {
23 throw new Error(
24 `Dispatching while constructing your middleware is not allowed. ` +
25 `Other middleware would not be applied to this dispatch.`
26 )
27 }
28
29 const middlewareAPI = {
30 getState: store.getState,
31 dispatch: (...args) => dispatch(...args)
32 }
33 const chain = middlewares.map(middleware => middleware(middlewareAPI))
34 dispatch = compose(...chain)(store.dispatch)
35
36 return {
37 ...store,
38 dispatch
39 }
40 }
41}