Upgrade React-Redux (2nd attempt)

Summary:
- Update and include `react-redux` to Greenkeeper
- Remove legacy context which is used to access `store`
- Export `store` directly to use instead of legacy context

Note:
1st attempt: D18169584 -> got backouted in D18203354

Reviewed By: jknoxville

Differential Revision: D18297298

fbshipit-source-id: fd968f1b211eabb094113a0b35e84305f70117fc
This commit is contained in:
Chaiwat Ekkaewnumchai
2019-11-04 07:42:39 -08:00
committed by Facebook Github Bot
parent 61d4e0c6a5
commit c1130a167b
8 changed files with 264 additions and 253 deletions

View File

@@ -72,7 +72,7 @@
"@types/lodash.isequal": "^4.5.5", "@types/lodash.isequal": "^4.5.5",
"@types/react": "16.9.11", "@types/react": "16.9.11",
"@types/react-dom": "^16.9.2", "@types/react-dom": "^16.9.2",
"@types/react-redux": "^7.1.1", "@types/react-redux": "^7.1.5",
"@types/react-virtualized-auto-sizer": "^1.0.0", "@types/react-virtualized-auto-sizer": "^1.0.0",
"@types/react-window": "^1.8.1", "@types/react-window": "^1.8.1",
"@types/redux-persist": "^4.3.1", "@types/redux-persist": "^4.3.1",
@@ -155,7 +155,7 @@
"react-devtools-core": "^4.0.6", "react-devtools-core": "^4.0.6",
"react-dom": "^16.11.0", "react-dom": "^16.11.0",
"react-emotion": "^9.2.6", "react-emotion": "^9.2.6",
"react-redux": "^5.0.7", "react-redux": "^7.1.1",
"react-test-renderer": "^16.11.0", "react-test-renderer": "^16.11.0",
"react-transition-group": "^4.3.0", "react-transition-group": "^4.3.0",
"react-virtualized-auto-sizer": "^1.0.2", "react-virtualized-auto-sizer": "^1.0.2",
@@ -179,12 +179,10 @@
}, },
"greenkeeper": { "greenkeeper": {
"ignore": [ "ignore": [
"@types/react-redux",
"electron", "electron",
"electron-builder", "electron-builder",
"emotion", "emotion",
"react-emotion", "react-emotion",
"react-redux",
"tmp" "tmp"
] ]
}, },

View File

@@ -22,10 +22,10 @@ import {
colors, colors,
} from 'flipper'; } from 'flipper';
import {FlipperDevicePlugin, BaseAction} from './plugin'; import {FlipperDevicePlugin, BaseAction} from './plugin';
import {connect} from 'react-redux'; import {connect, ReactReduxContext} from 'react-redux';
import {store} from './init';
import React, {Component, Fragment} from 'react'; import React, {Component, Fragment} from 'react';
import {clipboard} from 'electron'; import {clipboard} from 'electron';
import PropTypes from 'prop-types';
import { import {
PluginNotification, PluginNotification,
clearAllNotifications, clearAllNotifications,
@@ -49,51 +49,54 @@ export default class Notifications<
static icon = 'bell'; static icon = 'bell';
static keyboardActions: KeyboardActions = ['clear']; static keyboardActions: KeyboardActions = ['clear'];
static contextTypes = {
store: PropTypes.object.isRequired,
};
static supportsDevice() { static supportsDevice() {
return false; return false;
} }
onKeyboardAction = (action: string) => { onKeyboardAction = (action: string) => {
if (action === 'clear') { if (action === 'clear') {
this.onClear(); this.onClear(store)();
} }
}; };
onClear = () => { onClear = (store: Store<StoreState>) => () => {
(this.context.store as Store<StoreState>).dispatch(clearAllNotifications()); store.dispatch(clearAllNotifications());
}; };
render() { render() {
const {blacklistedPlugins, blacklistedCategories} = (this.context
.store as Store<StoreState>).getState().notifications;
return ( return (
<ConnectedNotificationsTable <ReactReduxContext.Consumer>
onClear={this.onClear} {({store}) => {
selectedID={this.props.deepLinkPayload} const {blacklistedPlugins, blacklistedCategories} = (store as Store<
onSelectPlugin={this.props.selectPlugin} StoreState
logger={this.props.logger} >).getState().notifications;
defaultFilters={[ return (
...blacklistedPlugins.map(value => ({ <ConnectedNotificationsTable
value, onClear={this.onClear(store)}
type: 'exclude', selectedID={this.props.deepLinkPayload}
key: 'plugin', onSelectPlugin={this.props.selectPlugin}
})), logger={this.props.logger}
...blacklistedCategories.map(value => ({ defaultFilters={[
value, ...blacklistedPlugins.map(value => ({
type: 'exclude', value,
key: 'category', type: 'exclude',
})), key: 'plugin',
]} })),
actions={ ...blacklistedCategories.map(value => ({
<Fragment> value,
<Button onClick={this.onClear}>Clear</Button> type: 'exclude',
</Fragment> key: 'category',
} })),
/> ]}
actions={
<Fragment>
<Button onClick={this.onClear(store)}>Clear</Button>
</Fragment>
}
/>
);
}}
</ReactReduxContext.Consumer>
); );
} }
} }

View File

@@ -8,13 +8,12 @@
*/ */
import {Button, styled} from 'flipper'; import {Button, styled} from 'flipper';
import {connect} from 'react-redux'; import {connect, ReactReduxContext} from 'react-redux';
import {spawn} from 'child_process'; import {spawn} from 'child_process';
import {dirname} from 'path'; import {dirname} from 'path';
import {selectDevice, preferDevice} from '../reducers/connections'; import {selectDevice, preferDevice} from '../reducers/connections';
import {default as which} from 'which'; import {default as which} from 'which';
import {showOpenDialog} from '../utils/exportData'; import {showOpenDialog} from '../utils/exportData';
import PropTypes from 'prop-types';
import BaseDevice from '../devices/BaseDevice'; import BaseDevice from '../devices/BaseDevice';
import React, {Component} from 'react'; import React, {Component} from 'react';
import {State} from '../reducers'; import {State} from '../reducers';
@@ -38,10 +37,6 @@ const DropdownButton = styled(Button)({
}); });
class DevicesButton extends Component<Props> { class DevicesButton extends Component<Props> {
static contextTypes = {
store: PropTypes.object.isRequired,
};
launchEmulator = (name: string) => { launchEmulator = (name: string) => {
// On Linux, you must run the emulator from the directory it's in because // On Linux, you must run the emulator from the directory it's in because
// reasons ... // reasons ...
@@ -85,7 +80,7 @@ class DevicesButton extends Component<Props> {
icon = 'desktop'; icon = 'desktop';
} }
const dropdown = []; const dropdown: any[] = [];
// Physical devices // Physical devices
const connectedDevices = [ const connectedDevices = [
@@ -169,16 +164,22 @@ class DevicesButton extends Component<Props> {
if (dropdown.length > 0) { if (dropdown.length > 0) {
dropdown.push({type: 'separator' as 'separator'}); dropdown.push({type: 'separator' as 'separator'});
} }
dropdown.push({
label: 'Open File...',
click: () => {
showOpenDialog(this.context.store);
},
});
return ( return (
<DropdownButton compact={true} icon={icon} dropdown={dropdown}> <ReactReduxContext.Consumer>
{buttonLabel} {({store}) => {
</DropdownButton> dropdown.push({
label: 'Open File...',
click: () => {
showOpenDialog(store);
},
});
return (
<DropdownButton compact={true} icon={icon} dropdown={dropdown}>
{buttonLabel}
</DropdownButton>
);
}}
</ReactReduxContext.Consumer>
); );
} }
} }

View File

@@ -20,7 +20,7 @@ import {
} from 'flipper'; } from 'flipper';
import {unsetShare} from '../reducers/application'; import {unsetShare} from '../reducers/application';
import React, {Component} from 'react'; import React, {Component} from 'react';
import PropTypes from 'prop-types'; import {ReactReduxContext} from 'react-redux';
export type SelectionType = 'multiple' | 'single'; export type SelectionType = 'multiple' | 'single';
@@ -122,10 +122,6 @@ class RowComponent extends Component<RowComponentProps> {
} }
export default class ListView extends Component<Props, State> { export default class ListView extends Component<Props, State> {
static contextTypes = {
store: PropTypes.object.isRequired,
};
state: State = {selectedElements: new Set([])}; state: State = {selectedElements: new Set([])};
static getDerivedStateFromProps(props: Props, state: State) { static getDerivedStateFromProps(props: Props, state: State) {
if (state.selectedElements.size > 0) { if (state.selectedElements.size > 0) {
@@ -161,46 +157,51 @@ export default class ListView extends Component<Props, State> {
}; };
render() { render() {
const onHide = () => {
this.context.store.dispatch(unsetShare());
this.props.onHide();
};
return ( return (
<Container> <ReactReduxContext.Consumer>
<FlexColumn> {({store}) => {
<Title>{this.props.title}</Title> const onHide = () => {
<RowComponentContainer> store.dispatch(unsetShare());
{this.props.elements.map(id => { this.props.onHide();
return ( };
<RowComponent return (
name={id} <Container>
key={id} <FlexColumn>
selected={this.state.selectedElements.has(id)} <Title>{this.props.title}</Title>
onChange={this.handleChange} <RowComponentContainer>
/> {this.props.elements.map(id => {
); return (
})} <RowComponent
</RowComponentContainer> name={id}
</FlexColumn> key={id}
<Padder paddingTop={8} paddingBottom={2}> selected={this.state.selectedElements.has(id)}
<FlexRow> onChange={this.handleChange}
<Spacer /> />
<Button compact padded onClick={onHide}> );
Close })}
</Button> </RowComponentContainer>
<Button </FlexColumn>
compact <Padder paddingTop={8} paddingBottom={2}>
padded <FlexRow>
type="primary" <Spacer />
onClick={() => { <Button compact padded onClick={onHide}>
this.props.onSelect([...this.state.selectedElements]); Close
}}> </Button>
Submit <Button
</Button> compact
</FlexRow> padded
</Padder> type="primary"
</Container> onClick={() => {
this.props.onSelect([...this.state.selectedElements]);
}}>
Submit
</Button>
</FlexRow>
</Padder>
</Container>
);
}}
</ReactReduxContext.Consumer>
); );
} }
} }

View File

@@ -19,9 +19,10 @@ import {
exportStoreToFile, exportStoreToFile,
EXPORT_FLIPPER_TRACE_EVENT, EXPORT_FLIPPER_TRACE_EVENT,
} from '../utils/exportData'; } from '../utils/exportData';
import PropTypes from 'prop-types';
import ShareSheetErrorList from './ShareSheetErrorList'; import ShareSheetErrorList from './ShareSheetErrorList';
import ShareSheetPendingDialog from './ShareSheetPendingDialog'; import ShareSheetPendingDialog from './ShareSheetPendingDialog';
import {ReactReduxContext} from 'react-redux';
import {store} from '../init';
const Container = styled(FlexColumn)({ const Container = styled(FlexColumn)({
padding: 20, padding: 20,
@@ -75,10 +76,6 @@ type State = {
}; };
export default class ShareSheetExportFile extends Component<Props, State> { export default class ShareSheetExportFile extends Component<Props, State> {
static contextTypes = {
store: PropTypes.object.isRequired,
};
state: State = { state: State = {
errorArray: [], errorArray: [],
result: {kind: 'pending'}, result: {kind: 'pending'},
@@ -89,13 +86,13 @@ export default class ShareSheetExportFile extends Component<Props, State> {
idler = new Idler(); idler = new Idler();
dispatchAndUpdateToolBarStatus(msg: string) { dispatchAndUpdateToolBarStatus(msg: string) {
this.context.store.dispatch( store.dispatch(
setExportStatusComponent( setExportStatusComponent(
<CancellableExportStatus <CancellableExportStatus
msg={msg} msg={msg}
onCancel={() => { onCancel={() => {
this.idler.cancel(); this.idler.cancel();
this.context.store.dispatch(unsetShare()); store.dispatch(unsetShare());
}} }}
/>, />,
), ),
@@ -110,21 +107,16 @@ export default class ShareSheetExportFile extends Component<Props, State> {
return; return;
} }
const {errorArray} = await reportPlatformFailures( const {errorArray} = await reportPlatformFailures(
exportStoreToFile( exportStoreToFile(this.props.file, store, this.idler, (msg: string) => {
this.props.file, if (this.state.runInBackground) {
this.context.store, this.dispatchAndUpdateToolBarStatus(msg);
this.idler, } else {
(msg: string) => { this.setState({statusUpdate: msg});
if (this.state.runInBackground) { }
this.dispatchAndUpdateToolBarStatus(msg); }),
} else {
this.setState({statusUpdate: msg});
}
},
),
`${EXPORT_FLIPPER_TRACE_EVENT}:UI_FILE`, `${EXPORT_FLIPPER_TRACE_EVENT}:UI_FILE`,
); );
this.context.store.dispatch(unsetShare()); store.dispatch(unsetShare());
if (this.state.runInBackground) { if (this.state.runInBackground) {
new Notification('Sharable Flipper trace created', { new Notification('Sharable Flipper trace created', {
body: `Flipper trace exported to the ${this.props.file}`, body: `Flipper trace exported to the ${this.props.file}`,
@@ -142,64 +134,76 @@ export default class ShareSheetExportFile extends Component<Props, State> {
} }
} }
renderSuccess(context: any) { renderSuccess() {
return ( return (
<Container> <ReactReduxContext.Consumer>
<FlexColumn> {({store}) => (
<Title bold>Data Exported Successfully</Title> <Container>
<InfoText> <FlexColumn>
When sharing your Flipper data, consider that the captured data <Title bold>Data Exported Successfully</Title>
might contain sensitive information like access tokens used in <InfoText>
network requests. When sharing your Flipper data, consider that the captured data
</InfoText> might contain sensitive information like access tokens used in
<ShareSheetErrorList errors={this.state.errorArray} /> network requests.
</FlexColumn> </InfoText>
<FlexRow> <ShareSheetErrorList errors={this.state.errorArray} />
<Spacer /> </FlexColumn>
<Button compact padded onClick={() => this.cancelAndHide(context)}> <FlexRow>
Close <Spacer />
</Button> <Button compact padded onClick={() => this.cancelAndHide(store)}>
</FlexRow> Close
</Container> </Button>
</FlexRow>
</Container>
)}
</ReactReduxContext.Consumer>
); );
} }
renderError(context: any, result: {kind: 'error'; error: Error}) { renderError(result: {kind: 'error'; error: Error}) {
return ( return (
<Container> <ReactReduxContext.Consumer>
<Title bold>Error</Title> {({store}) => (
<ErrorMessage code> <Container>
{result.error.message || 'File could not be saved.'} <Title bold>Error</Title>
</ErrorMessage> <ErrorMessage code>
<FlexRow> {result.error.message || 'File could not be saved.'}
<Spacer /> </ErrorMessage>
<Button compact padded onClick={() => this.cancelAndHide(context)}> <FlexRow>
Close <Spacer />
</Button> <Button compact padded onClick={() => this.cancelAndHide(store)}>
</FlexRow> Close
</Container> </Button>
</FlexRow>
</Container>
)}
</ReactReduxContext.Consumer>
); );
} }
renderPending(context: any, statusUpdate: string | null) { renderPending(statusUpdate: string | null) {
return ( return (
<ShareSheetPendingDialog <ReactReduxContext.Consumer>
statusUpdate={statusUpdate} {({store}) => (
statusMessage="Exporting Flipper trace..." <ShareSheetPendingDialog
onCancel={() => this.cancelAndHide(context)} statusUpdate={statusUpdate}
onRunInBackground={() => { statusMessage="Exporting Flipper trace..."
this.setState({runInBackground: true}); onCancel={() => this.cancelAndHide(store)}
if (statusUpdate) { onRunInBackground={() => {
this.dispatchAndUpdateToolBarStatus(statusUpdate); this.setState({runInBackground: true});
} if (statusUpdate) {
this.props.onHide(); this.dispatchAndUpdateToolBarStatus(statusUpdate);
}} }
/> this.props.onHide();
}}
/>
)}
</ReactReduxContext.Consumer>
); );
} }
cancelAndHide(context: any) { cancelAndHide(store: any) {
context.store.dispatch(unsetShare()); store.dispatch(unsetShare());
this.props.onHide(); this.props.onHide();
this.idler.cancel(); this.idler.cancel();
} }
@@ -208,11 +212,11 @@ export default class ShareSheetExportFile extends Component<Props, State> {
const {result, statusUpdate} = this.state; const {result, statusUpdate} = this.state;
switch (result.kind) { switch (result.kind) {
case 'success': case 'success':
return this.renderSuccess(this.context); return this.renderSuccess();
case 'error': case 'error':
return this.renderError(this.context, result); return this.renderError(result);
case 'pending': case 'pending':
return this.renderPending(this.context, statusUpdate); return this.renderPending(statusUpdate);
} }
} }
} }

View File

@@ -17,6 +17,8 @@ import {
Input, Input,
} from 'flipper'; } from 'flipper';
import React, {Component} from 'react'; import React, {Component} from 'react';
import {ReactReduxContext} from 'react-redux';
import {store} from '../init';
import { import {
setExportStatusComponent, setExportStatusComponent,
unsetShare, unsetShare,
@@ -30,7 +32,6 @@ import {
DataExportError, DataExportError,
} from '../fb-stubs/user'; } from '../fb-stubs/user';
import {exportStore, EXPORT_FLIPPER_TRACE_EVENT} from '../utils/exportData'; import {exportStore, EXPORT_FLIPPER_TRACE_EVENT} from '../utils/exportData';
import PropTypes from 'prop-types';
import {clipboard} from 'electron'; import {clipboard} from 'electron';
import ShareSheetErrorList from './ShareSheetErrorList'; import ShareSheetErrorList from './ShareSheetErrorList';
import {reportPlatformFailures} from '../utils/metrics'; import {reportPlatformFailures} from '../utils/metrics';
@@ -80,10 +81,6 @@ type State = {
}; };
export default class ShareSheetExportUrl extends Component<Props, State> { export default class ShareSheetExportUrl extends Component<Props, State> {
static contextTypes = {
store: PropTypes.object.isRequired,
};
state: State = { state: State = {
errorArray: [], errorArray: [],
result: null, result: null,
@@ -94,13 +91,13 @@ export default class ShareSheetExportUrl extends Component<Props, State> {
idler = new Idler(); idler = new Idler();
dispatchAndUpdateToolBarStatus(msg: string) { dispatchAndUpdateToolBarStatus(msg: string) {
this.context.store.dispatch( store.dispatch(
setExportStatusComponent( setExportStatusComponent(
<CancellableExportStatus <CancellableExportStatus
msg={msg} msg={msg}
onCancel={() => { onCancel={() => {
this.idler.cancel(); this.idler.cancel();
this.context.store.dispatch(unsetShare()); store.dispatch(unsetShare());
}} }}
/>, />,
), ),
@@ -119,7 +116,7 @@ export default class ShareSheetExportUrl extends Component<Props, State> {
} }
}; };
const {serializedString, errorArray} = await reportPlatformFailures( const {serializedString, errorArray} = await reportPlatformFailures(
exportStore(this.context.store, this.idler, statusUpdate), exportStore(store, this.idler, statusUpdate),
`${EXPORT_FLIPPER_TRACE_EVENT}:UI_LINK`, `${EXPORT_FLIPPER_TRACE_EVENT}:UI_LINK`,
); );
@@ -135,7 +132,7 @@ export default class ShareSheetExportUrl extends Component<Props, State> {
const flipperUrl = (result as DataExportResult).flipperUrl; const flipperUrl = (result as DataExportResult).flipperUrl;
if (flipperUrl) { if (flipperUrl) {
clipboard.writeText(String(flipperUrl)); clipboard.writeText(String(flipperUrl));
this.context.store.dispatch(setExportURL(flipperUrl)); store.dispatch(setExportURL(flipperUrl));
new Notification('Sharable Flipper trace created', { new Notification('Sharable Flipper trace created', {
body: 'URL copied to clipboard', body: 'URL copied to clipboard',
requireInteraction: true, requireInteraction: true,
@@ -158,7 +155,7 @@ export default class ShareSheetExportUrl extends Component<Props, State> {
} }
this.setState({result}); this.setState({result});
} }
this.context.store.dispatch(unsetShare()); store.dispatch(unsetShare());
this.props.logger.trackTimeSince(mark, 'export:url-error'); this.props.logger.trackTimeSince(mark, 'export:url-error');
} }
} }
@@ -181,74 +178,82 @@ export default class ShareSheetExportUrl extends Component<Props, State> {
} }
} }
renderPending(cancelAndHide: () => void, statusUpdate: string | null) { cancelAndHide = (store: any) => () => {
store.dispatch(unsetShare());
this.hideSheet();
};
renderPending(statusUpdate: string | null) {
return ( return (
<ShareSheetPendingDialog <ReactReduxContext.Consumer>
statusUpdate={statusUpdate} {({store}) => (
statusMessage="Uploading Flipper trace..." <ShareSheetPendingDialog
onCancel={cancelAndHide} statusUpdate={statusUpdate}
onRunInBackground={() => { statusMessage="Uploading Flipper trace..."
this.setState({runInBackground: true}); onCancel={this.cancelAndHide(store)}
if (statusUpdate) { onRunInBackground={() => {
this.dispatchAndUpdateToolBarStatus(statusUpdate); this.setState({runInBackground: true});
} if (statusUpdate) {
this.props.onHide(); this.dispatchAndUpdateToolBarStatus(statusUpdate);
}} }
/> this.props.onHide();
}}
/>
)}
</ReactReduxContext.Consumer>
); );
} }
render() { render() {
const cancelAndHide = () => {
this.context.store.dispatch(unsetShare());
this.hideSheet();
};
const {result, statusUpdate, errorArray} = this.state; const {result, statusUpdate, errorArray} = this.state;
if (!result || !(result as DataExportResult).flipperUrl) { if (!result || !(result as DataExportResult).flipperUrl) {
return this.renderPending(cancelAndHide, statusUpdate); return this.renderPending(statusUpdate);
} }
return ( return (
<Container> <ReactReduxContext.Consumer>
<> {({store}) => (
<FlexColumn> <Container>
{(result as DataExportResult).flipperUrl ? ( <>
<> <FlexColumn>
<Title bold>Data Upload Successful</Title> {(result as DataExportResult).flipperUrl ? (
<InfoText> <>
Flipper's data was successfully uploaded. This URL can be used <Title bold>Data Upload Successful</Title>
to share with other Flipper users. Opening it will import the <InfoText>
data from your trace. Flipper's data was successfully uploaded. This URL can be
</InfoText> used to share with other Flipper users. Opening it will
<Copy value={(result as DataExportResult).flipperUrl} /> import the data from your trace.
<InfoText> </InfoText>
When sharing your Flipper link, consider that the captured <Copy value={(result as DataExportResult).flipperUrl} />
data might contain sensitve information like access tokens <InfoText>
used in network requests. When sharing your Flipper link, consider that the captured
</InfoText> data might contain sensitve information like access tokens
<ShareSheetErrorList errors={errorArray} /> used in network requests.
</> </InfoText>
) : ( <ShareSheetErrorList errors={errorArray} />
<> </>
<Title bold> ) : (
{(result as DataExportError).error_class || 'Error'} <>
</Title> <Title bold>
<ErrorMessage code> {(result as DataExportError).error_class || 'Error'}
{(result as DataExportError).error || </Title>
'The data could not be uploaded'} <ErrorMessage code>
</ErrorMessage> {(result as DataExportError).error ||
</> 'The data could not be uploaded'}
)} </ErrorMessage>
</FlexColumn> </>
<FlexRow> )}
<Spacer /> </FlexColumn>
<Button compact padded onClick={cancelAndHide}> <FlexRow>
Close <Spacer />
</Button> <Button compact padded onClick={this.cancelAndHide(store)}>
</FlexRow> Close
</> </Button>
</Container> </FlexRow>
</>
</Container>
)}
</ReactReduxContext.Consumer>
); );
} }
} }

View File

@@ -32,7 +32,7 @@ import {setPersistor} from './utils/persistor';
import React from 'react'; import React from 'react';
import path from 'path'; import path from 'path';
const store = createStore<StoreState, Actions, any, any>( export const store = createStore<StoreState, Actions, any, any>(
reducers, reducers,
window.__REDUX_DEVTOOLS_EXTENSION__ window.__REDUX_DEVTOOLS_EXTENSION__
? window.__REDUX_DEVTOOLS_EXTENSION__({ ? window.__REDUX_DEVTOOLS_EXTENSION__({

View File

@@ -702,7 +702,7 @@
pirates "^4.0.0" pirates "^4.0.0"
source-map-support "^0.5.9" source-map-support "^0.5.9"
"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.1.5", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3": "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.5", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3":
version "7.6.3" version "7.6.3"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.3.tgz#935122c74c73d2240cafd32ddb5fc2a6cd35cf1f" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.3.tgz#935122c74c73d2240cafd32ddb5fc2a6cd35cf1f"
integrity sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA== integrity sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==
@@ -1265,7 +1265,7 @@
dependencies: dependencies:
"@types/react" "*" "@types/react" "*"
"@types/react-redux@^7.1.1": "@types/react-redux@^7.1.5":
version "7.1.5" version "7.1.5"
resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.5.tgz#c7a528d538969250347aa53c52241051cf886bd3" resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.5.tgz#c7a528d538969250347aa53c52241051cf886bd3"
integrity sha512-ZoNGQMDxh5ENY7PzU7MVonxDzS1l/EWiy8nUhDqxFqUZn4ovboCyvk4Djf68x6COb7vhGTKjyjxHxtFdAA5sUA== integrity sha512-ZoNGQMDxh5ENY7PzU7MVonxDzS1l/EWiy8nUhDqxFqUZn4ovboCyvk4Djf68x6COb7vhGTKjyjxHxtFdAA5sUA==
@@ -6685,7 +6685,7 @@ prompts@^2.0.1:
kleur "^3.0.3" kleur "^3.0.3"
sisteransi "^1.0.3" sisteransi "^1.0.3"
prop-types@^15.5.10, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: prop-types@^15.5.10, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2:
version "15.7.2" version "15.7.2"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
@@ -6830,28 +6830,27 @@ react-emotion@^9.2.6:
babel-plugin-emotion "^9.2.11" babel-plugin-emotion "^9.2.11"
create-emotion-styled "^9.2.8" create-emotion-styled "^9.2.8"
react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6: react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6:
version "16.10.2" version "16.10.2"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.10.2.tgz#984120fd4d16800e9a738208ab1fba422d23b5ab" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.10.2.tgz#984120fd4d16800e9a738208ab1fba422d23b5ab"
integrity sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA== integrity sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA==
react-lifecycles-compat@^3.0.0: react-is@^16.9.0:
version "3.0.4" version "16.11.0"
resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.11.0.tgz#b85dfecd48ad1ce469ff558a882ca8e8313928fa"
integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== integrity sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw==
react-redux@^5.0.7: react-redux@^7.1.1:
version "5.1.2" version "7.1.1"
resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.1.2.tgz#b19cf9e21d694422727bf798e934a916c4080f57" resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.1.1.tgz#ce6eee1b734a7a76e0788b3309bf78ff6b34fa0a"
integrity sha512-Ns1G0XXc8hDyH/OcBHOxNgQx9ayH3SPxBnFCOidGKSle8pKihysQw2rG/PmciUQRoclhVBO8HMhiRmGXnDja9Q== integrity sha512-QsW0vcmVVdNQzEkrgzh2W3Ksvr8cqpAv5FhEk7tNEft+5pp7rXxAudTz3VOPawRkLIepItpkEIyLcN/VVXzjTg==
dependencies: dependencies:
"@babel/runtime" "^7.1.2" "@babel/runtime" "^7.5.5"
hoist-non-react-statics "^3.3.0" hoist-non-react-statics "^3.3.0"
invariant "^2.2.4" invariant "^2.2.4"
loose-envify "^1.1.0" loose-envify "^1.4.0"
prop-types "^15.6.1" prop-types "^15.7.2"
react-is "^16.6.0" react-is "^16.9.0"
react-lifecycles-compat "^3.0.0"
react-test-renderer@^16.11.0: react-test-renderer@^16.11.0:
version "16.11.0" version "16.11.0"