import type { Middleware, AnyAction } from 'redux' import type { ThunkMiddleware } from 'redux-thunk' import thunkMiddleware from 'redux-thunk' import type { ImmutableStateInvariantMiddlewareOptions } from './immutableStateInvariantMiddleware' /* PROD_START_REMOVE_UMD */ import { createImmutableStateInvariantMiddleware } from './immutableStateInvariantMiddleware' /* PROD_STOP_REMOVE_UMD */ import type { SerializableStateInvariantMiddlewareOptions } from './serializableStateInvariantMiddleware' import { createSerializableStateInvariantMiddleware } from './serializableStateInvariantMiddleware' import { MiddlewareArray } from './utils' function isBoolean(x: any): x is boolean { return typeof x === 'boolean' } interface ThunkOptions { extraArgument: E } interface GetDefaultMiddlewareOptions { thunk?: boolean | ThunkOptions immutableCheck?: boolean | ImmutableStateInvariantMiddlewareOptions serializableCheck?: boolean | SerializableStateInvariantMiddlewareOptions } export type ThunkMiddlewareFor< S, O extends GetDefaultMiddlewareOptions = {} > = O extends { thunk: false } ? never : O extends { thunk: { extraArgument: infer E } } ? ThunkMiddleware : | ThunkMiddleware //The ThunkMiddleware with a `null` ExtraArgument is here to provide backwards-compatibility. | ThunkMiddleware export type CurriedGetDefaultMiddleware = < O extends Partial = { thunk: true immutableCheck: true serializableCheck: true } >( options?: O ) => MiddlewareArray | ThunkMiddlewareFor> export function curryGetDefaultMiddleware< S = any >(): CurriedGetDefaultMiddleware { return function curriedGetDefaultMiddleware(options) { return getDefaultMiddleware(options) } } /** * Returns any array containing the default middleware installed by * `configureStore()`. Useful if you want to configure your store with a custom * `middleware` array but still keep the default set. * * @return The default middleware used by `configureStore()`. * * @public * * @deprecated Prefer to use the callback notation for the `middleware` option in `configureStore` * to access a pre-typed `getDefaultMiddleware` instead. */ export function getDefaultMiddleware< S = any, O extends Partial = { thunk: true immutableCheck: true serializableCheck: true } >( options: O = {} as O ): MiddlewareArray | ThunkMiddlewareFor> { const { thunk = true, immutableCheck = true, serializableCheck = true, } = options let middlewareArray: Middleware<{}, S>[] = new MiddlewareArray() if (thunk) { if (isBoolean(thunk)) { middlewareArray.push(thunkMiddleware) } else { middlewareArray.push( thunkMiddleware.withExtraArgument(thunk.extraArgument) ) } } if (process.env.NODE_ENV !== 'production') { if (immutableCheck) { /* PROD_START_REMOVE_UMD */ let immutableOptions: ImmutableStateInvariantMiddlewareOptions = {} if (!isBoolean(immutableCheck)) { immutableOptions = immutableCheck } middlewareArray.unshift( createImmutableStateInvariantMiddleware(immutableOptions) ) /* PROD_STOP_REMOVE_UMD */ } if (serializableCheck) { let serializableOptions: SerializableStateInvariantMiddlewareOptions = {} if (!isBoolean(serializableCheck)) { serializableOptions = serializableCheck } middlewareArray.push( createSerializableStateInvariantMiddleware(serializableOptions) ) } } return middlewareArray as any }