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