1 | import { Middleware, AnyAction } from 'redux'
|
2 | import thunkMiddleware, { ThunkMiddleware } from 'redux-thunk'
|
3 | import {
|
4 |
|
5 | createImmutableStateInvariantMiddleware,
|
6 |
|
7 | ImmutableStateInvariantMiddlewareOptions
|
8 | } from './immutableStateInvariantMiddleware'
|
9 |
|
10 | import {
|
11 | createSerializableStateInvariantMiddleware,
|
12 | SerializableStateInvariantMiddlewareOptions
|
13 | } from './serializableStateInvariantMiddleware'
|
14 | import { MiddlewareArray } from './utils'
|
15 |
|
16 | function isBoolean(x: any): x is boolean {
|
17 | return typeof x === 'boolean'
|
18 | }
|
19 |
|
20 | interface ThunkOptions<E = any> {
|
21 | extraArgument: E
|
22 | }
|
23 |
|
24 | interface GetDefaultMiddlewareOptions {
|
25 | thunk?: boolean | ThunkOptions
|
26 | immutableCheck?: boolean | ImmutableStateInvariantMiddlewareOptions
|
27 | serializableCheck?: boolean | SerializableStateInvariantMiddlewareOptions
|
28 | }
|
29 |
|
30 | export 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>
|
41 | | ThunkMiddleware<S, AnyAction>
|
42 |
|
43 | export 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 |
|
53 | export function curryGetDefaultMiddleware<
|
54 | S = any
|
55 | >(): CurriedGetDefaultMiddleware<S> {
|
56 | return function curriedGetDefaultMiddleware(options) {
|
57 | return getDefaultMiddleware(options)
|
58 | }
|
59 | }
|
60 |
|
61 |
|
62 |
|
63 |
|
64 |
|
65 |
|
66 |
|
67 |
|
68 |
|
69 |
|
70 | export 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 |
|
101 | let immutableOptions: ImmutableStateInvariantMiddlewareOptions = {}
|
102 |
|
103 | if (!isBoolean(immutableCheck)) {
|
104 | immutableOptions = immutableCheck
|
105 | }
|
106 |
|
107 | middlewareArray.unshift(
|
108 | createImmutableStateInvariantMiddleware(immutableOptions)
|
109 | )
|
110 |
|
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 | }
|