diff --git a/examples/kepler/vite.config.js b/examples/kepler/vite.config.js new file mode 100644 index 00000000..a32c2043 --- /dev/null +++ b/examples/kepler/vite.config.js @@ -0,0 +1,5 @@ +export default { + define: { + 'process.env.MapboxAccessToken': JSON.stringify(process.env.MapboxAccessToken) + } +}; diff --git a/modules/core/src/animations/kepler-animation.ts b/modules/core/src/animations/kepler-animation.ts index ff6abe8c..a986f15c 100644 --- a/modules/core/src/animations/kepler-animation.ts +++ b/modules/core/src/animations/kepler-animation.ts @@ -175,7 +175,7 @@ export default class KeplerAnimation extends Animation { if (filterKeyframes.length > 0) { this.filterKeyframes = filterKeyframes.reduce((acc, filterKeyframe) => { const filterIdx = findFilterIdx({filters, filterKeyframe}); - const filter = filterIdx && filters[filterIdx]; + const filter = Number.isFinite(filterIdx) && filters[filterIdx]; if (filter) { if (acc[filter.id]) { acc[filter.id].set({filter, ...filterKeyframe}); diff --git a/modules/react/package.json b/modules/react/package.json index 6d51ecbf..3b015544 100644 --- a/modules/react/package.json +++ b/modules/react/package.json @@ -34,10 +34,11 @@ ], "sideEffects": false, "dependencies": { + "@kepler.gl/constants": "3.1.0", "@loaders.gl/zip": "^3.0.12", "@turf/helpers": "^5.1.5", "@turf/transform-translate": "^5.1.5", - "classnames": "^2.2.6", + "classnames": "^2.3.1", "fuzzy": "^0.1.3", "global": "^4.4.0", "lodash.get": "^4.4.2", diff --git a/modules/react/src/components/export-video/export-video-panel-container.tsx b/modules/react/src/components/export-video/export-video-panel-container.tsx index 9a2c1a89..4b81d2fa 100644 --- a/modules/react/src/components/export-video/export-video-panel-container.tsx +++ b/modules/react/src/components/export-video/export-video-panel-container.tsx @@ -21,6 +21,7 @@ import {parseSetCameraType, scaleToVideoExport} from './utils'; import {DEFAULT_FILENAME, getResolutionSetting} from './constants'; import type {MapProps} from 'react-map-gl'; import type {DeckProps, MapViewState} from '@deck.gl/core/typed'; +import {FILTER_VIEW_TYPES} from '@kepler.gl/constants'; const ENCODERS = { gif: GifEncoder, @@ -166,8 +167,12 @@ export class ExportVideoPanelContainer extends Component< quality: 0.8 }, jpeg: { + archive: 'zip', quality: 0.8 }, + png: { + archive: 'zip' + }, gif: { sampleInterval: 1000, width, @@ -225,7 +230,7 @@ export class ExportVideoPanelContainer extends Component< Array.isArray(animatableFilters) && animatableFilters.length ? animatableFilters : // only animate an enlarged time filter if animatable filters aren't specified. - filters.filter(f => f.type === 'timeRange' && f.enlarged) + filters.filter(f => f.type === 'timeRange' && f.view === FILTER_VIEW_TYPES.enlarged) ).map(f => ({ id: f.id, timings: [0, this.state.durationMs] diff --git a/modules/react/src/components/export-video/export-video-panel-preview.tsx b/modules/react/src/components/export-video/export-video-panel-preview.tsx index 47c827eb..bd3c9644 100644 --- a/modules/react/src/components/export-video/export-video-panel-preview.tsx +++ b/modules/react/src/components/export-video/export-video-panel-preview.tsx @@ -7,7 +7,7 @@ import React, {Component, ForwardedRef, RefObject, forwardRef} from 'react'; import DeckGL from '@deck.gl/react/typed'; import ReactMapGL, {type MapProps, type MapRef, useControl} from 'react-map-gl'; import {MapboxOverlay, MapboxOverlayProps} from '@deck.gl/mapbox/typed'; -import type {Deck, DeckProps, Layer, MapViewState} from '@deck.gl/core/typed'; +import type {Deck, DeckProps, MapViewState} from '@deck.gl/core/typed'; import isEqual from 'lodash.isequal'; import {deckStyle, DeckCanvas} from './styled-components'; @@ -36,7 +36,6 @@ type ExportVideoPanelPreviewState = { memoDevicePixelRatio: number; mapStyle: string; mapboxAccessToken?: string; - deckLayers: Layer[]; }; const DeckGLOverlay = forwardRef( @@ -71,8 +70,7 @@ export class ExportVideoPanelPreview extends Component< this.state = { mapStyle: url, // Unsure if mapStyle would ever change but allowing it just in case mapboxAccessToken: accessToken, - memoDevicePixelRatio: 1, - deckLayers: [] + memoDevicePixelRatio: 1 }; this._onMapLoad = this._onMapLoad.bind(this); @@ -150,7 +148,8 @@ export class ExportVideoPanelPreview extends Component< if (deckProps && deckProps.layers) { return deckProps.layers; } - return createKeplerLayers(mapData, viewState, beforeId); + const mapIndex = 0; // TODO: select mapIndex from redux + return createKeplerLayers(mapData, viewState, mapIndex, beforeId); } _onAfterRender() { @@ -162,12 +161,6 @@ export class ExportVideoPanelPreview extends Component< _onMapLoad() { // Adds mapbox layer to modal const map = this.mapRef.current.getMap(); - - const beforeId = this.props.mapboxLayerBeforeId; - const keplerLayers = this.createLayers(beforeId); - - this.setState({deckLayers: keplerLayers}); - map.on('render', this._onAfterRender); } @@ -182,22 +175,23 @@ export class ExportVideoPanelPreview extends Component< resolution, deckProps, mapProps, - disableBaseMap + disableBaseMap, + mapboxLayerBeforeId } = this.props; - const {mapStyle, deckLayers, mapboxAccessToken} = this.state; + const {mapStyle, mapboxAccessToken} = this.state; const deck = this.deckRef.current; const {width, height} = this._getContainer(); const doubleResolution = {width: resolution[0] * 2, height: resolution[1] * 2}; + const keplerLayers = this.createLayers(mapboxLayerBeforeId); return ( <> {disableBaseMap ? ( setRef(this.deckRef, ref?.deck)} - {...adapter.getProps({deck, extraProps: {...deckProps, layers: deckLayers}})} + {...adapter.getProps({deck, extraProps: {...deckProps, layers: keplerLayers}})} // {...doubleResolution} {...this._getContainer()} - layers={deckLayers} /> ) : ( )} diff --git a/modules/react/src/kepler-layers.ts b/modules/react/src/kepler-layers.ts index d43cd831..614ced65 100644 --- a/modules/react/src/kepler-layers.ts +++ b/modules/react/src/kepler-layers.ts @@ -4,34 +4,59 @@ import {createSelector} from 'reselect'; import type {Layer, MapViewState} from '@deck.gl/core/typed'; +// Note: kepler type imports are commented out to avoid issues when hubble is installed by kepler. +// import type {KeplerGlState} from '@kepler.gl/reducers'; +// import type {Layer as KeplerLayer} from '@kepler.gl/layers'; +// import type {SplitMap, SplitMapLayers} from '@kepler.gl/types'; /** * Kepler Layer Creation * Forked from kepler.gl * https://github.com/keplergl/kepler.gl/blob/master/src/components/map-container.js */ -const layersSelector = (state: any) => state.visState.layers; -const layerDataSelector = (state: any) => state.visState.layerData; -const mapLayersSelector = (state: any) => state.visState.mapLayers; +const layersSelector = (state: any /* KeplerGlState*/) => state.visState.layers; +const layerDataSelector = (state: any /* KeplerGlState*/) => state.visState.layerData; +const getMapLayersFromSplitMaps = ( + splitMaps: any /* SplitMap[]*/, + mapIndex?: number +): any[] /* SplitMapLayers*/ | undefined | null => { + return splitMaps[mapIndex || 0]?.layers; +}; + +const splitMapSelector = (state: any /* KeplerGlState*/) => state.visState.splitMaps; +const splitMapIndexSelector = (_: any /* KeplerGlState*/, mapIndex: number | undefined) => mapIndex; +const mapLayersSelector = createSelector( + splitMapSelector, + splitMapIndexSelector, + getMapLayersFromSplitMaps +); // const layerOrderSelector = state => state.visState.layerOrder; const layersToRenderSelector = createSelector( layersSelector, layerDataSelector, mapLayersSelector, // {[id]: true \ false} - (layers, layerData, mapLayers) => + (layers, layerData, splitMapLayers) => layers.reduce( - (accu: object, layer: any, idx: number) => ({ + (accu: object, layer: any /* KeplerLayer*/, idx: number) => ({ ...accu, - [layer.id]: layer.shouldRenderLayer(layerData[idx]) && _isVisibleMapLayer(layer, mapLayers) // eslint-disable-line + [layer.id]: + layer.config.isVisible && + layer.shouldRenderLayer(layerData[idx]) && + _isVisibleSplitMapLayer(layer, splitMapLayers) && + layer.overlayType === 'deckgl' }), {} ) ); -/* component private functions */ -function _isVisibleMapLayer(layer: any, mapLayers: any) { - // if layer.id is not in mapLayers, don't render it - return !mapLayers || (mapLayers && mapLayers[layer.id]); + +function _isVisibleSplitMapLayer( + layer: any /* KeplerLayer*/, + splitMapLayers?: any[] /* SplitMapLayers*/ +) { + // Undefined splitMapLayers means there isn't a split map, so don't refer to it for layer visibility. + // If splitMapLayers is defined, it means there is a split map and the upstream caller has selected the map to render in video. + return !splitMapLayers || (splitMapLayers && splitMapLayers[layer.id]); } function _onLayerSetDomain(idx: number, colorDomain: any) { @@ -44,8 +69,9 @@ function _onLayerSetDomain(idx: number, colorDomain: any) { function renderLayer( overlays: any, idx: number, - map: any, + map: any /* KeplerGlState*/, viewState: MapViewState, + isVisible: boolean, beforeId?: string ) { const { @@ -62,7 +88,11 @@ function renderLayer( onSetLayerDomain: (val: any) => _onLayerSetDomain(idx, val) }; - // Layer is Layer class + // Skip layers that aren't supposed to be visible + if (!isVisible) { + return overlays; + } + const layerOverlay = layer .renderLayer({ data, @@ -78,27 +108,33 @@ function renderLayer( deckLayer.clone({ pickable: false, // @ts-expect-error MapboxOverlay layers are extended to include beforeId - beforeId + beforeId, + visible: true }) ); return overlays.concat(layerOverlay || []); } -export function createKeplerLayers(map: any, viewState: MapViewState, beforeId?: string) { - const layersToRender = layersToRenderSelector(map); +export function createKeplerLayers( + map: any /* KeplerGlState*/, + viewState: MapViewState, + mapIndex: number = undefined, + beforeId?: string +) { + const layersToRender = layersToRenderSelector(map, mapIndex); // returns an arr of DeckGL layer objects const {layerOrder, layerData, layers} = map.visState; + if (layerData && layerData.length) { - return layerOrder - .slice() - .reverse() - .filter( - (_, idx: number) => layers[idx].overlayType === 'deckgl' && layersToRender[layers[idx].id] - ) + // Create same layer order as Kepler + const overlays = [...layerOrder] + .map(layerId => ({layerId, visible: layersToRender[layerId]})) .reduce( - (overlays: any, _, idx: number) => renderLayer(overlays, idx, map, viewState, beforeId), + (overlays: any, layerMeta, idx) => + renderLayer(overlays, idx, map, viewState, layerMeta.visible, beforeId), [] - ); // Slicing & reversing to create same layer order as Kepler + ); + return overlays; } return []; } diff --git a/yarn.lock b/yarn.lock index 4c8c3107..f4f2706f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1538,6 +1538,55 @@ __metadata: languageName: node linkType: hard +"@dnd-kit/accessibility@npm:^3.1.1": + version: 3.1.1 + resolution: "@dnd-kit/accessibility@npm:3.1.1" + dependencies: + tslib: "npm:^2.0.0" + peerDependencies: + react: ">=16.8.0" + checksum: 10c0/be0bf41716dc58f9386bc36906ec1ce72b7b42b6d1d0e631d347afe9bd8714a829bd6f58a346dd089b1519e93918ae2f94497411a61a4f5e4d9247c6cfd1fef8 + languageName: node + linkType: hard + +"@dnd-kit/core@npm:^6.1.0": + version: 6.3.1 + resolution: "@dnd-kit/core@npm:6.3.1" + dependencies: + "@dnd-kit/accessibility": "npm:^3.1.1" + "@dnd-kit/utilities": "npm:^3.2.2" + tslib: "npm:^2.0.0" + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: 10c0/196db95d81096d9dc248983533eab91ba83591770fa5c894b1ac776f42af0d99522b3fd5bb3923411470e4733fcfa103e6ee17adc17b9b7eb54c7fbec5ff7c52 + languageName: node + linkType: hard + +"@dnd-kit/modifiers@npm:^7.0.0": + version: 7.0.0 + resolution: "@dnd-kit/modifiers@npm:7.0.0" + dependencies: + "@dnd-kit/utilities": "npm:^3.2.2" + tslib: "npm:^2.0.0" + peerDependencies: + "@dnd-kit/core": ^6.1.0 + react: ">=16.8.0" + checksum: 10c0/542e1d2b6102a5c826118c36158aab23c5437d24008cab4848b0866d3d850b4410c4f465690767dd1f31fde33a1fa9d238675be70f174c179485ce376f0c8aa6 + languageName: node + linkType: hard + +"@dnd-kit/utilities@npm:^3.2.2": + version: 3.2.2 + resolution: "@dnd-kit/utilities@npm:3.2.2" + dependencies: + tslib: "npm:^2.0.0" + peerDependencies: + react: ">=16.8.0" + checksum: 10c0/9aa90526f3e3fd567b5acc1b625a63177b9e8d00e7e50b2bd0e08fa2bf4dba7e19529777e001fdb8f89a7ce69f30b190c8364d390212634e0afdfa8c395e85a0 + languageName: node + linkType: hard + "@emotion/is-prop-valid@npm:1.2.1": version: 1.2.1 resolution: "@emotion/is-prop-valid@npm:1.2.1" @@ -1963,6 +2012,7 @@ __metadata: "@deck.gl/core": "npm:^8.9" "@deck.gl/mapbox": "npm:^8.9" "@deck.gl/react": "npm:^8.9" + "@kepler.gl/constants": "npm:3.1.0" "@loaders.gl/zip": "npm:^3.0.12" "@turf/helpers": "npm:^5.1.5" "@turf/transform-translate": "npm:^5.1.5" @@ -1971,7 +2021,7 @@ __metadata: "@types/react": "npm:^18.3.0" "@types/react-dom": "npm:^18.3.0" "@types/tape-catch": "npm:^1.0.2" - classnames: "npm:^2.2.6" + classnames: "npm:^2.3.1" fuzzy: "npm:^0.1.3" global: "npm:^4.4.0" lodash.get: "npm:^4.4.2" @@ -2147,6 +2197,35 @@ __metadata: languageName: node linkType: hard +"@kepler.gl/constants@npm:3.1.0": + version: 3.1.0 + resolution: "@kepler.gl/constants@npm:3.1.0" + dependencies: + "@dnd-kit/core": "npm:^6.1.0" + "@dnd-kit/modifiers": "npm:^7.0.0" + "@kepler.gl/types": "npm:3.1.0" + "@types/d3-scale": "npm:^3.2.2" + "@types/keymirror": "npm:^0.1.1" + chroma-js: "npm:2.1.2" + colorbrewer: "npm:^1.5.0" + d3-array: "npm:^2.8.0" + d3-color: "npm:^2.0.0" + d3-scale: "npm:^3.2.3" + d3-scale-chromatic: "npm:2.0.0" + d3-time: "npm:^2.0.0" + global: "npm:^4.3.0" + keymirror: "npm:^0.1.1" + checksum: 10c0/0ad75545f80e902752fe9046d424d585e58ecef4c1595a8362ad7906f629313d8bf818dc6a9221cb427356c3167c9ab63fd74ffdd3b1a3b45c8a4e5447d24d47 + languageName: node + linkType: hard + +"@kepler.gl/types@npm:3.1.0": + version: 3.1.0 + resolution: "@kepler.gl/types@npm:3.1.0" + checksum: 10c0/af3e25cf6d04b264f46c9e303f3f0da1a4f9ad993a13ca67ffb7f7e24ead552f48b8a6139b7e58c2e9f39ca8582c7b0b7a370b55ba5783a62a98a0af7250dcca + languageName: node + linkType: hard + "@lerna/create@npm:8.1.2": version: 8.1.2 resolution: "@lerna/create@npm:8.1.2" @@ -3441,6 +3520,22 @@ __metadata: languageName: node linkType: hard +"@types/d3-scale@npm:^3.2.2": + version: 3.3.5 + resolution: "@types/d3-scale@npm:3.3.5" + dependencies: + "@types/d3-time": "npm:^2" + checksum: 10c0/2689ab13092e3fded22cdd1b888afd91aa60190be40c8eddc12b2d42de59b00917778340f90317c68c5ffc3a1bee68f5ca155434cd466bc7804f400f3f9e7529 + languageName: node + linkType: hard + +"@types/d3-time@npm:^2": + version: 2.1.4 + resolution: "@types/d3-time@npm:2.1.4" + checksum: 10c0/b597bfa51a163d4231e953d6903b06fd6341d0f11a28222a79fafaddb46155d7f458a67c814de53df84926a47dd535897228a475679d228576b0cda87351e534 + languageName: node + linkType: hard + "@types/geojson@npm:*, @types/geojson@npm:^7946.0.7": version: 7946.0.10 resolution: "@types/geojson@npm:7946.0.10" @@ -3476,6 +3571,13 @@ __metadata: languageName: node linkType: hard +"@types/keymirror@npm:^0.1.1": + version: 0.1.4 + resolution: "@types/keymirror@npm:0.1.4" + checksum: 10c0/f3c66ae8a2d786728cb91004e9a4d016c6df31478976b2e3d73d70b7fb6d8ca55216045973768be9a57f4c29a6ce70a18e1ff2205230831c8e509ed1b977f338 + languageName: node + linkType: hard + "@types/lodash.get@npm:^4.4.9": version: 4.4.9 resolution: "@types/lodash.get@npm:4.4.9" @@ -4857,6 +4959,15 @@ __metadata: languageName: node linkType: hard +"chroma-js@npm:2.1.2": + version: 2.1.2 + resolution: "chroma-js@npm:2.1.2" + dependencies: + cross-env: "npm:^6.0.3" + checksum: 10c0/f3760059b76240bab7387f335c798bbf55a4edf937534be7bc5c16ecad9b358dcfd891ca4fffa2c34742f45d5c3e96c8927c6a9906a13905da2bfa4c9ad30418 + languageName: node + linkType: hard + "chromium-bidi@npm:1.2.0": version: 1.2.0 resolution: "chromium-bidi@npm:1.2.0" @@ -4876,10 +4987,10 @@ __metadata: languageName: node linkType: hard -"classnames@npm:^2.2.6": - version: 2.3.1 - resolution: "classnames@npm:2.3.1" - checksum: 10c0/e3b832219042802464e648c41c2e8be96c2c64d2522cfa22fbb5ec088418406c61ab351a682c077c07f691c8b00c9f0ee7939b20fabc6c23da69063252a4ab89 +"classnames@npm:^2.3.1": + version: 2.5.1 + resolution: "classnames@npm:2.5.1" + checksum: 10c0/afff4f77e62cea2d79c39962980bf316bacb0d7c49e13a21adaadb9221e1c6b9d3cdb829d8bb1b23c406f4e740507f37e1dcf506f7e3b7113d17c5bab787aa69 languageName: node linkType: hard @@ -5008,6 +5119,13 @@ __metadata: languageName: node linkType: hard +"colorbrewer@npm:^1.5.0": + version: 1.5.9 + resolution: "colorbrewer@npm:1.5.9" + checksum: 10c0/d313735465f8a3a946f0313c3f8f6cbe978ea6d413dc988d0ce0d4fe351e9c741b93d3a7b4b33cd9d51c7845aa4d336ad51dad9c0c4d958c921d4f847d839633 + languageName: node + linkType: hard + "columnify@npm:1.6.0": version: 1.6.0 resolution: "columnify@npm:1.6.0" @@ -5287,6 +5405,18 @@ __metadata: languageName: node linkType: hard +"cross-env@npm:^6.0.3": + version: 6.0.3 + resolution: "cross-env@npm:6.0.3" + dependencies: + cross-spawn: "npm:^7.0.0" + bin: + cross-env: src/bin/cross-env.js + cross-env-shell: src/bin/cross-env-shell.js + checksum: 10c0/0d176b91c730abb08589431970a59771148f8fbf338959f5e3aa71b866d38ba390fc67f5330306d0a37d7cb74675224d0f23086f291661b944abbf5a00bd7080 + languageName: node + linkType: hard + "cross-spawn@npm:^5.0.1": version: 5.1.0 resolution: "cross-spawn@npm:5.1.0" @@ -5380,6 +5510,79 @@ __metadata: languageName: node linkType: hard +"d3-array@npm:2, d3-array@npm:^2.3.0, d3-array@npm:^2.8.0": + version: 2.12.1 + resolution: "d3-array@npm:2.12.1" + dependencies: + internmap: "npm:^1.0.0" + checksum: 10c0/7eca10427a9f113a4ca6a0f7301127cab26043fd5e362631ef5a0edd1c4b2dd70c56ed317566700c31e4a6d88b55f3951aaba192291817f243b730cb2352882e + languageName: node + linkType: hard + +"d3-color@npm:1 - 2, d3-color@npm:^2.0.0": + version: 2.0.0 + resolution: "d3-color@npm:2.0.0" + checksum: 10c0/5aa58dfb78e3db764373a904eabb643dc024ff6071128a41e86faafa100e0e17a796e06ac3f2662e9937242bb75b8286788629773d76936f11c17bd5fe5e15cd + languageName: node + linkType: hard + +"d3-format@npm:1 - 2": + version: 2.0.0 + resolution: "d3-format@npm:2.0.0" + checksum: 10c0/c869af459e20767dc3d9cbb2946ba79cc266ae4fb35d11c50c63fc89ea4ed168c702c7e3db94d503b3618de9609bf3bf2d855ef53e21109ddd7eb9c8f3fcf8a1 + languageName: node + linkType: hard + +"d3-interpolate@npm:1 - 2, d3-interpolate@npm:1.2.0 - 2": + version: 2.0.1 + resolution: "d3-interpolate@npm:2.0.1" + dependencies: + d3-color: "npm:1 - 2" + checksum: 10c0/2a5725b0c9c7fef3e8878cf75ad67be851b1472de3dda1f694c441786a1a32e198ddfaa6880d6b280401c1af5b844b61ccdd63d85d1607c1e6bb3a3f0bf532ea + languageName: node + linkType: hard + +"d3-scale-chromatic@npm:2.0.0": + version: 2.0.0 + resolution: "d3-scale-chromatic@npm:2.0.0" + dependencies: + d3-color: "npm:1 - 2" + d3-interpolate: "npm:1 - 2" + checksum: 10c0/93cafe497b00046b1d4e237a8bb8981fbb35ba03070f420bd913872f6e9d2c9628ed8bb8c84c6a6ffe16029359fa74b646c5c5129732ef4186ab059a77da3021 + languageName: node + linkType: hard + +"d3-scale@npm:^3.2.3": + version: 3.3.0 + resolution: "d3-scale@npm:3.3.0" + dependencies: + d3-array: "npm:^2.3.0" + d3-format: "npm:1 - 2" + d3-interpolate: "npm:1.2.0 - 2" + d3-time: "npm:^2.1.1" + d3-time-format: "npm:2 - 3" + checksum: 10c0/cb63c271ec9c5b632c245c63e0d0716b32adcc468247972c552f5be62fb34a17f71e4ac29fd8976704369f4b958bc6789c61a49427efe2160ae979d7843569dc + languageName: node + linkType: hard + +"d3-time-format@npm:2 - 3": + version: 3.0.0 + resolution: "d3-time-format@npm:3.0.0" + dependencies: + d3-time: "npm:1 - 2" + checksum: 10c0/0abe3379f07d1c12ce8930cdddad1223c99cd3e4eac05cf409b5a7953e9ebed56a95a64b0977f63958cfb6101fa4a2a85533a5eae40df84f22c0117dbf5e8982 + languageName: node + linkType: hard + +"d3-time@npm:1 - 2, d3-time@npm:^2.0.0, d3-time@npm:^2.1.1": + version: 2.1.1 + resolution: "d3-time@npm:2.1.1" + dependencies: + d3-array: "npm:2" + checksum: 10c0/4a01770a857bc37d2bafb8f00250e0e6a1fcc8051aea93e5eed168d8ee93e92da508a75ab5e42fc5472aa37e2a83aac68afaf3f12d9167c184ce781faadf5682 + languageName: node + linkType: hard + "damerau-levenshtein@npm:^1.0.8": version: 1.0.8 resolution: "damerau-levenshtein@npm:1.0.8" @@ -7367,7 +7570,7 @@ __metadata: languageName: node linkType: hard -"global@npm:^4.4.0": +"global@npm:^4.3.0, global@npm:^4.4.0": version: 4.4.0 resolution: "global@npm:4.4.0" dependencies: @@ -7988,6 +8191,13 @@ __metadata: languageName: node linkType: hard +"internmap@npm:^1.0.0": + version: 1.0.1 + resolution: "internmap@npm:1.0.1" + checksum: 10c0/60942be815ca19da643b6d4f23bd0bf4e8c97abbd080fb963fe67583b60bdfb3530448ad4486bae40810e92317bded9995cc31411218acc750d72cd4e8646eee + languageName: node + linkType: hard + "iota-array@npm:^1.0.0": version: 1.0.0 resolution: "iota-array@npm:1.0.0" @@ -8819,6 +9029,13 @@ __metadata: languageName: node linkType: hard +"keymirror@npm:^0.1.1": + version: 0.1.1 + resolution: "keymirror@npm:0.1.1" + checksum: 10c0/5a5196cc7cff6ec844b4f24d73bee65c3023e107a8c423ccc87af61925f953df1bfe3b467deb95644a28240ed8adf5fdac6c5dc45ad0b5ca4feab8c170be9e22 + languageName: node + linkType: hard + "kind-of@npm:^6.0.2, kind-of@npm:^6.0.3": version: 6.0.3 resolution: "kind-of@npm:6.0.3" @@ -13244,7 +13461,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.1": +"tslib@npm:^2.0.0, tslib@npm:^2.0.1": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62