UNPKG

3.55 kBPlain TextView Raw
1import { Middleware, AnyAction } from 'redux'
2import thunkMiddleware, { ThunkMiddleware } from 'redux-thunk'
3import {
4 /* PROD_START_REMOVE_UMD */
5 createImmutableStateInvariantMiddleware,
6 /* PROD_STOP_REMOVE_UMD */
7 ImmutableStateInvariantMiddlewareOptions
8} from './immutableStateInvariantMiddleware'
9
10import {
11 createSerializableStateInvariantMiddleware,
12 SerializableStateInvariantMiddlewareOptions
13} from './serializableStateInvariantMiddleware'
14import { MiddlewareArray } from './utils'
15
16function isBoolean(x: any): x is boolean {
17 return typeof x === 'boolean'
18}
19
20interface ThunkOptions<E = any> {
21 extraArgument: E
22}
23
24interface GetDefaultMiddlewareOptions {
25 thunk?: boolean | ThunkOptions
26 immutableCheck?: boolean | ImmutableStateInvariantMiddlewareOptions
27 serializableCheck?: boolean | SerializableStateInvariantMiddlewareOptions
28}
29
30export type ThunkMiddlewareFor<
31 S,
32 O extends GetDefaultMiddlewareOptions = {}
33> = O extends {
34 thunk: false
35}
36 ? never
37 : O extends { thunk: { extraArgument: infer E } }
38 ? ThunkMiddleware<S, AnyAction, E>
39 :
40 | ThunkMiddleware<S, AnyAction, null> //The ThunkMiddleware with a `null` ExtraArgument is here to provide backwards-compatibility.
41 | ThunkMiddleware<S, AnyAction>
42
43export type CurriedGetDefaultMiddleware<S = any> = <
44 O extends Partial<GetDefaultMiddlewareOptions> = {
45 thunk: true
46 immutableCheck: true
47 serializableCheck: true
48 }
49>(
50 options?: O
51) => MiddlewareArray<Middleware<{}, S> | ThunkMiddlewareFor<S, O>>
52
53export function curryGetDefaultMiddleware<
54 S = any
55>(): CurriedGetDefaultMiddleware<S> {
56 return function curriedGetDefaultMiddleware(options) {
57 return getDefaultMiddleware(options)
58 }
59}
60
61/**
62 * Returns any array containing the default middleware installed by
63 * `configureStore()`. Useful if you want to configure your store with a custom
64 * `middleware` array but still keep the default set.
65 *
66 * @return The default middleware used by `configureStore()`.
67 *
68 * @public
69 */
70export function getDefaultMiddleware<
71 S = any,
72 O extends Partial<GetDefaultMiddlewareOptions> = {
73 thunk: true
74 immutableCheck: true
75 serializableCheck: true
76 }
77>(
78 options: O = {} as O
79): MiddlewareArray<Middleware<{}, S> | ThunkMiddlewareFor<S, O>> {
80 const {
81 thunk = true,
82 immutableCheck = true,
83 serializableCheck = true
84 } = options
85
86 let middlewareArray: Middleware<{}, S>[] = new MiddlewareArray()
87
88 if (thunk) {
89 if (isBoolean(thunk)) {
90 middlewareArray.push(thunkMiddleware)
91 } else {
92 middlewareArray.push(
93 thunkMiddleware.withExtraArgument(thunk.extraArgument)
94 )
95 }
96 }
97
98 if (process.env.NODE_ENV !== 'production') {
99 if (immutableCheck) {
100 /* PROD_START_REMOVE_UMD */
101 let immutableOptions: ImmutableStateInvariantMiddlewareOptions = {}
102
103 if (!isBoolean(immutableCheck)) {
104 immutableOptions = immutableCheck
105 }
106
107 middlewareArray.unshift(
108 createImmutableStateInvariantMiddleware(immutableOptions)
109 )
110 /* PROD_STOP_REMOVE_UMD */
111 }
112
113 if (serializableCheck) {
114 let serializableOptions: SerializableStateInvariantMiddlewareOptions = {}
115
116 if (!isBoolean(serializableCheck)) {
117 serializableOptions = serializableCheck
118 }
119
120 middlewareArray.push(
121 createSerializableStateInvariantMiddleware(serializableOptions)
122 )
123 }
124 }
125
126 return middlewareArray as any
127}