From d9211b5b10573c48b8bbe72f65313ed0e63fcc29 Mon Sep 17 00:00:00 2001 From: David Lechner Date: Fri, 5 Jun 2020 20:52:23 -0500 Subject: [PATCH] switch to blueprintjs UI toolkit --- package.json | 8 +- src/components/ActionButton.tsx | 21 +-- src/components/App.tsx | 100 ++++++++---- src/components/Editor.tsx | 41 +++-- src/components/Notification.tsx | 85 +++++----- src/components/NotificationStack.tsx | 53 ++----- src/components/OpenFileButton.tsx | 21 +-- src/components/StatusBar.tsx | 10 +- src/components/Terminal.tsx | 12 +- src/components/Toolbar.tsx | 37 +++-- src/index.scss | 98 +++++++++--- src/index.tsx | 16 ++ src/reducers/status.ts | 2 +- yarn.lock | 223 ++++++++++++++------------- 14 files changed, 417 insertions(+), 310 deletions(-) diff --git a/package.json b/package.json index 4eb2458c..a881b111 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "0.1.0", "private": true, "dependencies": { + "@blueprintjs/core": "^3.28.1", "@pybricks/firmware": "2.0.0", "@pybricks/mpy-cross-v5": "^1.0.0", "@shopify/react-i18n": "^4.0.0", @@ -15,23 +16,20 @@ "@types/react": "^16.9.35", "@types/react-dom": "^16.9.8", "@types/react-redux": "^7.1.9", - "@types/react-transition-group": "^4.4.0", + "@types/react-splitter-layout": "^3.0.0", "@types/redux-logger": "^3.0.8", "@types/web-bluetooth": "^0.0.6", "ace-builds": "^1.4.9", - "bootstrap": "^4.5.0", "file-saver": "^2.0.2", "jszip": "^3.4.0", "node-sass": "^4.14.1", "react": "^16.13.1", "react-ace": "^9.0.0", - "react-bootstrap": "^1.0.0", "react-dom": "^16.13.1", "react-dropzone": "^11.0.1", "react-redux": "^7.2.0", - "react-resize-observer": "^1.1.1", "react-scripts": "3.4.1", - "react-transition-group": "^4.4.1", + "react-splitter-layout": "^4.0.0", "redux": "^4.0.5", "redux-logger": "^3.0.6", "redux-observable": "^1.2.0", diff --git a/src/components/ActionButton.tsx b/src/components/ActionButton.tsx index b2f8ccf5..02e0109d 100644 --- a/src/components/ActionButton.tsx +++ b/src/components/ActionButton.tsx @@ -1,12 +1,9 @@ // SPDX-License-Identifier: MIT // Copyright (c) 2020 The Pybricks Authors +import { Button, Intent, Position, Tooltip } from '@blueprintjs/core'; import { WithI18nProps, withI18n } from '@shopify/react-i18n'; import React from 'react'; -import Button from 'react-bootstrap/Button'; -import Image from 'react-bootstrap/Image'; -import OverlayTrigger from 'react-bootstrap/OverlayTrigger'; -import Tooltip from 'react-bootstrap/Tooltip'; import { TooltipId } from './button'; import en from './button.en.json'; @@ -28,16 +25,12 @@ type Props = ActionButtonProps & WithI18nProps; class ActionButton extends React.Component { render(): JSX.Element { return ( - - {this.props.i18n.translate(this.props.tooltip)}. - - } + - + ); } } diff --git a/src/components/App.tsx b/src/components/App.tsx index f86b83ce..6616375d 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -1,50 +1,84 @@ // SPDX-License-Identifier: MIT // Copyright (c) 2020 The Pybricks Authors -import React from 'react'; -import { Col, Row } from 'react-bootstrap'; -import Container from 'react-bootstrap/Container'; +import React, { EffectCallback, useEffect, useState } from 'react'; +import SplitterLayout from 'react-splitter-layout'; import Editor from './Editor'; import StatusBar from './StatusBar'; import Terminal from './Terminal'; import Toolbar from './Toolbar'; +import 'react-splitter-layout/lib/index.css'; + +function useShowDocs(): boolean { + function getShowDocs(): boolean { + return window.innerWidth >= 1024; + } + + const [showDocs, setShowDocs] = useState(getShowDocs); + + useEffect((): ReturnType => { + function handleResize(): void { + setShowDocs(getShowDocs()); + } + + window.addEventListener('resize', handleResize); + + return (): void => window.removeEventListener('resize', handleResize); + }, []); // Empty array ensures that effect is only run on mount and unmount + + return showDocs; +} + function App(): JSX.Element { + const showDocs = useShowDocs(); + const [dragging, setDragging] = useState(false); + return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - +
+ + setDragging(true)} + onDragEnd={(): void => setDragging(false)} + percentage={true} + secondaryInitialSize={Number( + localStorage.getItem('app-main-split') || 30, + )} + onSecondaryPaneSizeChange={(value): void => + localStorage.setItem('app-main-split', String(value)) + } + > + + localStorage.setItem('app-docs-split', String(value)) + } + > + +
+ +
+
+ {showDocs && ( +
+ {dragging &&
} - - - + width="100%" + height="100%" + frameBorder="none" + /> +
+ )} + +
); } diff --git a/src/components/Editor.tsx b/src/components/Editor.tsx index 64980d69..bbe055ef 100644 --- a/src/components/Editor.tsx +++ b/src/components/Editor.tsx @@ -1,9 +1,12 @@ // SPDX-License-Identifier: MIT // Copyright (c) 2020 The Pybricks Authors -import React, { ReactElement } from 'react'; +import { ResizeSensor } from '@blueprintjs/core'; +import { Ace } from 'ace-builds'; +import React from 'react'; import AceEditor from 'react-ace'; -import { ReactReduxContext } from 'react-redux'; +import { connect } from 'react-redux'; +import { Action, Dispatch } from '../actions'; import { setEditSession } from '../actions/editor'; import 'ace-builds/src-noconflict/mode-python'; @@ -11,16 +14,30 @@ import 'ace-builds/src-noconflict/theme-xcode'; import 'ace-builds/src-min-noconflict/ext-searchbox'; import 'ace-builds/src-min-noconflict/ext-language_tools'; -class Editor extends React.Component { +type DispatchProps = { onSessionChanged: (session?: Ace.EditSession) => void }; + +type EditorProps = DispatchProps; + +class Editor extends React.Component { + private editorRef: React.RefObject; + + constructor(props: EditorProps) { + super(props); + this.editorRef = React.createRef(); + } + render(): JSX.Element { return ( - - {({ store }): ReactElement => ( + this.editorRef.current?.editor?.resize()} + > +
{ - store.dispatch(setEditSession(e?.session)); + this.props.onSessionChanged(e?.session); }} onChange={(v): void => localStorage.setItem('program', v)} commands={[ @@ -47,10 +64,14 @@ class Editor extends React.Component { }, ]} /> - )} - +
+
); } } -export default Editor; +const mapDispatchToProps = (dispatch: Dispatch): DispatchProps => ({ + onSessionChanged: (s): Action => dispatch(setEditSession(s)), +}); + +export default connect(undefined, mapDispatchToProps)(Editor); diff --git a/src/components/Notification.tsx b/src/components/Notification.tsx index 8f32cc9a..a48a8b2e 100644 --- a/src/components/Notification.tsx +++ b/src/components/Notification.tsx @@ -1,12 +1,13 @@ // SPDX-License-Identifier: MIT // Copyright (c) 2020 The Pybricks Authors +import { IconName, Intent, Toast } from '@blueprintjs/core'; import { WithI18nProps, withI18n } from '@shopify/react-i18n'; import React from 'react'; -import Toast from 'react-bootstrap/Toast'; import { connect } from 'react-redux'; import { Dispatch } from '../actions'; -import { remove } from '../actions/notification'; +import { NotificationLevel, remove } from '../actions/notification'; +import { Level } from '../reducers/notification'; import en from './notification.en.json'; interface DispatchProps { @@ -15,7 +16,7 @@ interface DispatchProps { interface OwnProps { id: number; - style: string; + level: NotificationLevel; message?: string; messageId?: string; helpUrl?: string; @@ -23,51 +24,63 @@ interface OwnProps { type NotificationProps = DispatchProps & OwnProps & WithI18nProps; -function mapTitle(style: string): string { - switch (style) { - case 'danger': - return 'Error'; - case 'warning': - return 'Warning'; +function mapIntent(level: NotificationLevel): Intent { + switch (level) { + case Level.Error: + return Intent.DANGER; + case Level.Warning: + return Intent.WARNING; + case Level.Info: + return Intent.PRIMARY; default: - return 'Info'; + return Intent.NONE; + } +} + +function mapIcon(level: NotificationLevel): IconName | undefined { + switch (level) { + case Level.Error: + return 'error'; + case Level.Warning: + return 'warning-sign'; + case Level.Info: + return 'info-sign'; + default: + return undefined; } } class Notification extends React.Component { render(): JSX.Element { - const title = mapTitle(this.props.style); return ( { + onDismiss={(): void => { this.props.onClose(); }} - transition={false} - > - - - {title} - - - -

- {this.props.messageId - ? this.props.i18n.translate(this.props.messageId) - : this.props.message || 'missing message!'} -

-

+ timeout={0} + intent={mapIntent(this.props.level)} + icon={mapIcon(this.props.level)} + message={ +

+

+ {this.props.messageId + ? this.props.i18n.translate(this.props.messageId) + : this.props.message || 'missing message!'} +

{this.props.helpUrl && ( - - More info - +

+ + More info + +

)} -

- - +
+ } + /> ); } } diff --git a/src/components/NotificationStack.tsx b/src/components/NotificationStack.tsx index 330e9fef..67d1404e 100644 --- a/src/components/NotificationStack.tsx +++ b/src/components/NotificationStack.tsx @@ -1,12 +1,11 @@ // SPDX-License-Identifier: MIT // Copyright (c) 2020 The Pybricks Authors +import { Toaster } from '@blueprintjs/core'; import React from 'react'; -import { Collapse } from 'react-bootstrap'; import { connect } from 'react-redux'; -import { TransitionGroup } from 'react-transition-group'; import { RootState } from '../reducers'; -import { Level, NotificationList } from '../reducers/notification'; +import { NotificationList } from '../reducers/notification'; import Notification from './Notification'; interface StateProps { @@ -15,45 +14,21 @@ interface StateProps { type NotificationStackProps = StateProps; -function mapLevelToStyle(level: Level): string { - switch (level) { - case Level.Error: - return 'danger'; - case Level.Warning: - return 'warning'; - case Level.Info: - return 'info'; - } -} - class NotificationStack extends React.Component { render(): JSX.Element { return ( -
-
- - {this.props.list.map((n) => ( - - - - ))} - -
-
+ + {this.props.list.map((n) => ( + + ))} + ); } } diff --git a/src/components/OpenFileButton.tsx b/src/components/OpenFileButton.tsx index c29ed6cb..6a4ffbd3 100644 --- a/src/components/OpenFileButton.tsx +++ b/src/components/OpenFileButton.tsx @@ -1,12 +1,9 @@ // SPDX-License-Identifier: MIT // Copyright (c) 2020 The Pybricks Authors +import { Button, Intent, Position, Tooltip } from '@blueprintjs/core'; import { WithI18nProps, withI18n } from '@shopify/react-i18n'; import React from 'react'; -import Button from 'react-bootstrap/Button'; -import Image from 'react-bootstrap/Image'; -import OverlayTrigger from 'react-bootstrap/OverlayTrigger'; -import Tooltip from 'react-bootstrap/Tooltip'; import Dropzone, { FileRejection } from 'react-dropzone'; import { TooltipId } from './button'; import en from './button.en.json'; @@ -81,17 +78,13 @@ class OpenFileButton extends React.Component { noKeyboard={this.props.onClick !== undefined} > {({ getRootProps, getInputProps }): JSX.Element => ( - - {this.props.i18n.translate(this.props.tooltip)}. - - } + - + )} ); diff --git a/src/components/StatusBar.tsx b/src/components/StatusBar.tsx index 08d8a42b..07df1e03 100644 --- a/src/components/StatusBar.tsx +++ b/src/components/StatusBar.tsx @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT // Copyright (c) 2020 The Pybricks Authors +import { ProgressBar } from '@blueprintjs/core'; import React from 'react'; -import ProgressBar from 'react-bootstrap/ProgressBar'; import { connect } from 'react-redux'; import { RootState } from '../reducers'; @@ -13,8 +13,12 @@ type StatusProps = StateProps; class StatusBar extends React.Component { render(): JSX.Element { return ( -
- +
+
); } diff --git a/src/components/Terminal.tsx b/src/components/Terminal.tsx index ca370063..1f3a1cba 100644 --- a/src/components/Terminal.tsx +++ b/src/components/Terminal.tsx @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT // Copyright (c) 2020 The Pybricks Authors +import { ResizeSensor } from '@blueprintjs/core'; import React from 'react'; import { connect } from 'react-redux'; -import ResizeObserver from 'react-resize-observer'; import { Subscription } from 'rxjs'; import { Terminal as XTerm } from 'xterm'; import { FitAddon } from 'xterm-addon-fit'; @@ -62,13 +62,9 @@ class Terminal extends React.Component { render(): JSX.Element { return ( -
- this.fitAddon.fit()} /> -
+ this.fitAddon.fit()}> +
+ ); } } diff --git a/src/components/Toolbar.tsx b/src/components/Toolbar.tsx index 58a930f3..c903de27 100644 --- a/src/components/Toolbar.tsx +++ b/src/components/Toolbar.tsx @@ -1,9 +1,8 @@ // SPDX-License-Identifier: MIT // Copyright (c) 2020 The Pybricks Authors +import { ButtonGroup, Navbar } from '@blueprintjs/core'; import React from 'react'; -import ButtonGroup from 'react-bootstrap/ButtonGroup'; -import ButtonToolbar from 'react-bootstrap/ButtonToolbar'; import BluetoothButton from './BluetoothButton'; import FlashButton from './FlashButton'; import OpenButton from './OpenButton'; @@ -15,21 +14,25 @@ import StopButton from './StopButton'; class Toolbar extends React.Component { render(): JSX.Element { return ( - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + ); } } diff --git a/src/index.scss b/src/index.scss index 44d07b25..2c3e82aa 100644 --- a/src/index.scss +++ b/src/index.scss @@ -1,36 +1,96 @@ // SPDX-License-Identifier: MIT // Copyright (c) 2020 The Pybricks Authors -// Override default variables before the import -$body-bg: #e8e8e8; +@import '@blueprintjs/core/lib/scss/variables.scss'; -// Import Bootstrap and its default variables -@import '~bootstrap/scss/bootstrap'; +// override variables here +// See https://blueprintjs.com/docs/#core/variables -.terminal { - height: 15vh; +$pt-navbar-height: 72px; + +$pybricks-blue: #0088ce; +$pt-intent-primary: $pybricks-blue; +$pt-outline-color: rgba($pybricks-blue, 0.6); + +$navbar-backgound-color: $pt-app-background-color; +$dark-navbar-background-color: $pt-dark-app-background-color; + +@import '~normalize.css'; +@import '@blueprintjs/core/src/blueprint.scss'; + +$status-bar-height: 3vh; + +:root { + --mobile-pad: 0px; } -.container-col { - padding: 0px; - padding-right: 8px; +body { + // no scrolling of the page + overflow: hidden; + // See https://blueprintjs.com/docs/#core/components/navbar + padding-top: $pt-navbar-height; +} + +.docs-iframe { + height: 100%; + width: 100%; +} + +.docs-iframe-overlay { + position: absolute; + height: 100%; + width: 100%; +} + +.editor-container { + height: 100%; +} + +.terminal-padding { + padding-left: 10px; + height: 100%; +} + +.terminal-container { + height: 100%; +} + +.app-main { + // height makes everything fit without scrolling + height: calc(100vh - #{$pt-navbar-height} - #{$status-bar-height} - var(--mobile-pad)) !important; } .status-bar { - background-color: #0088ce; + position: fixed; + top: calc(100vh - #{$status-bar-height} - var(--mobile-pad)); + background-color: $pybricks-blue; + height: $status-bar-height; + width: 100vw; + display: flex; + align-items: center; } -.btn-light, .btn-light:focus { - background-color: #0088ce; - border-width: 0px; +.status-bar-item { + width: 25%; + margin-left: 10px; } -.btn-light:disabled { - background-color: #65acd0; - border-width: 0px; +.bp3-progress-bar.status-bar-item { + // override progress bar default gray1 backgound + background-color: $pt-app-background-color; } -.btn-light:hover, .btn-light:active { - background-color: #005885 !important; - border-width: 0px; +.bp3-navbar-divider { + // don't draw vertical line since we are just using button groups + border-left: unset; +} + +.ace_gutter { + // make ace editor match app backgound color + background-color: $pt-app-background-color !important; +} + +.layout-splitter { + // make layout splitter match app color scheme + background-color: $pt-divider-black !important; } diff --git a/src/index.tsx b/src/index.tsx index acf23d1a..1dba66e8 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT // Copyright (c) 2020 The Pybricks Authors +import { ResizeSensor } from '@blueprintjs/core'; import { I18nContext, I18nManager } from '@shopify/react-i18n'; import React from 'react'; import ReactDOM from 'react-dom'; @@ -46,6 +47,21 @@ ReactDOM.render( + {/* This is a hack for correctly sizing to view height on mobile when not running in fullscreen mode. */} + {/* https://css-tricks.com/the-trick-to-viewport-units-on-mobile/ */} + { + document.documentElement.style.setProperty( + '--mobile-pad', + `${e[0].contentRect.height - window.innerHeight}px`, + ); + }} + > +
+ diff --git a/src/reducers/status.ts b/src/reducers/status.ts index 491e66db..70adbc7d 100644 --- a/src/reducers/status.ts +++ b/src/reducers/status.ts @@ -8,7 +8,7 @@ import { BootloaderAction, BootloaderActionType } from '../actions/lwp3-bootload const progress: Reducer = (state = -1, action) => { switch (action.type) { case BootloaderActionType.FlashProgress: - return (action.complete / action.total) * 100; + return action.complete / action.total; default: return state; } diff --git a/yarn.lock b/yarn.lock index 09487f9b..f9f895da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1069,7 +1069,7 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.4", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.4", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": version "7.10.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.2.tgz#d103f21f2602497d38348a32e008637d506db839" integrity sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg== @@ -1109,6 +1109,31 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@blueprintjs/core@^3.28.1": + version "3.28.1" + resolved "https://registry.yarnpkg.com/@blueprintjs/core/-/core-3.28.1.tgz#cb4056c9637b09d8b8c46bd4efe7363cdb796b8d" + integrity sha512-Ws4+FrtHh5U4TMaqhFW1PXajJobn2By72LOxu18q8ksY4CuyUzvo8xIOooViQdA7ZLx9pwhC6dytsYdykwRy0w== + dependencies: + "@blueprintjs/icons" "^3.18.0" + "@types/dom4" "^2.0.1" + classnames "^2.2" + dom4 "^2.1.5" + normalize.css "^8.0.1" + popper.js "^1.15.0" + react-lifecycles-compat "^3.0.4" + react-popper "^1.3.7" + react-transition-group "^2.9.0" + resize-observer-polyfill "^1.5.1" + tslib "~1.10.0" + +"@blueprintjs/icons@^3.18.0": + version "3.18.0" + resolved "https://registry.yarnpkg.com/@blueprintjs/icons/-/icons-3.18.0.tgz#acf7a6915baeb0558d1bec323c0083dbae48ae51" + integrity sha512-emvW6AHWcilE3QoYnTs0eCkAZvpn13liTLnfajMfMVPB2/KKeYDa+TVbEqhVXWhrPanXkvJlZCVcizQvFeEYxw== + dependencies: + classnames "^2.2" + tslib "~1.10.0" + "@cnakazawa/watch@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" @@ -1330,11 +1355,6 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== -"@popperjs/core@^2.0.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.4.0.tgz#0e1bdf8d021e7ea58affade33d9d607e11365915" - integrity sha512-NMrDy6EWh9TPdSRiHmHH2ye1v5U0gBD7pRYwSwJvomx7Bm4GG04vu63dYiVzebLOx2obPpJugew06xVP0Nk7hA== - "@pybricks/firmware@2.0.0": version "2.0.0" resolved "https://npm.pkg.github.com/download/@pybricks/firmware/2.0.0/9ce17f084d6beb8f820d9fbd55d5b7f4238eeba9d935c12bbc1c2bc0d09a1fff#63ef2b783f3ffa52e0dc253a16bee9a939fea791" @@ -1389,19 +1409,6 @@ resolved "https://registry.yarnpkg.com/@redux-saga/types/-/types-1.1.0.tgz#0e81ce56b4883b4b2a3001ebe1ab298b84237204" integrity sha512-afmTuJrylUU/0OtqzaRkbyYFFNgCF73Bvel/sw90pvGrWIZ+vyoIJqA6eMSoA6+nb443kTmulmBtC9NerXboNg== -"@restart/context@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@restart/context/-/context-2.1.4.tgz#a99d87c299a34c28bd85bb489cb07bfd23149c02" - integrity sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q== - -"@restart/hooks@^0.3.12", "@restart/hooks@^0.3.21": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.3.25.tgz#11004139ad1c70d2f5965a8939dcb5aeb96aa652" - integrity sha512-m2v3N5pxTsIiSH74/sb1yW8D9RxkJidGW+5Mfwn/lHb2QzhZNlaU1su7abSyT9EGf0xS/0waLjrf7/XxQHUk7w== - dependencies: - lodash "^4.17.15" - lodash-es "^4.17.15" - "@shopify/dates@^0.3.6": version "0.3.6" resolved "https://registry.yarnpkg.com/@shopify/dates/-/dates-0.3.6.tgz#5118ae0b16cbe384dcb7ae19c21f17c6396e8302" @@ -1654,6 +1661,11 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@types/dom4@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/dom4/-/dom4-2.0.1.tgz#506d5781b9bcab81bd9a878b198aec7dee2a6033" + integrity sha512-kSkVAvWmMZiCYtvqjqQEwOmvKwcH+V4uiv3qPQ8pAh1Xl39xggGEo8gHUqV4waYGHezdFw0rKBR8Jt0CrQSDZA== + "@types/eslint-visitor-keys@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" @@ -1766,14 +1778,14 @@ hoist-non-react-statics "^3.3.0" redux "^4.0.0" -"@types/react-transition-group@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.0.tgz#882839db465df1320e4753e6e9f70ca7e9b4d46d" - integrity sha512-/QfLHGpu+2fQOqQaXh8MG9q03bFENooTb/it4jr5kKaZlDQfWvjqWZg48AwzPVMBHlRuTRAY7hRHCEOXz5kV6w== +"@types/react-splitter-layout@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/react-splitter-layout/-/react-splitter-layout-3.0.0.tgz#36f551fa8c7729ecd00c5a6a6e514e59f0190919" + integrity sha512-93cz94WYlT+91GC7DKWNogMRHCoW/T89AnJMxQiQwNs22XROwE/zX1oZt44ixyLVzITuwplyjwj1Jcg4VPzrbQ== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^16.9.11", "@types/react@^16.9.23", "@types/react@^16.9.35": +"@types/react@*", "@types/react@^16.9.35": version "16.9.35" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.35.tgz#a0830d172e8aadd9bd41709ba2281a3124bbd368" integrity sha512-q0n0SsWcGc8nDqH2GJfWQWUOmZSJhXV64CjVN5SvcNti3TdEaA3AH0D8DwNmMdzjMAC/78tB8nAZIlV8yTz+zQ== @@ -1800,11 +1812,6 @@ dependencies: "@types/jest" "*" -"@types/warning@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52" - integrity sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI= - "@types/web-bluetooth@^0.0.6": version "0.0.6" resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.6.tgz#71b56427353d3495ac7ba9a4d7a13c8f312f9c1e" @@ -2714,11 +2721,6 @@ boolbase@^1.0.0, boolbase@~1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= -bootstrap@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.5.0.tgz#97d9dbcb5a8972f8722c9962483543b907d9b9ec" - integrity sha512-Z93QoXvodoVslA+PWNdk23Hze4RBYIkpb5h8I2HY2Tu2h7A0LpAgLcyrhrSUyo2/Oxm2l1fRZPs1e5hnxnliXA== - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -3180,7 +3182,7 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -classnames@^2.2.6: +classnames@^2.2: version "2.2.6" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== @@ -3557,6 +3559,14 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +create-react-context@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.3.0.tgz#546dede9dc422def0d3fc2fe03afe0bc0f4f7d8c" + integrity sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw== + dependencies: + gud "^1.0.0" + warning "^4.0.3" + cross-spawn@7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" @@ -3823,7 +3833,7 @@ cssstyle@^1.0.0, cssstyle@^1.1.1: dependencies: cssom "0.3.x" -csstype@^2.2.0, csstype@^2.6.7: +csstype@^2.2.0: version "2.6.10" resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b" integrity sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w== @@ -3905,7 +3915,7 @@ deep-diff@^0.3.5: resolved "https://registry.yarnpkg.com/deep-diff/-/deep-diff-0.3.8.tgz#c01de63efb0eec9798801d40c7e0dae25b582c84" integrity sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ= -deep-equal@^1.0.1: +deep-equal@^1.0.1, deep-equal@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== @@ -4104,13 +4114,12 @@ dom-converter@^0.2: dependencies: utila "~0.4" -dom-helpers@^5.0.1, dom-helpers@^5.1.0, dom-helpers@^5.1.2: - version "5.1.4" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.1.4.tgz#4609680ab5c79a45f2531441f1949b79d6587f4b" - integrity sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A== +dom-helpers@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" + integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== dependencies: - "@babel/runtime" "^7.8.7" - csstype "^2.6.7" + "@babel/runtime" "^7.1.2" dom-serializer@0: version "0.2.2" @@ -4120,6 +4129,11 @@ dom-serializer@0: domelementtype "^2.0.1" entities "^2.0.0" +dom4@^2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/dom4/-/dom4-2.1.5.tgz#f98a94eb67b340f0fa5b42b0ee9c38cda035428e" + integrity sha512-gJbnVGq5zaBUY0lUh0LUEVGYrtN75Ks8ZwpwOYvnVFrKy/qzXK4R/1WuLIFExWj/tBxbRAkTzZUGJHXmqsBNjQ== + domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" @@ -5381,6 +5395,11 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= +gud@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" + integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== + gzip-size@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" @@ -7110,11 +7129,6 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash-es@^4.17.15: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" - integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ== - lodash._reinterpolate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" @@ -7794,6 +7808,11 @@ normalize-url@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== +normalize.css@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.1.tgz#9b98a208738b9cc2634caacbc42d131c97487bf3" + integrity sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg== + npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -8447,6 +8466,11 @@ pnp-webpack-plugin@1.6.4: dependencies: ts-pnp "^1.1.6" +popper.js@^1.14.4, popper.js@^1.15.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" + integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== + portfinder@^1.0.25: version "1.0.26" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.26.tgz#475658d56ca30bed72ac7f1378ed350bd1b64e70" @@ -9217,15 +9241,7 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.4" -prop-types-extra@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.1.tgz#58c3b74cbfbb95d304625975aa2f0848329a010b" - integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew== - dependencies: - react-is "^16.3.2" - warning "^4.0.0" - -prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -9407,25 +9423,6 @@ react-app-polyfill@^1.0.6: regenerator-runtime "^0.13.3" whatwg-fetch "^3.0.0" -react-bootstrap@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-1.0.1.tgz#044b51f34a9db8e17dbfb321a71267a8d6ad11b4" - integrity sha512-xMHwsvDN7sIv26P9wWiosWjITZije2dRCjEJHVfV2KFoSJY+8uv2zttEw0XMB7xviQcW3zuIGLJXuj8vf6lYEg== - dependencies: - "@babel/runtime" "^7.4.2" - "@restart/context" "^2.1.4" - "@restart/hooks" "^0.3.21" - "@types/react" "^16.9.23" - classnames "^2.2.6" - dom-helpers "^5.1.2" - invariant "^2.2.4" - prop-types "^15.7.2" - prop-types-extra "^1.1.0" - react-overlays "^3.1.2" - react-transition-group "^4.0.0" - uncontrollable "^7.0.0" - warning "^4.0.3" - react-dev-utils@^10.2.1: version "10.2.1" resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-10.2.1.tgz#f6de325ae25fa4d546d09df4bb1befdc6dd19c19" @@ -9480,7 +9477,7 @@ react-error-overlay@^6.0.7: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108" integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA== -react-is@^16.12.0, react-is@^16.3.2, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.9.0: +react-is@^16.12.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.9.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -9490,19 +9487,18 @@ react-lifecycles-compat@^3.0.4: resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== -react-overlays@^3.1.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-3.2.0.tgz#ed8335adb0871e701b0fc8396c44dfd2467e7a55" - integrity sha512-YTgCmw6l4uBOYylSnc3V8WLX+A0EoGnzDrqkYz0K7MUKbMBZFpaxLXH4EF9eZbspd+syZHQ5XAABI7n/zak1EA== +react-popper@^1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.7.tgz#f6a3471362ef1f0d10a4963673789de1baca2324" + integrity sha512-nmqYTx7QVjCm3WUZLeuOomna138R1luC4EqkW3hxJUrAe+3eNz3oFCLYdnPwILfn0mX1Ew2c3wctrjlUMYYUww== dependencies: - "@babel/runtime" "^7.4.5" - "@popperjs/core" "^2.0.0" - "@restart/hooks" "^0.3.12" - "@types/warning" "^3.0.0" - dom-helpers "^5.1.0" - prop-types "^15.7.2" - uncontrollable "^7.0.0" - warning "^4.0.3" + "@babel/runtime" "^7.1.2" + create-react-context "^0.3.0" + deep-equal "^1.1.1" + popper.js "^1.14.4" + prop-types "^15.6.1" + typed-styles "^0.0.7" + warning "^4.0.2" react-redux@^7.2.0: version "7.2.0" @@ -9515,11 +9511,6 @@ react-redux@^7.2.0: prop-types "^15.7.2" react-is "^16.9.0" -react-resize-observer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/react-resize-observer/-/react-resize-observer-1.1.1.tgz#641dfa2e0f4bd2549a8ab4bbbaf43b68f3dcaf76" - integrity sha512-3R+90Hou90Mr3wJYc+unsySC8Pn91V4nmjO32NKvUvjphRUbq9HisyLg7bDyGBE7xlMrrM6Fax7iNQaFdc/FYA== - react-scripts@3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-3.4.1.tgz#f551298b5c71985cc491b9acf3c8e8c0ae3ada0a" @@ -9580,15 +9571,20 @@ react-scripts@3.4.1: optionalDependencies: fsevents "2.1.2" -react-transition-group@^4.0.0, react-transition-group@^4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9" - integrity sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw== +react-splitter-layout@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/react-splitter-layout/-/react-splitter-layout-4.0.0.tgz#70b43ca6a78c056f5e5fbf29c67b597f040fbf2e" + integrity sha512-SLqOjBOxRuizWUa83w6q5/u9cDWa9/yj9Iko9V9JFN8x+cqIXiDlUFWSx+icz3IIgvsN/oRIw3za5/32RjIwrA== + +react-transition-group@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" + integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== dependencies: - "@babel/runtime" "^7.5.5" - dom-helpers "^5.0.1" + dom-helpers "^3.4.0" loose-envify "^1.4.0" prop-types "^15.6.2" + react-lifecycles-compat "^3.0.4" react@^16.13.1: version "16.13.1" @@ -9930,6 +9926,11 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= +resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" @@ -11202,6 +11203,11 @@ tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== +tslib@~1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + tsutils@^3.17.1: version "3.17.1" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" @@ -11261,6 +11267,11 @@ type@^2.0.0: resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== +typed-styles@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" + integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q== + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -11290,16 +11301,6 @@ typescript@~3.9.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.3.tgz#d3ac8883a97c26139e42df5e93eeece33d610b8a" integrity sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ== -uncontrollable@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.1.1.tgz#f67fed3ef93637126571809746323a9db815d556" - integrity sha512-EcPYhot3uWTS3w00R32R2+vS8Vr53tttrvMj/yA1uYRhf8hbTG2GyugGqWDY0qIskxn0uTTojVd6wPYW9ZEf8Q== - dependencies: - "@babel/runtime" "^7.6.3" - "@types/react" "^16.9.11" - invariant "^2.2.4" - react-lifecycles-compat "^3.0.4" - unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -11551,7 +11552,7 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.x" -warning@^4.0.0, warning@^4.0.3: +warning@^4.0.2, warning@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==