diff --git a/package.json b/package.json index eb25f6a97f..f6b8624628 100644 --- a/package.json +++ b/package.json @@ -156,6 +156,7 @@ "redux": "^4.0.5", "redux-actions": "^2.2.1", "reselect": "^4.0.0", + "resize-observer-polyfill": "^1.5.1", "s2-geometry": "^1.2.10", "supercluster": "^7.1.0", "type-analyzer": "0.3.0", diff --git a/src/components/bottom-widget.js b/src/components/bottom-widget.js index 6e176c2b65..9fa7967057 100644 --- a/src/components/bottom-widget.js +++ b/src/components/bottom-widget.js @@ -20,38 +20,30 @@ import React, {useCallback, useMemo} from 'react'; import styled from 'styled-components'; -import PropTypes from 'prop-types'; import TimeWidgetFactory from './filters/time-widget'; import AnimationControlFactory from './common/animation-control/animation-control'; import AnimationControllerFactory from './common/animation-control/animation-controller'; import {ANIMATION_WINDOW, FILTER_TYPES} from 'constants/default-settings'; import {getIntervalBins} from 'utils/filter-utils'; - -const propTypes = { - filters: PropTypes.arrayOf(PropTypes.object), - datasets: PropTypes.object, - uiState: PropTypes.object, - layers: PropTypes.arrayOf(PropTypes.object), - animationConfig: PropTypes.object, - visStateActions: PropTypes.object, - sidePanelWidth: PropTypes.number, - containerW: PropTypes.number -}; +import {media} from 'styles/media-breakpoints'; const maxWidth = 1080; const BottomWidgetContainer = styled.div` - position: absolute; display: flex; flex-direction: column; padding-top: ${props => (props.hasPadding ? props.theme.bottomWidgetPaddingTop : 0)}px; padding-right: ${props => (props.hasPadding ? props.theme.bottomWidgetPaddingRight : 0)}px; padding-bottom: ${props => (props.hasPadding ? props.theme.bottomWidgetPaddingBottom : 0)}px; padding-left: ${props => (props.hasPadding ? props.theme.bottomWidgetPaddingLeft : 0)}px; + pointer-events: none !important; /* prevent padding from blocking input */ + & > * { + /* all children should allow input */ + pointer-events: all; + } width: ${props => props.width}px; - bottom: 0; - right: 0; z-index: 1; + ${media.portable`padding: 0;`} `; FilterAnimationControllerFactory.deps = [AnimationControllerFactory]; @@ -235,8 +227,6 @@ export default function BottomWidgetFactory( ); }; - BottomWidget.propTypes = propTypes; - return BottomWidget; } /* eslint-enable complexity */ diff --git a/src/components/common/animation-control/floating-time-display.js b/src/components/common/animation-control/floating-time-display.js index 2a74440508..9b8a763a31 100644 --- a/src/components/common/animation-control/floating-time-display.js +++ b/src/components/common/animation-control/floating-time-display.js @@ -34,6 +34,11 @@ const StyledTimeDisplayWrapper = styled.div.attrs({ width: 100%; margin-left: -${props => props.theme.bottomInnerPdSide}px; justify-content: center; + pointer-events: none; /* prevent padding from blocking input */ + & > * { + /* all children should allow input */ + pointer-events: all; + } `; const StyledTimeDisplay = styled.div.attrs({ diff --git a/src/components/common/range-slider.js b/src/components/common/range-slider.js index f1e3ab3b1b..34159bc1a4 100644 --- a/src/components/common/range-slider.js +++ b/src/components/common/range-slider.js @@ -28,6 +28,7 @@ import Slider from 'components/common/slider/slider'; import {Input} from 'components/common/styled-components'; import {roundValToStep, clamp} from 'utils/data-utils'; +import {observeDimensions, unobserveDimensions} from '../../utils/observe-dimensions'; const SliderInput = styled(Input)` width: ${props => props.theme.sliderInputWidth}px; @@ -98,10 +99,22 @@ export default function RangeSliderFactory(RangePlot) { width: 288 }; + componentDidMount() { + if (this.sliderContainer instanceof Element) { + observeDimensions(this.sliderContainer, this._resize); + } + } + componentDidUpdate() { this._resize(); } + componentWillUnmount() { + if (this.sliderContainer instanceof Element) { + unobserveDimensions(this.sliderContainer); + } + } + sliderContainer = null; setSliderContainer = element => { this.sliderContainer = element; @@ -203,73 +216,74 @@ export default function RangeSliderFactory(RangePlot) { const {width} = this.state; const plotWidth = Math.max(width - sliderHandleWidth, 0); const renderPlot = (histogram && histogram.length) || lineChart; - if (!Array.isArray(range) || !range.every(Number.isFinite)) { - return null; - } return (
- {renderPlot ? ( - onChange([val0, val1])} - marks={this.props.marks} - range={range} - value={this.props.plotValue || this.filterValueSelector(this.props)} - width={plotWidth} - isRanged={isRanged} - step={step} - timezone={timezone} - timeFormat={timeFormat} - playbackControlWidth={playbackControlWidth} - /> - ) : null} - - {this.props.xAxis ? ( -
- + {renderPlot ? ( + onChange([val0, val1])} + marks={this.props.marks} + range={range} + value={this.props.plotValue || this.filterValueSelector(this.props)} width={plotWidth} + isRanged={isRanged} + step={step} timezone={timezone} - domain={range} - isEnlarged={this.props.isEnlarged} + timeFormat={timeFormat} + playbackControlWidth={playbackControlWidth} + /> + ) : null} + + {this.props.xAxis ? ( +
+ +
+ ) : null} + { + onChange([val0, val1]); + }} + enableBarDrag /> -
- ) : null} - { - onChange([val0, val1]); - }} - enableBarDrag - /> - {!isRanged && showInput ? this._renderInput('value1') : null} -
- {isRanged && showInput ? ( - - {this._renderInput('value0')} - {this._renderInput('value1')} - - ) : null} + {!isRanged && showInput ? this._renderInput('value1') : null} + + {isRanged && showInput ? ( + + {this._renderInput('value0')} + {this._renderInput('value1')} + + ) : null} + + )}
); } diff --git a/src/components/common/styled-components.js b/src/components/common/styled-components.js index b2417f5a65..bec1da7dd0 100644 --- a/src/components/common/styled-components.js +++ b/src/components/common/styled-components.js @@ -476,6 +476,8 @@ export const StyledModalInputFootnote = styled.div.attrs({ * This workaround will hide the error banner. */ export const StyledMapContainer = styled.div` + width: 100%; + height: 100%; .mapboxgl-map { .mapboxgl-missing-css { display: none; diff --git a/src/components/index.js b/src/components/index.js index 891c1dc483..a090a61b82 100644 --- a/src/components/index.js +++ b/src/components/index.js @@ -37,7 +37,8 @@ export {default as KeplerGl, default, injectComponents, ContainerFactory} from ' export {default as KeplerGlFactory, DEFAULT_KEPLER_GL_PROPS} from './kepler-gl'; export {default as SidePanelFactory} from './side-panel'; export {default as PanelTitleFactory} from './side-panel/panel-title'; -export {default as MapContainerFactory} from './map-container'; +export {default as MapContainerFactory, Attribution, prepareLayersToRender} from './map-container'; +export {default as MapsLayoutFactory} from './maps-layout'; export { default as BottomWidgetFactory, LayerAnimationControllerFactory, @@ -165,6 +166,9 @@ export {DatasetSquare} from './common/styled-components'; export {default as ActionPanel, ActionPanelItem} from './common/action-panel'; export {default as DataTableFactory} from './common/data-table'; export {default as CanvasHack} from './common/data-table/canvas'; +export {default as MapLayerSelector} from './common/map-layer-selector'; +export {default as VerticalToolbar} from './common/vertical-toolbar'; +export {default as ToolbarItem} from './common/toolbar-item'; // side pane components export {default as LayerTypeSelectorFactory} from './side-panel/layer-panel/layer-type-selector'; diff --git a/src/components/kepler-gl.js b/src/components/kepler-gl.js index d3fe8102d7..3f6b8116aa 100644 --- a/src/components/kepler-gl.js +++ b/src/components/kepler-gl.js @@ -19,7 +19,7 @@ // THE SOFTWARE. import React, {Component, createRef} from 'react'; -import {console as Console} from 'global/window'; +import Console from 'global/console'; import {bindActionCreators} from 'redux'; import styled, {ThemeProvider, withTheme} from 'styled-components'; import {createSelector} from 'reselect'; @@ -45,6 +45,7 @@ import {MISSING_MAPBOX_TOKEN} from 'constants/user-feedbacks'; import SidePanelFactory from './side-panel'; import MapContainerFactory from './map-container'; +import MapsLayoutFactory from './maps-layout'; import BottomWidgetFactory from './bottom-widget'; import ModalContainerFactory from './modal-container'; import PlotContainerFactory from './plot-container'; @@ -56,6 +57,7 @@ import {validateToken} from 'utils/mapbox-utils'; import {mergeMessages} from 'utils/locale-utils'; import {theme as basicTheme, themeLT, themeBS} from 'styles/base'; +import {observeDimensions, unobserveDimensions} from '../utils/observe-dimensions'; // Maybe we should think about exporting this or creating a variable // as part of the base.js theme @@ -92,6 +94,16 @@ const GlobalStyle = styled.div` } `; +const BottomWidgetOuter = styled.div( + ({absolute}) => ` + ${absolute ? 'position: absolute; bottom: 0; right: 0;' : ''} + pointer-events: none; /* prevent padding from blocking input */ + & > * { + /* all children should allow input */ + pointer-events: all; + }` +); + export const mapFieldsSelector = props => ({ getMapboxRef: props.getMapboxRef, mapboxApiAccessToken: props.mapboxApiAccessToken, @@ -165,8 +177,6 @@ export const plotContainerSelector = props => ({ export const isSplitSelector = props => props.visState.splitMaps && props.visState.splitMaps.length > 1; -export const containerWSelector = props => - props.mapState.width * (Number(isSplitSelector(props)) + 1); export const bottomWidgetSelector = (props, theme) => ({ filters: props.visState.filters, @@ -175,8 +185,8 @@ export const bottomWidgetSelector = (props, theme) => ({ layers: props.visState.layers, animationConfig: props.visState.animationConfig, visStateActions: props.visStateActions, - sidePanelWidth: props.uiState.readOnly ? 0 : props.sidePanelWidth + theme.sidePanel.margin.left, - containerW: containerWSelector(props) + toggleModal: props.uiStateActions.toggleModal, + sidePanelWidth: props.uiState.readOnly ? 0 : props.sidePanelWidth + theme.sidePanel.margin.left }); export const modalContainerSelector = (props, rootNode) => ({ @@ -195,8 +205,6 @@ export const modalContainerSelector = (props, rootNode) => ({ providerActions: props.providerActions, rootNode, - containerW: containerWSelector(props), - containerH: props.mapState.height, // User defined cloud provider props cloudProviders: props.cloudProviders, onExportToCloudSuccess: props.onExportToCloudSuccess, @@ -237,6 +245,7 @@ KeplerGlFactory.deps = [ BottomWidgetFactory, GeoCoderPanelFactory, MapContainerFactory, + MapsLayoutFactory, ModalContainerFactory, SidePanelFactory, PlotContainerFactory, @@ -247,6 +256,7 @@ function KeplerGlFactory( BottomWidget, GeoCoderPanel, MapContainer, + MapsLayout, ModalContainer, SidePanel, PlotContainer, @@ -257,30 +267,35 @@ function KeplerGlFactory( class KeplerGL extends Component { static defaultProps = DEFAULT_KEPLER_GL_PROPS; + state = { + dimensions: null + }; + componentDidMount() { this._validateMapboxToken(); this._loadMapStyle(); - this._handleResize(this.props); if (typeof this.props.onKeplerGlInitialized === 'function') { this.props.onKeplerGlInitialized(); } + if (this.root.current instanceof HTMLElement) { + observeDimensions(this.root.current, this._handleResize); + } } - componentDidUpdate(prevProps) { - if ( - // if dimension props has changed - this.props.height !== prevProps.height || - this.props.width !== prevProps.width || - // react-map-gl will dispatch updateViewport after this._handleResize is called - // here we check if this.props.mapState.height is sync with props.height - this.props.height !== this.props.mapState.height - ) { - this._handleResize(this.props); + componentWillUnmount() { + if (this.root.current instanceof HTMLElement) { + unobserveDimensions(this.root.current); } } + + _handleResize = dimensions => { + this.setState({dimensions}); + }; + static contextType = RootContext; root = createRef(); + bottomWidgetRef = createRef(); /* selectors */ themeSelector = props => props.theme; @@ -321,17 +336,6 @@ function KeplerGlFactory( } } - _handleResize({width, height}) { - if (!Number.isFinite(width) || !Number.isFinite(height)) { - Console.warn('width and height is required'); - return; - } - this.props.mapStateActions.updateMap({ - width: width / (1 + Number(this.props.mapState.isSplit)), - height - }); - } - _loadMapStyle = () => { const defaultStyles = Object.values(this.props.mapStyle.mapStyles); // add id to custom map styles if not given @@ -365,6 +369,7 @@ function KeplerGlFactory( readOnly } = this.props; + const dimensions = this.state.dimensions || {width, height}; const { splitMaps, // this will store support for split map view is necessary interactionConfig @@ -385,11 +390,12 @@ function KeplerGlFactory( const notificationPanelFields = notificationPanelSelector(this.props); const mapContainers = !isSplit - ? [] + ? [] : splitMaps.map((settings, index) => ( @@ -403,6 +409,8 @@ function KeplerGlFactory( className="kepler-gl" id={`kepler-gl__${id}`} style={{ + display: 'flex', + flexDirection: 'column', position: 'relative', width: `${width}px`, height: `${height}px` @@ -411,13 +419,21 @@ function KeplerGlFactory( > {!uiState.readOnly && !readOnly && } -
- {mapContainers} -
+ {mapContainers} {isExportingImage && } {interactionConfig.geocoder.enabled && } - - + + + + diff --git a/src/components/map-container.d.ts b/src/components/map-container.d.ts new file mode 100644 index 0000000000..eb90b3bb0c --- /dev/null +++ b/src/components/map-container.d.ts @@ -0,0 +1,18 @@ +import {Layer} from '../layers'; +import {SplitMapLayers} from '../reducers/vis-state-updaters'; +import React from 'react'; + +export function prepareLayersToRender( + layers: Layer[], + layerData: any[], + mapLayers: SplitMapLayers | undefined +): {[id: string]: boolean}; + +export type MapContainerProps = { + // TODO + primary: boolean; +}; + +export default function MapContainerFactory(): React.Component; + +export const Attribution: React.FC<{}>; diff --git a/src/components/map-container.js b/src/components/map-container.js index 23e3025c40..6519dfda8d 100644 --- a/src/components/map-container.js +++ b/src/components/map-container.js @@ -19,7 +19,7 @@ // THE SOFTWARE. // libraries -import React, {Component} from 'react'; +import React, {Component, createRef} from 'react'; import PropTypes from 'prop-types'; import MapboxGLMap from 'react-map-gl'; import DeckGL from '@deck.gl/react'; @@ -50,17 +50,23 @@ import { import {OVERLAY_TYPE} from 'layers/base-layer'; import ErrorBoundary from 'components/common/error-boundary'; +import {observeDimensions, unobserveDimensions} from '../utils/observe-dimensions'; +import MapLegendPanelFactory from './map/map-legend-panel'; /** @type {{[key: string]: React.CSSProperties}} */ const MAP_STYLE = { container: { display: 'inline-block', - position: 'relative' + position: 'relative', + width: '100%', + height: '100%' }, top: { position: 'absolute', top: '0px', - pointerEvents: 'none' + pointerEvents: 'none', + width: '100%', + height: '100%' } }; @@ -68,7 +74,7 @@ const MAPBOXGL_STYLE_UPDATE = 'style.load'; const MAPBOXGL_RENDER = 'render'; const TRANSITION_DURATION = 0; -const Attribution = () => ( +export const Attribution = () => (
Basemap by: @@ -97,9 +103,29 @@ const Attribution = () => ( ); -MapContainerFactory.deps = [MapPopoverFactory, MapControlFactory, EditorFactory]; +// {[id]: true \ false} +export function prepareLayersToRender(layers, layerData, mapLayers) { + return layers.reduce( + (accu, layer, idx) => ({ + ...accu, + [layer.id]: + layer.id !== GEOCODER_LAYER_ID && + layer.shouldRenderLayer(layerData[idx]) && + // if layer.id is not in mapLayers, don't render it + (!mapLayers || (mapLayers && mapLayers[layer.id])) + }), + {} + ); +} + +MapContainerFactory.deps = [ + MapPopoverFactory, + MapControlFactory, + EditorFactory, + MapLegendPanelFactory +]; -export default function MapContainerFactory(MapPopover, MapControl, Editor) { +export default function MapContainerFactory(MapPopover, MapControl, Editor, MapLegendPanel) { class MapContainer extends Component { static propTypes = { // required @@ -121,6 +147,7 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) { uiStateActions: PropTypes.object.isRequired, // optional + primary: PropTypes.bool, // primary one will be reporting its size to appState readOnly: PropTypes.bool, isExport: PropTypes.bool, clicked: PropTypes.object, @@ -136,7 +163,8 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) { static defaultProps = { MapComponent: MapboxGLMap, deckGlProps: {}, - index: 0 + index: 0, + primary: true }; constructor(props) { @@ -147,6 +175,11 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) { }; this._deck = null; + this._ref = createRef(); + } + + componentDidMount() { + observeDimensions(this._ref.current, this._handleResize); } componentWillUnmount() { @@ -155,8 +188,19 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) { this._map.off(MAPBOXGL_STYLE_UPDATE); this._map.off(MAPBOXGL_RENDER); } + unobserveDimensions(this._ref.current); } + _handleResize = dimensions => { + const {primary} = this.props; + if (primary) { + const {mapStateActions} = this.props; + if (dimensions && dimensions.width > 0 && dimensions.height > 0) { + mapStateActions.updateMap(dimensions); + } + } + }; + layersSelector = props => props.layers; layerDataSelector = props => props.layerData; mapLayersSelector = props => props.mapLayers; @@ -165,18 +209,7 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) { this.layersSelector, this.layerDataSelector, this.mapLayersSelector, - // {[id]: true \ false} - (layers, layerData, mapLayers) => - layers.reduce( - (accu, layer, idx) => ({ - ...accu, - [layer.id]: - layer.id !== GEOCODER_LAYER_ID && - layer.shouldRenderLayer(layerData[idx]) && - this._isVisibleMapLayer(layer, mapLayers) - }), - {} - ) + prepareLayersToRender ); filtersSelector = props => props.filters; @@ -193,11 +226,6 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) { ); /* component private functions */ - _isVisibleMapLayer(layer, mapLayers) { - // if layer.id is not in mapLayers, don't render it - return !mapLayers || (mapLayers && mapLayers[layer.id]); - } - _onCloseMapPopover = () => { this.props.visStateActions.onLayerClick(null); }; @@ -333,8 +361,6 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) { const commonProp = { onClose: this._onCloseMapPopover, - mapW: mapState.width, - mapH: mapState.height, zoom: mapState.zoom, container: this._deck ? this._deck.canvas : undefined }; @@ -458,10 +484,19 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) { } _onViewportChange = viewState => { + const {width, height, ...restViewState} = viewState; + const {primary} = this.props; + // react-map-gl sends 0,0 dimensions during initialization + // after we have received proper dimensions from observeDimensions + const next = { + ...(width > 0 && height > 0 ? viewState : restViewState), + // enabling transition in two maps may lead to endless update loops + transitionDuration: primary ? TRANSITION_DURATION : 0 + }; if (typeof this.props.onViewStateChange === 'function') { - this.props.onViewStateChange(viewState); + this.props.onViewStateChange(next); } - this.props.mapStateActions.updateMap(viewState); + this.props.mapStateActions.updateMap(next); }; _toggleMapControl = panelId => { @@ -470,36 +505,34 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) { uiStateActions.toggleMapControl(panelId, index); }; - render() { + /* eslint-disable complexity */ + _renderMap() { const { mapState, mapStyle, mapStateActions, - mapLayers, layers, MapComponent, datasets, mapboxApiAccessToken, mapboxApiUrl, mapControls, + isExport, locale, uiStateActions, visStateActions, interactionConfig, editor, index, - isExport + primary } = this.props; const layersToRender = this.layersToRenderSelector(this.props); - if (!mapStyle.bottomMapStyle) { - // style not yet loaded - return
; - } - const mapProps = { ...mapState, + width: '100%', + height: '100%', preserveDrawingBuffer: true, mapboxApiAccessToken, mapboxApiUrl, @@ -510,13 +543,15 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) { const isEdit = (mapControls.mapDraw || {}).active; const hasGeocoderLayer = layers.find(l => l.id === GEOCODER_LAYER_ID); + const isSplit = Boolean(index); return ( - + <> 'pointer' : undefined} - transitionDuration={TRANSITION_DURATION} onMouseMove={this.props.visStateActions.onMouseMove} > {this._renderDeckOverlay(layersToRender)} @@ -573,7 +607,16 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) {
) : null} {this._renderMapPopover(layersToRender)} - + {!isSplit || index === 1 ? : null} + + ); + } + + render() { + const {mapState, mapStyle} = this.props; + return ( + + {mapStyle.bottomMapStyle && this._renderMap()} ); } diff --git a/src/components/map/layer-selector-panel.js b/src/components/map/layer-selector-panel.js index cf4f03c4cf..d0df143dad 100644 --- a/src/components/map/layer-selector-panel.js +++ b/src/components/map/layer-selector-panel.js @@ -1,3 +1,23 @@ +// Copyright (c) 2021 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + import React, {useCallback, useMemo} from 'react'; import {MapControlButton} from 'components/common/styled-components'; import {Layers} from '../common/icons'; @@ -19,7 +39,7 @@ function LayerSelectorPanelFactory(MapControlTooltip, MapControlPanel) { readOnly }) => { const visibleLayers = mapControls?.visibleLayers || {}; - const {active: isActive, show, disableClose} = visibleLayers; + const {active: isActive, show, disableClose} = visibleLayers || {}; const legendLayers = useMemo( () => diff --git a/src/components/map/locale-panel.js b/src/components/map/locale-panel.js index ddef051905..3729f7a3b1 100644 --- a/src/components/map/locale-panel.js +++ b/src/components/map/locale-panel.js @@ -1,3 +1,23 @@ +// Copyright (c) 2021 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + import React, {useCallback} from 'react'; import ToolbarItem from 'components/common/toolbar-item'; import {MapControlButton} from 'components/common/styled-components'; @@ -15,7 +35,7 @@ function LocalePanelFactory(MapControlTooltip, MapControlPanel, MapControlToolba /** @type {import('./locale-panel').LocalePanelComponent} */ const LocalePanel = React.memo( ({availableLocales, onToggleMenuPanel, onSetLocale, locale: currentLocal, mapControls}) => { - const {active: isActive, disableClose} = mapControls.mapLocale || {}; + const {active: isActive, disableClose, show} = mapControls.mapLocale || {}; const onClickItem = useCallback( locale => { @@ -33,7 +53,7 @@ function LocalePanelFactory(MapControlTooltip, MapControlPanel, MapControlToolba ); const getLabel = useCallback(locale => `toolbar.${locale}`, []); - if (!mapControls.mapLocale) { + if (!show) { return null; } return ( diff --git a/src/components/map/map-control-panel.js b/src/components/map/map-control-panel.js index 6fb0ef8aea..f907e5b7ad 100644 --- a/src/components/map/map-control-panel.js +++ b/src/components/map/map-control-panel.js @@ -1,3 +1,23 @@ +// Copyright (c) 2021 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + import React from 'react'; import styled from 'styled-components'; import {FormattedMessage} from 'localization'; diff --git a/src/components/map/map-control-toolbar.js b/src/components/map/map-control-toolbar.js index 186f2f036a..5730cd2f93 100644 --- a/src/components/map/map-control-toolbar.js +++ b/src/components/map/map-control-toolbar.js @@ -1,3 +1,23 @@ +// Copyright (c) 2021 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + import styled from 'styled-components'; import VerticalToolbar from '../common/vertical-toolbar'; diff --git a/src/components/map/map-control-tooltip.js b/src/components/map/map-control-tooltip.js index c41da9cd81..8997202520 100644 --- a/src/components/map/map-control-tooltip.js +++ b/src/components/map/map-control-tooltip.js @@ -1,3 +1,23 @@ +// Copyright (c) 2021 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + import React from 'react'; import {Tooltip} from '..'; import {FormattedMessage} from 'localization'; diff --git a/src/components/map/map-control.js b/src/components/map/map-control.js index 6c82568c2a..37245e5a6b 100644 --- a/src/components/map/map-control.js +++ b/src/components/map/map-control.js @@ -39,6 +39,11 @@ const StyledMapControl = styled.div` display: grid; row-gap: 8px; justify-items: end; + pointer-events: none; /* prevent padding from blocking input */ + & > * { + /* all children should allow input */ + pointer-events: all; + } `; const LegendLogo = ; diff --git a/src/components/map/map-draw-panel.js b/src/components/map/map-draw-panel.js index 80058fbcbe..9398f3d99a 100644 --- a/src/components/map/map-draw-panel.js +++ b/src/components/map/map-draw-panel.js @@ -1,3 +1,23 @@ +// Copyright (c) 2021 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + import React, {useCallback} from 'react'; import {EDITOR_MODES} from 'constants/default-settings'; import { @@ -38,12 +58,13 @@ function MapDrawPanelFactory(MapControlTooltip, MapControlPanel, MapControlToolb onToggleEditorVisibility, actionIcons = defaultActionIcons }) => { - // const {mapDraw} = mapControls; - // const {active: isActive} = mapDraw; const isActive = mapControls?.mapDraw?.active; const onToggleMenuPanel = useCallback(() => onToggleMapControl('mapDraw'), [ onToggleMapControl ]); + if (!mapControls?.mapDraw?.show) { + return null; + } return (
{isActive ? ( diff --git a/src/components/map/map-legend-panel.js b/src/components/map/map-legend-panel.js index 96f3e6d2f8..7edadf5746 100644 --- a/src/components/map/map-legend-panel.js +++ b/src/components/map/map-legend-panel.js @@ -1,3 +1,23 @@ +// Copyright (c) 2021 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + import React, {useCallback} from 'react'; import {Legend} from 'components/common/icons'; import {FormattedMessage} from 'localization'; @@ -31,8 +51,8 @@ function MapLegendPanelFactory(MapControlTooltip, MapControlPanel, MapLegend) { logoComponent, actionIcons = defaultActionIcons }) => { - const {mapLegend} = mapControls; - const {active: isActive, disableClose} = mapLegend; + const mapLegend = mapControls?.mapLegend || {}; + const {active: isActive, disableClose} = mapLegend || {}; const onToggleMenuPanel = useCallback(() => onToggleMapControl('mapLegend'), [ onToggleMapControl ]); @@ -45,6 +65,9 @@ function MapLegendPanelFactory(MapControlTooltip, MapControlPanel, MapLegend) { [onToggleMenuPanel] ); + if (!mapLegend.show) { + return null; + } return !isActive ? ( ( splitMap.show && readOnly !== true, [splitMap.show, readOnly]); + if (!splitMap.show) { + return null; + } + return isVisible ? ( (; diff --git a/src/components/maps-layout.js b/src/components/maps-layout.js new file mode 100644 index 0000000000..fd9f6e2d0a --- /dev/null +++ b/src/components/maps-layout.js @@ -0,0 +1,40 @@ +// Copyright (c) 2021 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +import styled from 'styled-components'; +import React from 'react'; + +const Outer = styled.div` + position: relative; + display: flex; + width: 100%; + height: 100%; +`; + +MapsLayoutFactory.deps = []; + +export default function MapsLayoutFactory() { + class MapsLayout extends React.Component { + render() { + return {this.props.children}; + } + } + return MapsLayout; +} diff --git a/src/components/plot-container.js b/src/components/plot-container.js index 2443121f23..35648e4efa 100644 --- a/src/components/plot-container.js +++ b/src/components/plot-container.js @@ -27,6 +27,7 @@ import {StaticMap} from 'react-map-gl'; import debounce from 'lodash.debounce'; import {exportImageError} from 'utils/notifications-utils'; import MapContainerFactory from './map-container'; +import MapsLayoutFactory from './maps-layout'; import {convertToPng} from 'utils/export-utils'; import {scaleMapStyleByResolution} from 'utils/map-style-utils/mapbox-gl-style-editor'; import {getScaleFromImageSize} from 'utils/export-utils'; @@ -50,7 +51,7 @@ const propTypes = { splitMaps: PropTypes.arrayOf(PropTypes.object) }; -PlotContainerFactory.deps = [MapContainerFactory]; +PlotContainerFactory.deps = [MapContainerFactory, MapsLayoutFactory]; // Remove mapbox logo in exported map, because it contains non-ascii characters const StyledPlotContainer = styled.div` @@ -78,7 +79,7 @@ const deckGlProps = { } }; -export default function PlotContainerFactory(MapContainer) { +export default function PlotContainerFactory(MapContainer, MapsLayout) { class PlotContainer extends Component { constructor(props) { super(props); @@ -208,18 +209,20 @@ export default function PlotContainerFactory(MapContainer) { }; const mapContainers = !isSplit ? ( - + ) : ( - splitMaps.map((settings, index) => ( - - )) + + {splitMaps.map((settings, index) => ( + + ))} + ); - return ( diff --git a/src/components/side-panel/panel-tab.js b/src/components/side-panel/panel-tab.js index 9f3e430659..1dfea5fd90 100644 --- a/src/components/side-panel/panel-tab.js +++ b/src/components/side-panel/panel-tab.js @@ -1,3 +1,23 @@ +// Copyright (c) 2021 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + import React from 'react'; import styled from 'styled-components'; import {Tooltip} from 'components/common/styled-components'; diff --git a/src/components/side-panel/panel-title.js b/src/components/side-panel/panel-title.js index ccccb8b13f..d4dc9e1c9e 100644 --- a/src/components/side-panel/panel-title.js +++ b/src/components/side-panel/panel-title.js @@ -1,3 +1,23 @@ +// Copyright (c) 2021 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + import styled from 'styled-components'; const PanelTitleFactory = () => styled.div` diff --git a/src/components/side-panel/side-bar.js b/src/components/side-panel/side-bar.js index 90ceb956ed..030dc3f9ed 100644 --- a/src/components/side-panel/side-bar.js +++ b/src/components/side-panel/side-bar.js @@ -34,6 +34,11 @@ const StyledSidePanelContainer = styled.div` padding-right: ${props => props.theme.sidePanel.margin.right}px; padding-bottom: ${props => props.theme.sidePanel.margin.bottom}px; padding-left: ${props => props.theme.sidePanel.margin.left}px; + pointer-events: none; /* prevent padding from blocking input */ + & > * { + /* all children should allow input */ + pointer-events: all; + } `; const SideBarContainer = styled.div` diff --git a/src/localization/ru.js b/src/localization/ru.js index 0b09e6e934..9f4677825e 100644 --- a/src/localization/ru.js +++ b/src/localization/ru.js @@ -1,485 +1,488 @@ -// Copyright (c) 2021 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import {LOCALES} from './locales'; - -export default { - property: { - weight: 'вес', - label: 'ярлык', - fillColor: 'цвет заливки', - color: 'цвет', - coverage: 'покрытие', - strokeColor: 'цвет обводки', - radius: 'радиус', - outline: 'контур', - stroke: 'обводка', - density: 'плотность', - height: 'высота', - sum: 'сумма', - pointCount: 'Кол-во точек' - }, - placeholder: { - search: 'Поиск', - selectField: 'Выберите поле', - yAxis: 'Y Ось', - selectType: 'Выберите A тип', - selectValue: 'Выберите A значение', - enterValue: 'Введите значение', - empty: 'пустой' - }, - misc: { - by: '', - valuesIn: 'Значение в', - valueEquals: 'Значение равно', - dataSource: 'Источник данных', - brushRadius: 'Радиус кисти (km)', - empty: ' ' - }, - mapLayers: { - title: 'Слои карты', - label: 'Обозначения', - road: 'Дороги', - border: 'Границы', - building: 'Здания', - water: 'Вода', - land: 'Земля', - '3dBuilding': '3d здания' - }, - panel: { - text: { - label: 'Ярлык', - labelWithId: 'Ярлык {labelId}', - fontSize: 'Размер шрифта', - fontColor: 'Цвет шрифта', - textAnchor: 'Анкор текста', - alignment: 'Положение', - addMoreLabel: 'Добавить еще ярлык' - } - }, - sidebar: { - panels: { - layer: 'Слои', - filter: 'Фильтры', - interaction: 'Взаимодействия', - basemap: 'Базовая карта' - } - }, - layer: { - required: 'Требования*', - radius: 'Радиус', - color: 'Цвет', - fillColor: 'Цвет заливки', - outline: 'Контур', - weight: 'Вес', - propertyBasedOn: '{property} на основе', - coverage: 'Покрытие', - stroke: 'Обводка', - strokeWidth: 'Ширина обводки', - strokeColor: 'Цвет обводки', - basic: 'Basic', - trailLength: 'Trail Length', - trailLengthDescription: 'Number of seconds for a path to completely fade out', - newLayer: 'new layer', - elevationByDescription: 'When off, height is based on count of points', - colorByDescription: 'When off, color is based on count of points', - aggregateBy: 'Aggregate {field} by', - '3DModel': '3D Model', - '3DModelOptions': '3D Model Options', - type: { - point: 'точки', - arc: 'дуги', - line: 'линии', - grid: 'сетка', - hexbin: 'hexbin', - polygon: 'многоугольники', - geojson: 'geojson', - cluster: 'кластеры', - icon: 'значки', - heatmap: 'тепловая карта', - hexagon: 'шестиугольник', - hexagonid: 'H3', - trip: 'пути', - s2: 'S2', - '3d': '3D' - } - }, - layerVisConfigs: { - angle: 'Угол', - strokeWidth: 'Ширина штриха (в пикселях)', - strokeWidthRange: 'Диапазон ширины штриха', - radius: 'Радиус', - fixedRadius: 'Фиксированный радиус в метрах', - fixedRadiusDescription: 'Сопоставьте радиус с абсолютным радиусом в метрах, например От 5 до 5 метров', - radiusRange: 'Диапазон радиуса', - clusterRadius: 'Радиус кластера в пикселях', - radiusRangePixels: 'Диапазон радиуса в пикселях', - opacity: 'Непрозрачность', - coverage: 'Покрытие', - outline: 'Контур', - colorRange: 'Цветовая гамма', - stroke: 'Обводка', - strokeColor: 'Цвет обводки', - strokeColorRange: 'Обводка Цветовой диапазон', - targetColor: 'Целевой цвет', - colorAggregation: 'Цветовая агрегация', - heightAggregation: 'Агрегация по высоте', - resolutionRange: 'Диапазон разрешения', - sizeScale: 'Шкала размеров', - worldUnitSize: 'Мировые ед.изм.', - elevationScale: 'Шкала возвышения', - enableElevationZoomFactor: 'Использовать коэффициент увеличения по высоте', - enableElevationZoomFactorDescription: 'Отрегулируйте высоту / возвышение на основе текущего коэффициента масштабирования', - enableHeightZoomFactor: 'вкл. коэффициент масштабирования по высоте', - heightScale: 'Масштаб высоты', - coverageRange: 'Диапазон покрытия', - highPrecisionRendering: 'Высокая точность рендеринга', - highPrecisionRenderingDescription: 'Высокая точность приведет к снижению производительности', - height: 'Высота', - heightDescription: 'Нажмите кнопку в правом верхнем углу карты, чтобы переключиться в 3D-вид', - fill: 'Наполнить', - enablePolygonHeight: 'Включить высоту многоугольника', - showWireframe: 'Показать каркас', - weightIntensity: 'Вес Интенсивность', - zoomScale: 'Масштаб увеличения', - heightRange: 'Диапазон высоты', - heightMultiplier: 'Множитель высоты' - }, - layerManager: { - addData: 'Добавить данные', - addLayer: 'Добавить слой', - layerBlending: 'Смешивание слоев' - }, - mapManager: { - mapStyle: 'Стиль карты', - addMapStyle: 'Добавить стиль карты', - '3dBuildingColor': '3D Цвет здания' - }, - layerConfiguration: { - defaultDescription: 'Рассчитать {property} на основе выбранного поля', - howTo: 'How to' - }, - filterManager: { - addFilter: 'Добавить фильтр' - }, - datasetTitle: { - showDataTable: 'Показать таблицу данных ', - removeDataset: 'Удалить набор данных' - }, - datasetInfo: { - rowCount: '{rowCount} строк' - }, - tooltip: { - hideLayer: 'скрыть слой', - showLayer: 'показать слой', - hideFeature: 'Скрыть функцию', - showFeature: 'Показать функцию', - hide: 'скрыть', - show: 'показать', - removeLayer: 'Удалить слой', - duplicateLayer: 'Дублировать слой', - layerSettings: 'Настройки слоя', - closePanel: 'Закрыть текущую панель', - switchToDualView: 'Перейти в режим двойной карты', - showLegend: 'Показать легенду', - disable3DMap: 'Отключить 3D Карту', - DrawOnMap: 'Рисовать на карте', - selectLocale: 'Выберите регион', - hideLayerPanel: 'Скрыть панель слоев', - showLayerPanel: 'Показать панель слоев', - moveToTop: 'Перейти к верхним слоям данных', - selectBaseMapStyle: 'Выберите стиль базовой карты', - delete: 'Удалить', - timePlayback: 'Воспроизведение времени', - cloudStorage: 'Облачное хранилище', - '3DMap': '3D Карта', - animationByWindow: 'Перемещение временного окна', - animationByIncremental: 'Дополнительное временное окно', - speed: 'скорость', - play: 'проиграть', - pause: 'пауза', - reset: 'перезапустить' - }, - toolbar: { - exportImage: 'Экспорт изображения', - exportData: 'Экспорт данных', - exportMap: 'Экспорт карты', - shareMapURL: 'Share Map URL', - saveMap: 'Сохарнить Карту', - select: 'Выбрать', - polygon: 'Многоугольник', - rectangle: 'Квадрат', - hide: 'Скрыть', - show: 'Показать', - ...LOCALES - }, - editor: { - filterLayer: 'Слои фильтров', - copyGeometry: 'Копировать геометрию' - }, - - modal: { - title: { - deleteDataset: 'Удалить данные', - addDataToMap: 'Добавить данные на карту', - exportImage: 'Экспорт изображения', - exportData: 'Экспорт данных', - exportMap: 'Экспорт карты', - addCustomMapboxStyle: 'Добавить собственный стиль карты', - saveMap: 'Поделиться Картой', - shareURL: 'Поделиться URL' - }, - button: { - delete: 'Удалить', - download: 'Скачать', - export: 'Экспортировать', - addStyle: 'Добавить стиль', - save: 'Сохранить', - defaultCancel: 'Отменить', - defaultConfirm: 'Подтвердить' - }, - exportImage: { - ratioTitle: 'Ratio', - ratioDescription: 'Выберите соотношение для различного использования', - ratioOriginalScreen: 'Исходный экран', - ratioCustom: 'Настройки', - ratio4_3: '4:3', - ratio16_9: '16:9', - resolutionTitle: 'Разрешение', - resolutionDescription: 'Для печати лучше использовать высокое разрешение', - mapLegendTitle: 'Легенда карты', - mapLegendAdd: 'Добавить легенду на карту' - }, - exportData: { - datasetTitle: 'Набор данных', - datasetSubtitle: 'Выберите наборы данных, которые хотите экспортировать', - allDatasets: 'Все', - dataTypeTitle: 'Тип данных', - dataTypeSubtitle: 'Выберите тип данных, которые вы хотите экспортировать', - filterDataTitle: 'Отфильтрованные данные', - filterDataSubtitle: 'Вы можете выбрать экспорт исходных данных или отфильтрованных данных', - filteredData: 'Отфильтрованные данные', - unfilteredData: 'Нефильтрованные данные', - fileCount: '{fileCount} Файлов', - rowCount: '{rowCount} Строк' - }, - deleteData: { - warning: 'вы собираетесь удалить этот набор данных. Это повлияет на {length} слой' - }, - addStyle: { - publishTitle: - '2. Если вы указали URL-адрес файла mapbox на шаге 1, опубликуйте свой стиль на mapbox или предоставьте токен доступа. (Необязательно)', - publishSubtitle1: 'Вы можете создать свой собственный стиль карты', - publishSubtitle2: 'и', - publishSubtitle3: 'опубликовать', - publishSubtitle4: 'его.', - publishSubtitle5: 'Чтобы использовать частный стиль, вставьте свой', - publishSubtitle6: 'token доступа', - publishSubtitle7: - 'прим. kepler.gl - это клиентское приложение, данные остаются в вашем браузере .', - exampleToken: 'например pk.abcdefg.xxxxxx', - pasteTitle: '1. Вставить URL стиля', - pasteSubtitle0: 'URL стиля может быть mapbox', - pasteSubtitle1: 'Или', - pasteSubtitle2: 'URL стиля', - pasteSubtitle3: 'style.json используя', - pasteSubtitle4: 'Mapbox GL Style Spec', - namingTitle: '3. Назови свой стиль' - }, - shareMap: { - shareUriTitle: 'Поделиться URL карты', - shareUriSubtitle: 'Создать URL карты, чтобы поделиться с другими', - cloudTitle: 'Облачное хранилище', - cloudSubtitle: 'Войдите и загрузите данные карты в свое личное облачное хранилище', - shareDisclaimer: - 'kepler.gl сохранит данные вашей карты в вашем личном облачном хранилище, только люди с URL-адресом могут получить доступ к вашей карте и данным. ' + - 'Вы можете редактировать / удалить файл данных в своей облачной учетной записи в любое время.', - gotoPage: 'Перейти на страницу Kepler.gl {currentProvider}' - }, - statusPanel: { - mapUploading: 'Загрузка карты', - error: 'Ошибка' - }, - saveMap: { - title: 'Облачное хранилище', - subtitle: 'Авторизуйтесь, чтобы сохранить карту в вашем личном облачном хранилище' - }, - exportMap: { - formatTitle: 'Формат карты', - formatSubtitle: 'Выберите формат для экспорта карты', - html: { - selection: 'Экспорт карты в интерактивный файл HTML.', - tokenTitle: 'Токен доступа к Mapbox', - tokenSubtitle: 'Используйте свой токен доступа Mapbox в html(необязательно)', - tokenPlaceholder: 'Вставьте токен доступа Mapbox', - tokenMisuseWarning: - '* If you do not provide your own token, the map may fail to display at any time when we replace ours to avoid misuse. ', - tokenDisclaimer: 'Если вы не предоставите свой собственный токен, карта может не отображаться в любое время, когда мы заменяем наш, чтобы избежать неправильного использования.', - tokenUpdate: 'Как обновить существующий токен карты.', - modeTitle: 'Режим карты', - modeSubtitle1: 'Выберите режим приложения. Подробнее', - modeSubtitle2: 'Информация', - modeDescription: 'Разрешить пользователям {mode} карту', - read: 'чтение', - edit: 'редактирование' - }, - json: { - configTitle: 'Конфигурация карты', - configDisclaimer: - 'Конфигурация карты будет включена в файл Json. Если вы используете kepler.gl в своем собственном приложении. Вы можете скопировать этот конфиг и передать его ', - selection: - 'Экспорт текущих данных карты и конфигурации в один файл Json. Позже вы сможете открыть ту же карту, загрузив этот файл на kepler.gl.', - disclaimer: - '* Конфигурация карты связана с загруженными наборами данных. DataId используется для привязки слоев, фильтров и всплывающих подсказок к определенному набору данных. ' + - 'При передаче этой конфигурации addDataToMap, убедитесь, что идентификатор набора данных совпадает с dataId / s в этой конфигурации.' - } - }, - loadingDialog: { - loading: 'Загрузка...' - }, - loadData: { - upload: 'Загрузить файлы', - storage: 'Загрузить из хранилища' - }, - tripInfo: { - title: 'Как включить анимацию поездки', - description1: - 'Чтобы анимировать путь, данные geoJSON должны содержать LineString в своей геометрии объекта, а координаты в LineString должны иметь 4 элемента в форматах', - code: ' [longitude, latitude, altitude, timestamp] ', - description2: - 'с последним элементом, являющимся отметкой времени. Допустимые форматы меток времени включают unix в секундах, например 1564184363, или в миллисекундах, например 1564184363000', - example: ',Пример:' - }, - iconInfo: { - title: 'Как рисовать значки', - description1: - 'В вашем csv создайте столбец, поместите в него имя значка, который вы хотите нарисовать. Вы можете оставить ячейку пустой, если не хотите, чтобы значок отображался для некоторых точек. Когда столбец назван', - code: 'значек', - description2: ' kepler.gl автоматически создаст для вас слой значков.', - example: 'Пример:', - icons: 'Значки' - }, - storageMapViewer: { - lastModified: 'Последнее изменение {lastUpdated} назад', - back: 'Назад' - }, - overwriteMap: { - title: 'Сохранение карты...', - alreadyExists: 'уже существует в вашем {mapSaved}. Хотите его перезаписать?' - }, - loadStorageMap: { - back: 'Назад', - goToPage: 'Перейти на страницу Kepler.gl {displayName}', - storageMaps: 'Хранилище / Карты', - noSavedMaps: 'Нет сохраненных карт' - } - }, - header: { - visibleLayers: 'Видимые слои', - layerLegend: 'Легенда слоя' - }, - interactions: { - tooltip: 'Подсказка', - brush: 'Кисть', - coordinate: 'Координаты', - geocoder: 'Геокодер' - }, - layerBlending: { - title: 'Смешивание слоев', - additive: 'добавление', - normal: 'нормальное', - subtractive: 'вычитание' - }, - columns: { - title: 'Столбцы', - lat: 'lat', - lng: 'lon', - altitude: 'высота', - icon: 'значек', - geojson: 'geojson', - token: 'token', - arc: { - lat0: 'lat источника', - lng0: 'lng источника', - lat1: 'lat цели', - lng1: 'lng цели' - }, - line: { - alt0: 'высота источника', - alt1: 'высота цели' - }, - grid: { - worldUnitSize: 'Размер сетки (km)' - }, - hexagon: { - worldUnitSize: 'Hexagon радиус (km)' - }, - hex_id: 'hex id' - }, - color: { - customPalette: 'Ваша палитра', - steps: 'шагов', - type: 'тип', - reversed: 'перевернуть' - }, - scale: { - colorScale: 'Цветовая шкала', - sizeScale: 'Масштаб размера', - strokeScale: 'Масштаб штриха', - scale: 'Масштаб' - }, - fileUploader: { - message: 'Перетащите сюда ваши файлы', - chromeMessage: - '*Пользователь Chrome: ограничьте размер файла до 250 МБ, если нужно загрузить файл большего размера, попробуйте Safari', - disclaimer: - '*kepler.gl - это клиентское приложение без серверной части. Данные живут только на вашем компьютере. ' + - 'Никакая информация или данные карты не отправляются ни на один сервер.', - configUploadMessage: - 'Загрузите {fileFormatNames} или сохраненную карту **Json**. Подробнее [**supported file formats**]', - browseFiles: 'Просматреть файлы', - uploading: 'Загрузка', - fileNotSupported: 'File {errorFiles} is not supported.', - or: 'or' - }, - geocoder: { - title: 'Введите адрес или координаты, например 37.79, -122.40' - }, - fieldSelector: { - clearAll: 'Очистить все', - formatting: 'Форматирование' - }, - compare: { - modeLabel: 'Режим сравнения', - typeLabel: 'Тип сравнения', - types: { - absolute: 'Абсолютный', - relative: 'Относительный' - } - }, - mapPopover: { - primary: 'Первичный' - }, - density: 'density', - 'Bug Report': 'Отчет об ошибках', - 'User Guide': 'Инструкции', - Save: 'Сохранить', - Share: 'Поделиться' -}; +// Copyright (c) 2021 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +import {LOCALES} from './locales'; + +export default { + property: { + weight: 'вес', + label: 'ярлык', + fillColor: 'цвет заливки', + color: 'цвет', + coverage: 'покрытие', + strokeColor: 'цвет обводки', + radius: 'радиус', + outline: 'контур', + stroke: 'обводка', + density: 'плотность', + height: 'высота', + sum: 'сумма', + pointCount: 'Кол-во точек' + }, + placeholder: { + search: 'Поиск', + selectField: 'Выберите поле', + yAxis: 'Y Ось', + selectType: 'Выберите A тип', + selectValue: 'Выберите A значение', + enterValue: 'Введите значение', + empty: 'пустой' + }, + misc: { + by: '', + valuesIn: 'Значение в', + valueEquals: 'Значение равно', + dataSource: 'Источник данных', + brushRadius: 'Радиус кисти (km)', + empty: ' ' + }, + mapLayers: { + title: 'Слои карты', + label: 'Обозначения', + road: 'Дороги', + border: 'Границы', + building: 'Здания', + water: 'Вода', + land: 'Земля', + '3dBuilding': '3d здания' + }, + panel: { + text: { + label: 'Ярлык', + labelWithId: 'Ярлык {labelId}', + fontSize: 'Размер шрифта', + fontColor: 'Цвет шрифта', + textAnchor: 'Анкор текста', + alignment: 'Положение', + addMoreLabel: 'Добавить еще ярлык' + } + }, + sidebar: { + panels: { + layer: 'Слои', + filter: 'Фильтры', + interaction: 'Взаимодействия', + basemap: 'Базовая карта' + } + }, + layer: { + required: 'Требования*', + radius: 'Радиус', + color: 'Цвет', + fillColor: 'Цвет заливки', + outline: 'Контур', + weight: 'Вес', + propertyBasedOn: '{property} на основе', + coverage: 'Покрытие', + stroke: 'Обводка', + strokeWidth: 'Ширина обводки', + strokeColor: 'Цвет обводки', + basic: 'Basic', + trailLength: 'Trail Length', + trailLengthDescription: 'Number of seconds for a path to completely fade out', + newLayer: 'new layer', + elevationByDescription: 'When off, height is based on count of points', + colorByDescription: 'When off, color is based on count of points', + aggregateBy: 'Aggregate {field} by', + '3DModel': '3D Model', + '3DModelOptions': '3D Model Options', + type: { + point: 'точки', + arc: 'дуги', + line: 'линии', + grid: 'сетка', + hexbin: 'hexbin', + polygon: 'многоугольники', + geojson: 'geojson', + cluster: 'кластеры', + icon: 'значки', + heatmap: 'тепловая карта', + hexagon: 'шестиугольник', + hexagonid: 'H3', + trip: 'пути', + s2: 'S2', + '3d': '3D' + } + }, + layerVisConfigs: { + angle: 'Угол', + strokeWidth: 'Ширина штриха (в пикселях)', + strokeWidthRange: 'Диапазон ширины штриха', + radius: 'Радиус', + fixedRadius: 'Фиксированный радиус в метрах', + fixedRadiusDescription: + 'Сопоставьте радиус с абсолютным радиусом в метрах, например От 5 до 5 метров', + radiusRange: 'Диапазон радиуса', + clusterRadius: 'Радиус кластера в пикселях', + radiusRangePixels: 'Диапазон радиуса в пикселях', + opacity: 'Непрозрачность', + coverage: 'Покрытие', + outline: 'Контур', + colorRange: 'Цветовая гамма', + stroke: 'Обводка', + strokeColor: 'Цвет обводки', + strokeColorRange: 'Обводка Цветовой диапазон', + targetColor: 'Целевой цвет', + colorAggregation: 'Цветовая агрегация', + heightAggregation: 'Агрегация по высоте', + resolutionRange: 'Диапазон разрешения', + sizeScale: 'Шкала размеров', + worldUnitSize: 'Мировые ед.изм.', + elevationScale: 'Шкала возвышения', + enableElevationZoomFactor: 'Использовать коэффициент увеличения по высоте', + enableElevationZoomFactorDescription: + 'Отрегулируйте высоту / возвышение на основе текущего коэффициента масштабирования', + enableHeightZoomFactor: 'вкл. коэффициент масштабирования по высоте', + heightScale: 'Масштаб высоты', + coverageRange: 'Диапазон покрытия', + highPrecisionRendering: 'Высокая точность рендеринга', + highPrecisionRenderingDescription: 'Высокая точность приведет к снижению производительности', + height: 'Высота', + heightDescription: 'Нажмите кнопку в правом верхнем углу карты, чтобы переключиться в 3D-вид', + fill: 'Наполнить', + enablePolygonHeight: 'Включить высоту многоугольника', + showWireframe: 'Показать каркас', + weightIntensity: 'Вес Интенсивность', + zoomScale: 'Масштаб увеличения', + heightRange: 'Диапазон высоты', + heightMultiplier: 'Множитель высоты' + }, + layerManager: { + addData: 'Добавить данные', + addLayer: 'Добавить слой', + layerBlending: 'Смешивание слоев' + }, + mapManager: { + mapStyle: 'Стиль карты', + addMapStyle: 'Добавить стиль карты', + '3dBuildingColor': '3D Цвет здания' + }, + layerConfiguration: { + defaultDescription: 'Рассчитать {property} на основе выбранного поля', + howTo: 'How to' + }, + filterManager: { + addFilter: 'Добавить фильтр' + }, + datasetTitle: { + showDataTable: 'Показать таблицу данных ', + removeDataset: 'Удалить набор данных' + }, + datasetInfo: { + rowCount: '{rowCount} строк' + }, + tooltip: { + hideLayer: 'скрыть слой', + showLayer: 'показать слой', + hideFeature: 'Скрыть функцию', + showFeature: 'Показать функцию', + hide: 'скрыть', + show: 'показать', + removeLayer: 'Удалить слой', + duplicateLayer: 'Дублировать слой', + layerSettings: 'Настройки слоя', + closePanel: 'Закрыть текущую панель', + switchToDualView: 'Перейти в режим двойной карты', + showLegend: 'Показать легенду', + disable3DMap: 'Отключить 3D Карту', + DrawOnMap: 'Рисовать на карте', + selectLocale: 'Выберите регион', + hideLayerPanel: 'Скрыть панель слоев', + showLayerPanel: 'Показать панель слоев', + moveToTop: 'Перейти к верхним слоям данных', + selectBaseMapStyle: 'Выберите стиль базовой карты', + delete: 'Удалить', + timePlayback: 'Воспроизведение времени', + cloudStorage: 'Облачное хранилище', + '3DMap': '3D Карта', + animationByWindow: 'Перемещение временного окна', + animationByIncremental: 'Дополнительное временное окно', + speed: 'скорость', + play: 'проиграть', + pause: 'пауза', + reset: 'перезапустить' + }, + toolbar: { + exportImage: 'Экспорт изображения', + exportData: 'Экспорт данных', + exportMap: 'Экспорт карты', + shareMapURL: 'Share Map URL', + saveMap: 'Сохарнить Карту', + select: 'Выбрать', + polygon: 'Многоугольник', + rectangle: 'Квадрат', + hide: 'Скрыть', + show: 'Показать', + ...LOCALES + }, + editor: { + filterLayer: 'Слои фильтров', + copyGeometry: 'Копировать геометрию' + }, + + modal: { + title: { + deleteDataset: 'Удалить данные', + addDataToMap: 'Добавить данные на карту', + exportImage: 'Экспорт изображения', + exportData: 'Экспорт данных', + exportMap: 'Экспорт карты', + addCustomMapboxStyle: 'Добавить собственный стиль карты', + saveMap: 'Поделиться Картой', + shareURL: 'Поделиться URL' + }, + button: { + delete: 'Удалить', + download: 'Скачать', + export: 'Экспортировать', + addStyle: 'Добавить стиль', + save: 'Сохранить', + defaultCancel: 'Отменить', + defaultConfirm: 'Подтвердить' + }, + exportImage: { + ratioTitle: 'Ratio', + ratioDescription: 'Выберите соотношение для различного использования', + ratioOriginalScreen: 'Исходный экран', + ratioCustom: 'Настройки', + ratio4_3: '4:3', + ratio16_9: '16:9', + resolutionTitle: 'Разрешение', + resolutionDescription: 'Для печати лучше использовать высокое разрешение', + mapLegendTitle: 'Легенда карты', + mapLegendAdd: 'Добавить легенду на карту' + }, + exportData: { + datasetTitle: 'Набор данных', + datasetSubtitle: 'Выберите наборы данных, которые хотите экспортировать', + allDatasets: 'Все', + dataTypeTitle: 'Тип данных', + dataTypeSubtitle: 'Выберите тип данных, которые вы хотите экспортировать', + filterDataTitle: 'Отфильтрованные данные', + filterDataSubtitle: 'Вы можете выбрать экспорт исходных данных или отфильтрованных данных', + filteredData: 'Отфильтрованные данные', + unfilteredData: 'Нефильтрованные данные', + fileCount: '{fileCount} Файлов', + rowCount: '{rowCount} Строк' + }, + deleteData: { + warning: 'вы собираетесь удалить этот набор данных. Это повлияет на {length} слой' + }, + addStyle: { + publishTitle: + '2. Если вы указали URL-адрес файла mapbox на шаге 1, опубликуйте свой стиль на mapbox или предоставьте токен доступа. (Необязательно)', + publishSubtitle1: 'Вы можете создать свой собственный стиль карты', + publishSubtitle2: 'и', + publishSubtitle3: 'опубликовать', + publishSubtitle4: 'его.', + publishSubtitle5: 'Чтобы использовать частный стиль, вставьте свой', + publishSubtitle6: 'token доступа', + publishSubtitle7: + 'прим. kepler.gl - это клиентское приложение, данные остаются в вашем браузере .', + exampleToken: 'например pk.abcdefg.xxxxxx', + pasteTitle: '1. Вставить URL стиля', + pasteSubtitle0: 'URL стиля может быть mapbox', + pasteSubtitle1: 'Или', + pasteSubtitle2: 'URL стиля', + pasteSubtitle3: 'style.json используя', + pasteSubtitle4: 'Mapbox GL Style Spec', + namingTitle: '3. Назови свой стиль' + }, + shareMap: { + shareUriTitle: 'Поделиться URL карты', + shareUriSubtitle: 'Создать URL карты, чтобы поделиться с другими', + cloudTitle: 'Облачное хранилище', + cloudSubtitle: 'Войдите и загрузите данные карты в свое личное облачное хранилище', + shareDisclaimer: + 'kepler.gl сохранит данные вашей карты в вашем личном облачном хранилище, только люди с URL-адресом могут получить доступ к вашей карте и данным. ' + + 'Вы можете редактировать / удалить файл данных в своей облачной учетной записи в любое время.', + gotoPage: 'Перейти на страницу Kepler.gl {currentProvider}' + }, + statusPanel: { + mapUploading: 'Загрузка карты', + error: 'Ошибка' + }, + saveMap: { + title: 'Облачное хранилище', + subtitle: 'Авторизуйтесь, чтобы сохранить карту в вашем личном облачном хранилище' + }, + exportMap: { + formatTitle: 'Формат карты', + formatSubtitle: 'Выберите формат для экспорта карты', + html: { + selection: 'Экспорт карты в интерактивный файл HTML.', + tokenTitle: 'Токен доступа к Mapbox', + tokenSubtitle: 'Используйте свой токен доступа Mapbox в html(необязательно)', + tokenPlaceholder: 'Вставьте токен доступа Mapbox', + tokenMisuseWarning: + '* If you do not provide your own token, the map may fail to display at any time when we replace ours to avoid misuse. ', + tokenDisclaimer: + 'Если вы не предоставите свой собственный токен, карта может не отображаться в любое время, когда мы заменяем наш, чтобы избежать неправильного использования.', + tokenUpdate: 'Как обновить существующий токен карты.', + modeTitle: 'Режим карты', + modeSubtitle1: 'Выберите режим приложения. Подробнее', + modeSubtitle2: 'Информация', + modeDescription: 'Разрешить пользователям {mode} карту', + read: 'чтение', + edit: 'редактирование' + }, + json: { + configTitle: 'Конфигурация карты', + configDisclaimer: + 'Конфигурация карты будет включена в файл Json. Если вы используете kepler.gl в своем собственном приложении. Вы можете скопировать этот конфиг и передать его ', + selection: + 'Экспорт текущих данных карты и конфигурации в один файл Json. Позже вы сможете открыть ту же карту, загрузив этот файл на kepler.gl.', + disclaimer: + '* Конфигурация карты связана с загруженными наборами данных. DataId используется для привязки слоев, фильтров и всплывающих подсказок к определенному набору данных. ' + + 'При передаче этой конфигурации addDataToMap, убедитесь, что идентификатор набора данных совпадает с dataId / s в этой конфигурации.' + } + }, + loadingDialog: { + loading: 'Загрузка...' + }, + loadData: { + upload: 'Загрузить файлы', + storage: 'Загрузить из хранилища' + }, + tripInfo: { + title: 'Как включить анимацию поездки', + description1: + 'Чтобы анимировать путь, данные geoJSON должны содержать LineString в своей геометрии объекта, а координаты в LineString должны иметь 4 элемента в форматах', + code: ' [longitude, latitude, altitude, timestamp] ', + description2: + 'с последним элементом, являющимся отметкой времени. Допустимые форматы меток времени включают unix в секундах, например 1564184363, или в миллисекундах, например 1564184363000', + example: ',Пример:' + }, + iconInfo: { + title: 'Как рисовать значки', + description1: + 'В вашем csv создайте столбец, поместите в него имя значка, который вы хотите нарисовать. Вы можете оставить ячейку пустой, если не хотите, чтобы значок отображался для некоторых точек. Когда столбец назван', + code: 'значек', + description2: ' kepler.gl автоматически создаст для вас слой значков.', + example: 'Пример:', + icons: 'Значки' + }, + storageMapViewer: { + lastModified: 'Последнее изменение {lastUpdated} назад', + back: 'Назад' + }, + overwriteMap: { + title: 'Сохранение карты...', + alreadyExists: 'уже существует в вашем {mapSaved}. Хотите его перезаписать?' + }, + loadStorageMap: { + back: 'Назад', + goToPage: 'Перейти на страницу Kepler.gl {displayName}', + storageMaps: 'Хранилище / Карты', + noSavedMaps: 'Нет сохраненных карт' + } + }, + header: { + visibleLayers: 'Видимые слои', + layerLegend: 'Легенда слоя' + }, + interactions: { + tooltip: 'Подсказка', + brush: 'Кисть', + coordinate: 'Координаты', + geocoder: 'Геокодер' + }, + layerBlending: { + title: 'Смешивание слоев', + additive: 'добавление', + normal: 'нормальное', + subtractive: 'вычитание' + }, + columns: { + title: 'Столбцы', + lat: 'lat', + lng: 'lon', + altitude: 'высота', + icon: 'значек', + geojson: 'geojson', + token: 'token', + arc: { + lat0: 'lat источника', + lng0: 'lng источника', + lat1: 'lat цели', + lng1: 'lng цели' + }, + line: { + alt0: 'высота источника', + alt1: 'высота цели' + }, + grid: { + worldUnitSize: 'Размер сетки (km)' + }, + hexagon: { + worldUnitSize: 'Hexagon радиус (km)' + }, + hex_id: 'hex id' + }, + color: { + customPalette: 'Ваша палитра', + steps: 'шагов', + type: 'тип', + reversed: 'перевернуть' + }, + scale: { + colorScale: 'Цветовая шкала', + sizeScale: 'Масштаб размера', + strokeScale: 'Масштаб штриха', + scale: 'Масштаб' + }, + fileUploader: { + message: 'Перетащите сюда ваши файлы', + chromeMessage: + '*Пользователь Chrome: ограничьте размер файла до 250 МБ, если нужно загрузить файл большего размера, попробуйте Safari', + disclaimer: + '*kepler.gl - это клиентское приложение без серверной части. Данные живут только на вашем компьютере. ' + + 'Никакая информация или данные карты не отправляются ни на один сервер.', + configUploadMessage: + 'Загрузите {fileFormatNames} или сохраненную карту **Json**. Подробнее [**supported file formats**]', + browseFiles: 'Просматреть файлы', + uploading: 'Загрузка', + fileNotSupported: 'File {errorFiles} is not supported.', + or: 'or' + }, + geocoder: { + title: 'Введите адрес или координаты, например 37.79, -122.40' + }, + fieldSelector: { + clearAll: 'Очистить все', + formatting: 'Форматирование' + }, + compare: { + modeLabel: 'Режим сравнения', + typeLabel: 'Тип сравнения', + types: { + absolute: 'Абсолютный', + relative: 'Относительный' + } + }, + mapPopover: { + primary: 'Первичный' + }, + density: 'density', + 'Bug Report': 'Отчет об ошибках', + 'User Guide': 'Инструкции', + Save: 'Сохранить', + Share: 'Поделиться' +}; diff --git a/src/reducers/vis-state-updaters.d.ts b/src/reducers/vis-state-updaters.d.ts index 8c87cc36d0..b8bbccdda3 100644 --- a/src/reducers/vis-state-updaters.d.ts +++ b/src/reducers/vis-state-updaters.d.ts @@ -163,8 +163,10 @@ export type Editor = { selectedFeature: any; visible: boolean; }; + +export type SplitMapLayers = {[key: string]: boolean}; export type SplitMap = { - layers: {[key: string]: boolean}; + layers: SplitMapLayers; }; export type AnimationConfig = { domain: number[] | null; @@ -527,3 +529,6 @@ export function receiveMapConfigUpdater( export const INITIAL_VIS_STATE: VisState; export const DEFAULT_ANIMATION_CONFIG: AnimationConfig; export const DEFAULT_EDITOR: Editor; + +export function computeSplitMapLayers(layers: Array): Array; +export function closeSpecificMapAtIndex(state: VisState, action: unknown); diff --git a/src/reducers/vis-state-updaters.js b/src/reducers/vis-state-updaters.js index d4f8243e81..1106470ae1 100644 --- a/src/reducers/vis-state-updaters.js +++ b/src/reducers/vis-state-updaters.js @@ -1434,7 +1434,7 @@ export function renameDatasetUpdater(state, action) { * @param {Object} action action * @returns {Object} nextState */ -function closeSpecificMapAtIndex(state, action) { +export function closeSpecificMapAtIndex(state, action) { // retrieve layers meta data from the remaining map that we need to keep const indexToRetrieve = 1 - action.payload; const mapLayers = state.splitMaps[indexToRetrieve].layers; diff --git a/src/utils/observe-dimensions.d.ts b/src/utils/observe-dimensions.d.ts new file mode 100644 index 0000000000..70476c66b1 --- /dev/null +++ b/src/utils/observe-dimensions.d.ts @@ -0,0 +1,18 @@ +import {RefObject} from 'react'; + +export interface Dimensions { + readonly height: number; + readonly width: number; +} + +export default function useDimensions( + throttleDelay?: number +): [RefObject, Dimensions | undefined]; + +export function observeDimensions( + target: Element, + handleResize: (size: Dimensions) => void, + throttleDelay?: number +); + +export function unobserveDimensions(target: Element); diff --git a/src/utils/observe-dimensions.js b/src/utils/observe-dimensions.js new file mode 100644 index 0000000000..e0864ab5af --- /dev/null +++ b/src/utils/observe-dimensions.js @@ -0,0 +1,115 @@ +// Copyright (c) 2021 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +import throttle from 'lodash.throttle'; +import {useEffect, useRef, useState} from 'react'; +import ResizeObserver from 'resize-observer-polyfill'; + +const DEFAULT_THROTTLE_DELAY = 100; + +// Using a single ResizeObserver for all elements can be 10x +// more performant than using a separate ResizeObserver per element +// https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/z6ienONUb5A/F5-VcUZtBAAJ +let _observerRegistry; + +function getObserverRegistry() { + if (_observerRegistry === undefined) { + const callbacks = new Map(); + const resizeObserver = new ResizeObserver((entries, observer) => { + for (const entry of entries) { + callbacks.get(entry.target)?.(entry, observer); + } + }); + _observerRegistry = { + subscribe(target, callback) { + resizeObserver.observe(target); + callbacks.set(target, callback); + }, + unsubscribe(target) { + resizeObserver.unobserve(target); + callbacks.delete(target); + } + }; + } + return _observerRegistry; +} + +export function observeDimensions(target, handleResize, throttleDelay = DEFAULT_THROTTLE_DELAY) { + const registry = getObserverRegistry(); + const handler = throttleDelay > 0 ? throttle(handleResize, throttleDelay) : handleResize; + registry.subscribe(target, entry => handler(getSize(target, entry))); +} + +export function unobserveDimensions(target) { + const registry = getObserverRegistry(); + registry.unsubscribe(target); +} + +function getSize(node, entry) { + if (entry.contentRect) { + const {width, height} = entry.contentRect; + return {width, height}; + } + if (node.getBoundingClientRect) { + const {width, height} = node.getBoundingClientRect(); + return {width, height}; + } + return null; +} + +/** + * Usage example: + * const [ref, dimensions] = useDimensions(); + * + * @param throttleDelay + * @returns {[React.RefObject, {width: number, height: number} | null]} + */ +export default function useDimensions(throttleDelay = DEFAULT_THROTTLE_DELAY) { + const ref = useRef(null); + const [size, setSize] = useState(null); + + useEffect(() => { + const {current} = ref; + if (!current) { + return; + } + + let didUnobserve = false; + observeDimensions( + current, + entry => { + if (didUnobserve) return; + const newSize = getSize(current, entry); + if (newSize) { + // @ts-ignore + setSize(newSize); + } + }, + throttleDelay + ); + return () => { + didUnobserve = true; + unobserveDimensions(current); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [throttleDelay]); + + return [ref, size]; +} diff --git a/test/browser/components/kepler-gl-test.js b/test/browser/components/kepler-gl-test.js index e5d40bf644..0abee0a363 100644 --- a/test/browser/components/kepler-gl-test.js +++ b/test/browser/components/kepler-gl-test.js @@ -250,8 +250,7 @@ test('Components -> KeplerGl -> Mount -> Load default map style task', t => { { type: ActionTypes.REQUEST_MAP_STYLES, payload: DEFAULT_MAP_STYLES.reduce((accu, curr) => ({...accu, [curr.id]: curr}), {}) - }, - {type: ActionTypes.UPDATE_MAP, payload: {width: 800, height: 800}} + } ]; t.deepEqual( actions, @@ -398,8 +397,7 @@ test('Components -> KeplerGl -> Mount -> Load custom map style task', t => { (accu, curr) => ({...accu, [curr.id]: curr, smoothie: customStyle1}), {} ) - }, - {type: ActionTypes.UPDATE_MAP, payload: {width: 800, height: 800}} + } ]; t.deepEqual( actions, diff --git a/test/helpers/mock-map-styles.js b/test/helpers/mock-map-styles.js index f49bcec6ae..9e3b57972e 100644 --- a/test/helpers/mock-map-styles.js +++ b/test/helpers/mock-map-styles.js @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Uber Technologies, Inc. +// Copyright (c) 2021 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/yarn.lock b/yarn.lock index 599655d249..1519cb867a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3298,6 +3298,14 @@ agent-base@^4.3.0: dependencies: es6-promisify "^5.0.0" +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + airbnb-prop-types@^2.16.0: version "2.16.0" resolved "https://registry.yarnpkg.com/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz#b96274cefa1abb14f623f804173ee97c13971dc2" @@ -3424,12 +3432,12 @@ append-buffer@^1.0.2: dependencies: buffer-equal "^1.0.0" -append-transform@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" - integrity sha1-126/jKlNJ24keja61EpLdKthGZE= +append-transform@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" + integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== dependencies: - default-require-extensions "^1.0.0" + default-require-extensions "^3.0.0" aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" @@ -3456,19 +3464,12 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= - dependencies: - arr-flatten "^1.0.1" - arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -arr-flatten@^1.0.1, arr-flatten@^1.1.0: +arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== @@ -3519,11 +3520,6 @@ array-uniq@^1.0.1: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= - array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -3687,20 +3683,6 @@ babel-eslint@^10.1.0: eslint-visitor-keys "^1.0.0" resolve "^1.12.0" -babel-generator@^6.18.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - babel-jest@^26.6.3: version "26.6.3" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" @@ -3868,7 +3850,7 @@ babel-tape-runner@^3.0.0: "@babel/register" "^7.0.0" glob "^6.0.1" -babel-template@^6.16.0, babel-template@^6.3.0: +babel-template@^6.3.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= @@ -3879,7 +3861,7 @@ babel-template@^6.16.0, babel-template@^6.3.0: babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@^6.18.0, babel-traverse@^6.26.0: +babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= @@ -3894,7 +3876,7 @@ babel-traverse@^6.18.0, babel-traverse@^6.26.0: invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.18.0, babel-types@^6.26.0: +babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= @@ -4081,15 +4063,6 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -4398,14 +4371,15 @@ cached-path-relative@^1.0.0, cached-path-relative@^1.0.2: resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db" integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg== -caching-transform@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-1.0.1.tgz#6dbdb2f20f8d8fbce79f3e94e9d1742dcdf5c0a1" - integrity sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE= +caching-transform@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" + integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== dependencies: - md5-hex "^1.2.0" - mkdirp "^0.5.1" - write-file-atomic "^1.1.4" + hasha "^5.0.0" + make-dir "^3.0.0" + package-hash "^4.0.0" + write-file-atomic "^3.0.0" call-bind@^1.0.0: version "1.0.0" @@ -4442,11 +4416,6 @@ camelcase@^2.1.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= - camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -4663,6 +4632,11 @@ clean-css@^4.2.3: dependencies: source-map "~0.6.0" +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" @@ -4981,7 +4955,7 @@ continuable-cache@^0.3.1: resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" integrity sha1-vXJ6f67XfnH/OYWskzUakSczrQ8= -convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== @@ -5074,17 +5048,6 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" -coveralls@^3.0.6: - version "3.1.0" - resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.1.0.tgz#13c754d5e7a2dd8b44fe5269e21ca394fb4d615b" - integrity sha512-sHxOu2ELzW8/NC1UP5XVLbZDzO4S3VxfFye3XYCznopHy02YjNkHcj5bKaVw2O7hVaBdBjEdQGpie4II1mWhuQ== - dependencies: - js-yaml "^3.13.1" - lcov-parse "^1.0.0" - log-driver "^1.2.7" - minimist "^1.2.5" - request "^2.88.2" - create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -5123,23 +5086,6 @@ 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" -cross-spawn@^4: - version "4.0.2" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" - integrity sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE= - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -5504,11 +5450,6 @@ de-indent@^1.0.2: resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= -debug-log@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" - integrity sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8= - debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -5538,7 +5479,7 @@ decamelize-keys@^1.1.0: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.2.0: +decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -5595,12 +5536,12 @@ default-gateway@^4.2.0: execa "^1.0.0" ip-regex "^2.1.0" -default-require-extensions@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" - integrity sha1-836hXT4T/9m0N9M+GnW1+5eHTLg= +default-require-extensions@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.0.tgz#e03f93aac9b2b6443fc52e5e4a37b3ad9ad8df96" + integrity sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg== dependencies: - strip-bom "^2.0.0" + strip-bom "^4.0.0" define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" @@ -5699,13 +5640,6 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= - dependencies: - repeating "^2.0.0" - detect-libc@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" @@ -6287,6 +6221,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es6-error@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + es6-promise@^4.0.3, es6-promise@^4.0.5: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" @@ -6555,19 +6494,6 @@ exec-sh@^0.3.2: resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -6613,13 +6539,6 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= - dependencies: - is-posix-bracket "^0.1.0" - expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -6633,13 +6552,6 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= - dependencies: - fill-range "^2.1.0" - expand-template@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" @@ -6741,13 +6653,6 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= - dependencies: - is-extglob "^1.0.0" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -6911,27 +6816,11 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= - filesize@^3.6.1: version "3.6.1" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -6975,15 +6864,6 @@ find-babel-config@^1.2.0: json5 "^0.5.1" path-exists "^3.0.0" -find-cache-dir@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" - integrity sha1-yN765XyKUqinhPnjHFfHQumToLk= - dependencies: - commondir "^1.0.1" - mkdirp "^0.5.1" - pkg-dir "^1.0.0" - find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" @@ -6993,6 +6873,15 @@ find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: make-dir "^2.0.0" pkg-dir "^3.0.0" +find-cache-dir@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + find-file-up@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/find-file-up/-/find-file-up-0.1.3.tgz#cf68091bcf9f300a40da411b37da5cce5a2fbea0" @@ -7017,21 +6906,6 @@ find-process@^1.4.3: commander "^5.1.0" debug "^4.1.1" -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -7114,20 +6988,20 @@ for-in@^1.0.1, for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -for-own@^0.1.3, for-own@^0.1.4: +for-own@^0.1.3: version "0.1.5" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= dependencies: for-in "^1.0.1" -foreground-child@^1.5.3, foreground-child@^1.5.6: - version "1.5.6" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" - integrity sha1-T9ca0t/elnibmApcCilZN8svXOk= +foreground-child@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" + integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== dependencies: - cross-spawn "^4" - signal-exit "^3.0.0" + cross-spawn "^7.0.0" + signal-exit "^3.0.2" forever-agent@~0.6.1: version "0.6.1" @@ -7175,6 +7049,11 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" +fromentries@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" + integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== + fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" @@ -7367,11 +7246,6 @@ get-stdin@^8.0.0: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -7457,21 +7331,6 @@ gl@^4.2.2: node-gyp "^7.1.0" prebuild-install "^5.3.5" -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= - dependencies: - is-glob "^2.0.0" - glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -7514,7 +7373,7 @@ glob@^6.0.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.6, glob@^7.1.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.6: +glob@^7.0.0, glob@^7.0.3, glob@^7.1.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -7717,7 +7576,7 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== -handlebars@^4.0.3, handlebars@^4.7.6: +handlebars@^4.7.6: version "4.7.7" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== @@ -7754,11 +7613,6 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -7834,6 +7688,14 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasha@^5.0.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" + integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== + dependencies: + is-stream "^2.0.0" + type-fest "^0.8.0" + hast-util-is-element@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz#3b3ed5159a2707c6137b48637fbfe068e175a425" @@ -8334,11 +8196,6 @@ invariant@^2.2.2, invariant@^2.2.4: dependencies: loose-envify "^1.0.0" -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= - invert-kv@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" @@ -8521,18 +8378,6 @@ is-docker@^2.0.0: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= - dependencies: - is-primitive "^2.0.0" - is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -8545,11 +8390,6 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -8582,13 +8422,6 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= - dependencies: - is-extglob "^1.0.0" - is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -8628,13 +8461,6 @@ is-number-object@^1.0.4: resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= - dependencies: - kind-of "^3.0.2" - is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -8642,11 +8468,6 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -8693,21 +8514,11 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= - is-potential-custom-element-name@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - is-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" @@ -8790,7 +8601,7 @@ is-unc-path@^1.0.0: dependencies: unc-path-regex "^0.1.2" -is-utf8@^0.2.0, is-utf8@^0.2.1: +is-utf8@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= @@ -8877,35 +8688,17 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-lib-coverage@^1.1.2, istanbul-lib-coverage@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" - integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ== - -istanbul-lib-coverage@^3.0.0: +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1: version "3.0.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== -istanbul-lib-hook@^1.1.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86" - integrity sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw== - dependencies: - append-transform "^0.4.0" - -istanbul-lib-instrument@^1.10.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" - integrity sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A== +istanbul-lib-hook@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" + integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== dependencies: - babel-generator "^6.18.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - babylon "^6.18.0" - istanbul-lib-coverage "^1.2.1" - semver "^5.3.0" + append-transform "^2.0.0" istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: version "4.0.3" @@ -8917,15 +8710,18 @@ istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: istanbul-lib-coverage "^3.0.0" semver "^6.3.0" -istanbul-lib-report@^1.1.3: - version "1.1.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c" - integrity sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw== +istanbul-lib-processinfo@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz#e1426514662244b2f25df728e8fd1ba35fe53b9c" + integrity sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw== dependencies: - istanbul-lib-coverage "^1.2.1" - mkdirp "^0.5.1" - path-parse "^1.0.5" - supports-color "^3.1.2" + archy "^1.0.0" + cross-spawn "^7.0.0" + istanbul-lib-coverage "^3.0.0-alpha.1" + make-dir "^3.0.0" + p-map "^3.0.0" + rimraf "^3.0.0" + uuid "^3.3.3" istanbul-lib-report@^3.0.0: version "3.0.0" @@ -8936,17 +8732,6 @@ istanbul-lib-report@^3.0.0: make-dir "^3.0.0" supports-color "^7.1.0" -istanbul-lib-source-maps@^1.2.3: - version "1.2.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f" - integrity sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg== - dependencies: - debug "^3.1.0" - istanbul-lib-coverage "^1.2.1" - mkdirp "^0.5.1" - rimraf "^2.6.1" - source-map "^0.5.3" - istanbul-lib-source-maps@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" @@ -8956,13 +8741,6 @@ istanbul-lib-source-maps@^4.0.0: istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^1.4.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a" - integrity sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw== - dependencies: - handlebars "^4.0.3" - istanbul-reports@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" @@ -9450,11 +9228,6 @@ jsdom@^16.4.0: ws "^7.2.3" xml-name-validator "^3.0.0" -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= - jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -9645,13 +9418,6 @@ lazystream@^1.0.0: dependencies: readable-stream "^2.0.5" -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= - dependencies: - invert-kv "^1.0.0" - lcid@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" @@ -9659,11 +9425,6 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" -lcov-parse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-1.0.0.tgz#eb0d46b54111ebc561acb4c408ef9363bdc8f7e0" - integrity sha1-6w1GtUER68VhrLTECO+TY73I9+A= - lead@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42" @@ -9694,17 +9455,6 @@ livereload-js@^2.3.0: resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.4.0.tgz#447c31cf1ea9ab52fc20db615c5ddf678f78009c" integrity sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw== -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -9738,14 +9488,6 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -9856,11 +9598,6 @@ lodash@4.17.19, lodash@^4.0.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== -log-driver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" - integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== - log-symbols@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" @@ -9912,14 +9649,6 @@ lowercase-keys@^1.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -9947,7 +9676,7 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0: +make-dir@^3.0.0, make-dir@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -10047,11 +9776,6 @@ material-colors@^1.2.1: resolved "https://registry.yarnpkg.com/material-colors/-/material-colors-1.2.6.tgz#6d1958871126992ceecc72f4bcc4d8f010865f46" integrity sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg== -math-random@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== - math.gl@^3.3.0: version "3.3.1" resolved "https://registry.yarnpkg.com/math.gl/-/math.gl-3.3.1.tgz#f51e8102e1265d4ae0789ea21850e73f043f18bb" @@ -10064,18 +9788,6 @@ mathml-tag-names@^2.1.3: resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== -md5-hex@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" - integrity sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ= - dependencies: - md5-o-matic "^0.1.1" - -md5-o-matic@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" - integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M= - md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -10182,13 +9894,6 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -mem@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= - dependencies: - mimic-fn "^1.0.0" - mem@^4.0.0: version "4.3.0" resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" @@ -10257,13 +9962,6 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= -merge-source-map@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" - integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== - dependencies: - source-map "^0.6.1" - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -10287,25 +9985,6 @@ micromark@~2.10.0: debug "^4.0.0" parse-entities "^2.0.0" -micromatch@^2.3.11: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.5: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -10802,6 +10481,13 @@ node-notifier@^8.0.0: uuid "^8.3.0" which "^2.0.2" +node-preload@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" + integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== + dependencies: + process-on-spawn "^1.0.0" + node-releases@^1.1.71: version "1.1.72" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" @@ -10844,7 +10530,7 @@ normalize-package-data@^3.0.0: semver "^7.3.2" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.1, normalize-path@^2.1.1: +normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= @@ -10929,38 +10615,38 @@ nwsapi@^2.2.0: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== -nyc@^11.4.1: - version "11.9.0" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-11.9.0.tgz#4106e89e8fbe73623a1fc8b6ecb7abaa271ae1e4" - integrity sha512-w8OdJAhXL5izerzZMdqzYKMj/pgHJyY3qEPYBjLLxrhcVoHEY9pU5ENIiZyCgG9OR7x3VcUMoD40o6PtVpfR4g== +nyc@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" + integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== dependencies: - archy "^1.0.0" - arrify "^1.0.1" - caching-transform "^1.0.0" - convert-source-map "^1.5.1" - debug-log "^1.0.1" - default-require-extensions "^1.0.0" - find-cache-dir "^0.1.1" - find-up "^2.1.0" - foreground-child "^1.5.3" - glob "^7.0.6" - istanbul-lib-coverage "^1.1.2" - istanbul-lib-hook "^1.1.0" - istanbul-lib-instrument "^1.10.0" - istanbul-lib-report "^1.1.3" - istanbul-lib-source-maps "^1.2.3" - istanbul-reports "^1.4.0" - md5-hex "^1.2.0" - merge-source-map "^1.1.0" - micromatch "^3.1.10" - mkdirp "^0.5.0" - resolve-from "^2.0.0" - rimraf "^2.6.2" - signal-exit "^3.0.1" - spawn-wrap "^1.4.2" - test-exclude "^4.2.0" - yargs "11.1.0" - yargs-parser "^8.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + caching-transform "^4.0.0" + convert-source-map "^1.7.0" + decamelize "^1.2.0" + find-cache-dir "^3.2.0" + find-up "^4.1.0" + foreground-child "^2.0.0" + get-package-type "^0.1.0" + glob "^7.1.6" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-hook "^3.0.0" + istanbul-lib-instrument "^4.0.0" + istanbul-lib-processinfo "^2.0.2" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.2" + make-dir "^3.0.0" + node-preload "^0.2.1" + p-map "^3.0.0" + process-on-spawn "^1.0.0" + resolve-from "^5.0.0" + rimraf "^3.0.0" + signal-exit "^3.0.2" + spawn-wrap "^2.0.0" + test-exclude "^6.0.0" + yargs "^15.0.2" oauth-sign@~0.9.0: version "0.9.0" @@ -11048,14 +10734,6 @@ object.getownpropertydescriptors@^2.0.3: define-properties "^1.1.3" es-abstract "^1.17.0-next.1" -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -11164,15 +10842,6 @@ os-homedir@^1.0.0, os-homedir@^1.0.1: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -os-locale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== - dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" - os-locale@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" @@ -11222,13 +10891,6 @@ p-is-promise@^2.0.0: resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -11236,13 +10898,6 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -11262,6 +10917,13 @@ p-map@^2.0.0: resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + p-retry@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" @@ -11269,16 +10931,21 @@ p-retry@^3.0.1: dependencies: retry "^0.12.0" -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-hash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" + integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== + dependencies: + graceful-fs "^4.1.15" + hasha "^5.0.0" + lodash.flattendeep "^4.4.0" + release-zalgo "^1.0.0" + package-json@^2.0.0: version "2.4.0" resolved "https://registry.yarnpkg.com/package-json/-/package-json-2.4.0.tgz#0d15bd67d1cbbddbb2ca222ff2edb86bcb31a8bb" @@ -11383,17 +11050,7 @@ parse-git-config@^0.2.0: dependencies: ini "^1.3.3" -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -parse-json@^2.1.0, parse-json@^2.2.0: +parse-json@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= @@ -11486,13 +11143,6 @@ path-dirname@^1.0.0: resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - dependencies: - pinkie-promise "^2.0.0" - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -11523,7 +11173,7 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.5, path-parse@^1.0.6: +path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== @@ -11557,15 +11207,6 @@ path-to-regexp@^1.7.0: dependencies: isarray "0.0.1" -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -11665,13 +11306,6 @@ pixelmatch@^5.1.0: dependencies: pngjs "^4.0.1" -pkg-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" - integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= - dependencies: - find-up "^1.0.0" - pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -11679,7 +11313,7 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" -pkg-dir@^4.2.0: +pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== @@ -11843,11 +11477,6 @@ prepend-http@^1.0.0, prepend-http@^1.0.1: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= - prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -11905,6 +11534,13 @@ process-nextick-args@~1.0.6: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= +process-on-spawn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" + integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== + dependencies: + fromentries "^1.2.0" + process@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/process/-/process-0.10.1.tgz#842457cc51cfed72dc775afeeafb8c6034372725" @@ -12006,11 +11642,6 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - psl@^1.1.33: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" @@ -12171,15 +11802,6 @@ randexp@0.4.6: discontinuous-range "1.0.0" ret "~0.1.10" -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -12512,14 +12134,6 @@ read-only-stream@^2.0.0: dependencies: readable-stream "^2.0.2" -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - read-pkg-up@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" @@ -12537,15 +12151,6 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" @@ -12741,13 +12346,6 @@ regenerator-transform@^0.14.2: dependencies: "@babel/runtime" "^7.8.4" -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== - dependencies: - is-equal-shallow "^0.1.3" - regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -12813,6 +12411,13 @@ relateurl@^0.2.7: resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= +release-zalgo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" + integrity sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA= + dependencies: + es6-error "^4.0.1" + remark-html@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/remark-html/-/remark-html-8.0.0.tgz#9fcb859a6f3cb40f3ef15402950f1a62ec301b3a" @@ -13054,6 +12659,11 @@ reselect@^4.0.0: resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7" integrity sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA== +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" @@ -13084,11 +12694,6 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1: expand-tilde "^2.0.0" global-modules "^1.0.0" -resolve-from@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" - integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= - resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" @@ -13390,7 +12995,7 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -13583,7 +13188,7 @@ side-channel@^1.0.2, side-channel@^1.0.3: es-abstract "^1.18.0-next.0" object-inspect "^1.8.0" -signal-exit@^3.0.0, signal-exit@^3.0.1, signal-exit@^3.0.2: +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== @@ -13758,7 +13363,7 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.3: +source-map@^0.5.0, source-map@^0.5.6, source-map@~0.5.3: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -13778,17 +13383,17 @@ space-separated-tokens@^1.0.0: resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== -spawn-wrap@^1.4.2: - version "1.4.3" - resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.4.3.tgz#81b7670e170cca247d80bf5faf0cfb713bdcf848" - integrity sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw== +spawn-wrap@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" + integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== dependencies: - foreground-child "^1.5.6" - mkdirp "^0.5.0" - os-homedir "^1.0.1" - rimraf "^2.6.2" + foreground-child "^2.0.0" + is-windows "^1.0.2" + make-dir "^3.0.0" + rimraf "^3.0.0" signal-exit "^3.0.2" - which "^1.3.0" + which "^2.0.1" spawnd@^4.4.0: version "4.4.0" @@ -14155,13 +13760,6 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= - dependencies: - is-utf8 "^0.2.0" - strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -14328,13 +13926,6 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^3.1.2: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= - dependencies: - has-flag "^1.0.0" - supports-color@^5.0.0, supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -14528,17 +14119,6 @@ terser@^4.1.2, terser@^4.6.3: source-map "~0.6.1" source-map-support "~0.5.12" -test-exclude@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20" - integrity sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA== - dependencies: - arrify "^1.0.1" - micromatch "^2.3.11" - object-assign "^4.1.0" - read-pkg-up "^1.0.1" - require-main-filename "^1.0.1" - test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -14779,11 +14359,6 @@ trim-newlines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= - trim-trailing-lines@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" @@ -14863,7 +14438,7 @@ type-fest@^0.6.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== -type-fest@^0.8.1: +type-fest@^0.8.0, type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== @@ -15299,7 +14874,7 @@ uuid@^2.0.1: resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" integrity sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho= -uuid@^3.3.2, uuid@^3.4.0: +uuid@^3.3.2, uuid@^3.3.3, uuid@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -15832,7 +15407,7 @@ which-pm-runs@^1.0.0: resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= -which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: +which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -15908,7 +15483,7 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^1.1.2, write-file-atomic@^1.1.4: +write-file-atomic@^1.1.2: version "1.3.4" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" integrity sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8= @@ -15978,21 +15553,11 @@ xmlhttprequest@1: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -y18n@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" - integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== - "y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -16037,38 +15602,6 @@ yargs-parser@^20.2.3: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== -yargs-parser@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" - integrity sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ== - dependencies: - camelcase "^4.1.0" - -yargs-parser@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" - integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= - dependencies: - camelcase "^4.1.0" - -yargs@11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" - integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A== - dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^9.0.2" - yargs@^12.0.2: version "12.0.5" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" @@ -16103,7 +15636,7 @@ yargs@^13.3.2: y18n "^4.0.0" yargs-parser "^13.1.2" -yargs@^15.4.1: +yargs@^15.0.2, yargs@^15.4.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==