UNPKG

3.77 kBPlain TextView Raw
1import type { Middleware, AnyAction } from 'redux'
2import type { ThunkMiddleware } from 'redux-thunk'
3import thunkMiddleware from 'redux-thunk'
4import type { ImmutableStateInvariantMiddlewareOptions } from './immutableStateInvariantMiddleware'
5/* PROD_START_REMOVE_UMD */
6import { createImmutableStateInvariantMiddleware } from './immutableStateInvariantMiddleware'
7/* PROD_STOP_REMOVE_UMD */
8
9import type { SerializableStateInvariantMiddlewareOptions } from './serializableStateInvariantMiddleware'
10import { createSerializableStateInvariantMiddleware } from './serializableStateInvariantMiddleware'
11import type { ExcludeFromTuple } from './tsHelpers'
12import { MiddlewareArray } from './utils'
13
14function isBoolean(x: any): x is boolean {
15 return typeof x === 'boolean'
16}
17
18interface ThunkOptions<E = any> {
19 extraArgument: E
20}
21
22interface GetDefaultMiddlewareOptions {
23 thunk?: boolean | ThunkOptions
24 immutableCheck?: boolean | ImmutableStateInvariantMiddlewareOptions
25 serializableCheck?: boolean | SerializableStateInvariantMiddlewareOptions
26}
27
28export 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
39export 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
49export function curryGetDefaultMiddleware<
50 S = any
51>(): CurriedGetDefaultMiddleware<S> {
52 return function curriedGetDefaultMiddleware(options) {
53 return getDefaultMiddleware(options)
54 }
55}
56
57/**
58 * Returns any array containing the default middleware installed by
59 * `configureStore()`. Useful if you want to configure your store with a custom
60 * `middleware` array but still keep the default set.
61 *
62 * @return The default middleware used by `configureStore()`.
63 *
64 * @public
65 *
66 * @deprecated Prefer to use the callback notation for the `middleware` option in `configureStore`
67 * to access a pre-typed `getDefaultMiddleware` instead.
68 */
69export 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 /* PROD_START_REMOVE_UMD */
100 let immutableOptions: ImmutableStateInvariantMiddlewareOptions = {}
101
102 if (!isBoolean(immutableCheck)) {
103 immutableOptions = immutableCheck
104 }
105
106 middlewareArray.unshift(
107 createImmutableStateInvariantMiddleware(immutableOptions)
108 )
109 /* PROD_STOP_REMOVE_UMD */
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}