diff --git a/package.json b/package.json index 7c22eead3932ca..32dadf55d2d09a 100644 --- a/package.json +++ b/package.json @@ -364,7 +364,7 @@ "@opentelemetry/resources": "^1.4.0", "@opentelemetry/sdk-metrics-base": "^0.30.0", "@opentelemetry/semantic-conventions": "^1.4.0", - "@reduxjs/toolkit": "^1.6.1", + "@reduxjs/toolkit": "1.7.2", "@slack/webhook": "^5.0.4", "@tanstack/react-query": "^4.2.1", "@tanstack/react-query-devtools": "^4.2.1", @@ -443,7 +443,7 @@ "https-proxy-agent": "^5.0.0", "i18n-iso-countries": "^4.3.1", "icalendar": "0.7.1", - "immer": "^9.0.6", + "immer": "^9.0.15", "inquirer": "^7.3.3", "intl": "^1.2.5", "intl-format-cache": "^2.1.0", @@ -544,18 +544,18 @@ "react-visibility-sensor": "^5.1.1", "recompose": "^0.30.0", "reduce-reducers": "^1.0.4", - "redux": "^4.1.0", + "redux": "^4.2.0", "redux-actions": "^2.6.5", "redux-devtools-extension": "^2.13.8", "redux-logger": "^3.0.6", "redux-observable": "2.0.0", "redux-saga": "^1.1.3", - "redux-thunk": "^2.3.0", + "redux-thunk": "^2.4.1", "redux-thunks": "^1.0.0", "remark-parse": "^8.0.3", "remark-stringify": "^8.0.3", "require-in-the-middle": "^5.1.0", - "reselect": "^4.0.0", + "reselect": "^4.1.6", "resize-observer-polyfill": "^1.5.1", "rison-node": "1.0.2", "rrule": "2.6.4", diff --git a/packages/kbn-test-jest-helpers/BUILD.bazel b/packages/kbn-test-jest-helpers/BUILD.bazel index f25123f3f636dc..3ac64fc5d52f0b 100644 --- a/packages/kbn-test-jest-helpers/BUILD.bazel +++ b/packages/kbn-test-jest-helpers/BUILD.bazel @@ -108,7 +108,6 @@ TYPES_DEPS = [ "@npm//@types/prettier", "@npm//@types/react", "@npm//@types/react-dom", - "@npm//@types/react-redux", "@npm//@types/react-router-dom", "@npm//@types/semver", "@npm//@types/xml2js", diff --git a/packages/kbn-test/BUILD.bazel b/packages/kbn-test/BUILD.bazel index 7094425f81f9fb..4397def4140507 100644 --- a/packages/kbn-test/BUILD.bazel +++ b/packages/kbn-test/BUILD.bazel @@ -121,7 +121,6 @@ TYPES_DEPS = [ "@npm//@types/node", "@npm//@types/prettier", "@npm//@types/react-dom", - "@npm//@types/react-redux", "@npm//@types/react-router-dom", "@npm//@types/semver", "@npm//@types/supertest", diff --git a/renovate.json b/renovate.json index 7f60faf4a0a62f..b5523536465fd3 100644 --- a/renovate.json +++ b/renovate.json @@ -191,6 +191,22 @@ "matchBaseBranches": ["main"], "labels": ["release_note:skip", "backport:skip", "ci:all-cypress-suites"], "enabled": true + }, + { + "groupName": "redux", + "packageNames": ["redux", "react-redux"], + "reviewers":[ + "team:enterprise-search-frontend", + "team:kibana-presentation", + "team:kibana-data-discovery", + "team:platform-deployment-management", + "team:infra-monitoring-ui", + "team:kibana-gis", + "team:security-solution" + ], + "matchBaseBranches": ["main"], + "labels": ["release_note:skip", "backport:skip", "ci:all-cypress-suites"], + "enabled": true } ] } diff --git a/x-pack/plugins/security_solution/public/common/store/types.ts b/x-pack/plugins/security_solution/public/common/store/types.ts index 544bdb765e090d..2a7717da699686 100644 --- a/x-pack/plugins/security_solution/public/common/store/types.ts +++ b/x-pack/plugins/security_solution/public/common/store/types.ts @@ -22,7 +22,7 @@ import type { ManagementPluginState } from '../../management'; import type { UsersPluginState } from '../../users/store'; import type { GlobalUrlParam } from './global_url_param'; -export type StoreState = HostsPluginState & +export type State = HostsPluginState & UsersPluginState & NetworkPluginState & UsersPluginState & @@ -34,13 +34,6 @@ export type StoreState = HostsPluginState & sourcerer: SourcererState; globalUrlParam: GlobalUrlParam; }; -/** - * The redux `State` type for the Security App. - * We use `CombinedState` to wrap our shape because we create our reducer using `combineReducers`. - * `combineReducers` returns a type wrapped in `CombinedState`. - * `CombinedState` is required for redux to know what keys to make optional when preloaded state into a store. - */ -export type State = CombinedState; /** * like redux's `MiddlewareAPI` but `getState` returns an `Immutable` version of diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts index 1cdb4d495d1316..7665de64fa2463 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts @@ -174,7 +174,7 @@ export const showView: (state: EndpointState) => EndpointIndexUIQueryParams['sho * Returns the Host Status which is connected the fleet agent */ export const hostStatusInfo: (state: Immutable) => HostStatus = createSelector( - (state) => state.hostStatus, + (state: Immutable) => state.hostStatus, (hostStatus) => { return hostStatus ? hostStatus : HostStatus.UNHEALTHY; } @@ -184,7 +184,7 @@ export const hostStatusInfo: (state: Immutable) => HostStatus = c * Returns the Policy Response overall status */ export const policyResponseStatus: (state: Immutable) => string = createSelector( - (state) => state.policyResponse, + (state: Immutable) => state.policyResponse, (policyResponse) => { return (policyResponse && policyResponse?.Endpoint?.policy?.applied?.status) || ''; } diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_details/selectors/policy_settings_selectors.ts b/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_details/selectors/policy_settings_selectors.ts index 04c5934a5b334e..97d6886a49d371 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_details/selectors/policy_settings_selectors.ts +++ b/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_details/selectors/policy_settings_selectors.ts @@ -105,7 +105,7 @@ export const license = (state: Immutable) => { /** Returns the policyId from the url */ export const policyIdFromParams: (state: Immutable) => string = createSelector( - (state) => state.location, + (state: Immutable) => state.location, (location: PolicyDetailsState['location']) => { return ( matchPath(location?.pathname ?? '', { diff --git a/x-pack/plugins/security_solution/public/network/containers/tls/index.tsx b/x-pack/plugins/security_solution/public/network/containers/tls/index.tsx index 9d13900619a08e..5568488fd0caa4 100644 --- a/x-pack/plugins/security_solution/public/network/containers/tls/index.tsx +++ b/x-pack/plugins/security_solution/public/network/containers/tls/index.tsx @@ -62,9 +62,7 @@ export const useNetworkTls = ({ type, }: UseNetworkTls): [boolean, NetworkTlsArgs] => { const getTlsSelector = useMemo(() => networkSelectors.tlsSelector(), []); - const { activePage, limit, sort } = useDeepEqualSelector((state) => - getTlsSelector(state, type, flowTarget) - ); + const { activePage, limit, sort } = useDeepEqualSelector((state) => getTlsSelector(state, type)); const [networkTlsRequest, setNetworkTlsRequest] = useState(null); diff --git a/x-pack/plugins/security_solution/public/resolver/store/camera/selectors.ts b/x-pack/plugins/security_solution/public/resolver/store/camera/selectors.ts index e022f9d5d3b981..9f6aba90d00b78 100644 --- a/x-pack/plugins/security_solution/public/resolver/store/camera/selectors.ts +++ b/x-pack/plugins/security_solution/public/resolver/store/camera/selectors.ts @@ -64,8 +64,8 @@ function animationIsActive(animation: CameraAnimationState, time: number): boole * */ export const scale: (state: CameraState) => (time: number) => Vector2 = createSelector( - (state) => state.scalingFactor, - (state) => state.animation, + (state: CameraState) => state.scalingFactor, + (state: CameraState) => state.animation, (scalingFactor, animation) => { const scaleNotCountingAnimation = scaleFromScalingFactor(scalingFactor); /** @@ -277,7 +277,7 @@ export const scale: (state: CameraState) => (time: number) => Vector2 = createSe */ export const clippingPlanes: (state: CameraState) => (time: number) => ClippingPlanes = createSelector( - (state) => state.rasterSize, + (state: CameraState) => state.rasterSize, scale, (rasterSize, scaleAtTime) => /** @@ -305,7 +305,7 @@ export const clippingPlanes: (state: CameraState) => (time: number) => ClippingP * Whether or not the camera is animating, at a given time. */ export const isAnimating: (state: CameraState) => (time: number) => boolean = createSelector( - (state) => state.animation, + (state: CameraState) => state.animation, (animation) => (time) => { return animation !== undefined && animationIsActive(animation, time); } @@ -324,10 +324,10 @@ export const isAnimating: (state: CameraState) => (time: number) => boolean = cr * We could update the translation as the user moved the mouse but floating point drift (round-off error) could occur. */ export const translation: (state: CameraState) => (time: number) => Vector2 = createSelector( - (state) => state.panning, - (state) => state.translationNotCountingCurrentPanning, + (state: CameraState) => state.panning, + (state: CameraState) => state.translationNotCountingCurrentPanning, scale, - (state) => state.animation, + (state: CameraState) => state.animation, (panning, translationNotCountingCurrentPanning, scaleAtTime, animation) => { /** * Memoizing this for object reference equality. diff --git a/x-pack/plugins/security_solution/public/resolver/store/data/selectors.ts b/x-pack/plugins/security_solution/public/resolver/store/data/selectors.ts index 2aaf6206b06bc8..72afd77482c8fb 100644 --- a/x-pack/plugins/security_solution/public/resolver/store/data/selectors.ts +++ b/x-pack/plugins/security_solution/public/resolver/store/data/selectors.ts @@ -554,28 +554,9 @@ export const nodesAndEdgelines: (state: DataState) => ( processNodePositions: visibleProcessNodePositions, connectingEdgeLineSegments, }; - }, aaBBEqualityCheck); + }, aabbModel.isEqual); }); -function isAABBType(value: unknown): value is AABB { - const castValue = value as AABB; - return castValue.maximum !== undefined && castValue.minimum !== undefined; -} - -/** - * This is needed to avoid the TS error that is caused by using aabbModel.isEqual directly. Ideally we could - * just pass that function instead of having to check the type of the parameters. It might be worth doing a PR to - * the reselect library to correct the type. - */ -function aaBBEqualityCheck(a: T, b: T, index: number): boolean { - if (isAABBType(a) && isAABBType(b)) { - return aabbModel.isEqual(a, b); - } else { - // this is equivalent to the default equality check for defaultMemoize - return a === b; - } -} - /** * If there is a pending request that's for a entity ID that doesn't matche the `entityID`, then we should cancel it. */ diff --git a/x-pack/plugins/security_solution/public/resolver/store/selectors.ts b/x-pack/plugins/security_solution/public/resolver/store/selectors.ts index 60e8507ba1bc3b..1940e680e1b56e 100644 --- a/x-pack/plugins/security_solution/public/resolver/store/selectors.ts +++ b/x-pack/plugins/security_solution/public/resolver/store/selectors.ts @@ -9,7 +9,13 @@ import { createSelector, defaultMemoize } from 'reselect'; import * as cameraSelectors from './camera/selectors'; import * as dataSelectors from './data/selectors'; import * as uiSelectors from './ui/selectors'; -import type { ResolverState, IsometricTaxiLayout, DataState } from '../types'; +import type { + ResolverState, + IsometricTaxiLayout, + DataState, + VisibleEntites, + NodeData, +} from '../types'; import type { EventStats } from '../../../common/endpoint/types'; import * as nodeModel from '../../../common/endpoint/models/node'; @@ -211,14 +217,9 @@ export const statsTotalForNode = composeSelectors( export const visibleNodesAndEdgeLines = createSelector( nodesAndEdgelines, boundingBox, - function ( - /* eslint-disable @typescript-eslint/no-shadow */ - nodesAndEdgelines, - boundingBox - /* eslint-enable @typescript-eslint/no-shadow */ - ) { + function (nodesAndEdgelinesFn, boundingBoxFn) { // `boundingBox` and `nodesAndEdgelines` are each memoized. - return (time: number) => nodesAndEdgelines(boundingBox(time)); + return (time: number) => nodesAndEdgelinesFn(boundingBoxFn(time)); } ); @@ -240,12 +241,13 @@ export const originID: (state: ResolverState) => string | undefined = composeSel * Takes a nodeID (aka entity_id) and returns the node ID of the node that aria should 'flowto' or null * If the node has a flowto candidate that is currently visible, that will be returned, otherwise null. */ -export const ariaFlowtoNodeID: ( - state: ResolverState -) => (time: number) => (nodeID: string) => string | null = createSelector( +export const ariaFlowtoNodeID = createSelector( visibleNodesAndEdgeLines, composeSelectors(dataStateSelector, dataSelectors.ariaFlowtoCandidate), - (visibleNodesAndEdgeLinesAtTime, ariaFlowtoCandidate) => { + function ( + visibleNodesAndEdgeLinesAtTime: (time: number) => VisibleEntites, + ariaFlowtoCandidate: (nodeId: string) => string | null + ) { return defaultMemoize((time: number) => { // get the visible nodes at `time` const { processNodePositions } = visibleNodesAndEdgeLinesAtTime(time); @@ -361,7 +363,10 @@ export const newIDsToRequest: (state: ResolverState) => (time: number) => Set dataState.nodeData), visibleNodesAndEdgeLines, - function (nodeData, visibleNodesAndEdgeLinesAtTime) { + function ( + nodeData: Map | undefined, + visibleNodesAndEdgeLinesAtTime: (time: number) => VisibleEntites + ) { return defaultMemoize((time: number) => { const { processNodePositions: nodesInView } = visibleNodesAndEdgeLinesAtTime(time); diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/state/root_reducer.ts b/x-pack/plugins/synthetics/public/apps/synthetics/state/root_reducer.ts index 8fbb92efaaa989..34e036bf6fac44 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/state/root_reducer.ts +++ b/x-pack/plugins/synthetics/public/apps/synthetics/state/root_reducer.ts @@ -7,16 +7,30 @@ import { combineReducers } from '@reduxjs/toolkit'; -import { syntheticsMonitorReducer } from './monitor_summary/synthetics_montior_reducer'; -import { monitorStatusReducer } from './monitor_summary'; -import { uiReducer } from './ui'; -import { indexStatusReducer } from './index_status'; -import { syntheticsEnablementReducer } from './synthetics_enablement'; -import { monitorListReducer } from './monitor_list'; -import { serviceLocationsReducer } from './service_locations'; -import { monitorOverviewReducer } from './overview'; +import { + syntheticsMonitorReducer, + SyntheticsMonitorState, +} from './monitor_summary/synthetics_montior_reducer'; +import { monitorStatusReducer, MonitorSummaryState } from './monitor_summary'; +import { uiReducer, UiState } from './ui'; +import { indexStatusReducer, IndexStatusState } from './index_status'; +import { syntheticsEnablementReducer, SyntheticsEnablementState } from './synthetics_enablement'; +import { monitorListReducer, MonitorListState } from './monitor_list'; +import { serviceLocationsReducer, ServiceLocationsState } from './service_locations'; +import { monitorOverviewReducer, MonitorOverviewState } from './overview'; -export const rootReducer = combineReducers({ +export interface SyntheticsAppState { + ui: UiState; + indexStatus: IndexStatusState; + syntheticsEnablement: SyntheticsEnablementState; + monitorList: MonitorListState; + serviceLocations: ServiceLocationsState; + monitorStatus: MonitorSummaryState; + syntheticsMonitor: SyntheticsMonitorState; + overview: MonitorOverviewState; +} + +export const rootReducer = combineReducers({ ui: uiReducer, indexStatus: indexStatusReducer, syntheticsEnablement: syntheticsEnablementReducer, @@ -26,5 +40,3 @@ export const rootReducer = combineReducers({ syntheticsMonitor: syntheticsMonitorReducer, overview: monitorOverviewReducer, }); - -export type SyntheticsAppState = ReturnType; diff --git a/x-pack/plugins/synthetics/public/legacy_uptime/state/index.ts b/x-pack/plugins/synthetics/public/legacy_uptime/state/index.ts index 9d4fa202b3d1a6..cb67df714dbc85 100644 --- a/x-pack/plugins/synthetics/public/legacy_uptime/state/index.ts +++ b/x-pack/plugins/synthetics/public/legacy_uptime/state/index.ts @@ -11,9 +11,9 @@ import { composeWithDevTools } from 'redux-devtools-extension'; import createSagaMiddleware from 'redux-saga'; import { Storage } from '@kbn/kibana-utils-plugin/public'; import { rootEffect } from './effects'; -import { rootReducer } from './reducers'; +import { rootReducer, RootState } from './reducers'; -export type AppState = ReturnType; +export type AppState = RootState; const sagaMW = createSagaMiddleware(); diff --git a/x-pack/plugins/synthetics/public/legacy_uptime/state/reducers/index.ts b/x-pack/plugins/synthetics/public/legacy_uptime/state/reducers/index.ts index 4c011a86e44209..dc4db2d58ac61c 100644 --- a/x-pack/plugins/synthetics/public/legacy_uptime/state/reducers/index.ts +++ b/x-pack/plugins/synthetics/public/legacy_uptime/state/reducers/index.ts @@ -6,27 +6,50 @@ */ import { combineReducers } from 'redux'; -import { agentPoliciesReducer } from '../private_locations'; -import { monitorReducer } from './monitor'; -import { uiReducer } from './ui'; -import { monitorStatusReducer } from './monitor_status'; -import { monitorListReducer } from './monitor_list'; -import { dynamicSettingsReducer } from './dynamic_settings'; -import { pingReducer } from './ping'; -import { pingListReducer } from './ping_list'; -import { monitorDurationReducer } from './monitor_duration'; -import { indexStatusReducer } from './index_status'; -import { mlJobsReducer } from './ml_anomaly'; -import { certificatesReducer } from '../certificates/certificates'; +import { agentPoliciesReducer, AgentPoliciesState } from '../private_locations'; +import { monitorReducer, MonitorState } from './monitor'; +import { uiReducer, UiState } from './ui'; +import { monitorStatusReducer, MonitorStatusState } from './monitor_status'; +import { monitorListReducer, MonitorList } from './monitor_list'; +import { dynamicSettingsReducer, DynamicSettingsState } from './dynamic_settings'; +import { pingReducer, PingState } from './ping'; +import { pingListReducer, PingListState } from './ping_list'; +import { monitorDurationReducer, MonitorDuration } from './monitor_duration'; +import { indexStatusReducer, IndexStatusState } from './index_status'; +import { mlJobsReducer, MLJobState } from './ml_anomaly'; +import { certificatesReducer, CertificatesState } from '../certificates/certificates'; import { selectedFiltersReducer } from './selected_filters'; -import { alertsReducer } from '../alerts/alerts'; -import { journeyReducer } from './journey'; -import { networkEventsReducer } from './network_events'; -import { syntheticsReducer } from './synthetics'; -import { monitorManagementListReducer } from './monitor_management'; -import { testNowRunsReducer } from './test_now_runs'; +import { SelectedFilters } from '../actions/selected_filters'; +import { alertsReducer, AlertState } from '../alerts/alerts'; +import { JourneyKVP, journeyReducer } from './journey'; +import { networkEventsReducer, NetworkEventsState } from './network_events'; +import { syntheticsReducer, SyntheticsReducerState } from './synthetics'; +import { monitorManagementListReducer, MonitorManagementList } from './monitor_management'; +import { testNowRunsReducer, TestNowRunsState } from './test_now_runs'; -export const rootReducer = combineReducers({ +export interface RootState { + monitor: MonitorState; + ui: UiState; + monitorList: MonitorList; + monitorManagementList: MonitorManagementList; + monitorStatus: MonitorStatusState; + dynamicSettings: DynamicSettingsState; + ping: PingState; + pingList: PingListState; + ml: MLJobState; + monitorDuration: MonitorDuration; + indexStatus: IndexStatusState; + certificates: CertificatesState; + selectedFilters: SelectedFilters | null; + alerts: AlertState; + journeys: JourneyKVP; + networkEvents: NetworkEventsState; + synthetics: SyntheticsReducerState; + testNowRuns: TestNowRunsState; + agentPolicies: AgentPoliciesState; +} + +export const rootReducer = combineReducers({ monitor: monitorReducer, ui: uiReducer, monitorList: monitorListReducer, diff --git a/x-pack/plugins/timelines/public/hooks/use_selector.tsx b/x-pack/plugins/timelines/public/hooks/use_selector.tsx index 07e1e7d5cc2986..80f5a5905c95ce 100644 --- a/x-pack/plugins/timelines/public/hooks/use_selector.tsx +++ b/x-pack/plugins/timelines/public/hooks/use_selector.tsx @@ -8,7 +8,7 @@ import { shallowEqual, useSelector } from 'react-redux'; import deepEqual from 'fast-deep-equal'; -export type TypedUseSelectorHook = ( +export type TypedUseSelectorHook = >( selector: (state: TState) => TSelected, equalityFn?: (left: TSelected, right: TSelected) => boolean ) => TSelected; diff --git a/yarn.lock b/yarn.lock index d957cd7f99395a..c5e1ab95e5b7cf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4636,15 +4636,15 @@ resolved "https://registry.yarnpkg.com/@redux-saga/types/-/types-1.1.0.tgz#0e81ce56b4883b4b2a3001ebe1ab298b84237204" integrity sha512-afmTuJrylUU/0OtqzaRkbyYFFNgCF73Bvel/sw90pvGrWIZ+vyoIJqA6eMSoA6+nb443kTmulmBtC9NerXboNg== -"@reduxjs/toolkit@^1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.6.1.tgz#7bc83b47352a663bf28db01e79d17ba54b98ade9" - integrity sha512-pa3nqclCJaZPAyBhruQtiRwtTjottRrVJqziVZcWzI73i6L3miLTtUyWfauwv08HWtiXLx1xGyGt+yLFfW/d0A== +"@reduxjs/toolkit@1.7.2": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.7.2.tgz#b428aaef92582379464f9de698dbb71957eafb02" + integrity sha512-wwr3//Ar8ZhM9bS58O+HCIaMlR4Y6SNHfuszz9hKnQuFIKvwaL3Kmjo6fpDKUOjo4Lv54Yi299ed8rofCJ/Vjw== dependencies: - immer "^9.0.1" - redux "^4.1.0" - redux-thunk "^2.3.0" - reselect "^4.0.0" + immer "^9.0.7" + redux "^4.1.2" + redux-thunk "^2.4.1" + reselect "^4.1.5" "@samverschueren/stream-to-observable@^0.3.0": version "0.3.0" @@ -16829,10 +16829,10 @@ immediate@~3.0.5: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= -immer@^9.0.1, immer@^9.0.6: - version "9.0.6" - resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.6.tgz#7a96bf2674d06c8143e327cbf73539388ddf1a73" - integrity sha512-G95ivKpy+EvVAnAab4fVa4YGYn24J1SpEktnJX7JJ45Bd7xqME/SCplFzYFmTbrkwZbQ4xJK1xMTUYBkN6pWsQ== +immer@^9.0.15, immer@^9.0.7: + version "9.0.15" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.15.tgz#0b9169e5b1d22137aba7d43f8a81a495dd1b62dc" + integrity sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ== import-fresh@^2.0.0: version "2.0.0" @@ -20935,7 +20935,7 @@ oauth-sign@~0.9.0: object-assign@4.X, object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-assign@^3.0.0: version "3.0.0" @@ -23853,20 +23853,20 @@ redux-saga@^1.1.3: dependencies: "@redux-saga/core" "^1.1.3" -redux-thunk@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" - integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw== +redux-thunk@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.1.tgz#0dd8042cf47868f4b29699941de03c9301a75714" + integrity sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q== redux-thunks@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redux-thunks/-/redux-thunks-1.0.0.tgz#56e03b86d281a2664c884ab05c543d9ab1673658" integrity sha1-VuA7htKBomZMiEqwXFQ9mrFnNlg= -redux@^4.0.0, redux@^4.0.4, redux@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.1.1.tgz#76f1c439bb42043f985fbd9bf21990e60bd67f47" - integrity sha512-hZQZdDEM25UY2P493kPYuKqviVwZ58lEmGQNeQ+gXa+U0gYPUBf7NKYazbe3m+bs/DzM/ahN12DbF+NG8i0CWw== +redux@^4.0.0, redux@^4.0.4, redux@^4.1.2, redux@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.0.tgz#46f10d6e29b6666df758780437651eeb2b969f13" + integrity sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA== dependencies: "@babel/runtime" "^7.9.2" @@ -23912,9 +23912,9 @@ regenerator-runtime@^0.11.0: integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-runtime@^0.13.1, regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: - version "0.13.7" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" - integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== regenerator-transform@^0.15.0: version "0.15.0" @@ -24313,10 +24313,10 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= -reselect@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7" - integrity sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA== +reselect@^4.0.0, reselect@^4.1.5, reselect@^4.1.6: + version "4.1.6" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.6.tgz#19ca2d3d0b35373a74dc1c98692cdaffb6602656" + integrity sha512-ZovIuXqto7elwnxyXbBtCPo9YFEr3uJqj2rRbcOOog1bmu2Ag85M4hixSwFWyaBMKXNgvPaJ9OSu9SkBPIeJHQ== resize-observer-polyfill@^1.5.1: version "1.5.1"