From 33deb45738ea30b250d923a6d3c0ff18746a00f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Arag=C3=B3n?= Date: Tue, 16 Apr 2024 13:36:45 +0200 Subject: [PATCH] Update Deck GL v9 (#838) --- .github/workflows/ci.yml | 4 + .npmrc | 1 + CHANGELOG.md | 6 + lerna.json | 2 +- package.json | 19 +- packages/react-api/__tests__/api/SQL.test.js | 2 +- packages/react-api/__tests__/api/lds.test.js | 2 +- .../react-api/__tests__/api/tilejson.test.js | 28 +- .../hooks/useCartoLayerProps.test.js | 28 +- packages/react-api/package.json | 14 +- packages/react-api/src/api/SQL.js | 4 +- packages/react-api/src/api/model.js | 3 +- packages/react-api/src/api/stats.js | 2 +- packages/react-api/src/api/tilejson.js | 18 +- .../src/hooks/FeaturesDroppedLoader.js | 28 - .../src/hooks/dataFilterExtensionUtil.js | 2 +- .../react-api/src/hooks/maskExtensionUtil.js | 2 +- .../react-api/src/hooks/useCartoLayerProps.js | 14 - .../react-api/src/hooks/useTileFeatures.js | 18 +- packages/react-api/src/index.d.ts | 3 +- packages/react-api/src/index.js | 3 +- packages/react-api/src/types.d.ts | 20 +- packages/react-api/src/types.js | 11 + packages/react-auth/package.json | 4 +- packages/react-basemaps/package.json | 6 +- .../react-basemaps/src/basemaps/GoogleMap.js | 2 +- .../__tests__/filters/tileFeatures.test.js | 3 +- packages/react-core/package.json | 4 +- .../src/filters/tileFeaturesGeometries.d.ts | 2 +- .../src/filters/tileFeaturesGeometries.js | 2 +- packages/react-core/src/index.d.ts | 2 +- packages/react-core/src/index.js | 2 + packages/react-core/src/types.d.ts | 8 +- packages/react-core/src/types.js | 6 + .../react-redux/__tests__/cartoSlice.test.js | 12 - packages/react-redux/package.json | 10 +- packages/react-redux/src/slices/cartoSlice.js | 24 +- packages/react-redux/src/types.d.ts | 1 - packages/react-ui/package.json | 4 +- .../stories/widgets/CategoryWidget.stories.js | 99 - .../stories/widgets/FormulaWidget.stories.js | 78 - .../widgets/HistogramWidget.stories.js | 90 - .../stories/widgets/PieWidget.stories.js | 90 - .../widgets/ScatterPlotWidget.stories.js | 94 - .../__tests__/models/CategoryModel.test.js | 1 + .../__tests__/models/FormulaModel.test.js | 1 + .../__tests__/models/GeocodingModel.test.js | 4 +- .../__tests__/models/HistogramModel.test.js | 1 + .../__tests__/models/RangeModel.test.js | 1 + .../__tests__/models/TableModel.test.js | 1 + .../__tests__/models/TimeSeriesModel.test.js | 1 + .../__tests__/models/fqn.test.js | 1668 +++++++++++++++++ .../__tests__/models/utils.test.js | 2 +- packages/react-widgets/package.json | 19 +- packages/react-widgets/src/index.d.ts | 3 +- packages/react-widgets/src/index.js | 3 +- .../src/layers/EditableCartoGeoJsonLayer.js | 6 +- .../src/layers/FeatureSelectionLayer.js | 3 +- .../react-widgets/src/layers/MaskLayer.js | 2 +- .../src/models/GeocodingModel.js | 3 +- packages/react-widgets/src/models/fqn.d.ts | 11 +- packages/react-widgets/src/models/fqn.js | 114 ++ packages/react-widgets/src/models/utils.d.ts | 9 +- packages/react-widgets/src/models/utils.js | 4 +- packages/react-widgets/src/types.d.ts | 2 - .../react-widgets/src/widgets/BarWidget.js | 17 +- .../src/widgets/CategoryWidget.js | 19 +- .../src/widgets/FormulaWidget.js | 18 +- .../src/widgets/HistogramWidget.js | 19 +- .../react-widgets/src/widgets/PieWidget.js | 19 +- .../react-widgets/src/widgets/RangeWidget.js | 7 +- .../src/widgets/ScatterPlotWidget.js | 15 +- .../react-widgets/src/widgets/TableWidget.js | 10 +- .../src/widgets/TimeSeriesWidget.js | 10 +- .../src/widgets/utils/WidgetWithAlert.js | 20 +- .../defaultDroppingFeaturesAlertProps.js | 3 - packages/react-widgets/webpack.config.js | 2 +- packages/react-workers/package.json | 4 +- tsconfig.json | 2 +- yarn.lock | 1159 +++++++----- 80 files changed, 2640 insertions(+), 1320 deletions(-) create mode 100644 .npmrc delete mode 100644 packages/react-api/src/hooks/FeaturesDroppedLoader.js create mode 100644 packages/react-api/src/types.js create mode 100644 packages/react-core/src/types.js delete mode 100644 packages/react-ui/storybook/stories/widgets/CategoryWidget.stories.js delete mode 100644 packages/react-ui/storybook/stories/widgets/FormulaWidget.stories.js delete mode 100644 packages/react-ui/storybook/stories/widgets/HistogramWidget.stories.js delete mode 100644 packages/react-ui/storybook/stories/widgets/PieWidget.stories.js delete mode 100644 packages/react-ui/storybook/stories/widgets/ScatterPlotWidget.stories.js create mode 100644 packages/react-widgets/__tests__/models/fqn.test.js delete mode 100644 packages/react-widgets/src/widgets/utils/defaultDroppingFeaturesAlertProps.js diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 12fb3f78c..59adebf80 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -110,6 +110,10 @@ jobs: with: node-version: ${{ matrix.node-version }} + # Configure private registry + - name: Configure private registry + run: npm set //npm.pkg.github.com/:_authToken ${{ secrets.GITHUB_TOKEN }} + # Install dependencies, lint, build and test - name: Install dependencies diff --git a/.npmrc b/.npmrc new file mode 100644 index 000000000..bc9c450fb --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +@cartodb:registry=https://npm.pkg.github.com diff --git a/CHANGELOG.md b/CHANGELOG.md index f84002ab2..6e26b4fac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ## Not released +## 3.0.0 + +### 3.0.0-alpha.7 (2024-04-16) + +- Update Deck GL v9 and removed dropping features functionality [#838](https://github.com/CartoDB/carto-react/pull/838) + ## 2.5 ### 2.5.2 (2024-04-10) diff --git a/lerna.json b/lerna.json index 57d5aab6f..04964135c 100644 --- a/lerna.json +++ b/lerna.json @@ -4,5 +4,5 @@ ], "npmClient": "yarn", "useWorkspaces": true, - "version": "2.5.2" + "version": "3.0.0-alpha.7" } diff --git a/package.json b/package.json index 9f906ac73..314b37bbf 100644 --- a/package.json +++ b/package.json @@ -5,22 +5,21 @@ "packages/*" ], "devDependencies": { - "@deck.gl/aggregation-layers": "^8.9.18", - "@deck.gl/carto": "^8.9.18", - "@deck.gl/core": "^8.9.18", - "@deck.gl/extensions": "^8.9.18", - "@deck.gl/geo-layers": "^8.9.18", - "@deck.gl/google-maps": "^8.9.18", - "@deck.gl/layers": "^8.9.18", - "@deck.gl/mesh-layers": "^8.9.18", + "@deck.gl-community/editable-layers": "^9.0.0-alpha.1", + "@deck.gl/aggregation-layers": "^9.0.1", + "@deck.gl/carto": "^9.0.1", + "@deck.gl/core": "^9.0.1", + "@deck.gl/extensions": "^9.0.1", + "@deck.gl/geo-layers": "^9.0.1", + "@deck.gl/google-maps": "^9.0.1", + "@deck.gl/layers": "^9.0.1", + "@deck.gl/mesh-layers": "^9.0.1", "@emotion/react": "^11.10.6", "@emotion/styled": "^11.10.6", "@formatjs/intl-localematcher": "^0.4.0", "@mui/icons-material": "^5.11.16", "@mui/lab": "^5.0.0-alpha.125", "@mui/material": "^5.11.16", - "@nebula.gl/edit-modes": "^1.0.4", - "@nebula.gl/layers": "^1.0.4", "@reduxjs/toolkit": "^1.5.0", "@testing-library/jest-dom": "^5.11.9", "@testing-library/react": "^11.2.5", diff --git a/packages/react-api/__tests__/api/SQL.test.js b/packages/react-api/__tests__/api/SQL.test.js index 6f7585e7d..77ed10a0d 100644 --- a/packages/react-api/__tests__/api/SQL.test.js +++ b/packages/react-api/__tests__/api/SQL.test.js @@ -1,7 +1,7 @@ import { REQUEST_GET_MAX_URL_LENGTH } from '@carto/react-core'; import { mockClear, mockSqlApiRequest } from '../mockSqlApiRequest'; import { executeSQL } from '../../src/api/SQL'; -import { API_VERSIONS } from '@deck.gl/carto'; +import { API_VERSIONS } from '../../src/types'; describe('should call SqlApi', () => { const response = { rows: { revenue: 1495728 } }; diff --git a/packages/react-api/__tests__/api/lds.test.js b/packages/react-api/__tests__/api/lds.test.js index 958e15cf9..7c222baf5 100644 --- a/packages/react-api/__tests__/api/lds.test.js +++ b/packages/react-api/__tests__/api/lds.test.js @@ -1,5 +1,5 @@ -import { API_VERSIONS } from '@deck.gl/carto'; import { ldsGeocode } from '../../src/api/lds'; +import { API_VERSIONS } from '../../src/types'; const sampleCredentialsV3 = { apiVersion: API_VERSIONS.V3, diff --git a/packages/react-api/__tests__/api/tilejson.test.js b/packages/react-api/__tests__/api/tilejson.test.js index 54a2fc8d5..8b0a66a9b 100644 --- a/packages/react-api/__tests__/api/tilejson.test.js +++ b/packages/react-api/__tests__/api/tilejson.test.js @@ -1,16 +1,13 @@ import { getTileJson } from '../../src/api/tilejson'; -import { MAP_TYPES, API_VERSIONS } from '@deck.gl/carto'; +import { MAP_TYPES, API_VERSIONS } from '../../src/types'; -const mockedFetchLayerData = jest.fn(); +const mockedVectorTilesetSource = jest.fn(); jest.mock('@deck.gl/carto', () => ({ ...jest.requireActual('@deck.gl/carto'), - fetchLayerData: (props) => { - mockedFetchLayerData(props); - return Promise.resolve({ - data: {}, - format: 'tilejson' - }); + vectorTilesetSource: (props) => { + mockedVectorTilesetSource(props); + return Promise.resolve({}); } })); @@ -34,17 +31,12 @@ describe('tilejson', () => { const tilejson = await getTileJson({ source }); - expect(mockedFetchLayerData).toBeCalledWith({ + expect(mockedVectorTilesetSource).toBeCalledWith({ + connectionName: '__test_connection__', + apiBaseUrl: 'https://gcp-us-east1.api.carto.com', + accessToken: '__test_api_key__', clientId: 'carto-for-react', // hardcoded as no neeed to export CLIENT_ID from '@carto/react-api/api/common'; - connection: '__test_connection__', - credentials: { - accessToken: '__test_api_key__', - apiBaseUrl: 'https://gcp-us-east1.api.carto.com', - apiVersion: 'v3' - }, - format: 'tilejson', - source: '__test_tileset__', - type: 'tileset' + tableName: '__test_tileset__' }); expect(tilejson).toBeDefined(); diff --git a/packages/react-api/__tests__/hooks/useCartoLayerProps.test.js b/packages/react-api/__tests__/hooks/useCartoLayerProps.test.js index 1cc480124..681e47385 100644 --- a/packages/react-api/__tests__/hooks/useCartoLayerProps.test.js +++ b/packages/react-api/__tests__/hooks/useCartoLayerProps.test.js @@ -1,9 +1,9 @@ import { DataFilterExtension, MaskExtension } from '@deck.gl/extensions'; -import { MAP_TYPES, API_VERSIONS } from '@deck.gl/carto'; import { renderHook } from '@testing-library/react-hooks'; import useCartoLayerProps from '../../src/hooks/useCartoLayerProps'; import { mockReduxHooks, mockClear } from '../mockReduxHooks'; import { MAX_GPU_FILTERS } from '../../src/hooks/dataFilterExtensionUtil'; +import { MAP_TYPES, API_VERSIONS } from '../../src/types'; describe('useCartoLayerProps', () => { mockReduxHooks(); @@ -13,21 +13,11 @@ describe('useCartoLayerProps', () => { 'binary', 'onViewportLoad', 'fetch', - 'loaders', 'onDataLoad', 'id', 'visible', 'opacity', 'uniqueIdProperty', - 'data', - 'type', - 'geoColumn', - 'aggregationExp', - 'provider', - 'connection', - 'credentials', - 'clientId', - 'queryParameters', 'filterRange', 'updateTriggers', 'getFilterValue', @@ -90,22 +80,6 @@ describe('useCartoLayerProps', () => { }); }); - test('should return correct props when source geo column is set', () => { - const source = { - credentials: { - apiVersion: API_VERSIONS.V2 - }, - geoColumn: 'column_name', - aggregationExp: 'agg_exp' - }; - - const { result } = renderHook(() => useCartoLayerProps({ source })); - - expect(Object.keys(result.current)).toEqual([...COMMON_PROPS]); - expect(result.current.geoColumn).toBe(source.geoColumn); - expect(result.current.aggregationExp).toBe(source.aggregationExp); - }); - describe('when maps_api_version is V3', () => { test('should return correct props when source type is tileset', () => { const source = { diff --git a/packages/react-api/package.json b/packages/react-api/package.json index b4c4e130f..4d8bfc28d 100644 --- a/packages/react-api/package.json +++ b/packages/react-api/package.json @@ -1,6 +1,6 @@ { "name": "@carto/react-api", - "version": "2.5.2", + "version": "3.0.0-alpha.7", "description": "CARTO for React - Api", "author": "CARTO Dev Team", "keywords": [ @@ -68,12 +68,12 @@ "@babel/runtime": "^7.13.9" }, "peerDependencies": { - "@carto/react-core": "^2.5.0", - "@carto/react-redux": "^2.5.0", - "@carto/react-workers": "^2.5.0", - "@deck.gl/carto": "^8.9.18", - "@deck.gl/core": "^8.9.18", - "@deck.gl/extensions": "^8.9.18", + "@carto/react-core": "^3.0.0-alpha.7", + "@carto/react-redux": "^3.0.0-alpha.7", + "@carto/react-workers": "^3.0.0-alpha.7", + "@deck.gl/carto": "^9.0.1", + "@deck.gl/core": "^9.0.1", + "@deck.gl/extensions": "^9.0.1", "@loaders.gl/mvt": "^3.2.10", "react": "17.x || 18.x", "react-dom": "17.x || 18.x", diff --git a/packages/react-api/src/api/SQL.js b/packages/react-api/src/api/SQL.js index fdf17ced9..64cd29dae 100644 --- a/packages/react-api/src/api/SQL.js +++ b/packages/react-api/src/api/SQL.js @@ -1,8 +1,8 @@ import { encodeParameter, getRequest, postRequest } from '@carto/react-core'; import { REQUEST_GET_MAX_URL_LENGTH } from '@carto/react-core'; -import { API_VERSIONS } from '@deck.gl/carto/typed'; import { dealWithApiError, CLIENT_ID } from './common'; +import { API_VERSIONS } from '../types'; const DEFAULT_USER_COMPONENT_IN_URL = '{user}'; @@ -17,7 +17,7 @@ const DEFAULT_USER_COMPONENT_IN_URL = '{user}'; * @param { string } props.query - SQL query to be executed * @param { string } props.connection - connection name required for CARTO cloud native * @param { Object } props.opts - Additional options for the HTTP request (eg `{ headers: {} }`) - * @param { import('@deck.gl/carto/typed').QueryParameters } props.queryParameters - SQL query parameters + * @param { import('@deck.gl/carto').QueryParameters } props.queryParameters - SQL query parameters */ export const executeSQL = async ({ credentials, diff --git a/packages/react-api/src/api/model.js b/packages/react-api/src/api/model.js index 3a0b68396..ba2f29016 100644 --- a/packages/react-api/src/api/model.js +++ b/packages/react-api/src/api/model.js @@ -1,8 +1,9 @@ import { checkCredentials, makeCall } from './common'; -import { MAP_TYPES, API_VERSIONS } from '@deck.gl/carto/typed'; import { _assert as assert } from '@carto/react-core/'; import { REQUEST_GET_MAX_URL_LENGTH, _getClient } from '@carto/react-core'; +import { MAP_TYPES } from '../types'; +import { API_VERSIONS } from '../types'; const AVAILABLE_MODELS = [ 'category', diff --git a/packages/react-api/src/api/stats.js b/packages/react-api/src/api/stats.js index bf47e2a22..977bf6db5 100644 --- a/packages/react-api/src/api/stats.js +++ b/packages/react-api/src/api/stats.js @@ -1,11 +1,11 @@ import { checkCredentials, makeCall } from './common'; -import { MAP_TYPES, API_VERSIONS } from '@deck.gl/carto/typed'; import { getTileJson } from './tilejson'; import { InvalidColumnError, REQUEST_GET_MAX_URL_LENGTH, _assert as assert } from '@carto/react-core/'; +import { MAP_TYPES, API_VERSIONS } from '../types'; /** * Execute a stats service request. diff --git a/packages/react-api/src/api/tilejson.js b/packages/react-api/src/api/tilejson.js index d84958c42..bb0195dd0 100644 --- a/packages/react-api/src/api/tilejson.js +++ b/packages/react-api/src/api/tilejson.js @@ -1,6 +1,7 @@ import { checkCredentials, CLIENT_ID } from './common'; -import { MAP_TYPES, API_VERSIONS, fetchLayerData, FORMATS } from '@deck.gl/carto/typed'; +import { vectorTilesetSource } from '@deck.gl/carto'; import { _assert as assert } from '@carto/react-core'; +import { MAP_TYPES, API_VERSIONS } from '../types'; /** * Get the TileJson for static tilesets @@ -24,16 +25,13 @@ export async function getTileJson(props) { 'TileJson is a feature only available in CARTO 3.' ); - const { data, format } = await fetchLayerData({ - type: source.type, - source: source.data, - connection: source.connection, - credentials: source.credentials, - format: FORMATS.TILEJSON, - clientId: CLIENT_ID + const data = await vectorTilesetSource({ + connectionName: source.connection, + apiBaseUrl: source.credentials.apiBaseUrl, + accessToken: source.credentials.accessToken, + clientId: CLIENT_ID, + tableName: source.data }); - assert(format === FORMATS.TILEJSON, 'getTileJson: data is not a tilejson'); - return data; } diff --git a/packages/react-api/src/hooks/FeaturesDroppedLoader.js b/packages/react-api/src/hooks/FeaturesDroppedLoader.js deleted file mode 100644 index 755aabba9..000000000 --- a/packages/react-api/src/hooks/FeaturesDroppedLoader.js +++ /dev/null @@ -1,28 +0,0 @@ -import { MVTWorkerLoader } from '@loaders.gl/mvt'; -import { selectLoader } from '@loaders.gl/core'; - -// eslint-disable-next-line import/no-anonymous-default-export -export default { - name: 'FeaturesDroppedLoader', - module: 'carto', - category: 'geometry', - extensions: [], - // By only specifying `carto-vector-tile` the SpatialIndexLayer will not use this loader - mimeTypes: ['application/vnd.carto-vector-tile', ...MVTWorkerLoader.mimeTypes], - parse: async (arrayBuffer, options, context) => { - const { headers } = context.response; - const isDroppingFeatures = headers['features-dropped-from-tile'] === 'true'; - - // Obtain a registered loader to actually parse the data - let loader = null; - options.mimeType = options.mimeType || headers['content-type']; - if (MVTWorkerLoader.mimeTypes.includes(options.mimeType)) { - loader = MVTWorkerLoader; - } else { - const dummyBlob = new Blob([], { type: options.mimeType }); - loader = await selectLoader(dummyBlob); - } - const result = await context.parse(arrayBuffer, loader, options, context); - return result ? { ...result, isDroppingFeatures } : null; - } -}; diff --git a/packages/react-api/src/hooks/dataFilterExtensionUtil.js b/packages/react-api/src/hooks/dataFilterExtensionUtil.js index 93de053bd..456a5dc96 100644 --- a/packages/react-api/src/hooks/dataFilterExtensionUtil.js +++ b/packages/react-api/src/hooks/dataFilterExtensionUtil.js @@ -1,4 +1,4 @@ -import { DataFilterExtension } from '@deck.gl/extensions/typed'; +import { DataFilterExtension } from '@deck.gl/extensions'; import { _buildFeatureFilter, _FilterTypes } from '@carto/react-core'; // Don't change this value to maintain compatibility with builder diff --git a/packages/react-api/src/hooks/maskExtensionUtil.js b/packages/react-api/src/hooks/maskExtensionUtil.js index f7c6d48f1..2663dae13 100644 --- a/packages/react-api/src/hooks/maskExtensionUtil.js +++ b/packages/react-api/src/hooks/maskExtensionUtil.js @@ -1,5 +1,5 @@ import { MASK_ID } from '@carto/react-core/'; -import { MaskExtension } from '@deck.gl/extensions/typed'; +import { MaskExtension } from '@deck.gl/extensions'; const maskExtension = new MaskExtension(); diff --git a/packages/react-api/src/hooks/useCartoLayerProps.js b/packages/react-api/src/hooks/useCartoLayerProps.js index ab9c40515..2f56d70ff 100644 --- a/packages/react-api/src/hooks/useCartoLayerProps.js +++ b/packages/react-api/src/hooks/useCartoLayerProps.js @@ -5,10 +5,6 @@ import useGeojsonFeatures from './useGeojsonFeatures'; import useTileFeatures from './useTileFeatures'; import { getDataFilterExtensionProps } from './dataFilterExtensionUtil'; import { getMaskExtensionProps } from './maskExtensionUtil'; -import FeaturesDroppedLoader from './FeaturesDroppedLoader'; -import { CLIENT_ID } from '../api/common'; - -const LOADERS = [FeaturesDroppedLoader]; export default function useCartoLayerProps({ source, @@ -57,7 +53,6 @@ export default function useCartoLayerProps({ ...(viewportFeatures && { onViewportLoad, fetch, - loaders: LOADERS, onDataLoad }) }; @@ -78,15 +73,6 @@ export default function useCartoLayerProps({ visible: layerConfig?.visible !== undefined ? layerConfig.visible : true, opacity: layerConfig?.opacity ?? 1, uniqueIdProperty, - data: source?.data, - type: source?.type, - geoColumn: source?.geoColumn, - aggregationExp: source?.aggregationExp, - provider: source?.provider, - connection: source?.connection, - credentials: source?.credentials, - clientId: CLIENT_ID, - queryParameters: source?.queryParameters, ...dataFilterExtensionProps, ...maskExtensionProps, extensions diff --git a/packages/react-api/src/hooks/useTileFeatures.js b/packages/react-api/src/hooks/useTileFeatures.js index be04e098c..902b96402 100644 --- a/packages/react-api/src/hooks/useTileFeatures.js +++ b/packages/react-api/src/hooks/useTileFeatures.js @@ -1,12 +1,14 @@ import { useEffect, useCallback, useState } from 'react'; -import { debounce, SpatialIndex, getColumnNameFromGeoColumn } from '@carto/react-core'; +import { + debounce, + SpatialIndex, + getColumnNameFromGeoColumn, + TILE_FORMATS +} from '@carto/react-core'; import { Methods, executeTask } from '@carto/react-workers'; -import { setIsDroppingFeatures } from '@carto/react-redux'; -import { Layer } from '@deck.gl/core/typed'; -import { TILE_FORMATS } from '@deck.gl/carto/typed'; +import { Layer } from '@deck.gl/core'; import { throwError } from './utils'; import useFeaturesCommons from './useFeaturesCommons'; -import { useDispatch } from 'react-redux'; export default function useTileFeatures({ source, @@ -15,7 +17,6 @@ export default function useTileFeatures({ uniqueIdProperty, debounceTimeout = 250 }) { - const dispatch = useDispatch(); const [ debounceIdRef, isTilesetLoaded, @@ -77,14 +78,11 @@ export default function useTileFeatures({ return acc; }, []); - const isDroppingFeatures = tiles?.some((tile) => tile.content?.isDroppingFeatures); - dispatch(setIsDroppingFeatures({ id: sourceId, isDroppingFeatures })); - executeTask(sourceId, Methods.LOAD_TILES, { tiles: cleanedTiles }) .then(() => setTilesetLoaded(true)) .catch(throwError); }, - [sourceId, setTilesetLoaded, dispatch] + [sourceId, setTilesetLoaded] ); // eslint-disable-next-line react-hooks/exhaustive-deps diff --git a/packages/react-api/src/index.d.ts b/packages/react-api/src/index.d.ts index e142e1667..e8ba0e235 100644 --- a/packages/react-api/src/index.d.ts +++ b/packages/react-api/src/index.d.ts @@ -4,7 +4,6 @@ export { getStats as _getStats } from './api/stats'; export { getTileJson as _getTileJson } from './api/tilejson'; export { executeModel as _executeModel } from './api/model'; -export { default as FeaturesDroppedLoader } from './hooks/FeaturesDroppedLoader'; export { default as useCartoLayerProps } from './hooks/useCartoLayerProps'; -export { Credentials, UseCartoLayerFilterProps, SourceProps } from './types'; +export { Credentials, UseCartoLayerFilterProps, SourceProps, MAP_TYPES, API_VERSIONS } from './types'; diff --git a/packages/react-api/src/index.js b/packages/react-api/src/index.js index 1316b8dbf..41323dc60 100644 --- a/packages/react-api/src/index.js +++ b/packages/react-api/src/index.js @@ -4,7 +4,8 @@ export { getStats as _getStats } from './api/stats'; export { getTileJson as _getTileJson } from './api/tilejson'; export { executeModel as _executeModel } from './api/model'; -export { default as FeaturesDroppedLoader } from './hooks/FeaturesDroppedLoader'; export { default as useCartoLayerProps } from './hooks/useCartoLayerProps'; export { getDataFilterExtensionProps } from './hooks/dataFilterExtensionUtil'; + +export { MAP_TYPES, API_VERSIONS } from './types'; diff --git a/packages/react-api/src/types.d.ts b/packages/react-api/src/types.d.ts index 9e857c498..415197526 100644 --- a/packages/react-api/src/types.d.ts +++ b/packages/react-api/src/types.d.ts @@ -1,9 +1,20 @@ -import { DataFilterExtension, MaskExtension } from '@deck.gl/extensions/typed'; -import { MAP_TYPES, API_VERSIONS } from '@deck.gl/carto/typed'; -import { QueryParameters } from '@deck.gl/carto/typed'; +import { DataFilterExtension, MaskExtension } from '@deck.gl/extensions'; +import { QueryParameters } from '@deck.gl/carto'; import { FeatureCollection } from 'geojson'; import { Provider } from '@carto/react-core'; +export enum API_VERSIONS { + V1 = 'v1', + V2 = 'v2', + V3 = 'v3' +} + +export enum MAP_TYPES { + TABLE = 'table', + QUERY = 'query', + TILESET = 'tileset' +} + type ApiVersionsType = typeof API_VERSIONS; type MapTypesType = typeof MAP_TYPES; interface CredentialsCarto2 { @@ -59,6 +70,7 @@ export type UseCartoLayerFilterProps = { }; maskEnabled: boolean; maskId: string; -} & SourceProps; +}; export type ExecuteSQLResponse = Promise; + diff --git a/packages/react-api/src/types.js b/packages/react-api/src/types.js new file mode 100644 index 000000000..c32a08764 --- /dev/null +++ b/packages/react-api/src/types.js @@ -0,0 +1,11 @@ +export const MAP_TYPES = Object.freeze({ + TABLE: 'table', + QUERY: 'query', + TILESET: 'tileset' +}); + +export const API_VERSIONS = Object.freeze({ + V1: 'v1', + V2: 'v2', + V3: 'v3' +}); diff --git a/packages/react-auth/package.json b/packages/react-auth/package.json index 611708451..04aed3bfe 100644 --- a/packages/react-auth/package.json +++ b/packages/react-auth/package.json @@ -1,6 +1,6 @@ { "name": "@carto/react-auth", - "version": "2.5.2", + "version": "3.0.0-alpha.7", "description": "CARTO for React - Auth", "author": "CARTO Dev Team", "keywords": [ @@ -68,7 +68,7 @@ "@babel/runtime": "^7.13.9" }, "peerDependencies": { - "@carto/react-core": "^2.5.0", + "@carto/react-core": "^3.0.0-alpha.7", "react": "17.x || 18.x", "react-dom": "17.x || 18.x" } diff --git a/packages/react-basemaps/package.json b/packages/react-basemaps/package.json index 224978170..81ccf4fd9 100644 --- a/packages/react-basemaps/package.json +++ b/packages/react-basemaps/package.json @@ -1,6 +1,6 @@ { "name": "@carto/react-basemaps", - "version": "2.5.2", + "version": "3.0.0-alpha.7", "description": "CARTO for React - Basemaps", "keywords": [ "carto", @@ -68,8 +68,8 @@ "@babel/runtime": "^7.13.9" }, "peerDependencies": { - "@carto/react-core": "^2.5.0", - "@deck.gl/google-maps": "^8.9.18", + "@carto/react-core": "^3.0.0-alpha.7", + "@deck.gl/google-maps": "^9.0.1", "react": "17.x || 18.x", "react-dom": "17.x || 18.x" } diff --git a/packages/react-basemaps/src/basemaps/GoogleMap.js b/packages/react-basemaps/src/basemaps/GoogleMap.js index 9373ca88c..5b4a3ee93 100644 --- a/packages/react-basemaps/src/basemaps/GoogleMap.js +++ b/packages/react-basemaps/src/basemaps/GoogleMap.js @@ -1,5 +1,5 @@ import React, { useEffect, useRef } from 'react'; -import { GoogleMapsOverlay } from '@deck.gl/google-maps/typed'; +import { GoogleMapsOverlay } from '@deck.gl/google-maps'; import { debounce } from '@carto/react-core'; /** diff --git a/packages/react-core/__tests__/filters/tileFeatures.test.js b/packages/react-core/__tests__/filters/tileFeatures.test.js index c286032a5..21595f1c1 100644 --- a/packages/react-core/__tests__/filters/tileFeatures.test.js +++ b/packages/react-core/__tests__/filters/tileFeatures.test.js @@ -1,6 +1,5 @@ -import { TILE_FORMATS } from '@deck.gl/carto'; import { geojsonToBinary } from '@loaders.gl/gis'; -import { tileFeatures } from '../../src'; +import { TILE_FORMATS, tileFeatures } from '../../src'; import * as transformToTileCoords from '../../src/utils/transformToTileCoords'; describe('viewport features with binary mode', () => { diff --git a/packages/react-core/package.json b/packages/react-core/package.json index 992c1c481..9e52492af 100644 --- a/packages/react-core/package.json +++ b/packages/react-core/package.json @@ -1,6 +1,6 @@ { "name": "@carto/react-core", - "version": "2.5.2", + "version": "3.0.0-alpha.7", "description": "CARTO for React - Core", "author": "CARTO Dev Team", "keywords": [ @@ -68,7 +68,7 @@ "@babel/runtime": "^7.13.9" }, "peerDependencies": { - "@deck.gl/carto": "^8.9.18", + "@deck.gl/carto": "^9.0.1", "@turf/bbox-clip": "^6.3.0", "@turf/bbox-polygon": "^6.3.0", "@turf/boolean-intersects": "^6.3.0", diff --git a/packages/react-core/src/filters/tileFeaturesGeometries.d.ts b/packages/react-core/src/filters/tileFeaturesGeometries.d.ts index ec7c3164c..b2a00879a 100644 --- a/packages/react-core/src/filters/tileFeaturesGeometries.d.ts +++ b/packages/react-core/src/filters/tileFeaturesGeometries.d.ts @@ -1,6 +1,6 @@ -import { TILE_FORMATS } from '@deck.gl/carto/typed'; import { Polygon, MultiPolygon } from 'geojson'; import { TileFeaturesResponse } from '../types'; +import { TILE_FORMATS } from '../types'; export default function tileFeaturesGeometries(arg: { tiles: any; diff --git a/packages/react-core/src/filters/tileFeaturesGeometries.js b/packages/react-core/src/filters/tileFeaturesGeometries.js index 4c6848d05..4c64989e3 100644 --- a/packages/react-core/src/filters/tileFeaturesGeometries.js +++ b/packages/react-core/src/filters/tileFeaturesGeometries.js @@ -1,9 +1,9 @@ -import { TILE_FORMATS } from '@deck.gl/carto/typed'; import bboxPolygon from '@turf/bbox-polygon'; import intersects from '@turf/boolean-intersects'; import booleanWithin from '@turf/boolean-within'; import intersect from '@turf/intersect'; import transformToTileCoords from '../utils/transformToTileCoords'; +import { TILE_FORMATS } from '../types'; const GEOMETRY_TYPES = Object.freeze({ Point: 0, diff --git a/packages/react-core/src/index.d.ts b/packages/react-core/src/index.d.ts index a7249a0e6..be394717d 100644 --- a/packages/react-core/src/index.d.ts +++ b/packages/react-core/src/index.d.ts @@ -44,7 +44,7 @@ export { export { tileFeatures } from './filters/tileFeatures'; export { geojsonFeatures } from './filters/geojsonFeatures'; -export { AggregationFunctions, GroupByFeature, HistogramFeature, Viewport, TileFeatures } from './types'; +export { AggregationFunctions, GroupByFeature, HistogramFeature, Viewport, TileFeatures, TILE_FORMATS } from './types'; export { GroupDateTypes } from './operations/constants/GroupDateTypes'; export { groupValuesByDateColumn } from './operations/groupByDate'; diff --git a/packages/react-core/src/index.js b/packages/react-core/src/index.js index 2b96cc534..2e31d74bb 100644 --- a/packages/react-core/src/index.js +++ b/packages/react-core/src/index.js @@ -67,3 +67,5 @@ export { setClient as _setClient, getClient as _getClient } from './utils/clientParameter'; + +export { TILE_FORMATS } from './types'; diff --git a/packages/react-core/src/types.d.ts b/packages/react-core/src/types.d.ts index 795914ad6..9f5862467 100644 --- a/packages/react-core/src/types.d.ts +++ b/packages/react-core/src/types.d.ts @@ -1,8 +1,14 @@ -import { TILE_FORMATS } from '@deck.gl/carto/typed'; import { AggregationTypes } from './operations/constants/AggregationTypes'; import { Polygon, MultiPolygon } from 'geojson'; import { SpatialIndex } from './operations/constants/SpatialIndexTypes'; +export enum TILE_FORMATS { + MVT = 'mvt', + JSON = 'json', + GEOJSON = 'geojson', + BINARY = 'binary' +} + export type AggregationFunctions = Record< AggregationTypes, ( diff --git a/packages/react-core/src/types.js b/packages/react-core/src/types.js new file mode 100644 index 000000000..aa8078cfe --- /dev/null +++ b/packages/react-core/src/types.js @@ -0,0 +1,6 @@ +export const TILE_FORMATS = Object.freeze({ + MVT: 'mvt', + JSON: 'json', + GEOJSON: 'geojson', + BINARY: 'binary' +}); diff --git a/packages/react-redux/__tests__/cartoSlice.test.js b/packages/react-redux/__tests__/cartoSlice.test.js index e66af7eca..462d5a670 100644 --- a/packages/react-redux/__tests__/cartoSlice.test.js +++ b/packages/react-redux/__tests__/cartoSlice.test.js @@ -1,5 +1,4 @@ import * as cartoSlice from '../src/slices/cartoSlice'; -import { setDefaultCredentials } from '@deck.gl/carto'; import { mockAppStoreConfiguration } from './mockReducerManager'; import { VOYAGER } from '@carto/react-basemaps'; import { _FilterTypes } from '@carto/react-core'; @@ -21,10 +20,6 @@ const INITIAL_STATE = { } }; -jest.mock('@deck.gl/carto', () => ({ - setDefaultCredentials: jest.fn() -})); - describe('carto slice', () => { const store = mockAppStoreConfiguration(); store.reducerManager.add('carto', cartoSlice.createCartoSlice(INITIAL_STATE)); @@ -303,12 +298,5 @@ describe('carto slice', () => { updatedProp: 'update' }); }); - - test('should call setDefaultCredentials', () => { - store.dispatch(cartoSlice.setCredentials({ updatedProp: 'update' })); - - const { carto: state } = store.getState(); - expect(setDefaultCredentials).toHaveBeenCalledWith(state.credentials); - }); }); }); diff --git a/packages/react-redux/package.json b/packages/react-redux/package.json index f81ffe7d3..d80079460 100644 --- a/packages/react-redux/package.json +++ b/packages/react-redux/package.json @@ -1,6 +1,6 @@ { "name": "@carto/react-redux", - "version": "2.5.2", + "version": "3.0.0-alpha.7", "description": "CARTO for React - Redux", "author": "CARTO Dev Team", "keywords": [ @@ -67,10 +67,10 @@ "@babel/runtime": "^7.13.9" }, "peerDependencies": { - "@carto/react-core": "^2.5.0", - "@carto/react-workers": "^2.5.0", - "@deck.gl/carto": "^8.9.18", - "@deck.gl/core": "^8.9.18", + "@carto/react-core": "^3.0.0-alpha.7", + "@carto/react-workers": "^3.0.0-alpha.7", + "@deck.gl/carto": "^9.0.1", + "@deck.gl/core": "^9.0.1", "@reduxjs/toolkit": "^1.5.0" } } diff --git a/packages/react-redux/src/slices/cartoSlice.js b/packages/react-redux/src/slices/cartoSlice.js index a251a0f32..74fe4d323 100644 --- a/packages/react-redux/src/slices/cartoSlice.js +++ b/packages/react-redux/src/slices/cartoSlice.js @@ -1,6 +1,5 @@ import { createSlice } from '@reduxjs/toolkit'; -import { WebMercatorViewport } from '@deck.gl/core/typed'; -import { setDefaultCredentials } from '@deck.gl/carto/typed'; +import { WebMercatorViewport } from '@deck.gl/core'; import { removeWorker } from '@carto/react-workers'; import { FEATURE_SELECTION_MODES, @@ -63,11 +62,6 @@ export const createCartoSlice = (initialState) => { action.payload.credentials = action.payload.credentials || state.credentials; state.dataSources[action.payload.id] = action.payload; }, - setIsDroppingFeatures: (state, action) => { - const source = state.dataSources[action.payload.id]; - source.isDroppingFeatures = action.payload.isDroppingFeatures; - state.dataSources[action.payload.id] = source; - }, removeSource: (state, action) => { delete state.dataSources[action.payload]; removeWorker(action.payload); @@ -183,7 +177,6 @@ export const createCartoSlice = (initialState) => { ...state.credentials, ...action.payload }; - setDefaultCredentials(state.credentials); }, setFeatureSelectionMode: (state, action) => { state.featureSelectionMode = action.payload; @@ -208,7 +201,7 @@ export const createCartoSlice = (initialState) => { * @param {string} data.connection - connection name for CARTO 3 source. * @param {import('../types').SourceFilters=} data.filters - logical operator that defines how filters for different columns are joined together. * @param {FiltersLogicalOperators=} data.filtersLogicalOperator - logical operator that defines how filters for different columns are joined together. - * @param {import('@deck.gl/carto/typed').QueryParameters} data.queryParameters - SQL query parameters. + * @param {import('@deck.gl/carto').QueryParameters} data.queryParameters - SQL query parameters. * @param {string=} data.geoColumn - (optional) name of column containing geometries or spatial index data. * @param {string=} data.aggregationExp - (optional) for spatial index data. * @param {string=} data.provider - (optional) type of the data warehouse. @@ -242,17 +235,6 @@ export const addSource = ({ } }); -/** - * Action to set the `isDroppingFeature` flag. - * @param {object} data - * @param {string} data.id - unique id for the source. - * @param {boolean} data.isDroppingFeatures - flag that indicate if tiles are generated using a dropping feature strategy. - */ -export const setIsDroppingFeatures = ({ id, isDroppingFeatures }) => ({ - type: 'carto/setIsDroppingFeatures', - payload: { id, isDroppingFeatures } -}); - /** * Action to remove a source from the store * @param {string} sourceId - id of the source to remove @@ -358,8 +340,6 @@ const _setViewPort = (payload) => ({ type: 'carto/setViewPort', payload }); * Redux selector to get a source by ID */ export const selectSourceById = (state, id) => state.carto.dataSources[id]; -export const checkIfSourceIsDroppingFeature = (state, id) => - state.carto.dataSources[id]?.isDroppingFeatures; /** * Redux selector to select the active viewport diff --git a/packages/react-redux/src/types.d.ts b/packages/react-redux/src/types.d.ts index 5be5c71d5..ada1ebbb5 100644 --- a/packages/react-redux/src/types.d.ts +++ b/packages/react-redux/src/types.d.ts @@ -25,7 +25,6 @@ export type Source = SourceProps & { id: string; filters?: SourceFilters; filtersLogicalOperator?: FiltersLogicalOperators; - isDroppingFeatures?: boolean; }; type InitialCarto2State = { diff --git a/packages/react-ui/package.json b/packages/react-ui/package.json index c708e7086..63027487b 100644 --- a/packages/react-ui/package.json +++ b/packages/react-ui/package.json @@ -1,6 +1,6 @@ { "name": "@carto/react-ui", - "version": "2.5.2", + "version": "3.0.0-alpha.7", "description": "CARTO for React - UI", "author": "CARTO Dev Team", "keywords": [ @@ -82,7 +82,7 @@ "@babel/runtime": "^7.13.9" }, "peerDependencies": { - "@carto/react-core": "^2.5.0", + "@carto/react-core": "^3.0.0-alpha.7", "@emotion/react": "^11.10.6", "@emotion/styled": "^11.10.6", "@formatjs/intl-localematcher": "^0.4.0", diff --git a/packages/react-ui/storybook/stories/widgets/CategoryWidget.stories.js b/packages/react-ui/storybook/stories/widgets/CategoryWidget.stories.js deleted file mode 100644 index aeab1245a..000000000 --- a/packages/react-ui/storybook/stories/widgets/CategoryWidget.stories.js +++ /dev/null @@ -1,99 +0,0 @@ -import React from 'react'; -import { Provider } from 'react-redux'; -import { - Title, - Subtitle, - Primary, - ArgsTable, - Stories, - PRIMARY_STORY -} from '@storybook/addon-docs'; -import * as cartoSlice from '../../../../react-redux/src/slices/cartoSlice'; -import { AggregationTypes } from '../../../../react-core/src'; -import CategoryWidget from '../../../../react-widgets/src/widgets/CategoryWidget'; -import { mockAppStoreConfiguration } from './utils'; -import { buildReactPropsAsString } from '../../utils/utils'; - -const store = mockAppStoreConfiguration(); - -const mockedData = [...Array(30)].map((_, idx) => ({ - 'sb-column': `Category ${ - idx < 5 ? '1' : idx < 10 ? '2' : idx < 15 ? '3' : idx < 20 ? '4' : '5' - }`, - 'sb-operation-column': idx * 100 -})); -// store.dispatch( -// cartoSlice.setViewportFeatures({ sourceId: 'sb-data-source', features: mockedData }) -// ); - -const options = { - title: 'Widgets/CategoryWidget', - component: CategoryWidget, - decorators: [ - (Story) => ( - - - - ) - ], - argTypes: { - operation: { - control: { - type: 'select', - options: Object.values(AggregationTypes) - } - } - }, - parameters: { - docs: { - page: () => ( - <> - - <Subtitle /> - <Primary /> - <ArgsTable story={PRIMARY_STORY} /> - <Stories /> - </> - ) - } - } -}; - -// export default options; - -const Template = (args) => <CategoryWidget {...args} />; - -const DEFAULT_PROPS = { - id: 'sb-category-id', - title: 'wrapper title', - dataSource: 'sb-data-source', - column: 'sb-column', - operationColumn: 'sb-operation-column', - operation: 'sum' -}; - -export const Default = Template.bind({}); -Default.args = DEFAULT_PROPS; -Default.parameters = buildReactPropsAsString(DEFAULT_PROPS, 'CategoryWidget'); - -export const WithFormatter = Template.bind({}); -const WithFormatterProps = { ...DEFAULT_PROPS, formatter: (v) => `$${v}` }; -WithFormatter.args = WithFormatterProps; -WithFormatter.parameters = buildReactPropsAsString(WithFormatterProps, 'CategoryWidget'); - -export const WithCustomLabels = Template.bind({}); -const WithCustomLabelsProps = { - ...DEFAULT_PROPS, - labels: { - 'Category 1': 'Cat. 1', - 'Category 2': 'Cat. 2', - 'Category 3': 'Cat. 3', - 'Category 4': 'Cat. 4', - 'Category 5': 'Cat. 5' - } -}; -WithCustomLabels.args = WithCustomLabelsProps; -WithCustomLabels.parameters = buildReactPropsAsString( - WithCustomLabelsProps, - 'CategoryWidget' -); diff --git a/packages/react-ui/storybook/stories/widgets/FormulaWidget.stories.js b/packages/react-ui/storybook/stories/widgets/FormulaWidget.stories.js deleted file mode 100644 index c2f6bd7d1..000000000 --- a/packages/react-ui/storybook/stories/widgets/FormulaWidget.stories.js +++ /dev/null @@ -1,78 +0,0 @@ -import React from 'react'; -import { Provider } from 'react-redux'; -import { - Title, - Subtitle, - Primary, - ArgsTable, - Stories, - PRIMARY_STORY -} from '@storybook/addon-docs'; -import * as cartoSlice from '../../../../react-redux/src/slices/cartoSlice'; -import { AggregationTypes } from '../../../../react-core/src'; -import FormulaWidget from '../../../../react-widgets/src/widgets/FormulaWidget'; -import { mockAppStoreConfiguration } from './utils'; -import { buildReactPropsAsString } from '../../utils/utils'; - -const store = mockAppStoreConfiguration(); - -// store.dispatch( -// cartoSlice.setViewportFeatures({ -// sourceId: 'sb-data-source', -// features: [{ 'sb-column': 5000 }, { 'sb-column': 5000 }] -// }) -// ); - -const options = { - title: 'Widgets/FormulaWidget', - component: FormulaWidget, - decorators: [ - (Story) => ( - <Provider store={store}> - <Story /> - </Provider> - ) - ], - argTypes: { - operation: { - control: { - type: 'select', - options: Object.values(AggregationTypes) - } - } - }, - parameters: { - docs: { - page: () => ( - <> - <Title /> - <Subtitle /> - <Primary /> - <ArgsTable story={PRIMARY_STORY} /> - <Stories /> - </> - ) - } - } -}; - -// export default options; - -const Template = (args) => <FormulaWidget {...args} />; - -const DEFAULT_PROPS = { - id: 'sb-formula-id', - title: 'wrapper title', - dataSource: 'sb-data-source', - column: 'sb-column', - operation: 'sum' -}; - -export const Default = Template.bind({}); -Default.args = DEFAULT_PROPS; -Default.parameters = buildReactPropsAsString(DEFAULT_PROPS, 'FormulaWidget'); - -export const WithFormatter = Template.bind({}); -const WithFormatterProps = { ...DEFAULT_PROPS, formatter: (v) => `$${v}` }; -WithFormatter.args = WithFormatterProps; -WithFormatter.parameters = buildReactPropsAsString(WithFormatterProps, 'FormulaWidget'); diff --git a/packages/react-ui/storybook/stories/widgets/HistogramWidget.stories.js b/packages/react-ui/storybook/stories/widgets/HistogramWidget.stories.js deleted file mode 100644 index 9fd016ec6..000000000 --- a/packages/react-ui/storybook/stories/widgets/HistogramWidget.stories.js +++ /dev/null @@ -1,90 +0,0 @@ -import React from 'react'; -import { Provider } from 'react-redux'; -import { - Title, - Subtitle, - Primary, - ArgsTable, - Stories, - PRIMARY_STORY -} from '@storybook/addon-docs'; -import * as cartoSlice from '../../../../react-redux/src/slices/cartoSlice'; -import { AggregationTypes } from '../../../../react-core/src'; -import HistogramWidget from '../../../../react-widgets/src/widgets/HistogramWidget'; -import { mockAppStoreConfiguration } from './utils'; -import { buildReactPropsAsString } from '../../utils/utils'; - -const store = mockAppStoreConfiguration(); - -const mockedData = [...Array(40)].map((_, idx) => ({ - 'sb-column': idx < 10 ? 100 : idx < 25 ? 200 : idx < 33 ? 300 : idx < 35 ? 400 : 500 -})); -// store.dispatch( -// cartoSlice.setViewportFeatures({ sourceId: 'sb-data-source', features: mockedData }) -// ); - -const options = { - title: 'Widgets/HistogramWidget', - component: HistogramWidget, - decorators: [ - (Story) => ( - <Provider store={store}> - <Story /> - </Provider> - ) - ], - argTypes: { - operation: { - control: { - type: 'select', - options: Object.values(AggregationTypes) - } - } - }, - parameters: { - docs: { - page: () => ( - <> - <Title /> - <Subtitle /> - <Primary /> - <ArgsTable story={PRIMARY_STORY} /> - <Stories /> - </> - ) - } - } -}; - -// export default options; - -const Template = (args) => <HistogramWidget {...args} />; - -const DEFAULT_PROPS = { - id: 'sb-histogram-id', - title: 'wrapper title', - dataSource: 'sb-data-source', - column: 'sb-column', - ticks: [200, 300, 400, 500], - operation: 'count' -}; - -export const Default = Template.bind({}); -Default.args = DEFAULT_PROPS; -Default.parameters = buildReactPropsAsString(DEFAULT_PROPS, 'HistogramWidget'); - -export const xAxisFormatter = Template.bind({}); -const xAxisFormatterProps = { ...DEFAULT_PROPS, xAxisFormatter: (v) => `${v}$` }; -xAxisFormatter.args = xAxisFormatterProps; -xAxisFormatter.parameters = buildReactPropsAsString( - xAxisFormatterProps, - 'HistogramWidget' -); - -export const yAxisFormatter = Template.bind({}); -const yAxisFormatterProps = { ...DEFAULT_PROPS, formatter: (v) => `$${v}` }; -yAxisFormatter.args = yAxisFormatterProps; -yAxisFormatter.parameters = buildReactPropsAsString( - yAxisFormatterProps, - 'HistogramWidget' -); diff --git a/packages/react-ui/storybook/stories/widgets/PieWidget.stories.js b/packages/react-ui/storybook/stories/widgets/PieWidget.stories.js deleted file mode 100644 index b68e8eccc..000000000 --- a/packages/react-ui/storybook/stories/widgets/PieWidget.stories.js +++ /dev/null @@ -1,90 +0,0 @@ -import React from 'react'; -import { Provider } from 'react-redux'; -import { - Title, - Subtitle, - Primary, - ArgsTable, - Stories, - PRIMARY_STORY -} from '@storybook/addon-docs'; -import * as cartoSlice from '../../../../react-redux/src/slices/cartoSlice'; -import { AggregationTypes } from '../../../../react-core/src'; -import PieWidget from '../../../../react-widgets/src/widgets/PieWidget'; -import { mockAppStoreConfiguration } from './utils'; -import { buildReactPropsAsString } from '../../utils/utils'; - -const store = mockAppStoreConfiguration(); - -const mockedData = [...Array(10)].map((_, idx) => ({ - 'sb-column': `Category ${ - idx < 2 ? '1' : idx < 4 ? '2' : idx < 8 ? '3' : idx < 9 ? '4' : '5' - }`, - 'sb-operation-column': idx * 100 -})); -// store.dispatch( -// cartoSlice.setViewportFeatures({ sourceId: 'sb-data-source', features: mockedData }) -// ); - -const options = { - title: 'Widgets/PieWidget', - component: PieWidget, - decorators: [ - (Story) => ( - <Provider store={store}> - <Story /> - </Provider> - ) - ], - argTypes: { - operation: { - control: { - type: 'select', - options: Object.values(AggregationTypes) - } - } - }, - parameters: { - docs: { - page: () => ( - <> - <Title /> - <Subtitle /> - <Primary /> - <ArgsTable story={PRIMARY_STORY} /> - <Stories /> - </> - ) - } - } -}; - -// export default options; - -const Template = (args) => <PieWidget {...args} />; - -const DEFAULT_PROPS = { - id: 'sb-pie-id', - title: 'wrapper title', - dataSource: 'sb-data-source', - column: 'sb-column', - operationColumn: 'sb-operation-column', - operation: 'sum' -}; - -export const Default = Template.bind({}); -Default.args = DEFAULT_PROPS; -Default.parameters = buildReactPropsAsString(DEFAULT_PROPS, 'PieWidget'); - -export const WithFormatter = Template.bind({}); -const WithFormatterProps = { ...DEFAULT_PROPS, formatter: (v) => `$${v}` }; -WithFormatter.args = WithFormatterProps; -WithFormatter.parameters = buildReactPropsAsString(WithFormatterProps, 'PieWidget'); - -export const TooltipFormatter = Template.bind({}); -const TooltipFormatterProps = { - ...DEFAULT_PROPS, - tooltipFormatter: (params) => `That's a custom tooltip for: ${params.name}` -}; -TooltipFormatter.args = TooltipFormatterProps; -TooltipFormatter.parameters = buildReactPropsAsString(TooltipFormatterProps, 'PieWidget'); diff --git a/packages/react-ui/storybook/stories/widgets/ScatterPlotWidget.stories.js b/packages/react-ui/storybook/stories/widgets/ScatterPlotWidget.stories.js deleted file mode 100644 index 02eb25b70..000000000 --- a/packages/react-ui/storybook/stories/widgets/ScatterPlotWidget.stories.js +++ /dev/null @@ -1,94 +0,0 @@ -import React from 'react'; -import { Provider } from 'react-redux'; -import { - Title, - Subtitle, - Primary, - ArgsTable, - Stories, - PRIMARY_STORY -} from '@storybook/addon-docs'; -import * as cartoSlice from '@carto/react-redux/src/slices/cartoSlice'; -import ScatterPlotWidget from '../../../../react-widgets/src/widgets/ScatterPlotWidget'; -import { mockAppStoreConfiguration } from './utils'; -import { buildReactPropsAsString } from '../../utils/utils'; - -const store = mockAppStoreConfiguration(); - -// store.dispatch( -// cartoSlice.setViewportFeatures({ -// sourceId: 'sb-data-source', -// features: [ -// { 'sb-x-column': 5000, 'sb-y-column': 3000 }, -// { 'sb-x-column': 2000, 'sb-y-column': 1000 } -// ] -// }) -// ); - -const options = { - title: 'Widgets/ScatterPlotWidget', - component: ScatterPlotWidget, - decorators: [ - (Story) => ( - <Provider store={store}> - <Story /> - </Provider> - ) - ], - parameters: { - docs: { - page: () => ( - <> - <Title /> - <Subtitle /> - <Primary /> - <ArgsTable story={PRIMARY_STORY} /> - <Stories /> - </> - ) - } - } -}; - -// export default options; - -const Template = (args) => <ScatterPlotWidget {...args} />; - -const DEFAULT_PROPS = { - id: 'sb-scatter-id', - title: 'wrapper title', - dataSource: 'sb-data-source', - xAxisColumn: 'sb-x-column', - yAxisColumn: 'sb-y-column' -}; - -export const Default = Template.bind({}); -Default.args = DEFAULT_PROPS; -Default.parameters = buildReactPropsAsString(DEFAULT_PROPS, 'ScatterPlotWidget'); - -export const xAxisFormatter = Template.bind({}); -const xAxisFormatterProps = { ...DEFAULT_PROPS, xAxisFormatter: (v) => `${v}$` }; -xAxisFormatter.args = xAxisFormatterProps; -xAxisFormatter.parameters = buildReactPropsAsString( - xAxisFormatterProps, - 'ScatterPlotWidget' -); - -export const yAxisFormatter = Template.bind({}); -const yAxisFormatterProps = { ...DEFAULT_PROPS, yAxisFormatter: (v) => `$${v}` }; -yAxisFormatter.args = yAxisFormatterProps; -yAxisFormatter.parameters = buildReactPropsAsString( - yAxisFormatterProps, - 'ScatterPlotWidget' -); - -export const tooltipFormatter = Template.bind({}); -const tooltipFormatterProps = { - ...DEFAULT_PROPS, - tooltipFormatter: (v) => `Price: $ ${v.value[0]}` -}; -tooltipFormatter.args = tooltipFormatterProps; -tooltipFormatter.parameters = buildReactPropsAsString( - tooltipFormatterProps, - 'ScatterPlotWidget' -); diff --git a/packages/react-widgets/__tests__/models/CategoryModel.test.js b/packages/react-widgets/__tests__/models/CategoryModel.test.js index 42d4ebbdb..14dc44ef2 100644 --- a/packages/react-widgets/__tests__/models/CategoryModel.test.js +++ b/packages/react-widgets/__tests__/models/CategoryModel.test.js @@ -10,6 +10,7 @@ const RESULT = [ const mockedExecuteModel = jest.fn(); jest.mock('@carto/react-api', () => ({ + ...jest.requireActual('@carto/react-api'), _executeModel: (props) => { mockedExecuteModel(props); return Promise.resolve({ rows: RESULT }); diff --git a/packages/react-widgets/__tests__/models/FormulaModel.test.js b/packages/react-widgets/__tests__/models/FormulaModel.test.js index c0225bfd9..fff958180 100644 --- a/packages/react-widgets/__tests__/models/FormulaModel.test.js +++ b/packages/react-widgets/__tests__/models/FormulaModel.test.js @@ -7,6 +7,7 @@ const RESULT = 3.14; const mockedExecuteModel = jest.fn(); jest.mock('@carto/react-api', () => ({ + ...jest.requireActual('@carto/react-api'), _executeModel: (props) => { mockedExecuteModel(props); return Promise.resolve({ rows: [{ VALUE: RESULT }] }); diff --git a/packages/react-widgets/__tests__/models/GeocodingModel.test.js b/packages/react-widgets/__tests__/models/GeocodingModel.test.js index c567851fc..0478999b5 100644 --- a/packages/react-widgets/__tests__/models/GeocodingModel.test.js +++ b/packages/react-widgets/__tests__/models/GeocodingModel.test.js @@ -1,6 +1,5 @@ import { geocodeStreetPoint } from '../../src/models/GeocodingModel'; -import { API_VERSIONS } from '@deck.gl/carto'; -import { ldsGeocode, executeSQL } from '@carto/react-api/'; +import { ldsGeocode, executeSQL, API_VERSIONS } from '@carto/react-api/'; const sampleCredentialsV2 = { apiVersion: API_VERSIONS.V2 @@ -17,6 +16,7 @@ const bostonCoordinates = { }; jest.mock('@carto/react-api', () => ({ + ...jest.requireActual('@carto/react-api'), executeSQL: jest.fn().mockImplementation(async () => global.executeSqlMockResult), ldsGeocode: jest.fn().mockImplementation(async () => global.ldsGeocodeMockResult) })); diff --git a/packages/react-widgets/__tests__/models/HistogramModel.test.js b/packages/react-widgets/__tests__/models/HistogramModel.test.js index 2aa95e6e5..95ad036f0 100644 --- a/packages/react-widgets/__tests__/models/HistogramModel.test.js +++ b/packages/react-widgets/__tests__/models/HistogramModel.test.js @@ -14,6 +14,7 @@ const MOCK_SQL_RESPONSE = Array(TICKS.length) const mockedExecuteModel = jest.fn(); jest.mock('@carto/react-api', () => ({ + ...jest.requireActual('@carto/react-api'), _executeModel: (props) => { mockedExecuteModel(props); return Promise.resolve({ rows: MOCK_SQL_RESPONSE }); diff --git a/packages/react-widgets/__tests__/models/RangeModel.test.js b/packages/react-widgets/__tests__/models/RangeModel.test.js index f1e14c08d..ed4b8f18b 100644 --- a/packages/react-widgets/__tests__/models/RangeModel.test.js +++ b/packages/react-widgets/__tests__/models/RangeModel.test.js @@ -6,6 +6,7 @@ const RESULT = { min: 0, max: 100 }; const mockedExecuteModel = jest.fn(); jest.mock('@carto/react-api', () => ({ + ...jest.requireActual('@carto/react-api'), _executeModel: (props) => { mockedExecuteModel(props); return Promise.resolve({ rows: [RESULT] }); diff --git a/packages/react-widgets/__tests__/models/TableModel.test.js b/packages/react-widgets/__tests__/models/TableModel.test.js index 541e1df01..b6aa09a0a 100644 --- a/packages/react-widgets/__tests__/models/TableModel.test.js +++ b/packages/react-widgets/__tests__/models/TableModel.test.js @@ -17,6 +17,7 @@ const RESULT = { const mockedExecuteModel = jest.fn(); jest.mock('@carto/react-api', () => ({ + ...jest.requireActual('@carto/react-api'), _executeModel: (props) => { mockedExecuteModel(props); return Promise.resolve(RESULT); diff --git a/packages/react-widgets/__tests__/models/TimeSeriesModel.test.js b/packages/react-widgets/__tests__/models/TimeSeriesModel.test.js index 74869878c..1bd0b7333 100644 --- a/packages/react-widgets/__tests__/models/TimeSeriesModel.test.js +++ b/packages/react-widgets/__tests__/models/TimeSeriesModel.test.js @@ -13,6 +13,7 @@ const MOCK_API_RESULT = { const mockedExecuteModel = jest.fn(); jest.mock('@carto/react-api', () => ({ + ...jest.requireActual('@carto/react-api'), _executeModel: (props) => { mockedExecuteModel(props); return Promise.resolve(MOCK_API_RESULT); diff --git a/packages/react-widgets/__tests__/models/fqn.test.js b/packages/react-widgets/__tests__/models/fqn.test.js new file mode 100644 index 000000000..4dce01cec --- /dev/null +++ b/packages/react-widgets/__tests__/models/fqn.test.js @@ -0,0 +1,1668 @@ +import { Provider } from '@carto/react-core'; +import { FullyQualifiedName, ParsingMode } from '../../src/models/fqn'; + +describe('FQN', () => { + describe('for BigQuery', () => { + test.each([ + [ + 'project.dataset.table', + { unquoted: ['project', 'dataset', 'table'], quoted: [null, null, null] }, + '`project.dataset.table`' + ], + [ + '`project.dataset.table`', + { unquoted: ['project', 'dataset', 'table'], quoted: [null, null, null] }, + '`project.dataset.table`' + ], + [ + '`project`.`dataset`.`table`', + { + unquoted: ['project', 'dataset', 'table'], + quoted: ['`project`', '`dataset`', '`table`'] + }, + '`project.dataset.table`' + ], + [ + 'pro_ject.da-taset.tab le', + { + unquoted: ['pro_ject', 'da-taset', 'tab le'], + quoted: [null, '`da-taset`', '`tab le`'] + }, + '`pro_ject.da-taset.tab le`' + ], + [ + 'dataset.table', + { unquoted: [null, 'dataset', 'table'], quoted: [null, null, null] }, + '`dataset.table`' + ], + ['table', { unquoted: ['', '', 'table'], quoted: [null, null, null] }, '`table`'], + ['`table`', { unquoted: ['', '', 'table'], quoted: [null, null, null] }, '`table`'], + [ + '`weird table-name`', + { + unquoted: ['', '', 'weird table-name'], + quoted: [null, null, '`weird table-name`'] + }, + '`weird table-name`' + ], + [ + '`dataset.weird-table name`', + { + unquoted: ['', 'dataset', 'weird-table name'], + quoted: [null, null, '`weird-table name`'] + }, + '`dataset.weird-table name`' + ], + [ + 'project.dataset.`table with spaces`', + { + unquoted: ['project', 'dataset', 'table with spaces'], + quoted: [null, null, '`table with spaces`'] + }, + '`project.dataset.table with spaces`' + ], + [ + '`project.dataset.`table double escaped``', + { + unquoted: ['project', 'dataset', 'table double escaped'], + quoted: [null, null, '`table double escaped`'] + }, + '`project.dataset.table double escaped`' + ], + [ + '`project.dataset.table half escaped', + { + unquoted: ['project', 'dataset', 'table half escaped'], + quoted: [null, null, '`table half escaped`'] + }, + '`project.dataset.table half escaped`' + ], + [ + 'project.dataset.42name', + { unquoted: ['project', 'dataset', '42name'], quoted: [null, null, '`42name`'] }, + '`project.dataset.42name`' + ] + ])( + 'should parse %p correctly', + ( + fqn, + { + unquoted: [databaseName, schemaName, objectName], + quoted: [quotedDatabaseName, quotedSchemaName, quotedObjectName] + }, + expectedFqn + ) => { + const fqnObj = new FullyQualifiedName(fqn, Provider.BigQuery); + + expect(fqnObj.getObjectName()).toEqual(objectName); + expect(fqnObj.getObjectName({ quoted: true })).toEqual( + quotedObjectName || objectName + ); + + if (schemaName) { + expect(fqnObj.getSchemaName()).toEqual(schemaName); + expect(fqnObj.getSchemaName({ quoted: true })).toEqual( + quotedSchemaName || schemaName + ); + } + + if (databaseName) { + expect(fqnObj.getDatabaseName()).toEqual(databaseName); + expect(fqnObj.getDatabaseName({ quoted: true })).toEqual( + quotedDatabaseName || databaseName + ); + } + + expect(fqnObj.toString()).toEqual(expectedFqn); + } + ); + + test.each([ + ['project.dataset', 'project', 'dataset', '', '`project.dataset`'], + ['project', 'project', '', '', '`project`'], + [ + 'project.dataset.`table with spaces`', + 'project', + 'dataset', + 'table with spaces', + '`project.dataset.table with spaces`' + ] + ])( + 'should parse %p correctly in left to right parsing mode', + (fqn, databaseName, schemaName, objectName, expectedFqn) => { + const fqnObj = new FullyQualifiedName( + fqn, + Provider.BigQuery, + ParsingMode.LeftToRight + ); + expect(fqnObj.getDatabaseName()).toEqual(databaseName); + if (schemaName) { + expect(fqnObj.getSchemaName()).toEqual(schemaName); + } + if (objectName) { + expect(fqnObj.getObjectName()).toEqual(objectName); + } + expect(fqnObj.toString()).toEqual(expectedFqn); + } + ); + + test.each([ + ['project.dataset.table.extra'], + ['pro`ject.dataset.table'], + ['`project.da``taset.table`'], + ['dataset..table'], + ['.dataset.table'], + ['dataset.table.'], + ['Project.dataset.table'] + ])('should throw an error for %p fqn', (invalidFqn) => { + expect(() => new FullyQualifiedName(invalidFqn, Provider.BigQuery)).toThrowError(); + }); + + test('should set project / dataset name correctly for an incomplete FQN', () => { + const fqnObj = new FullyQualifiedName('dataset.table', Provider.BigQuery); + fqnObj.setDatabaseName('project'); + fqnObj.setSchemaName('my_dataset'); + expect(fqnObj.getDatabaseName()).toEqual('project'); + expect(fqnObj.getSchemaName()).toEqual('my_dataset'); + expect(fqnObj.getObjectName()).toEqual('table'); + expect(fqnObj.toString()).toEqual('`project.my_dataset.table`'); + }); + + test.each([ + ['project.dataset.table', 'suffix', 'table_suffix', 'table_suffix'], + ['project.dataset.my-table', 'suffix', '`my-table_suffix`', 'my-table_suffix'], + ['project.dataset.`table`', 'my-suffix', '`table_my-suffix`', 'table_my-suffix'] + ])( + 'should get object name correctly from %p with suffix %p', + (fqn, suffix, quotedName, unquotedName) => { + const fqnObj = new FullyQualifiedName(fqn, Provider.BigQuery); + expect(fqnObj.getObjectName({ quoted: true, suffix: suffix })).toEqual( + quotedName + ); + expect(fqnObj.getObjectName({ quoted: false, suffix: suffix })).toEqual( + unquotedName + ); + } + ); + + test('should throw an error if we try to set the a project name with uppercase letters', () => { + const fqnObj = new FullyQualifiedName('dataset.table', Provider.BigQuery); + expect(() => fqnObj.setDatabaseName('Project')).toThrowError(); + }); + + describe('isValid', () => { + test.each([ + ['a.b.c.d'], + ['a.b..c'], + ['a..b.c'], + ['a.b.c.'], + ['.a.b.c'], + ['.a.b.c.'], + ['a..b'], + ['.a.b'], + ['a.b.'], + ['a.'], + ['.a'], + ['`a.b.c.d`'], + ['a.b..`c`'], + ['`a..b.c`'], + ['`a..b`'] + ])('should never accept %p', (fqn) => { + expect( + FullyQualifiedName.isValid(fqn, Provider.BigQuery, { + parsingMode: ParsingMode.RightToLeft, + quoted: false + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.BigQuery, { + parsingMode: ParsingMode.RightToLeft, + quoted: true + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.BigQuery, { + parsingMode: ParsingMode.LeftToRight, + quoted: false + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.BigQuery, { + parsingMode: ParsingMode.LeftToRight, + quoted: true + }) + ).toEqual(false); + }); + + test.each([ + ['my project.dataset.table'], + ['project.my dataset.table'], + ['project.dataset.my table'], + ['`project`.`dataset`.my table'], + ['my dataset.table'], + ['dataset.my table'], + ['`my dataset`.my table'], + ['my table'] + ])('should should only accept quoted %p', (fqn) => { + expect( + FullyQualifiedName.isValid(fqn, Provider.BigQuery, { + parsingMode: ParsingMode.RightToLeft, + quoted: false + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.BigQuery, { + parsingMode: ParsingMode.RightToLeft, + quoted: true + }) + ).toEqual(true); + expect( + FullyQualifiedName.isValid(fqn, Provider.BigQuery, { + parsingMode: ParsingMode.LeftToRight, + quoted: false + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.BigQuery, { + parsingMode: ParsingMode.LeftToRight, + quoted: true + }) + ).toEqual(true); + }); + + test.each([ + ['project.dataset.table'], + ['dataset.table'], + ['table'], + ['my-project.dataset.table'], + ['`a project`.dataset.table'], + ['`a project.dataset.table`'], + ['`a project.a dataset.a table`'], + ['`a project`.`a dataset`.`a table`'], + ['dataset.`a table`'], + ['`a dataset`.`a table`'], + ['`a table`'] + ])('should always accept %p', (fqn) => { + expect( + FullyQualifiedName.isValid(fqn, Provider.BigQuery, { + parsingMode: ParsingMode.RightToLeft, + quoted: false + }) + ).toEqual(true); + expect( + FullyQualifiedName.isValid(fqn, Provider.BigQuery, { + parsingMode: ParsingMode.RightToLeft, + quoted: true + }) + ).toEqual(true); + expect( + FullyQualifiedName.isValid(fqn, Provider.BigQuery, { + parsingMode: ParsingMode.LeftToRight, + quoted: false + }) + ).toEqual(true); + expect( + FullyQualifiedName.isValid(fqn, Provider.BigQuery, { + parsingMode: ParsingMode.LeftToRight, + quoted: true + }) + ).toEqual(true); + }); + }); + }); + + describe('for PostgreSQL', () => { + test.each([ + [ + 'database.schema.table', + { unquoted: ['database', 'schema', 'table'], quoted: [null, null, null] }, + 'database.schema.table' + ], + [ + 'database."schema".table', + { unquoted: ['database', 'schema', 'table'], quoted: [null, '"schema"', null] }, + 'database."schema".table' + ], + [ + 'database."schema"."table"', + { + unquoted: ['database', 'schema', 'table'], + quoted: [null, '"schema"', '"table"'] + }, + 'database."schema"."table"' + ], + [ + '"database.schema.table"', + { + unquoted: ['', '', 'database.schema.table'], + quoted: [null, null, '"database.schema.table"'] + }, + '"database.schema.table"' + ], + [ + 'database.schema."table WITH spaces"', + { + unquoted: ['database', 'schema', 'table WITH spaces'], + quoted: [null, null, '"table WITH spaces"'] + }, + 'database.schema."table WITH spaces"' + ], + [ + 'database.schema.TableWithCaps', + { + unquoted: ['database', 'schema', 'tablewithcaps'], + quoted: [null, null, 'TableWithCaps'] + }, + 'database.schema.TableWithCaps' + ], + [ + 'database.schema.table-WITH-dashes', + { + unquoted: ['database', 'schema', 'table-WITH-dashes'], + quoted: [null, null, '"table-WITH-dashes"'] + }, + 'database.schema."table-WITH-dashes"' + ], + [ + 'database.schema."tableWith weird-FQN"', + { + unquoted: ['database', 'schema', 'tableWith weird-FQN'], + quoted: [null, null, '"tableWith weird-FQN"'] + }, + 'database.schema."tableWith weird-FQN"' + ], + [ + 'database."schema"."ta""bl""e"', + { + unquoted: ['database', 'schema', 'ta"bl"e'], + quoted: [null, '"schema"', '"ta""bl""e"'] + }, + 'database."schema"."ta""bl""e"' + ], + [ + 'database.schema.42name', + { unquoted: ['database', 'schema', '42name'], quoted: [null, null, '"42name"'] }, + 'database.schema."42name"' + ] + ])( + 'should parse %p correctly', + ( + fqn, + { + unquoted: [databaseName, schemaName, objectName], + quoted: [quotedDatabaseName, quotedSchemaName, quotedObjectName] + }, + expectedFqn + ) => { + const fqnObj = new FullyQualifiedName(fqn, Provider.Postgres); + + expect(fqnObj.getObjectName()).toEqual(objectName); + expect(fqnObj.getObjectName({ quoted: true })).toEqual( + quotedObjectName || objectName + ); + + if (schemaName) { + expect(fqnObj.getSchemaName()).toEqual(schemaName); + expect(fqnObj.getSchemaName({ quoted: true })).toEqual( + quotedSchemaName || schemaName + ); + } + + if (databaseName) { + expect(fqnObj.getDatabaseName()).toEqual(databaseName); + expect(fqnObj.getDatabaseName({ quoted: true })).toEqual( + quotedDatabaseName || databaseName + ); + } + + expect(fqnObj.toString()).toEqual(expectedFqn); + } + ); + + test.each([ + ['project.dataset', 'project', 'dataset', '', 'project.dataset'], + ['project', 'project', '', '', 'project'], + [ + 'project.dataset.table with spaces', + 'project', + 'dataset', + 'table with spaces', + 'project.dataset."table with spaces"' + ] + ])( + 'should parse %p correctly in left to right parsing mode', + (fqn, databaseName, schemaName, objectName, expectedFqn) => { + const fqnObj = new FullyQualifiedName( + fqn, + Provider.Postgres, + ParsingMode.LeftToRight + ); + expect(fqnObj.getDatabaseName()).toEqual(databaseName); + if (schemaName) { + expect(fqnObj.getSchemaName()).toEqual(schemaName); + } + if (objectName) { + expect(fqnObj.getObjectName()).toEqual(objectName); + } + expect(fqnObj.toString()).toEqual(expectedFqn); + } + ); + + test.each([ + ['project.dataset.table.extra'], + ['project.data"set.table'], + ['schema..table'], + ['.schema.table'], + ['schema.table.'] + ])('should throw an error for %p fqn', (invalidFqn) => { + expect(() => new FullyQualifiedName(invalidFqn, Provider.Postgres)).toThrowError(); + }); + + test('should set database / schema name correctly for an incomplete FQN', () => { + const fqnObj = new FullyQualifiedName('schema.table', Provider.Postgres); + fqnObj.setDatabaseName('DAT_A-base'); + fqnObj.setSchemaName('MY_SCHEMA'); + expect(fqnObj.getDatabaseName()).toEqual('DAT_A-base'); + expect(fqnObj.getSchemaName()).toEqual('MY_SCHEMA'); + expect(fqnObj.getObjectName()).toEqual('table'); + expect(fqnObj.toString()).toEqual('"DAT_A-base"."MY_SCHEMA".table'); + fqnObj.setSchemaName('my_schema'); + expect(fqnObj.getSchemaName()).toEqual('my_schema'); + expect(fqnObj.toString()).toEqual('"DAT_A-base".my_schema.table'); + }); + + test.each([ + ['project.dataset.table', 'suffix', 'table_suffix', 'table_suffix'], + ['project.dataset.my-table', 'suffix', '"my-table_suffix"', 'my-table_suffix'], + ['project.dataset.table', 'my-suffix', '"table_my-suffix"', 'table_my-suffix'], + ['project.dataset."my""Table"', 'suffix', '"my""Table_suffix"', 'my"Table_suffix'] + ])( + 'should get object name correctly from %p with suffix %p', + (fqn, suffix, quotedName, unquotedName) => { + const fqnObj = new FullyQualifiedName(fqn, Provider.Postgres); + expect(fqnObj.getObjectName({ quoted: true, suffix: suffix })).toEqual( + quotedName + ); + expect(fqnObj.getObjectName({ quoted: false, suffix: suffix })).toEqual( + unquotedName + ); + } + ); + + test('should set object name correctly when it should be escaped', () => { + const fqnObj = new FullyQualifiedName( + 'database.schema', + Provider.Postgres, + ParsingMode.LeftToRight + ); + fqnObj.setObjectName('ta ".ble name'); + expect(fqnObj.getObjectName()).toEqual('ta ".ble name'); + expect(fqnObj.toString()).toEqual('database.schema."ta "".ble name"'); + }); + + describe('isValid', () => { + test.each([ + ['a.b.c.d'], + ['a.b..c'], + ['a..b.c'], + ['a.b.c.'], + ['.a.b.c'], + ['.a.b.c.'], + ['a..b'], + ['.a.b'], + ['a.b.'], + ['a.'], + ['.a'], + ['"a"."b"."c"."d"'], + ['a.b.."c"'], + ['"a".."b"."c"'], + ['"a".."b"'] + ])('should never accept %p', (fqn) => { + expect( + FullyQualifiedName.isValid(fqn, Provider.Postgres, { + parsingMode: ParsingMode.RightToLeft, + quoted: false + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.Postgres, { + parsingMode: ParsingMode.RightToLeft, + quoted: true + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.Postgres, { + parsingMode: ParsingMode.LeftToRight, + quoted: false + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.Postgres, { + parsingMode: ParsingMode.LeftToRight, + quoted: true + }) + ).toEqual(false); + }); + + test.each([ + ['my database.schema.table'], + ['database.my schema.table'], + ['database.schema.my table'], + ['"database"."schema".my table'], + ['my schema.table'], + ['schema.my table'], + ['"my schema".my table'], + ['my table'] + ])('should should only accept quoted %p', (fqn) => { + expect( + FullyQualifiedName.isValid(fqn, Provider.Postgres, { + parsingMode: ParsingMode.RightToLeft, + quoted: false + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.Postgres, { + parsingMode: ParsingMode.RightToLeft, + quoted: true + }) + ).toEqual(true); + expect( + FullyQualifiedName.isValid(fqn, Provider.Postgres, { + parsingMode: ParsingMode.LeftToRight, + quoted: false + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.Postgres, { + parsingMode: ParsingMode.LeftToRight, + quoted: true + }) + ).toEqual(true); + }); + + test.each([ + ['database.schema.table'], + ['"a database".schema.table'], + ['"a database"."a schema"."a table"'], + ['database."a table"'], + ['"a database"."a table"'], + ['"a table"'] + ])('should always accept %p', (fqn) => { + expect( + FullyQualifiedName.isValid(fqn, Provider.Postgres, { + parsingMode: ParsingMode.RightToLeft, + quoted: false + }) + ).toEqual(true); + expect( + FullyQualifiedName.isValid(fqn, Provider.Postgres, { + parsingMode: ParsingMode.RightToLeft, + quoted: true + }) + ).toEqual(true); + expect( + FullyQualifiedName.isValid(fqn, Provider.Postgres, { + parsingMode: ParsingMode.LeftToRight, + quoted: false + }) + ).toEqual(true); + expect( + FullyQualifiedName.isValid(fqn, Provider.Postgres, { + parsingMode: ParsingMode.LeftToRight, + quoted: true + }) + ).toEqual(true); + }); + }); + }); + + describe('for Snowflake', () => { + test.each([ + [ + 'database.schema.table', + { + unquoted: ['DATABASE', 'SCHEMA', 'TABLE'], + quoted: ['database', 'schema', 'table'] + }, + 'database.schema.table' + ], + [ + 'DATABASE.schema.table', + { + unquoted: ['DATABASE', 'SCHEMA', 'TABLE'], + quoted: ['DATABASE', 'schema', 'table'] + }, + 'DATABASE.schema.table' + ], + [ + 'DAT_abase.SCHE_ma.TAB le', + { + unquoted: ['DAT_ABASE', 'SCHE_MA', 'TAB le'], + quoted: ['DAT_abase', 'SCHE_ma', '"TAB le"'] + }, + 'DAT_abase.SCHE_ma."TAB le"' + ], + [ + 'schema.table', + { unquoted: ['', 'SCHEMA', 'TABLE'], quoted: [null, 'schema', 'table'] }, + 'schema.table' + ], + ['table', { unquoted: ['', '', 'TABLE'], quoted: [null, null, 'table'] }, 'table'], + [ + '"table"', + { unquoted: ['', '', 'table'], quoted: [null, null, '"table"'] }, + '"table"' + ], + [ + '"weird table-name"', + { + unquoted: ['', '', 'weird table-name'], + quoted: [null, null, '"weird table-name"'] + }, + '"weird table-name"' + ], + [ + 'schema."weird-table name"', + { + unquoted: ['', 'SCHEMA', 'weird-table name'], + quoted: [null, 'schema', '"weird-table name"'] + }, + 'schema."weird-table name"' + ], + [ + 'database.my@schema.my@table', + { + unquoted: ['DATABASE', 'my@schema', 'my@table'], + quoted: ['database', '"my@schema"', '"my@table"'] + }, + 'database."my@schema"."my@table"' + ], + [ + 'database."schema"."ta""bl""e"', + { + unquoted: ['DATABASE', 'schema', 'ta"bl"e'], + quoted: ['database', '"schema"', '"ta""bl""e"'] + }, + 'database."schema"."ta""bl""e"' + ], + [ + 'database.schema.42name', + { + unquoted: ['DATABASE', 'SCHEMA', '42name'], + quoted: ['database', 'schema', '"42name"'] + }, + 'database.schema."42name"' + ] + ])( + 'should parse %p correctly', + ( + fqn, + { + unquoted: [databaseName, schemaName, objectName], + quoted: [quotedDatabaseName, quotedSchemaName, quotedObjectName] + }, + expectedFqn + ) => { + const fqnObj = new FullyQualifiedName(fqn, Provider.Snowflake); + + expect(fqnObj.getObjectName()).toEqual(objectName); + expect(fqnObj.getObjectName({ quoted: true })).toEqual( + quotedObjectName || objectName + ); + + if (schemaName) { + expect(fqnObj.getSchemaName()).toEqual(schemaName); + expect(fqnObj.getSchemaName({ quoted: true })).toEqual( + quotedSchemaName || schemaName + ); + } + + if (databaseName) { + expect(fqnObj.getDatabaseName()).toEqual(databaseName); + expect(fqnObj.getDatabaseName({ quoted: true })).toEqual( + quotedDatabaseName || databaseName + ); + } + + expect(fqnObj.toString()).toEqual(expectedFqn); + } + ); + + test.each([ + ['project.dataset', 'PROJECT', 'DATASET', '', 'project.dataset'], + ['project', 'PROJECT', '', '', 'project'], + [ + 'project.dataset.table with spaces', + 'PROJECT', + 'DATASET', + 'table with spaces', + 'project.dataset."table with spaces"' + ] + ])( + 'should parse %p correctly in left to right parsing mode', + (fqn, databaseName, schemaName, objectName, expectedFqn) => { + const fqnObj = new FullyQualifiedName( + fqn, + Provider.Snowflake, + ParsingMode.LeftToRight + ); + expect(fqnObj.getDatabaseName()).toEqual(databaseName); + if (schemaName) { + expect(fqnObj.getSchemaName()).toEqual(schemaName); + } + if (objectName) { + expect(fqnObj.getObjectName()).toEqual(objectName); + } + expect(fqnObj.toString()).toEqual(expectedFqn); + } + ); + + test.each([ + ['database.schema.table.extra'], + ['schema..table'], + ['.schema.table'], + ['schema.table.'] + ])('should throw an error for %p fqn', (invalidFqn) => { + expect(() => new FullyQualifiedName(invalidFqn, Provider.Snowflake)).toThrowError(); + }); + + test('should set database / schema name correctly for an incomplete FQN', () => { + const fqnObj = new FullyQualifiedName('schema.table', Provider.Snowflake); + fqnObj.setDatabaseName('DAT_A-base'); + fqnObj.setSchemaName('my_schema'); + expect(fqnObj.getDatabaseName()).toEqual('DAT_A-base'); + expect(fqnObj.getSchemaName()).toEqual('my_schema'); + expect(fqnObj.getObjectName()).toEqual('TABLE'); + expect(fqnObj.toString()).toEqual('"DAT_A-base"."my_schema".table'); + fqnObj.setSchemaName('MY_SCHEMA'); + expect(fqnObj.getSchemaName()).toEqual('MY_SCHEMA'); + expect(fqnObj.toString()).toEqual('"DAT_A-base".MY_SCHEMA.table'); + }); + + test.each([ + ['project.dataset.table', 'suffix', 'table_suffix', 'TABLE_SUFFIX'], + ['project.dataset.my-table', 'suffix', '"my-table_suffix"', 'my-table_suffix'], + ['project.dataset.table', 'my-suffix', '"table_my-suffix"', 'table_my-suffix'], + ['project.dataset."my""Table"', 'suffix', '"my""Table_suffix"', 'my"Table_suffix'] + ])( + 'should get object name correctly from %p with suffix %p', + (fqn, suffix, quotedName, unquotedName) => { + const fqnObj = new FullyQualifiedName(fqn, Provider.Snowflake); + expect(fqnObj.getObjectName({ quoted: true, suffix: suffix })).toEqual( + quotedName + ); + expect(fqnObj.getObjectName({ quoted: false, suffix: suffix })).toEqual( + unquotedName + ); + } + ); + + test('should set object name correctly when it should be escaped', () => { + const fqnObj = new FullyQualifiedName( + 'database.schema', + Provider.Snowflake, + ParsingMode.LeftToRight + ); + fqnObj.setObjectName('ta ".ble name'); + expect(fqnObj.getObjectName()).toEqual('ta ".ble name'); + expect(fqnObj.toString()).toEqual('database.schema."ta "".ble name"'); + }); + + describe('isValid', () => { + test.each([ + ['a.b.c.d'], + ['a.b..c'], + ['a..b.c'], + ['a.b.c.'], + ['.a.b.c'], + ['.a.b.c.'], + ['a..b'], + ['.a.b'], + ['a.b.'], + ['a.'], + ['.a'], + ['"a"."b"."c"."d"'], + ['a.b.."c"'], + ['"a".."b"."c"'], + ['"a".."b"'] + ])('should never accept %p', (fqn) => { + expect( + FullyQualifiedName.isValid(fqn, Provider.Snowflake, { + parsingMode: ParsingMode.RightToLeft, + quoted: false + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.Snowflake, { + parsingMode: ParsingMode.RightToLeft, + quoted: true + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.Snowflake, { + parsingMode: ParsingMode.LeftToRight, + quoted: false + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.Snowflake, { + parsingMode: ParsingMode.LeftToRight, + quoted: true + }) + ).toEqual(false); + }); + + test.each([ + ['my database.schema.table'], + ['database.my schema.table'], + ['database.schema.my table'], + ['"database"."schema".my table'], + ['my schema.table'], + ['schema.my table'], + ['"my schema".my table'], + ['my table'] + ])('should should only accept quoted %p', (fqn) => { + expect( + FullyQualifiedName.isValid(fqn, Provider.Snowflake, { + parsingMode: ParsingMode.RightToLeft, + quoted: false + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.Snowflake, { + parsingMode: ParsingMode.RightToLeft, + quoted: true + }) + ).toEqual(true); + expect( + FullyQualifiedName.isValid(fqn, Provider.Snowflake, { + parsingMode: ParsingMode.LeftToRight, + quoted: false + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.Snowflake, { + parsingMode: ParsingMode.LeftToRight, + quoted: true + }) + ).toEqual(true); + }); + + test.each([ + ['database.schema.table'], + ['"a database".schema.table'], + ['"a database"."a schema"."a table"'], + ['database."a table"'], + ['"a database"."a table"'], + ['"a table"'] + ])('should always accept %p', (fqn) => { + expect( + FullyQualifiedName.isValid(fqn, Provider.Snowflake, { + parsingMode: ParsingMode.RightToLeft, + quoted: false + }) + ).toEqual(true); + expect( + FullyQualifiedName.isValid(fqn, Provider.Snowflake, { + parsingMode: ParsingMode.RightToLeft, + quoted: true + }) + ).toEqual(true); + expect( + FullyQualifiedName.isValid(fqn, Provider.Snowflake, { + parsingMode: ParsingMode.LeftToRight, + quoted: false + }) + ).toEqual(true); + expect( + FullyQualifiedName.isValid(fqn, Provider.Snowflake, { + parsingMode: ParsingMode.LeftToRight, + quoted: true + }) + ).toEqual(true); + }); + }); + }); + + describe('for Redshift', () => { + test.each([ + [ + 'database.schema.table', + { unquoted: ['database', 'schema', 'table'], quoted: [null, null, null] }, + 'database.schema.table' + ], + [ + 'database."schema".table', + { unquoted: ['database', 'schema', 'table'], quoted: [null, '"schema"', null] }, + 'database."schema".table' + ], + [ + 'database."schema"."table"', + { + unquoted: ['database', 'schema', 'table'], + quoted: [null, '"schema"', '"table"'] + }, + 'database."schema"."table"' + ], + [ + '"database.schema.table"', + { + unquoted: ['', '', 'database.schema.table'], + quoted: [null, null, '"database.schema.table"'] + }, + '"database.schema.table"' + ], + [ + 'database.schema."table WITH spaces"', + { + unquoted: ['database', 'schema', 'table with spaces'], + quoted: [null, null, '"table WITH spaces"'] + }, + 'database.schema."table WITH spaces"' + ], + [ + 'database.schema.TableWithCaps', + { + unquoted: ['database', 'schema', 'tablewithcaps'], + quoted: [null, null, 'TableWithCaps'] + }, + 'database.schema.TableWithCaps' + ], + [ + 'database.schema.table-with-dashes', + { + unquoted: ['database', 'schema', 'table-with-dashes'], + quoted: [null, null, '"table-with-dashes"'] + }, + 'database.schema."table-with-dashes"' + ], + [ + 'database.schema."tableWith weird-FQN"', + { + unquoted: ['database', 'schema', 'tablewith weird-fqn'], + quoted: [null, null, '"tableWith weird-FQN"'] + }, + 'database.schema."tableWith weird-FQN"' + ], + [ + 'database."schema"."ta""bl""e"', + { + unquoted: ['database', 'schema', 'ta"bl"e'], + quoted: [null, '"schema"', '"ta""bl""e"'] + }, + 'database."schema"."ta""bl""e"' + ], + [ + 'database.schema.42name', + { unquoted: ['database', 'schema', '42name'], quoted: [null, null, '"42name"'] }, + 'database.schema."42name"' + ] + ])( + 'should parse %p correctly', + ( + fqn, + { + unquoted: [databaseName, schemaName, objectName], + quoted: [quotedDatabaseName, quotedSchemaName, quotedObjectName] + }, + expectedFqn + ) => { + const fqnObj = new FullyQualifiedName(fqn, Provider.Redshift); + + expect(fqnObj.getObjectName()).toEqual(objectName); + expect(fqnObj.getObjectName({ quoted: true })).toEqual( + quotedObjectName || objectName + ); + + if (schemaName) { + expect(fqnObj.getSchemaName()).toEqual(schemaName); + expect(fqnObj.getSchemaName({ quoted: true })).toEqual( + quotedSchemaName || schemaName + ); + } + + if (databaseName) { + expect(fqnObj.getDatabaseName()).toEqual(databaseName); + expect(fqnObj.getDatabaseName({ quoted: true })).toEqual( + quotedDatabaseName || databaseName + ); + } + + expect(fqnObj.toString()).toEqual(expectedFqn); + } + ); + + test.each([ + ['project.dataset', 'project', 'dataset', '', 'project.dataset'], + ['project', 'project', '', '', 'project'], + [ + 'project.dataset.table with spaces', + 'project', + 'dataset', + 'table with spaces', + 'project.dataset."table with spaces"' + ] + ])( + 'should parse %p correctly in left to right parsing mode', + (fqn, databaseName, schemaName, objectName, expectedFqn) => { + const fqnObj = new FullyQualifiedName( + fqn, + Provider.Redshift, + ParsingMode.LeftToRight + ); + expect(fqnObj.getDatabaseName()).toEqual(databaseName); + if (schemaName) { + expect(fqnObj.getSchemaName()).toEqual(schemaName); + } + if (objectName) { + expect(fqnObj.getObjectName()).toEqual(objectName); + } + expect(fqnObj.toString()).toEqual(expectedFqn); + } + ); + + test.each([ + ['project.dataset.table.extra'], + ['schema..table'], + ['.schema.table'], + ['schema.table.'] + ])('should throw an error for %p fqn', (invalidFqn) => { + expect(() => new FullyQualifiedName(invalidFqn, Provider.Redshift)).toThrowError(); + }); + + test('should set database / schema name correctly for an incomplete FQN', () => { + const fqnObj = new FullyQualifiedName('schema.table', Provider.Redshift); + fqnObj.setDatabaseName('DAT_A-base'); + fqnObj.setSchemaName('my_schema'); + expect(fqnObj.getDatabaseName()).toEqual('dat_a-base'); + expect(fqnObj.getSchemaName()).toEqual('my_schema'); + expect(fqnObj.getObjectName()).toEqual('table'); + expect(fqnObj.toString()).toEqual('"DAT_A-base".my_schema.table'); + }); + + test.each([ + ['project.dataset.table', 'suffix', 'table_suffix', 'table_suffix'], + ['project.dataset.my-table', 'suffix', '"my-table_suffix"', 'my-table_suffix'], + ['project.dataset.table', 'my-suffix', '"table_my-suffix"', 'table_my-suffix'], + ['project.dataset."my""Table"', 'suffix', '"my""Table_suffix"', 'my"table_suffix'] + ])( + 'should get object name correctly from %p with suffix %p', + (fqn, suffix, quotedName, unquotedName) => { + const fqnObj = new FullyQualifiedName(fqn, Provider.Redshift); + expect(fqnObj.getObjectName({ quoted: true, suffix: suffix })).toEqual( + quotedName + ); + expect(fqnObj.getObjectName({ quoted: false, suffix: suffix })).toEqual( + unquotedName + ); + } + ); + + test('should set object name correctly when it should be escaped', () => { + const fqnObj = new FullyQualifiedName( + 'database.schema', + Provider.Redshift, + ParsingMode.LeftToRight + ); + fqnObj.setObjectName('ta ".ble name'); + expect(fqnObj.getObjectName()).toEqual('ta ".ble name'); + expect(fqnObj.toString()).toEqual('database.schema."ta "".ble name"'); + }); + + describe('isValid', () => { + test.each([ + ['a.b.c.d'], + ['a.b..c'], + ['a..b.c'], + ['a.b.c.'], + ['.a.b.c'], + ['.a.b.c.'], + ['a..b'], + ['.a.b'], + ['a.b.'], + ['a.'], + ['.a'], + ['"a"."b"."c"."d"'], + ['a.b.."c"'], + ['"a".."b"."c"'], + ['"a".."b"'] + ])('should never accept %p', (fqn) => { + expect( + FullyQualifiedName.isValid(fqn, Provider.Redshift, { + parsingMode: ParsingMode.RightToLeft, + quoted: false + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.Redshift, { + parsingMode: ParsingMode.RightToLeft, + quoted: true + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.Redshift, { + parsingMode: ParsingMode.LeftToRight, + quoted: false + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.Redshift, { + parsingMode: ParsingMode.LeftToRight, + quoted: true + }) + ).toEqual(false); + }); + + test.each([ + ['my database.schema.table'], + ['database.my schema.table'], + ['database.schema.my table'], + ['"database"."schema".my table'], + ['my schema.table'], + ['schema.my table'], + ['"my schema".my table'], + ['my table'] + ])('should should only accept quoted %p', (fqn) => { + expect( + FullyQualifiedName.isValid(fqn, Provider.Redshift, { + parsingMode: ParsingMode.RightToLeft, + quoted: false + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.Redshift, { + parsingMode: ParsingMode.RightToLeft, + quoted: true + }) + ).toEqual(true); + expect( + FullyQualifiedName.isValid(fqn, Provider.Redshift, { + parsingMode: ParsingMode.LeftToRight, + quoted: false + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.Redshift, { + parsingMode: ParsingMode.LeftToRight, + quoted: true + }) + ).toEqual(true); + }); + + test.each([ + ['database.schema.table'], + ['"a database".schema.table'], + ['"a database"."a schema"."a table"'], + ['database."a table"'], + ['"a database"."a table"'], + ['"a table"'] + ])('should always accept %p', (fqn) => { + expect( + FullyQualifiedName.isValid(fqn, Provider.Redshift, { + parsingMode: ParsingMode.RightToLeft, + quoted: false + }) + ).toEqual(true); + expect( + FullyQualifiedName.isValid(fqn, Provider.Redshift, { + parsingMode: ParsingMode.RightToLeft, + quoted: true + }) + ).toEqual(true); + expect( + FullyQualifiedName.isValid(fqn, Provider.Redshift, { + parsingMode: ParsingMode.LeftToRight, + quoted: false + }) + ).toEqual(true); + expect( + FullyQualifiedName.isValid(fqn, Provider.Redshift, { + parsingMode: ParsingMode.LeftToRight, + quoted: true + }) + ).toEqual(true); + }); + }); + }); + + describe('for Databricks', () => { + test.each([ + [ + 'database.schema.table', + { unquoted: ['database', 'schema', 'table'], quoted: [null, null, null] }, + 'database.schema.table' + ], + [ + 'database.`schema`.table', + { unquoted: ['database', 'schema', 'table'], quoted: [null, '`schema`', null] }, + 'database.`schema`.table' + ], + [ + 'database.`schema`.`table`', + { + unquoted: ['database', 'schema', 'table'], + quoted: [null, '`schema`', '`table`'] + }, + 'database.`schema`.`table`' + ], + [ + '`database.schema.table`', + { + unquoted: ['', '', 'database.schema.table'], + quoted: [null, null, '`database.schema.table`'] + }, + '`database.schema.table`' + ], + [ + 'database.schema.`table with spaces`', + { + unquoted: ['database', 'schema', 'table with spaces'], + quoted: [null, null, '`table with spaces`'] + }, + 'database.schema.`table with spaces`' + ], + [ + 'database.schema.TableWithCaps', + { unquoted: ['database', 'schema', 'TableWithCaps'], quoted: [null, null, null] }, + 'database.schema.TableWithCaps' + ], + [ + 'database.schema.table-with-dashes', + { + unquoted: ['database', 'schema', 'table-with-dashes'], + quoted: [null, null, '`table-with-dashes`'] + }, + 'database.schema.`table-with-dashes`' + ], + [ + 'database.schema.`tableWith weird-FQN`', + { + unquoted: ['database', 'schema', 'tableWith weird-FQN'], + quoted: [null, null, '`tableWith weird-FQN`'] + }, + 'database.schema.`tableWith weird-FQN`' + ], + [ + 'database.`schema`.`ta``bl``e`', + { + unquoted: ['database', 'schema', 'ta`bl`e'], + quoted: [null, '`schema`', '`ta``bl``e`'] + }, + 'database.`schema`.`ta``bl``e`' + ] + ])( + 'should parse %p correctly', + ( + fqn, + { + unquoted: [databaseName, schemaName, objectName], + quoted: [quotedDatabaseName, quotedSchemaName, quotedObjectName] + }, + expectedFqn + ) => { + const fqnObj = new FullyQualifiedName(fqn, Provider.Databricks); + + expect(fqnObj.getObjectName()).toEqual(objectName); + expect(fqnObj.getObjectName({ quoted: true })).toEqual( + quotedObjectName || objectName + ); + + if (schemaName) { + expect(fqnObj.getSchemaName()).toEqual(schemaName); + expect(fqnObj.getSchemaName({ quoted: true })).toEqual( + quotedSchemaName || schemaName + ); + } + + if (databaseName) { + expect(fqnObj.getDatabaseName()).toEqual(databaseName); + expect(fqnObj.getDatabaseName({ quoted: true })).toEqual( + quotedDatabaseName || databaseName + ); + } + + expect(fqnObj.toString()).toEqual(expectedFqn); + } + ); + + test.each([ + ['project.dataset', 'project', 'dataset', '', 'project.dataset'], + ['project', 'project', '', '', 'project'], + [ + 'project.dataset.table with spaces', + 'project', + 'dataset', + 'table with spaces', + 'project.dataset.`table with spaces`' + ] + ])( + 'should parse %p correctly in left to right parsing mode', + (fqn, databaseName, schemaName, objectName, expectedFqn) => { + const fqnObj = new FullyQualifiedName( + fqn, + Provider.Databricks, + ParsingMode.LeftToRight + ); + expect(fqnObj.getDatabaseName()).toEqual(databaseName); + if (schemaName) { + expect(fqnObj.getSchemaName()).toEqual(schemaName); + } + if (objectName) { + expect(fqnObj.getObjectName()).toEqual(objectName); + } + expect(fqnObj.toString()).toEqual(expectedFqn); + } + ); + + test.each([ + ['project.dataset.table.extra'], + ['"project.dataset.name'], + ['schema..table'], + ['.schema.table'], + ['schema.table.'] + ])('should throw an error for %p fqn', (invalidFqn) => { + expect(() => new FullyQualifiedName(invalidFqn, Provider.Snowflake)).toThrowError(); + }); + + test('should set database / schema name correctly for an incomplete FQN', () => { + const fqnObj = new FullyQualifiedName('schema.table', Provider.Databricks); + fqnObj.setDatabaseName('DAT_A-base'); + fqnObj.setSchemaName('my_schema'); + expect(fqnObj.getDatabaseName()).toEqual('DAT_A-base'); + expect(fqnObj.getSchemaName()).toEqual('my_schema'); + expect(fqnObj.getObjectName()).toEqual('table'); + expect(fqnObj.toString()).toEqual('`DAT_A-base`.my_schema.table'); + }); + + test.each([ + ['project.dataset.table', 'suffix', 'table_suffix', 'table_suffix'], + ['project.dataset.my-table', 'suffix', '`my-table_suffix`', 'my-table_suffix'], + ['project.dataset.table', 'my-suffix', '`table_my-suffix`', 'table_my-suffix'], + ['project.dataset.`my``Table`', 'suffix', '`my``Table_suffix`', 'my`Table_suffix'] + ])( + 'should get object name correctly from %p with suffix %p', + (fqn, suffix, quotedName, unquotedName) => { + const fqnObj = new FullyQualifiedName(fqn, Provider.Databricks); + expect(fqnObj.getObjectName({ quoted: true, suffix: suffix })).toEqual( + quotedName + ); + expect(fqnObj.getObjectName({ quoted: false, suffix: suffix })).toEqual( + unquotedName + ); + } + ); + + test('should set object name correctly when it should be escaped', () => { + const fqnObj = new FullyQualifiedName( + 'database.schema', + Provider.Databricks, + ParsingMode.LeftToRight + ); + fqnObj.setObjectName('ta ".ble name'); + expect(fqnObj.getObjectName()).toEqual('ta ".ble name'); + expect(fqnObj.toString()).toEqual('database.schema.`ta ".ble name`'); + }); + + describe('isValid', () => { + test.each([ + ['a.b.c.d'], + ['a.b..c'], + ['a..b.c'], + ['a.b.c.'], + ['.a.b.c'], + ['.a.b.c.'], + ['a..b'], + ['.a.b'], + ['a.b.'], + ['a.'], + ['.a'], + ['`a`.`b`.`c`.`d`'], + ['a.b..`c`'], + ['`a`..`b`.`c`'], + ['`a`..`b`'] + ])('should never accept %p', (fqn) => { + expect( + FullyQualifiedName.isValid(fqn, Provider.Databricks, { + parsingMode: ParsingMode.RightToLeft, + quoted: false + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.Databricks, { + parsingMode: ParsingMode.RightToLeft, + quoted: true + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.Databricks, { + parsingMode: ParsingMode.LeftToRight, + quoted: false + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.Databricks, { + parsingMode: ParsingMode.LeftToRight, + quoted: true + }) + ).toEqual(false); + }); + + test.each([ + ['my database.schema.table'], + ['database.my schema.table'], + ['database.schema.my table'], + ['`database`.`schema`.my table'], + ['my schema.table'], + ['schema.my table'], + ['`my schema`.my table'], + ['my table'] + ])('should should only accept quoted %p', (fqn) => { + expect( + FullyQualifiedName.isValid(fqn, Provider.Databricks, { + parsingMode: ParsingMode.RightToLeft, + quoted: false + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.Databricks, { + parsingMode: ParsingMode.RightToLeft, + quoted: true + }) + ).toEqual(true); + expect( + FullyQualifiedName.isValid(fqn, Provider.Databricks, { + parsingMode: ParsingMode.LeftToRight, + quoted: false + }) + ).toEqual(false); + expect( + FullyQualifiedName.isValid(fqn, Provider.Databricks, { + parsingMode: ParsingMode.LeftToRight, + quoted: true + }) + ).toEqual(true); + }); + + test.each([ + ['database.schema.table'], + ['`a database`.schema.table'], + ['`a database`.`a schema`.`a table`'], + ['database.`a table`'], + ['`a database`.`a table`'], + ['`a table`'] + ])('should always accept %p', (fqn) => { + expect( + FullyQualifiedName.isValid(fqn, Provider.Databricks, { + parsingMode: ParsingMode.RightToLeft, + quoted: false + }) + ).toEqual(true); + expect( + FullyQualifiedName.isValid(fqn, Provider.Databricks, { + parsingMode: ParsingMode.RightToLeft, + quoted: true + }) + ).toEqual(true); + expect( + FullyQualifiedName.isValid(fqn, Provider.Databricks, { + parsingMode: ParsingMode.LeftToRight, + quoted: false + }) + ).toEqual(true); + expect( + FullyQualifiedName.isValid(fqn, Provider.Databricks, { + parsingMode: ParsingMode.LeftToRight, + quoted: true + }) + ).toEqual(true); + }); + }); + }); + + describe('in default parsing mode (right to left)', () => { + describe('with no schema and object', () => { + test('should work when safely asking for database name', () => { + const fqn = new FullyQualifiedName('schema.table', Provider.BigQuery); + expect(fqn.getDatabaseName({ safe: true })).toBe(null); + }); + + test('should work when safely asking for schema name', () => { + const fqn = new FullyQualifiedName('table', Provider.BigQuery); + expect(fqn.getSchemaName({ safe: true })).toBe(null); + }); + + test('should fail when asking for database name', () => { + const fqn = new FullyQualifiedName('schema.table', Provider.BigQuery); + expect(() => fqn.getDatabaseName()).toThrowError('Database name is not defined'); + }); + + test('should fail when asking for schema name', () => { + const fqn = new FullyQualifiedName('table', Provider.BigQuery); + expect(() => fqn.getSchemaName()).toThrowError('Schema name is not defined'); + }); + + test('should work when asking for object name', () => { + const fqn = new FullyQualifiedName('table', Provider.BigQuery); + expect(fqn.getObjectName()).toEqual('table'); + }); + }); + + describe('with no database name', () => { + test('should work when safely asking for database name', () => { + const fqn = new FullyQualifiedName('schema.table', Provider.BigQuery); + expect(fqn.getDatabaseName({ safe: true })).toEqual(null); + }); + + test('should fail when asking for database name', () => { + const fqn = new FullyQualifiedName('schema.table', Provider.BigQuery); + expect(() => fqn.getDatabaseName()).toThrowError('Database name is not defined'); + }); + + test('should work when asking for schema name', () => { + const fqn = new FullyQualifiedName('schema.table', Provider.BigQuery); + expect(fqn.getSchemaName()).toEqual('schema'); + }); + + test('should work when asking for object name', () => { + const fqn = new FullyQualifiedName('table', Provider.BigQuery); + expect(fqn.getObjectName()).toEqual('table'); + }); + }); + }); + + describe('in left to right parsing mode', () => { + describe('with no schema and object ', () => { + test('should work when asking for full FQN', () => { + const fqn = new FullyQualifiedName( + 'database', + Provider.BigQuery, + ParsingMode.LeftToRight + ); + expect(fqn.toString()).toEqual('`database`'); + }); + + test('should work when asking for database name', () => { + const fqn = new FullyQualifiedName( + 'database', + Provider.BigQuery, + ParsingMode.LeftToRight + ); + expect(fqn.getDatabaseName()).toEqual('database'); + }); + + test('should fail when asking for schema name', () => { + const fqn = new FullyQualifiedName( + 'database', + Provider.BigQuery, + ParsingMode.LeftToRight + ); + expect(() => fqn.getSchemaName()).toThrowError('Schema name is not defined'); + }); + + test('should fail when asking for object name', () => { + const fqn = new FullyQualifiedName( + 'database', + Provider.BigQuery, + ParsingMode.LeftToRight + ); + expect(() => fqn.getObjectName()).toThrowError('Object name is not defined'); + }); + + test('should work when safely asking for schema name', () => { + const fqn = new FullyQualifiedName( + 'database', + Provider.BigQuery, + ParsingMode.LeftToRight + ); + expect(fqn.getSchemaName({ safe: true })).toBe(null); + }); + + test('should work when safely asking for object name', () => { + const fqn = new FullyQualifiedName( + 'database', + Provider.BigQuery, + ParsingMode.LeftToRight + ); + expect(fqn.getObjectName({ safe: true })).toBe(null); + }); + }); + + describe('with no object name', () => { + test('should work when asking for full FQN', () => { + const fqn = new FullyQualifiedName( + 'database.schema', + Provider.BigQuery, + ParsingMode.LeftToRight + ); + expect(fqn.toString()).toEqual('`database.schema`'); + }); + + test('should work when asking for database name', () => { + const fqn = new FullyQualifiedName( + 'database.schema', + Provider.BigQuery, + ParsingMode.LeftToRight + ); + expect(fqn.getDatabaseName()).toEqual('database'); + }); + + test('should work when asking for schema name', () => { + const fqn = new FullyQualifiedName( + 'database.schema', + Provider.BigQuery, + ParsingMode.LeftToRight + ); + expect(fqn.getSchemaName()).toEqual('schema'); + }); + + test('should fail when asking for object name', () => { + const fqn = new FullyQualifiedName( + 'database.schema', + Provider.BigQuery, + ParsingMode.LeftToRight + ); + expect(() => fqn.getObjectName()).toThrowError('Object name is not defined'); + }); + }); + }); +}); diff --git a/packages/react-widgets/__tests__/models/utils.test.js b/packages/react-widgets/__tests__/models/utils.test.js index 2bce30deb..208bf8a20 100644 --- a/packages/react-widgets/__tests__/models/utils.test.js +++ b/packages/react-widgets/__tests__/models/utils.test.js @@ -1,4 +1,3 @@ -import { MAP_TYPES, API_VERSIONS } from '@deck.gl/carto'; import { sourceAndFiltersToSQL, wrapModelCall, @@ -6,6 +5,7 @@ import { normalizeObjectKeys } from '../../src/models/utils'; import { AggregationTypes, Provider, _filtersToSQL } from '@carto/react-core'; +import { MAP_TYPES, API_VERSIONS } from '@carto/react-api'; const V2_SOURCE = { id: '__test__', diff --git a/packages/react-widgets/package.json b/packages/react-widgets/package.json index c671b09f3..b0cf9ea58 100644 --- a/packages/react-widgets/package.json +++ b/packages/react-widgets/package.json @@ -1,6 +1,6 @@ { "name": "@carto/react-widgets", - "version": "2.5.2", + "version": "3.0.0-alpha.7", "description": "CARTO for React - Widgets", "author": "CARTO Dev Team", "keywords": [ @@ -69,18 +69,17 @@ "@babel/runtime": "^7.13.9" }, "peerDependencies": { - "@carto/react-api": "^2.5.0", - "@carto/react-core": "^2.5.0", - "@carto/react-redux": "^2.5.0", - "@carto/react-ui": "^2.5.0", - "@carto/react-workers": "^2.5.0", - "@deck.gl/core": "^8.9.18", - "@deck.gl/layers": "^8.9.18", + "@carto/react-api": "^3.0.0-alpha.7", + "@carto/react-core": "^3.0.0-alpha.7", + "@carto/react-redux": "^3.0.0-alpha.7", + "@carto/react-ui": "^3.0.0-alpha.7", + "@carto/react-workers": "^3.0.0-alpha.7", + "@deck.gl-community/editable-layers": "^9.0.0-alpha.1", + "@deck.gl/core": "^9.0.1", + "@deck.gl/layers": "^9.0.1", "@emotion/react": "^11.10.6", "@emotion/styled": "^11.10.6", "@mui/material": "^5.11.16", - "@nebula.gl/edit-modes": "^1.0.4", - "@nebula.gl/layers": "^1.0.4", "@turf/kinks": "^6.3.0", "dequal": "^2.0.2", "react": "17.x || 18.x", diff --git a/packages/react-widgets/src/index.d.ts b/packages/react-widgets/src/index.d.ts index 7807de82d..b81187b32 100644 --- a/packages/react-widgets/src/index.d.ts +++ b/packages/react-widgets/src/index.d.ts @@ -27,4 +27,5 @@ export { default as FeatureSelectionWidget } from './widgets/FeatureSelectionWid export { default as FeatureSelectionLayer } from './layers/FeatureSelectionLayer'; export { default as useGeocoderWidgetController, setGeocoderResult } from './hooks/useGeocoderWidgetController'; export { WidgetState, WidgetStateType } from './types'; -export { isRemoteCalculationSupported as _isRemoteCalculationSupported, sourceAndFiltersToSQL as _sourceAndFiltersToSQL } from './models/utils'; +export { isRemoteCalculationSupported as _isRemoteCalculationSupported, sourceAndFiltersToSQL as _sourceAndFiltersToSQL, getSqlEscapedSource as _getSqlEscapedSource } from './models/utils'; + diff --git a/packages/react-widgets/src/index.js b/packages/react-widgets/src/index.js index 2ea2d0902..bf79ddc23 100644 --- a/packages/react-widgets/src/index.js +++ b/packages/react-widgets/src/index.js @@ -28,5 +28,6 @@ export { export { WidgetStateType } from './hooks/useWidgetFetch'; export { isRemoteCalculationSupported as _isRemoteCalculationSupported, - sourceAndFiltersToSQL as _sourceAndFiltersToSQL + sourceAndFiltersToSQL as _sourceAndFiltersToSQL, + getSqlEscapedSource as _getSqlEscapedSource } from './models/utils'; diff --git a/packages/react-widgets/src/layers/EditableCartoGeoJsonLayer.js b/packages/react-widgets/src/layers/EditableCartoGeoJsonLayer.js index fb8c2d069..754fc56be 100644 --- a/packages/react-widgets/src/layers/EditableCartoGeoJsonLayer.js +++ b/packages/react-widgets/src/layers/EditableCartoGeoJsonLayer.js @@ -1,4 +1,4 @@ -import { EditableGeoJsonLayer } from '@nebula.gl/layers'; +import { EditableGeoJsonLayer } from '@deck.gl-community/editable-layers'; // EditableGeoJsonLayer extends EditableLayer and it's its code https://github.com/uber/nebula.gl/blob/master/modules/layers/src/layers/editable-layer.ts#L75 // We've overwritten _addEventHandlers and _removeEventHandlers to be able to use an eventManager sent it as a property instead of use @@ -41,4 +41,8 @@ export default class EditableCartoGeoJsonLayer extends EditableGeoJsonLayer { _getEventManager() { return this.props.eventManager || this.context.deck.eventManager; } + + createTooltipsLayers() { + return []; + } } diff --git a/packages/react-widgets/src/layers/FeatureSelectionLayer.js b/packages/react-widgets/src/layers/FeatureSelectionLayer.js index cd65569d5..bc4d2c2a0 100644 --- a/packages/react-widgets/src/layers/FeatureSelectionLayer.js +++ b/packages/react-widgets/src/layers/FeatureSelectionLayer.js @@ -1,6 +1,6 @@ import { useEffect, useMemo, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; -import * as nebulaModes from '@nebula.gl/edit-modes'; +import * as nebulaModes from '@deck.gl-community/editable-layers'; import { addSpatialFilter, selectSpatialFilter, @@ -72,6 +72,7 @@ export default function FeatureSelectionLayer( return [ mask && MaskLayer(), (selectedMode || spatialFilterGeometry) && + // @ts-ignore new EditableCartoGeoJsonLayer({ eventManager: customEventManager, id: 'FeatureSelectionLayer', diff --git a/packages/react-widgets/src/layers/MaskLayer.js b/packages/react-widgets/src/layers/MaskLayer.js index 6883c0457..1e474588f 100644 --- a/packages/react-widgets/src/layers/MaskLayer.js +++ b/packages/react-widgets/src/layers/MaskLayer.js @@ -1,5 +1,5 @@ import { useSelector } from 'react-redux'; -import { SolidPolygonLayer } from '@deck.gl/layers/typed'; +import { SolidPolygonLayer } from '@deck.gl/layers'; import { MASK_ID } from '@carto/react-core/'; import { selectValidSpatialFilter } from '@carto/react-redux/'; diff --git a/packages/react-widgets/src/models/GeocodingModel.js b/packages/react-widgets/src/models/GeocodingModel.js index 51efe2506..bdaf38732 100644 --- a/packages/react-widgets/src/models/GeocodingModel.js +++ b/packages/react-widgets/src/models/GeocodingModel.js @@ -1,7 +1,6 @@ // Geocoding / Data Services https://carto.com/developers/data-services-api/reference/ -import { executeSQL, ldsGeocode } from '@carto/react-api'; -import { API_VERSIONS } from '@deck.gl/carto/typed'; +import { executeSQL, ldsGeocode, API_VERSIONS } from '@carto/react-api'; /** * Street-Level Geocoder. diff --git a/packages/react-widgets/src/models/fqn.d.ts b/packages/react-widgets/src/models/fqn.d.ts index b8bad71f0..7e9fe90c5 100644 --- a/packages/react-widgets/src/models/fqn.d.ts +++ b/packages/react-widgets/src/models/fqn.d.ts @@ -18,6 +18,11 @@ export enum ParsingMode { RightToLeft = 'rightToLeft' } +type IsValidOptions = { + parsingMode?: ParsingMode + quoted?: boolean +} + export class FullyQualifiedName { protected databaseFragment: Fragment | null protected schemaFragment: Fragment | null @@ -47,10 +52,14 @@ export class FullyQualifiedName { public setDatabaseName (databaseName: string): void - public setSchemaName (schemaName: string): void + public setSchemaName (schemaName: string): void public setObjectName (objectName: string): void + static isValid (fqn: string, provider: Provider, options?: IsValidOptions): boolean + + private _isValid (quoted: boolean): boolean + private parseFQN (fqn: string): Array<Fragment | null> private getFragmentName (fragment: Fragment): string diff --git a/packages/react-widgets/src/models/fqn.js b/packages/react-widgets/src/models/fqn.js index 5122ff784..0053f3f00 100644 --- a/packages/react-widgets/src/models/fqn.js +++ b/packages/react-widgets/src/models/fqn.js @@ -5,6 +5,7 @@ export const ParsingMode = Object.freeze({ RightToLeft: 'rightToLeft' }); +const bqProjectId = /^[a-z][a-z0-9-]{4,28}[a-z0-9]$/; const bqIdentifierRegex = '((?:[^`.]*?)|`(?:(?:[^`.])*?)`)'; const identifierRegex = '((?:[^".]*?)|"(?:(?:[^"]|"")*?)")'; const databricksIdentifierRegex = '((?:[^`.]*?)|`(?:(?:[^`]|``)*?)`)'; @@ -206,6 +207,115 @@ export class FullyQualifiedName { this.objectFragment = objectFqnFragment[0]; } + static isValid(fqn, provider, options) { + try { + const parsingMode = options?.parsingMode || ParsingMode.RightToLeft; + const quoted = options?.quoted || false; + const fqnObject = new FullyQualifiedName(fqn, provider, parsingMode); + return fqnObject._isValid(quoted); + } catch (err) { + return false; + // if (err instanceof InvalidFQNError) { + // return false + // } + // throw err + } + } + + _isValid(quoted) { + let checkDatabase = false; + let checkSchema = false; + let checkObject = false; + let namePresent = false; + // @ts-ignore + if (this.parsingMode === ParsingMode.LeftToRight) { + if (this.objectFragment) { + if (!this.schemaFragment || !this.databaseFragment) { + return false; + } + if (!quoted) { + checkDatabase = checkSchema = checkObject = true; + } + namePresent = true; + } else if (this.schemaFragment) { + if (!this.databaseFragment) { + return false; + } + if (!quoted) { + checkDatabase = checkSchema = true; + } + namePresent = true; + } else if (this.databaseFragment) { + if (!quoted) { + checkDatabase = true; + } + namePresent = true; + } + } else { + if (this.databaseFragment) { + if (!this.schemaFragment || !this.objectFragment) { + return false; + } + if (!quoted) { + checkDatabase = checkSchema = checkObject = true; + } + namePresent = true; + } else if (this.schemaFragment) { + if (!this.objectFragment) { + return false; + } + if (!quoted) { + checkSchema = checkObject = true; + } + namePresent = true; + } else if (this.objectFragment) { + if (!quoted) { + checkObject = true; + } + namePresent = true; + } + } + + if (!namePresent) { + return false; + } + + const fullyQuoted = + this.provider === Provider.BigQuery && + this.originalFQN.startsWith(escapeCharacter[Provider.BigQuery]) && + this.originalFQN.endsWith(escapeCharacter[Provider.BigQuery]) && + !this.originalFQN.slice(1, -1).includes(escapeCharacter[Provider.BigQuery]); + if ( + checkDatabase && + !(fullyQuoted || this.databaseFragment?.quoted) && + nameNeedsQuotesChecker[this.provider].test(this.databaseFragment?.name || '') + ) { + // make exception for valid bigquery project ids (which can contain dashes) + if ( + this.provider !== Provider.BigQuery || + !bqProjectId.test(this.databaseFragment?.name || '') + ) { + return false; + } + } + if ( + checkSchema && + !(fullyQuoted || this.schemaFragment?.quoted) && + nameNeedsQuotesChecker[this.provider].test(this.schemaFragment?.name || '') + ) { + return false; + } + if ( + checkObject && + !(fullyQuoted || this.objectFragment?.quoted) && + nameNeedsQuotesChecker[this.provider].test(this.objectFragment?.name || '') + ) { + return false; + } + + return true; + } + parseFQN(fqn) { const matchResult = fqn.match(fqnParseRegex[this.provider]); if (!matchResult) { @@ -215,6 +325,10 @@ export class FullyQualifiedName { const identifiers = matchResult.slice(1, 4); const fragments = identifiers.map((name) => { + if (name === '' && this.originalFQN !== '') { + throw new Error(this.originalFQN); + } + if (!name) { return null; } diff --git a/packages/react-widgets/src/models/utils.d.ts b/packages/react-widgets/src/models/utils.d.ts index 4b1e753f3..de1d06827 100644 --- a/packages/react-widgets/src/models/utils.d.ts +++ b/packages/react-widgets/src/models/utils.d.ts @@ -1,8 +1,9 @@ -import { SourceProps } from "@carto/react-api"; -import { FiltersLogicalOperators, Provider, _FilterTypes } from "@carto/react-core"; +import { SourceProps, MAP_TYPES } from "@carto/react-api"; +import { FiltersLogicalOperators, Provider, _FilterTypes, Provider } from "@carto/react-core"; import { SourceFilters } from "@carto/react-redux"; -import { MAP_TYPES } from "@deck.gl/carto/typed"; export function isRemoteCalculationSupported(prop: { source: SourceProps }): boolean -export function sourceAndFiltersToSQL(props: { data: string, filters?: SourceFilters, filtersLogicalOperator?: FiltersLogicalOperators, provider: Provider, type: typeof MAP_TYPES }): string \ No newline at end of file +export function sourceAndFiltersToSQL(props: { data: string, filters?: SourceFilters, filtersLogicalOperator?: FiltersLogicalOperators, provider: Provider, type: typeof MAP_TYPES }): string + +export function getSqlEscapedSource(table: string, provider: Provider): string \ No newline at end of file diff --git a/packages/react-widgets/src/models/utils.js b/packages/react-widgets/src/models/utils.js index ef3c8fe87..7a34358f3 100644 --- a/packages/react-widgets/src/models/utils.js +++ b/packages/react-widgets/src/models/utils.js @@ -1,4 +1,3 @@ -import { MAP_TYPES, API_VERSIONS } from '@deck.gl/carto/typed'; import { AggregationTypes, getSpatialIndexFromGeoColumn, @@ -6,6 +5,7 @@ import { Provider } from '@carto/react-core'; import { FullyQualifiedName } from './fqn'; +import { MAP_TYPES, API_VERSIONS } from '@carto/react-api'; export function isRemoteCalculationSupported(props) { const { source } = props; @@ -73,7 +73,7 @@ function sanitizeSQLSource(sql) { return sql.trim().replace(/;$/, ''); } -function getSqlEscapedSource(table, provider) { +export function getSqlEscapedSource(table, provider) { const fqn = new FullyQualifiedName(table, provider); if (provider === Provider.Snowflake) { diff --git a/packages/react-widgets/src/types.d.ts b/packages/react-widgets/src/types.d.ts index 411b1c823..7f3c26a31 100644 --- a/packages/react-widgets/src/types.d.ts +++ b/packages/react-widgets/src/types.d.ts @@ -27,7 +27,6 @@ type CommonWidgetProps = { onStateChange?: (stateEvent: WidgetState) => void wrapperProps?: object, noDataAlertProps?: object - droppingFeaturesAlertProps?: object } type MonoColumnWidgetProps = { @@ -103,7 +102,6 @@ export type WidgetWithAlert = { dataSource: string; global?: boolean; noDataAlertProps?: object; - droppingFeaturesAlertProps?: object; children?: React.ReactNode; } diff --git a/packages/react-widgets/src/widgets/BarWidget.js b/packages/react-widgets/src/widgets/BarWidget.js index 8cb7c14e1..93688ec49 100644 --- a/packages/react-widgets/src/widgets/BarWidget.js +++ b/packages/react-widgets/src/widgets/BarWidget.js @@ -40,7 +40,6 @@ const EMPTY_ARRAY = []; * @param {Function} [props.onError] - Function to handle error messages from the widget. * @param {object} [props.wrapperProps] - Extra props to pass to [WrapperWidgetUI](https://storybook-react.carto.com/?path=/docs/widgets-wrapperwidgetui--default). * @param {object} [props.noDataAlertProps] - Extra props to pass to [NoDataAlert](). - * @param {object} [props.droppingFeaturesAlertProps] - Extra props to pass to [NoDataAlert]() when dropping feature. */ function BarWidget({ id, @@ -62,16 +61,14 @@ function BarWidget({ global, onError, wrapperProps, - noDataAlertProps, - droppingFeaturesAlertProps + noDataAlertProps }) { const dispatch = useDispatch(); const { data: _data = [], isLoading, - warning, - remoteCalculation + warning } = useWidgetFetch(getCategories, { id, dataSource, @@ -142,14 +139,7 @@ function BarWidget({ return ( <WrapperWidgetUI title={title} isLoading={isLoading} {...wrapperProps}> - <WidgetWithAlert - dataSource={dataSource} - warning={warning} - global={global} - droppingFeaturesAlertProps={droppingFeaturesAlertProps} - noDataAlertProps={noDataAlertProps} - showDroppingFeaturesAlert={!remoteCalculation} - > + <WidgetWithAlert warning={warning} noDataAlertProps={noDataAlertProps}> {(!!sortedData.length || isLoading) && ( <BarWidgetUI xAxisData={sortedData.map((category) => category.name)} @@ -195,7 +185,6 @@ BarWidget.propTypes = { onError: PropTypes.func, wrapperProps: PropTypes.object, noDataAlertProps: PropTypes.object, - droppingFeaturesAlertProps: PropTypes.object, height: PropTypes.oneOfType([PropTypes.number, PropTypes.string]) }; diff --git a/packages/react-widgets/src/widgets/CategoryWidget.js b/packages/react-widgets/src/widgets/CategoryWidget.js index 4ed38c09e..1e304ba7b 100644 --- a/packages/react-widgets/src/widgets/CategoryWidget.js +++ b/packages/react-widgets/src/widgets/CategoryWidget.js @@ -36,7 +36,6 @@ const EMPTY_ARRAY = []; * @param {Function} [props.onError] - Function to handle error messages from the widget. * @param {object} [props.wrapperProps] - Extra props to pass to [WrapperWidgetUI](https://storybook-react.carto.com/?path=/docs/widgets-wrapperwidgetui--default). * @param {object} [props.noDataAlertProps] - Extra props to pass to [NoDataAlert](). - * @param {object} [props.droppingFeaturesAlertProps] - Extra props to pass to [NoDataAlert]() when dropping feature. */ function CategoryWidget(props) { @@ -56,8 +55,7 @@ function CategoryWidget(props) { global, onError, wrapperProps, - noDataAlertProps, - droppingFeaturesAlertProps + noDataAlertProps } = props; const dispatch = useDispatch(); @@ -68,8 +66,7 @@ function CategoryWidget(props) { const { data = [], isLoading, - warning, - remoteCalculation + warning } = useWidgetFetch(getCategories, { id, dataSource, @@ -111,14 +108,7 @@ function CategoryWidget(props) { return ( <WrapperWidgetUI title={title} isLoading={isLoading} {...wrapperProps}> - <WidgetWithAlert - dataSource={dataSource} - warning={warning} - global={global} - droppingFeaturesAlertProps={droppingFeaturesAlertProps} - noDataAlertProps={noDataAlertProps} - showDroppingFeaturesAlert={!remoteCalculation} - > + <WidgetWithAlert warning={warning} noDataAlertProps={noDataAlertProps}> {(!!data.length || isLoading) && ( <CategoryWidgetUI data={data} @@ -156,8 +146,7 @@ CategoryWidget.propTypes = { global: PropTypes.bool, onError: PropTypes.func, wrapperProps: PropTypes.object, - noDataAlertProps: PropTypes.object, - droppingFeaturesAlertProps: PropTypes.object + noDataAlertProps: PropTypes.object }; CategoryWidget.defaultProps = { diff --git a/packages/react-widgets/src/widgets/FormulaWidget.js b/packages/react-widgets/src/widgets/FormulaWidget.js index a7dfc6333..6cf9522f1 100644 --- a/packages/react-widgets/src/widgets/FormulaWidget.js +++ b/packages/react-widgets/src/widgets/FormulaWidget.js @@ -23,7 +23,6 @@ import WidgetWithAlert from './utils/WidgetWithAlert'; * @param {Function=} [props.onError] - Function to handle error messages from the widget. * @param {Function=} [props.onStateChange] - Callback to handle state updates of widgets * @param {object} [props.wrapperProps] - Extra props to pass to [WrapperWidgetUI](https://storybook-react.carto.com/?path=/docs/widgets-wrapperwidgetui--default). - * @param {object} [props.droppingFeaturesAlertProps] - Extra props to pass to [NoDataAlert]() when dropping feature. */ function FormulaWidget({ id, @@ -38,14 +37,12 @@ function FormulaWidget({ global, onError, onStateChange, - wrapperProps, - droppingFeaturesAlertProps + wrapperProps }) { const { data = { value: undefined }, isLoading, - warning, - remoteCalculation + warning } = useWidgetFetch(getFormula, { id, dataSource, @@ -65,13 +62,7 @@ function FormulaWidget({ return ( <WrapperWidgetUI title={title} isLoading={isLoading} {...wrapperProps}> - <WidgetWithAlert - dataSource={dataSource} - warning={warning} - global={global} - droppingFeaturesAlertProps={droppingFeaturesAlertProps} - showDroppingFeaturesAlert={!remoteCalculation} - > + <WidgetWithAlert warning={warning}> <FormulaWidgetUI data={value} formatter={formatter} @@ -94,8 +85,7 @@ FormulaWidget.propTypes = { animation: PropTypes.bool, global: PropTypes.bool, onError: PropTypes.func, - wrapperProps: PropTypes.object, - droppingFeaturesAlertProps: PropTypes.object + wrapperProps: PropTypes.object }; FormulaWidget.defaultProps = { diff --git a/packages/react-widgets/src/widgets/HistogramWidget.js b/packages/react-widgets/src/widgets/HistogramWidget.js index ca7615bc6..ce1419c2c 100644 --- a/packages/react-widgets/src/widgets/HistogramWidget.js +++ b/packages/react-widgets/src/widgets/HistogramWidget.js @@ -40,7 +40,6 @@ const EMPTY_ARRAY = []; * @param {Function} [props.onError] - Function to handle error messages from the widget. * @param {object} [props.wrapperProps] - Extra props to pass to [WrapperWidgetUI](https://storybook-react.carto.com/?path=/docs/widgets-wrapperwidgetui--default). * @param {object} [props.noDataAlertProps] - Extra props to pass to [NoDataAlert](). - * @param {object} [props.droppingFeaturesAlertProps] - Extra props to pass to [NoDataAlert]() when dropping feature. */ function HistogramWidget({ @@ -63,8 +62,7 @@ function HistogramWidget({ global, onError, wrapperProps, - noDataAlertProps, - droppingFeaturesAlertProps + noDataAlertProps }) { const dispatch = useDispatch(); @@ -109,8 +107,7 @@ function HistogramWidget({ let { data = EMPTY_ARRAY, isLoading, - warning = _warning, - remoteCalculation + warning = _warning } = useWidgetFetch(getHistogram, { id, dataSource, @@ -180,14 +177,7 @@ function HistogramWidget({ return ( <WrapperWidgetUI title={title} {...wrapperProps} isLoading={isLoading}> - <WidgetWithAlert - dataSource={dataSource} - warning={warning} - global={global} - droppingFeaturesAlertProps={droppingFeaturesAlertProps} - noDataAlertProps={noDataAlertProps} - showDroppingFeaturesAlert={!remoteCalculation} - > + <WidgetWithAlert warning={warning} noDataAlertProps={noDataAlertProps}> {(!!data.length || isLoading) && ( <HistogramWidgetUI data={data} @@ -231,8 +221,7 @@ HistogramWidget.propTypes = { global: PropTypes.bool, onError: PropTypes.func, wrapperProps: PropTypes.object, - noDataAlertProps: PropTypes.object, - droppingFeaturesAlertProps: PropTypes.object + noDataAlertProps: PropTypes.object }; HistogramWidget.defaultProps = { diff --git a/packages/react-widgets/src/widgets/PieWidget.js b/packages/react-widgets/src/widgets/PieWidget.js index 89e5a97e1..18b55dbdd 100644 --- a/packages/react-widgets/src/widgets/PieWidget.js +++ b/packages/react-widgets/src/widgets/PieWidget.js @@ -38,7 +38,6 @@ const EMPTY_ARRAY = []; * @param {Function} [props.onError] - Function to handle error messages from the widget. * @param {object} [props.wrapperProps] - Extra props to pass to [WrapperWidgetUI](https://storybook-react.carto.com/?path=/docs/widgets-wrapperwidgetui--default). * @param {object} [props.noDataAlertProps] - Extra props to pass to [NoDataAlert](). - * @param {object} [props.droppingFeaturesAlertProps] - Extra props to pass to [NoDataAlert]() when dropping feature. */ function PieWidget({ id, @@ -58,8 +57,7 @@ function PieWidget({ colors, onError, wrapperProps, - noDataAlertProps, - droppingFeaturesAlertProps + noDataAlertProps }) { const dispatch = useDispatch(); @@ -70,8 +68,7 @@ function PieWidget({ const { data = [], isLoading, - warning, - remoteCalculation + warning } = useWidgetFetch(getCategories, { id, dataSource, @@ -113,14 +110,7 @@ function PieWidget({ return ( <WrapperWidgetUI title={title} isLoading={isLoading} {...wrapperProps}> - <WidgetWithAlert - dataSource={dataSource} - warning={warning} - global={global} - droppingFeaturesAlertProps={droppingFeaturesAlertProps} - noDataAlertProps={noDataAlertProps} - showDroppingFeaturesAlert={!remoteCalculation} - > + <WidgetWithAlert warning={warning} noDataAlertProps={noDataAlertProps}> {(!!data.length || isLoading) && ( <PieWidgetUI data={data} @@ -162,8 +152,7 @@ PieWidget.propTypes = { onError: PropTypes.func, colors: PropTypes.arrayOf(PropTypes.string), wrapperProps: PropTypes.object, - noDataAlertProps: PropTypes.object, - droppingFeaturesAlertProps: PropTypes.object + noDataAlertProps: PropTypes.object }; PieWidget.defaultProps = { diff --git a/packages/react-widgets/src/widgets/RangeWidget.js b/packages/react-widgets/src/widgets/RangeWidget.js index 79405c37a..659118055 100644 --- a/packages/react-widgets/src/widgets/RangeWidget.js +++ b/packages/react-widgets/src/widgets/RangeWidget.js @@ -132,12 +132,7 @@ function RangeWidget({ return ( <WrapperWidgetUI title={title} isLoading={isLoading} {...wrapperProps}> - <WidgetWithAlert - dataSource={dataSource} - warning={warning} - global={global} - showDroppingFeaturesAlert={false} - > + <WidgetWithAlert warning={warning}> {min !== undefined && max !== undefined && ( <RangeWidgetUI min={min} diff --git a/packages/react-widgets/src/widgets/ScatterPlotWidget.js b/packages/react-widgets/src/widgets/ScatterPlotWidget.js index 87de0f917..710a89912 100644 --- a/packages/react-widgets/src/widgets/ScatterPlotWidget.js +++ b/packages/react-widgets/src/widgets/ScatterPlotWidget.js @@ -25,7 +25,6 @@ import { _FeatureFlags, _hasFeatureFlag } from '@carto/react-core'; * @param {Function} [props.onError] - Function to handle error messages from the widget. * @param {object} [props.wrapperProps] - Extra props to pass to [WrapperWidgetUI](https://storybook-react.carto.com/?path=/docs/widgets-wrapperwidgetui--default). * @param {object} [props.noDataAlertProps] - Extra props to pass to [NoDataAlert](). - * @param {object} [props.droppingFeaturesAlertProps] - Extra props to pass to [NoDataAlert]() when dropping feature. */ function ScatterPlotWidget({ id, @@ -42,8 +41,7 @@ function ScatterPlotWidget({ global, onError, wrapperProps, - noDataAlertProps, - droppingFeaturesAlertProps + noDataAlertProps }) { const { data = [], @@ -65,13 +63,7 @@ function ScatterPlotWidget({ return ( <WrapperWidgetUI title={title} isLoading={isLoading} {...wrapperProps}> - <WidgetWithAlert - dataSource={dataSource} - warning={warning} - global={global} - droppingFeaturesAlertProps={droppingFeaturesAlertProps} - noDataAlertProps={noDataAlertProps} - > + <WidgetWithAlert warning={warning} noDataAlertProps={noDataAlertProps}> {(!!data.length || isLoading) && ( <ScatterPlotWidgetUI data={data} @@ -107,8 +99,7 @@ ScatterPlotWidget.propTypes = { tooltipFormatter: PropTypes.func, onError: PropTypes.func, wrapperProps: PropTypes.object, - noDataAlertProps: PropTypes.object, - droppingFeaturesAlertProps: PropTypes.object + noDataAlertProps: PropTypes.object }; ScatterPlotWidget.defaultProps = { diff --git a/packages/react-widgets/src/widgets/TableWidget.js b/packages/react-widgets/src/widgets/TableWidget.js index 2dcefe7dc..f538d8dd7 100644 --- a/packages/react-widgets/src/widgets/TableWidget.js +++ b/packages/react-widgets/src/widgets/TableWidget.js @@ -24,7 +24,6 @@ import { _FeatureFlags, _hasFeatureFlag } from '@carto/react-core'; * @param {string} [props.height] - Static widget height, required for scrollable table content. * @param {boolean=} [props.stableHeight] - If specified, error and no-data state will maintain same height as normal widget in loading/loaded state. * @param {boolean} [props.dense] - Whether the table should use a compact layout with smaller cell paddings. - * @param {object} [props.droppingFeaturesAlertProps] - Extra props to pass to [NoDataAlert]() when dropping feature. * @param {number} [props.pageSize] - Number of rows per page. This is used to manage internal state externally. */ @@ -43,7 +42,6 @@ function TableWidget({ height, stableHeight, dense, - droppingFeaturesAlertProps, // Internal state pageSize }) { @@ -57,8 +55,7 @@ function TableWidget({ const { data = { rows: [], totalCount: 0, hasData: false }, isLoading, - warning, - remoteCalculation + warning } = useWidgetFetch(getTable, { id, dataSource, @@ -102,11 +99,7 @@ function TableWidget({ return ( <WrapperWidgetUI title={title} {...wrapperProps} isLoading={isLoading}> <WidgetWithAlert - dataSource={dataSource} warning={warning} - global={global} - droppingFeaturesAlertProps={droppingFeaturesAlertProps} - showDroppingFeaturesAlert={!remoteCalculation} noDataAlertProps={noDataAlertProps} stableHeight={stableHeight} > @@ -149,7 +142,6 @@ TableWidget.propTypes = { onError: PropTypes.func, wrapperProps: PropTypes.object, noDataAlertProps: PropTypes.object, - droppingFeaturesAlertProps: PropTypes.object, initialPageSize: PropTypes.number, onPageSizeChange: PropTypes.func, height: PropTypes.string, diff --git a/packages/react-widgets/src/widgets/TimeSeriesWidget.js b/packages/react-widgets/src/widgets/TimeSeriesWidget.js index cd2f5ade2..1797d4a38 100644 --- a/packages/react-widgets/src/widgets/TimeSeriesWidget.js +++ b/packages/react-widgets/src/widgets/TimeSeriesWidget.js @@ -97,7 +97,6 @@ const debounceTimeout = 250; * @param {function} [props.onStop] - Event raised when the animation is stopped. * @param {function} [props.onTimelineUpdate] - Event raised when the timeline is updated. It happens when the animation is playing. The function receive as param the date that is being shown. * @param {function} [props.onTimeWindowUpdate] - Event raised when the timeWindow is updated. It happens when the animation is playing with a timeWindow enabled. The function receive as param an array of two date objects. - * @param {object} [props.droppingFeaturesAlertProps] - Extra props to pass to [NoDataAlert]() when dropping feature. * @param {boolean=} [props.showLegend] - Show/hide the legend. True by default only splitByCategory/multiple series mode. */ function TimeSeriesWidget({ @@ -115,7 +114,6 @@ function TimeSeriesWidget({ onError, wrapperProps, noDataAlertProps, - droppingFeaturesAlertProps, // UI chartType, timeAxisSplitNumber, @@ -204,8 +202,7 @@ function TimeSeriesWidget({ const { data: result = [], isLoading, - warning, - remoteCalculation + warning } = useWidgetFetch(getTimeSeries, { id, dataSource, @@ -429,12 +426,8 @@ function TimeSeriesWidget({ ]} > <WidgetWithAlert - dataSource={dataSource} warning={warning} - global={global} - droppingFeaturesAlertProps={droppingFeaturesAlertProps} noDataAlertProps={noDataAlertProps} - showDroppingFeaturesAlert={!remoteCalculation} stableHeight={stableHeight} > {(!!data.length || isLoading) && ( @@ -524,7 +517,6 @@ TimeSeriesWidget.propTypes = { onError: PropTypes.func, wrapperProps: PropTypes.object, noDataAlertProps: PropTypes.object, - droppingFeaturesAlertProps: PropTypes.object, // UI tooltip: PropTypes.bool, tooltipFormatter: PropTypes.func, diff --git a/packages/react-widgets/src/widgets/utils/WidgetWithAlert.js b/packages/react-widgets/src/widgets/utils/WidgetWithAlert.js index e43708408..ed9e368da 100644 --- a/packages/react-widgets/src/widgets/utils/WidgetWithAlert.js +++ b/packages/react-widgets/src/widgets/utils/WidgetWithAlert.js @@ -1,27 +1,15 @@ import React, { useState } from 'react'; -import { checkIfSourceIsDroppingFeature } from '@carto/react-redux'; import { NoDataAlert } from '@carto/react-ui'; -import { useSelector } from 'react-redux'; -import { defaultDroppingFeaturesAlertProps } from './defaultDroppingFeaturesAlertProps'; export default function WidgetWithAlert({ - dataSource, - droppingFeaturesAlertProps = defaultDroppingFeaturesAlertProps, - showDroppingFeaturesAlert = true, noDataAlertProps = {}, warning, - global = false, stableHeight, // if specified, "no-data" state will attempt to keep the same height as when rendered with data children }) { - const isDroppingFeatures = useSelector((state) => - checkIfSourceIsDroppingFeature(state, dataSource) - ); - const [childrenRef, setChildenRef] = useState(); const [savedHeight, setSavedHeight] = useState(); - const noData = - (!global && isDroppingFeatures && showDroppingFeaturesAlert) || warning || !children; + const noData = warning || !children; if (stableHeight) { if (noData && childrenRef && savedHeight === undefined) { @@ -33,11 +21,7 @@ export default function WidgetWithAlert({ return noData ? ( <NoDataAlert - {...(isDroppingFeatures - ? droppingFeaturesAlertProps - : warning - ? { ...noDataAlertProps, body: warning } - : noDataAlertProps)} + {...(warning ? { ...noDataAlertProps, body: warning } : noDataAlertProps)} style={{ height: savedHeight }} /> ) : ( diff --git a/packages/react-widgets/src/widgets/utils/defaultDroppingFeaturesAlertProps.js b/packages/react-widgets/src/widgets/utils/defaultDroppingFeaturesAlertProps.js deleted file mode 100644 index 124f71253..000000000 --- a/packages/react-widgets/src/widgets/utils/defaultDroppingFeaturesAlertProps.js +++ /dev/null @@ -1,3 +0,0 @@ -export const defaultDroppingFeaturesAlertProps = { - body: 'Data for this widget is not available at this zoom level. Zoom in to get data from features in the map.' -} diff --git a/packages/react-widgets/webpack.config.js b/packages/react-widgets/webpack.config.js index 6bb6ed60d..315d83ec1 100644 --- a/packages/react-widgets/webpack.config.js +++ b/packages/react-widgets/webpack.config.js @@ -11,7 +11,7 @@ const webpackConfig = { /^@deck.gl\/.+$/, /^@mui\/.+$/, /^@emotion\/.+$/, - /^@nebula.gl\/.+$/, + /^@deck.gl-community\/.+$/, 'react', 'react-dom', 'react-redux', diff --git a/packages/react-workers/package.json b/packages/react-workers/package.json index 8f342d40d..8d37e906c 100644 --- a/packages/react-workers/package.json +++ b/packages/react-workers/package.json @@ -1,6 +1,6 @@ { "name": "@carto/react-workers", - "version": "2.5.2", + "version": "3.0.0-alpha.7", "description": "CARTO for React - Workers", "author": "CARTO Dev Team", "keywords": [ @@ -66,7 +66,7 @@ }, "dependencies": { "@babel/runtime": "^7.13.9", - "@carto/react-core": "^2.5.2", + "@carto/react-core": "^3.0.0-alpha.7", "@turf/bbox-polygon": "^6.3.0", "@turf/boolean-intersects": "^6.3.0", "@turf/boolean-within": "^6.3.0", diff --git a/tsconfig.json b/tsconfig.json index fb6c3a177..ec3e89908 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,7 +11,7 @@ "allowSyntheticDefaultImports": true, "noEmit": true, "baseUrl": ".", - "compileOnSave": true, + // "compileOnSave": true, "paths": { "@carto/react-api/*": ["packages/react-api/src/*"], "@carto/react-auth/*": ["packages/react-auth/src/*"], diff --git a/yarn.lock b/yarn.lock index 766267c0a..5909fdaf7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1203,123 +1203,166 @@ enabled "2.0.x" kuler "^2.0.0" -"@danmarshall/deckgl-typings@4.9.12": - version "4.9.12" - resolved "https://registry.yarnpkg.com/@danmarshall/deckgl-typings/-/deckgl-typings-4.9.12.tgz#81ed316353550996cf5a139f40d8c01384264a93" - integrity sha512-hRXXDepfieobs+YFcjhoSXS97boSqgMAlWKREGwxBbqO/mE2seNJgQHPedsR+DeGJiK3hJsQmykt8TO51shJ4g== +"@deck.gl-community/editable-layers@^9.0.0-alpha.1": + version "9.0.0-alpha.1" + resolved "https://registry.yarnpkg.com/@deck.gl-community/editable-layers/-/editable-layers-9.0.0-alpha.1.tgz#3e85a6d8af36c34b51902438a6498045f8632ca1" + integrity sha512-CRYfqgZbpdxewaqXMcKrtbmZTQugGKv2dUk6H3A5rSSabDF75an4k0BHaR9gnejexk6/aBfCiIsm9fy+090KiQ== dependencies: - "@types/hammerjs" "^2.0.36" - "@types/react" "*" - indefinitely-typed "^1.1.0" + "@turf/along" "^6.5.0" + "@turf/area" "^6.5.0" + "@turf/bbox" "^6.5.0" + "@turf/bbox-polygon" "^6.5.0" + "@turf/bearing" "^6.5.0" + "@turf/boolean-point-in-polygon" "^6.5.0" + "@turf/buffer" "^6.5.0" + "@turf/center" "^6.5.0" + "@turf/centroid" "^6.5.0" + "@turf/circle" "^6.5.0" + "@turf/clone" "^6.5.0" + "@turf/destination" "^6.5.0" + "@turf/difference" "^6.5.0" + "@turf/distance" "^6.5.0" + "@turf/ellipse" "^6.5.0" + "@turf/helpers" "^6.5.0" + "@turf/intersect" "^6.5.0" + "@turf/invariant" "^6.5.0" + "@turf/line-intersect" "^6.5.0" + "@turf/meta" "^6.5.0" + "@turf/midpoint" "^6.5.0" + "@turf/nearest-point-on-line" "^6.5.0" + "@turf/point-to-line-distance" "^6.5.0" + "@turf/polygon-to-line" "^6.5.0" + "@turf/rewind" "^6.5.0" + "@turf/transform-rotate" "^6.5.0" + "@turf/transform-scale" "^6.5.0" + "@turf/transform-translate" "^6.5.0" + "@turf/union" "^6.5.0" + cubic-hermite-spline "^1.0.1" + eventemitter3 "^5.0.0" + geojson-types "^2.0.1" + lodash.throttle "^4.1.1" + uuid "9.0.0" + viewport-mercator-project ">=6.2.3" -"@deck.gl/aggregation-layers@^8.9.18": - version "8.9.18" - resolved "https://registry.yarnpkg.com/@deck.gl/aggregation-layers/-/aggregation-layers-8.9.18.tgz#0cb97e2a22458146bc32ea36afee31a13c1f45e7" - integrity sha512-9yyeUmb4jM4wdBHTHYOEP23fWPB2zWy/g/RbiifkzvGn1aTyCs45oDGPbq6YeaZ3rcepg6qn/Br4oaBAn6g6Qg== +"@deck.gl/aggregation-layers@^9.0.1": + version "9.0.8" + resolved "https://registry.yarnpkg.com/@deck.gl/aggregation-layers/-/aggregation-layers-9.0.8.tgz#b85cd1cfdc3e5b9550eca65043cc2b8cd9bdb38a" + integrity sha512-vZXswsClk7Ty5M0EBk5FIccEbt0uEheq2NxVZJxKo+8dlFP/lt/BYrRJsnmxIhaiuSVIfmzi0O9lJyeec44POg== dependencies: - "@luma.gl/constants" "^8.5.20" - "@luma.gl/shadertools" "^8.5.20" - "@math.gl/web-mercator" "^3.6.2" + "@luma.gl/constants" "^9.0.9" + "@luma.gl/shadertools" "^9.0.9" + "@math.gl/web-mercator" "^4.0.0" d3-hexbin "^0.2.1" -"@deck.gl/carto@^8.9.18": - version "8.9.18" - resolved "https://registry.yarnpkg.com/@deck.gl/carto/-/carto-8.9.18.tgz#b5079c8d452ced2131920f13785ec031e2d6ca1c" - integrity sha512-C2hDFdg6TnAmdkBGQ6c5gY9F0wkTxc/o/13QGTY3Zd5MFQMwImzb4Nzh32n0CIancaXXj9x39NdEv04+paX/Wg== - dependencies: - "@loaders.gl/gis" "^3.4.2" - "@loaders.gl/loader-utils" "^3.4.2" - "@loaders.gl/mvt" "^3.4.2" - "@loaders.gl/tiles" "^3.4.2" - "@luma.gl/constants" "^8.5.20" - "@math.gl/web-mercator" "^3.6.2" +"@deck.gl/carto@^9.0.1": + version "9.0.8" + resolved "https://registry.yarnpkg.com/@deck.gl/carto/-/carto-9.0.8.tgz#116f6b1c981b0c9ee99f9e6e9d150cbd4966b0ea" + integrity sha512-/NU9IxtY3CCMkTL/LjBLGMnNpZT7NNYWa7VGWalKGJAB8/+6/dWanee2UmFv5TyxVeevlXvwQI1yDrygTwYFng== + dependencies: + "@loaders.gl/gis" "^4.2.0" + "@loaders.gl/loader-utils" "^4.2.0" + "@loaders.gl/mvt" "^4.2.0" + "@loaders.gl/schema" "^4.2.0" + "@loaders.gl/tiles" "^4.2.0" + "@luma.gl/constants" "^9.0.9" + "@math.gl/web-mercator" "^4.0.0" + "@types/d3-array" "^3.0.2" + "@types/d3-color" "^1.4.2" + "@types/d3-scale" "^3.0.0" cartocolor "^4.0.2" d3-array "^3.2.0" d3-color "^3.1.0" d3-format "^3.1.0" d3-scale "^4.0.0" - h3-js "^3.7.0" + earcut "^2.2.4" + h3-js "^4.1.0" moment-timezone "^0.5.33" pbf "^3.2.1" - quadbin "^0.1.9" - -"@deck.gl/core@^8.9.18": - version "8.9.18" - resolved "https://registry.yarnpkg.com/@deck.gl/core/-/core-8.9.18.tgz#4a09defbc0f226a85c49864e2bbe324e2f9e43d5" - integrity sha512-zliaY4ZHebPCfMVEN6lxWuKDN+iNRL3XQwCLRX9N6ZqzzNFUXTLs//Vasdj+x8v4qEAQCJBEngzFPa0BemtvOQ== - dependencies: - "@loaders.gl/core" "^3.4.2" - "@loaders.gl/images" "^3.4.2" - "@luma.gl/constants" "^8.5.20" - "@luma.gl/core" "^8.5.20" - "@luma.gl/webgl" "^8.5.20" - "@math.gl/core" "^3.6.2" - "@math.gl/sun" "^3.6.2" - "@math.gl/web-mercator" "^3.6.2" - "@probe.gl/env" "^3.5.0" - "@probe.gl/log" "^3.5.0" - "@probe.gl/stats" "^3.5.0" + quadbin "^0.2.0" + +"@deck.gl/core@^9.0.1": + version "9.0.8" + resolved "https://registry.yarnpkg.com/@deck.gl/core/-/core-9.0.8.tgz#db5237184578c27b7a29f6373ff3487025070623" + integrity sha512-lZyU+Pdy3aSqikvfoGIpfNpZKP7+qdSxV4z1pOQOI9jRVjNpbLW4VzMqnFYVM43XsHDuqr57MKHnZRYS7Z9fzQ== + dependencies: + "@loaders.gl/core" "^4.2.0" + "@loaders.gl/images" "^4.2.0" + "@luma.gl/constants" "^9.0.9" + "@luma.gl/core" "^9.0.9" + "@luma.gl/engine" "^9.0.9" + "@luma.gl/shadertools" "^9.0.9" + "@luma.gl/webgl" "^9.0.9" + "@math.gl/core" "^4.0.0" + "@math.gl/sun" "^4.0.0" + "@math.gl/web-mercator" "^4.0.0" + "@probe.gl/env" "^4.0.9" + "@probe.gl/log" "^4.0.9" + "@probe.gl/stats" "^4.0.9" + "@types/offscreencanvas" "^2019.6.4" gl-matrix "^3.0.0" - math.gl "^3.6.2" mjolnir.js "^2.7.0" -"@deck.gl/extensions@^8.9.18": - version "8.9.18" - resolved "https://registry.yarnpkg.com/@deck.gl/extensions/-/extensions-8.9.18.tgz#899136199d9e14af052e29e3940dd01de49f0e1f" - integrity sha512-Tyrea4UiOm7KQQGjaEcXvtT1OHDjQErhZEt9GJcZx4MIbF6g2RZkR/gsXcNPYq4/sPg7evRlspe43TUMKUjYZw== - dependencies: - "@luma.gl/shadertools" "^8.5.20" - -"@deck.gl/geo-layers@^8.9.18": - version "8.9.18" - resolved "https://registry.yarnpkg.com/@deck.gl/geo-layers/-/geo-layers-8.9.18.tgz#d4b2cec11a5491081d9a383c3db87bd92d2c0cb7" - integrity sha512-vjOuMXK331JYvzdPUbMQK7DiPfYGXMuoFWtIAvmCihRg2Cw5nQspRTwIx7X2JxCQFYiKDmkq/4CRyE9Oz0X9Nw== - dependencies: - "@loaders.gl/3d-tiles" "^3.4.2" - "@loaders.gl/gis" "^3.4.2" - "@loaders.gl/loader-utils" "^3.4.2" - "@loaders.gl/mvt" "^3.4.2" - "@loaders.gl/schema" "^3.4.2" - "@loaders.gl/terrain" "^3.4.2" - "@loaders.gl/tiles" "^3.4.2" - "@loaders.gl/wms" "^3.4.2" - "@luma.gl/constants" "^8.5.20" - "@luma.gl/experimental" "^8.5.20" - "@math.gl/core" "^3.6.2" - "@math.gl/culling" "^3.6.2" - "@math.gl/web-mercator" "^3.6.2" +"@deck.gl/extensions@^9.0.1": + version "9.0.8" + resolved "https://registry.yarnpkg.com/@deck.gl/extensions/-/extensions-9.0.8.tgz#7c9a431631c96e704d9a8657fe6639bf793cbcbe" + integrity sha512-NLzrHsjZrs+zvRetVDOEPAM01sS5h/+cBb9RV7UhoUuWsfziPJ3JpK5yRPGFCo4TZqdZ/BdORMpVYp48GciLxg== + dependencies: + "@luma.gl/constants" "^9.0.9" + "@luma.gl/shadertools" "^9.0.9" + "@math.gl/core" "^4.0.0" + +"@deck.gl/geo-layers@^9.0.1": + version "9.0.8" + resolved "https://registry.yarnpkg.com/@deck.gl/geo-layers/-/geo-layers-9.0.8.tgz#5496df9d23f4442bab08ff7a9f8a84169a943c35" + integrity sha512-Df1cNKepmxruAJC3z+U/QCwkcsVqLFE5HWvcW/eM8cUb0OXa8MMUStYcErIluc2+82RX9QSiDyNtIEZdtn1J+g== + dependencies: + "@loaders.gl/3d-tiles" "^4.2.0" + "@loaders.gl/gis" "^4.2.0" + "@loaders.gl/loader-utils" "^4.2.0" + "@loaders.gl/mvt" "^4.2.0" + "@loaders.gl/schema" "^4.2.0" + "@loaders.gl/terrain" "^4.2.0" + "@loaders.gl/tiles" "^4.2.0" + "@loaders.gl/wms" "^4.2.0" + "@luma.gl/gltf" "^9.0.9" + "@luma.gl/shadertools" "^9.0.9" + "@math.gl/core" "^4.0.0" + "@math.gl/culling" "^4.0.0" + "@math.gl/web-mercator" "^4.0.0" "@types/geojson" "^7946.0.8" - h3-js "^3.7.0" + h3-js "^4.1.0" long "^3.2.0" -"@deck.gl/google-maps@^8.9.18": - version "8.9.18" - resolved "https://registry.yarnpkg.com/@deck.gl/google-maps/-/google-maps-8.9.18.tgz#7c689af409e2ea95c10944eedabfd67079a40eed" - integrity sha512-DGc0QeAJrRMI7aRBQq2i6bAEXVgGViUqUV6M5055rjK+ybtrhhQSwztzPYEFVJjqA0G6ITo7EeyjbBU0/7Nxww== +"@deck.gl/google-maps@^9.0.1": + version "9.0.8" + resolved "https://registry.yarnpkg.com/@deck.gl/google-maps/-/google-maps-9.0.8.tgz#6c4061692028a39383361d101a3ed2a0d06c04aa" + integrity sha512-w8L/Zaie1HeGbso5p0t9lJec+EEmhr3j1UdFWH+4RxNjLcQ6Pegv98ZEPQmvb9KwF44XrZXfrbEbaE8QPszyGA== + dependencies: + "@luma.gl/constants" "^9.0.9" + "@math.gl/core" "^4.0.0" + "@types/google.maps" "^3.48.6" -"@deck.gl/layers@^8.9.18": - version "8.9.18" - resolved "https://registry.yarnpkg.com/@deck.gl/layers/-/layers-8.9.18.tgz#1222f2ec3a5e4151c76e5d7655906c2d86258a18" - integrity sha512-O6X8ueTBp0r//47UeXCHXvr+TNKJPjdfmwQVzGSogFejOif1IVpU2hycIOJ5pMl/PdYs8uZK8VbZj7qYibsrMQ== +"@deck.gl/layers@^9.0.1": + version "9.0.8" + resolved "https://registry.yarnpkg.com/@deck.gl/layers/-/layers-9.0.8.tgz#55bb86e0d73d2c9e9584416185cacf377980321c" + integrity sha512-HFxVTHiJKM4UCaxRJGJtBWNd4/xEOHaD76eR7W7caviRjnWQn2iTC+ViDM+ElY2AtxbGIDcbF7tA/UdpAuPXLA== dependencies: - "@loaders.gl/images" "^3.4.2" - "@loaders.gl/schema" "^3.4.2" - "@luma.gl/constants" "^8.5.20" + "@loaders.gl/images" "^4.2.0" + "@loaders.gl/schema" "^4.2.0" "@mapbox/tiny-sdf" "^2.0.5" - "@math.gl/core" "^3.6.2" - "@math.gl/polygon" "^3.6.2" - "@math.gl/web-mercator" "^3.6.2" + "@math.gl/core" "^4.0.0" + "@math.gl/polygon" "^4.0.0" + "@math.gl/web-mercator" "^4.0.0" earcut "^2.2.4" -"@deck.gl/mesh-layers@^8.9.18": - version "8.9.18" - resolved "https://registry.yarnpkg.com/@deck.gl/mesh-layers/-/mesh-layers-8.9.18.tgz#c57262210773161d0ea0511625b4372892ca915c" - integrity sha512-1/kH8T7q2UbpUzxrbTiDGA1g75W99Oiz3vvNpPz18W+qEyWMyrxIv80yIdT1s4DKe9uPIfiktNjdYPuhD6q9xw== +"@deck.gl/mesh-layers@^9.0.1": + version "9.0.8" + resolved "https://registry.yarnpkg.com/@deck.gl/mesh-layers/-/mesh-layers-9.0.8.tgz#a6d105c4ad06104a60f202e77de5a70e798e90ce" + integrity sha512-rs1U90BpccMxViTIYzG4B7VpwfdbDQhbvv7lQvkVVDuvrEhIMkSPTkvqCV6R50cV8ZAm9wq5lD45GXmK2fQJjg== dependencies: - "@loaders.gl/gltf" "^3.4.2" - "@luma.gl/constants" "^8.5.20" - "@luma.gl/experimental" "^8.5.20" - "@luma.gl/shadertools" "^8.5.20" + "@loaders.gl/gltf" "^4.2.0" + "@luma.gl/gltf" "^9.0.9" + "@luma.gl/shadertools" "^9.0.9" "@discoveryjs/json-ext@^0.5.0", "@discoveryjs/json-ext@^0.5.3": version "0.5.7" @@ -2035,50 +2078,82 @@ dependencies: "@lit-labs/ssr-dom-shim" "^1.0.0" -"@loaders.gl/3d-tiles@^3.4.2": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@loaders.gl/3d-tiles/-/3d-tiles-3.4.4.tgz#e80f930fd7c318add0ef9df0699c623611c6fec6" - integrity sha512-o6z8h5541OYTQT546p1FJlMjiqFvTu29C6W9F9X3rPIUdnBirTpCubgpHcAw53AIDOrvlIxBKH/KDkqoxFIylQ== - dependencies: - "@loaders.gl/draco" "3.4.4" - "@loaders.gl/gltf" "3.4.4" - "@loaders.gl/loader-utils" "3.4.4" - "@loaders.gl/math" "3.4.4" - "@loaders.gl/tiles" "3.4.4" - "@math.gl/core" "^3.5.1" - "@math.gl/geospatial" "^3.5.1" +"@loaders.gl/3d-tiles@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@loaders.gl/3d-tiles/-/3d-tiles-4.2.0.tgz#6fc3b94ffb4fdb90654d706a8abc0a9c3afac067" + integrity sha512-WkHj5m5tk6Ga1AI276UTSzYERy9FL2CXFT08j6IvWGhmjNFAPHvckGlgDS/bciVj0IpsrR61xEtks73Q5YIFlQ== + dependencies: + "@loaders.gl/compression" "4.2.0" + "@loaders.gl/crypto" "4.2.0" + "@loaders.gl/draco" "4.2.0" + "@loaders.gl/gltf" "4.2.0" + "@loaders.gl/images" "4.2.0" + "@loaders.gl/loader-utils" "4.2.0" + "@loaders.gl/math" "4.2.0" + "@loaders.gl/tiles" "4.2.0" + "@loaders.gl/zip" "4.2.0" + "@math.gl/core" "^4.0.1" + "@math.gl/culling" "^4.0.1" + "@math.gl/geospatial" "^4.0.1" + "@probe.gl/log" "^4.0.4" long "^5.2.1" -"@loaders.gl/core@^3.4.2": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@loaders.gl/core/-/core-3.4.4.tgz#65c182fcf9e7e6536ac7d27d87635a8721843a95" - integrity sha512-uutqjvf91WJZx7WbSmJy75AHFNCPDnnweFnVmdAEflF6ohc+uAdjltqz6tGD3PxbT8LjNLTOk60kxyC/QwDBqQ== +"@loaders.gl/compression@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@loaders.gl/compression/-/compression-4.2.0.tgz#8d7763b1350007e02c20546d326d32f60e91268a" + integrity sha512-7dDR3h/y8HB73HVX4dVybEePzBJKQH6Gpb2VSPptZ0BoftWjctI+BRjKI8+SgPqIsJ0qOHkfvvIVLWalYuuzvA== + dependencies: + "@loaders.gl/loader-utils" "4.2.0" + "@loaders.gl/worker-utils" "4.2.0" + "@types/brotli" "^1.3.0" + "@types/pako" "^1.0.1" + fflate "0.7.4" + lzo-wasm "^0.0.4" + pako "1.0.11" + snappyjs "^0.6.1" + optionalDependencies: + brotli "^1.3.2" + lz4js "^0.2.0" + zstd-codec "^0.1" + +"@loaders.gl/core@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@loaders.gl/core/-/core-4.2.0.tgz#bb76e278f04e32636b58cffd9bf633d3af39d3d7" + integrity sha512-HCl+1BdNTcfKGi5+MhZh7ABKhybAjbhsJUsjhJxp2kYEW+2zybHoYPLvZLJFSuu88J/e5FqnL1HmdEFwn6oPXQ== dependencies: - "@babel/runtime" "^7.3.1" - "@loaders.gl/loader-utils" "3.4.4" - "@loaders.gl/worker-utils" "3.4.4" - "@probe.gl/log" "^4.0.1" + "@loaders.gl/loader-utils" "4.2.0" + "@loaders.gl/schema" "4.2.0" + "@loaders.gl/worker-utils" "4.2.0" + "@probe.gl/log" "^4.0.2" -"@loaders.gl/draco@3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@loaders.gl/draco/-/draco-3.4.4.tgz#cf2db51cf413a866363475da439382ef6878e579" - integrity sha512-VtJffpDbcdA0/uJzzJIET3B5j96cz6g5f93Wg2tlGtvnKZvJs4bjyojur4p7u5ElHJARm36F91N7Td4jGvMbYw== +"@loaders.gl/crypto@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@loaders.gl/crypto/-/crypto-4.2.0.tgz#80d31e96262fd28f7b5c564c64019646714efe7a" + integrity sha512-/SJI8NB1SrPWeRdkwtIN3lOzYJgcQw0USmLt+cQhux5lLqxw6MjsLeVU8k559KEhEQvIAvIiYLNtPHflKdQTrA== dependencies: - "@babel/runtime" "^7.3.1" - "@loaders.gl/loader-utils" "3.4.4" - "@loaders.gl/schema" "3.4.4" - "@loaders.gl/worker-utils" "3.4.4" - draco3d "1.5.5" - -"@loaders.gl/gis@3.4.4", "@loaders.gl/gis@^3.4.2": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@loaders.gl/gis/-/gis-3.4.4.tgz#74390f4271e26b0bcc83bbe5786947658c3093bd" - integrity sha512-QwGOdpaE/jb1KsgHEkkiUD7C+dHWSDJKfMKM5OStIMPABX0Cxd8MSqyQ8+BOFWM7kdqXdMvgRjB9912R6T4AHQ== - dependencies: - "@loaders.gl/loader-utils" "3.4.4" - "@loaders.gl/schema" "3.4.4" + "@loaders.gl/loader-utils" "4.2.0" + "@loaders.gl/worker-utils" "4.2.0" + "@types/crypto-js" "^4.0.2" + +"@loaders.gl/draco@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@loaders.gl/draco/-/draco-4.2.0.tgz#4806c311412b3021da3e9fb8e0d369830f68015a" + integrity sha512-nOcAt7/Dj2GeRstQMfWY0E5QMO55DanEbvXhIrSNh8ebk3XqOEMjhIxzy81VadPydSrnDhi6dVmmcEQXbL3Dpw== + dependencies: + "@loaders.gl/loader-utils" "4.2.0" + "@loaders.gl/schema" "4.2.0" + "@loaders.gl/worker-utils" "4.2.0" + draco3d "1.5.7" + +"@loaders.gl/gis@4.2.0", "@loaders.gl/gis@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@loaders.gl/gis/-/gis-4.2.0.tgz#d246f03fdea8aaa4146468aee33d33d8994e1793" + integrity sha512-rwpchq5iAvFShhXsRcd1cZfRFdsA6gNzYwIgwK1UsoXiBzFvCoJ3Hn8b2fn3Z/x3wuTWX83Cxobr8aoVymMzwQ== + dependencies: + "@loaders.gl/loader-utils" "4.2.0" + "@loaders.gl/schema" "4.2.0" "@mapbox/vector-tile" "^1.3.1" - "@math.gl/polygon" "^3.5.1" + "@math.gl/polygon" "^4.0.0" pbf "^3.2.1" "@loaders.gl/gis@^2.3.13": @@ -2090,23 +2165,24 @@ "@mapbox/vector-tile" "^1.3.1" pbf "^3.2.1" -"@loaders.gl/gltf@3.4.4", "@loaders.gl/gltf@^3.4.2": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@loaders.gl/gltf/-/gltf-3.4.4.tgz#9b68965432bebda85db05fd354cb348fab37f7a0" - integrity sha512-8dbyZChWXku+OoL64rccFa60uxBhbRLdDelfCZqopRxwI/JF8ZCAEGuoFAftw84sU97JmfJbnCtcMMc8bebv4w== +"@loaders.gl/gltf@4.2.0", "@loaders.gl/gltf@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@loaders.gl/gltf/-/gltf-4.2.0.tgz#eeb01d1afee13a27d336d1ff4b445a238b11a06a" + integrity sha512-t15dYnnfmQCGa5mar9KoShVxIVHNH5zAcoLRKpIXhPEvRmOdMeXETwAYQeJ73+IfK/EzY6OwkTlu6Kwm/0EgEw== dependencies: - "@loaders.gl/draco" "3.4.4" - "@loaders.gl/images" "3.4.4" - "@loaders.gl/loader-utils" "3.4.4" - "@loaders.gl/textures" "3.4.4" - "@math.gl/core" "^3.5.1" + "@loaders.gl/draco" "4.2.0" + "@loaders.gl/images" "4.2.0" + "@loaders.gl/loader-utils" "4.2.0" + "@loaders.gl/schema" "4.2.0" + "@loaders.gl/textures" "4.2.0" + "@math.gl/core" "^4.0.0" -"@loaders.gl/images@3.4.4", "@loaders.gl/images@^3.4.2": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@loaders.gl/images/-/images-3.4.4.tgz#ce0d56caac49ebf63f76a6234f1df4a7b8c99441" - integrity sha512-ViMh58oZ2GLsKCoYBH4nYMvi5fHeVZXiLAABVP+AVU54Jrf+PZYm8y8KaC22zBmGEZ15hGhJF/dNeOpgqZ+V4w== +"@loaders.gl/images@4.2.0", "@loaders.gl/images@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@loaders.gl/images/-/images-4.2.0.tgz#961504856a3a997e71c116acc908eef6c945c67b" + integrity sha512-0rntM3HheRsvlIESZiy39GDBj6FJ1L85wcMaIzmgre+AlCVZnuc0s619tgsbk+oJ+syPEtbzdyg+Ud05TIXhzA== dependencies: - "@loaders.gl/loader-utils" "3.4.4" + "@loaders.gl/loader-utils" "4.2.0" "@loaders.gl/loader-utils@2.3.13": version "2.3.13" @@ -2116,179 +2192,166 @@ "@babel/runtime" "^7.3.1" "@probe.gl/stats" "^3.3.0" -"@loaders.gl/loader-utils@3.4.4", "@loaders.gl/loader-utils@^3.4.2": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@loaders.gl/loader-utils/-/loader-utils-3.4.4.tgz#06a9185e6b9a6457aaaf4f5526dca25c9021ff25" - integrity sha512-EFY/YBniNyfZk0ojnBitl+xRL3Du8tinOwdFnWD0rVIf61+bFifFI0fJys8/tgrlF6sfiKdYbupow8G/a3xF2g== +"@loaders.gl/loader-utils@4.2.0", "@loaders.gl/loader-utils@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@loaders.gl/loader-utils/-/loader-utils-4.2.0.tgz#cb8ec688687ab5cfd06daceb57d133c17b6e4e8e" + integrity sha512-kWM3yMTGLqkBwb/CdWhzQU6P17PZelyFvUm5LtPm1LHo1tVuxutBeo5wl0FuAraJIx4O4/oCR0iNdb4l58wKRg== dependencies: - "@babel/runtime" "^7.3.1" - "@loaders.gl/worker-utils" "3.4.4" - "@probe.gl/stats" "^4.0.1" - -"@loaders.gl/math@3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@loaders.gl/math/-/math-3.4.4.tgz#4e427fdd1bd954b4667303df71ae21cbe1dacad3" - integrity sha512-l5ZGV7gAznj0nFjfiKIP9qIrSKLLiaRvGC2pmbM4J+2A674Sj59WwoZiASYNevOlByjScIwyZWe62wcneuyIWw== - dependencies: - "@loaders.gl/images" "3.4.4" - "@loaders.gl/loader-utils" "3.4.4" - "@math.gl/core" "^3.5.1" - -"@loaders.gl/mvt@^3.4.2": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@loaders.gl/mvt/-/mvt-3.4.4.tgz#7c7559912ed3ef6e995e0baae20cc7c6b090375b" - integrity sha512-qxGe+EmuaDlXBs/EeBFzIKipgv+YrAm2BlHzyxLOsdBVmay9q31OYCqdigVw3Fc5h30D65hOfBC6k1lKo4OUyw== - dependencies: - "@loaders.gl/gis" "3.4.4" - "@loaders.gl/loader-utils" "3.4.4" - "@loaders.gl/schema" "3.4.4" - "@math.gl/polygon" "^3.5.1" + "@loaders.gl/schema" "4.2.0" + "@loaders.gl/worker-utils" "4.2.0" + "@probe.gl/stats" "^4.0.2" + +"@loaders.gl/math@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@loaders.gl/math/-/math-4.2.0.tgz#f688df333c1adb5c698cd2098f1821f835bbab31" + integrity sha512-Z3NRoVJcmKPrkSfsd9bwpvRmWy/VI6MjD/eZ4AWObqtbVPsbaupUvk5Cc26djYkJ373nCE38D8jE25+lKvPqAQ== + dependencies: + "@loaders.gl/images" "4.2.0" + "@loaders.gl/loader-utils" "4.2.0" + "@math.gl/core" "^4.0.0" + +"@loaders.gl/mvt@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@loaders.gl/mvt/-/mvt-4.2.0.tgz#9c1b921f611ced39b7a6d9fa74f90a52ef9a9587" + integrity sha512-W/JHmWSP4hwWJb3xWtGqjTvn/TPSOhA651FptXT9SXWyLglEwKCrlSy4uTr1fFu1fxSJXxo6cQmWVVmVmYN7VA== + dependencies: + "@loaders.gl/gis" "4.2.0" + "@loaders.gl/images" "4.2.0" + "@loaders.gl/loader-utils" "4.2.0" + "@loaders.gl/schema" "4.2.0" + "@math.gl/polygon" "^4.0.0" pbf "^3.2.1" -"@loaders.gl/schema@3.4.4", "@loaders.gl/schema@^3.4.2": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@loaders.gl/schema/-/schema-3.4.4.tgz#551c74a03a6d0f82913125bf2aca3254de67e0cb" - integrity sha512-+lESS+cUSgXst9kxaW2LTxWMVMrT96cv0TWfsSryA11EVsxr50aSPWC+K0BHe7k60+80pQWEt4iyMRgVHM+6tg== +"@loaders.gl/schema@4.2.0", "@loaders.gl/schema@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@loaders.gl/schema/-/schema-4.2.0.tgz#87c1da01aa15a45060ea54010504bc0c87689d38" + integrity sha512-xM5PY3k9UvyXz6rgCyouGSIbfzdsmrR2zYEhI5prFYwgjnOJX0D5Wz4TpsuNQaVpsAGC6cZXgQU6nmhScQYJyQ== dependencies: "@types/geojson" "^7946.0.7" -"@loaders.gl/terrain@^3.4.2": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@loaders.gl/terrain/-/terrain-3.4.4.tgz#4af56000d7b0722a421282621ad3c625fc7142c4" - integrity sha512-IXX9uBlhRaehKMkFBmIclbexygTkRtDXTGg1r5p+SOITTnt1QYCM2J2q49Fntpi19reyVl9n+DzA81Pb8YeNLg== +"@loaders.gl/terrain@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@loaders.gl/terrain/-/terrain-4.2.0.tgz#553e61baf6dae1eb8af87cd2a6cc523d7074ef2c" + integrity sha512-j7LA5kU5Y4ZWEEXzpQOnmyIaQoIh07AkQj2FSnrEM0AwYgq9xSVa31otPk5WegEzOwbUOsWgHLtxju52HDUHJQ== dependencies: - "@babel/runtime" "^7.3.1" - "@loaders.gl/images" "3.4.4" - "@loaders.gl/loader-utils" "3.4.4" - "@loaders.gl/schema" "3.4.4" + "@loaders.gl/images" "4.2.0" + "@loaders.gl/loader-utils" "4.2.0" + "@loaders.gl/schema" "4.2.0" "@mapbox/martini" "^0.2.0" -"@loaders.gl/textures@3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@loaders.gl/textures/-/textures-3.4.4.tgz#9d5199ad49d4c2e30f21b170a717844dd143ffc0" - integrity sha512-CD1CPKvXJy3TzzCq42xpwrpYdjimJ7bKf5GSwDs2+qx/fZDnmJBk9z/762VzXyUwTpgGFk3XzbEwkP6H4vkESg== - dependencies: - "@loaders.gl/images" "3.4.4" - "@loaders.gl/loader-utils" "3.4.4" - "@loaders.gl/schema" "3.4.4" - "@loaders.gl/worker-utils" "3.4.4" +"@loaders.gl/textures@4.2.0", "@loaders.gl/textures@^4.1.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@loaders.gl/textures/-/textures-4.2.0.tgz#d1473e3b4933725ef130c66ec18502bd810d79ec" + integrity sha512-T+MoSyVCUQAjPTbDRnEXhQxyn5iU5nMzYiMI59VElp43WkShU3s7k4OB6HhAFPfIeqlD0ZPnm3ecgYZ/BZbZ6w== + dependencies: + "@loaders.gl/images" "4.2.0" + "@loaders.gl/loader-utils" "4.2.0" + "@loaders.gl/schema" "4.2.0" + "@loaders.gl/worker-utils" "4.2.0" + "@math.gl/types" "^4.0.1" ktx-parse "^0.0.4" texture-compressor "^1.0.2" -"@loaders.gl/tiles@3.4.4", "@loaders.gl/tiles@^3.4.2": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@loaders.gl/tiles/-/tiles-3.4.4.tgz#8e0597a7cda501e4a1a6a35d6434f27407a487d3" - integrity sha512-Z2doHX4+9RTDpQZJ2EHqxcwXxvqWkJoD8i4wh/DvSZgp9Ccot4L7wb907gHyYvDZ3lzQc0mx7LVcC6BBNvKS8w== - dependencies: - "@loaders.gl/loader-utils" "3.4.4" - "@loaders.gl/math" "3.4.4" - "@math.gl/core" "^3.5.1" - "@math.gl/culling" "^3.5.1" - "@math.gl/geospatial" "^3.5.1" - "@math.gl/web-mercator" "^3.5.1" - "@probe.gl/stats" "^4.0.1" - -"@loaders.gl/wms@^3.4.2": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@loaders.gl/wms/-/wms-3.4.4.tgz#447124ee599d3c45ca668f3aa36776f449b47108" - integrity sha512-CVYldmVQq9rADw6ex5rLc0mrhqvq5LogUGQHAdRgU2HfpdLEVYjHOJuPzmZfDVQHMNw6a9QQBo54thjSQn5BbA== +"@loaders.gl/tiles@4.2.0", "@loaders.gl/tiles@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@loaders.gl/tiles/-/tiles-4.2.0.tgz#2d8a32b9bdf7fe9df01801424eeca947ae653536" + integrity sha512-PjOFSZfiA5ioqRObF0sPVwnqnrCRU9Mw1gt36buga4UF7AYvbirKY/BysrM1NkqCSG0SWNbMGUdhBn41jlQv5g== + dependencies: + "@loaders.gl/loader-utils" "4.2.0" + "@loaders.gl/math" "4.2.0" + "@math.gl/core" "^4.0.0" + "@math.gl/culling" "^4.0.0" + "@math.gl/geospatial" "^4.0.0" + "@math.gl/web-mercator" "^4.0.0" + "@probe.gl/stats" "^4.0.2" + +"@loaders.gl/wms@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@loaders.gl/wms/-/wms-4.2.0.tgz#d324306acd566ae0b4093d8d5b00f5d8b9bd00c9" + integrity sha512-dN/q2rCaY9m3Sg06uq6Jq96reyYc+A8WwaMs0ehWIg7fQ1R/mh2cHCvmx/fBnY97fmIMPjrd+7wG3hluYcnssw== dependencies: - "@babel/runtime" "^7.3.1" - "@loaders.gl/images" "3.4.4" - "@loaders.gl/loader-utils" "3.4.4" - "@loaders.gl/schema" "3.4.4" - "@loaders.gl/xml" "3.4.4" + "@loaders.gl/images" "4.2.0" + "@loaders.gl/loader-utils" "4.2.0" + "@loaders.gl/schema" "4.2.0" + "@loaders.gl/xml" "4.2.0" "@turf/rewind" "^5.1.5" deep-strict-equal "^0.2.0" - lerc "^4.0.1" - -"@loaders.gl/worker-utils@3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@loaders.gl/worker-utils/-/worker-utils-3.4.4.tgz#4447814e4746aa206771307429fd1174e720131e" - integrity sha512-ltqMd+BsAk3QGPLycZODukL1wNyBEb04X6wpI3rC5NWByzwSippwWTW4g4QnS3Q9zgMFV4jR/YV6CRp/GiVzvQ== - dependencies: - "@babel/runtime" "^7.3.1" - -"@loaders.gl/xml@3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@loaders.gl/xml/-/xml-3.4.4.tgz#e15b3bc25c2f60776ab2557752cb0981b98725ec" - integrity sha512-y8idCKtyjVsIIpDDxZ8K53nLNJpzEffBadPNWfuhWWXCggOuQZhrnBWKnNrBu9GeO1ShYwrN8ea7GKdALl4fhA== - dependencies: - "@babel/runtime" "^7.3.1" - "@loaders.gl/loader-utils" "3.4.4" - "@loaders.gl/schema" "3.4.4" - fast-xml-parser "^4.1.3" -"@luma.gl/constants@8.5.20", "@luma.gl/constants@^8.5.20": - version "8.5.20" - resolved "https://registry.yarnpkg.com/@luma.gl/constants/-/constants-8.5.20.tgz#91de116f68110fb28a000b59747d34d54bc06ab2" - integrity sha512-5yG+ybkUZ4j6kLPWMZjN4Hun2yLB0MyEpNCRKAUN9/yS9UIWA7unyVxjSf2vnE7k/7dywtxlbXegASNFgNVGxw== - -"@luma.gl/core@^8.5.20": - version "8.5.20" - resolved "https://registry.yarnpkg.com/@luma.gl/core/-/core-8.5.20.tgz#8b6cea7b5d7230e8b2848c310fc092af2c652571" - integrity sha512-xJr96G6vhYcznYHC84fbeOG3fgNM4lFwj9bd0VPcg/Kfe8otUeN1Hl0AKHCCtNn48PiMSg3LKbaiRfNUMhaffQ== - dependencies: - "@babel/runtime" "^7.0.0" - "@luma.gl/constants" "8.5.20" - "@luma.gl/engine" "8.5.20" - "@luma.gl/gltools" "8.5.20" - "@luma.gl/shadertools" "8.5.20" - "@luma.gl/webgl" "8.5.20" - -"@luma.gl/engine@8.5.20": - version "8.5.20" - resolved "https://registry.yarnpkg.com/@luma.gl/engine/-/engine-8.5.20.tgz#5ef3fa7b69a3bcfeda5991ed9f1d75445cbfbf13" - integrity sha512-+0ryJ/4gL1pWaEgZimY21jUPt1LYiO6Cqte8TNUprCfAHoAStsuzD7jwgEqnM6jJOUEdIxQ3w0z3Dzw/0KIE+w== - dependencies: - "@babel/runtime" "^7.0.0" - "@luma.gl/constants" "8.5.20" - "@luma.gl/gltools" "8.5.20" - "@luma.gl/shadertools" "8.5.20" - "@luma.gl/webgl" "8.5.20" - "@math.gl/core" "^3.5.0" - "@probe.gl/env" "^3.5.0" - "@probe.gl/stats" "^3.5.0" - "@types/offscreencanvas" "^2019.7.0" - -"@luma.gl/experimental@^8.5.20": - version "8.5.20" - resolved "https://registry.yarnpkg.com/@luma.gl/experimental/-/experimental-8.5.20.tgz#1bb4c458eaadc81f357aead7b7d3067f7c665c94" - integrity sha512-V1Jp68rYMPtwMdf+50r3NSYsGV3srjwZ+lcK2ew4DshjedDbYwLqTGMWcOyBhY3K3aCl2LH3Fhn0hAY+3NTLGA== - dependencies: - "@luma.gl/constants" "8.5.20" - "@math.gl/core" "^3.5.0" - earcut "^2.0.6" - -"@luma.gl/gltools@8.5.20": - version "8.5.20" - resolved "https://registry.yarnpkg.com/@luma.gl/gltools/-/gltools-8.5.20.tgz#eb35b44b185a83e2e46f1a4f61b51661b95aaf32" - integrity sha512-5pP6ph9FSX5gHiVWQM1DmYRUnriklzKUG9yaqlQsKEqCFsOcKB0EfK3MfBVXIfsOdP/1bJZ9Dlz/zV19soWVhg== - dependencies: - "@babel/runtime" "^7.0.0" - "@luma.gl/constants" "8.5.20" - "@probe.gl/env" "^3.5.0" - "@probe.gl/log" "^3.5.0" - "@types/offscreencanvas" "^2019.7.0" +"@loaders.gl/worker-utils@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@loaders.gl/worker-utils/-/worker-utils-4.2.0.tgz#8dc31b2aac6bc2a5ae80b174aca370926c9f3d3f" + integrity sha512-sTfalI6utDO7/0i89bE5Ex+uXK6Kull7U3IozkDNPSn6JhNwCvkujhcmQWEFxEPY0CQRVZBq95pjbCYbYYLJpQ== -"@luma.gl/shadertools@8.5.20", "@luma.gl/shadertools@^8.5.20": - version "8.5.20" - resolved "https://registry.yarnpkg.com/@luma.gl/shadertools/-/shadertools-8.5.20.tgz#ee09f3880acdd1599619dead3ca5fbe4116bb8b6" - integrity sha512-q1lrCZy1ncIFb4mMjsYgISLzNP6eMnhLUY+Oltj/qjAMcPEssCeHN2+XGfP/CVtU+O7sC+5JY2bQGaTs6HQ/Qw== +"@loaders.gl/xml@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@loaders.gl/xml/-/xml-4.2.0.tgz#53508e0ee79936e07fff40a788ba67d81e6814d7" + integrity sha512-du9s+dubvLsJPzSvugUY3WwBuDvv3ZKOVtLaiakeqsQeOwbcvXa6LQgSR2nT79KQ2DL1+U51ctQHjtXLyOc6PA== dependencies: - "@babel/runtime" "^7.0.0" - "@math.gl/core" "^3.5.0" + "@loaders.gl/loader-utils" "4.2.0" + "@loaders.gl/schema" "4.2.0" + fast-xml-parser "^4.2.5" -"@luma.gl/webgl@8.5.20", "@luma.gl/webgl@^8.5.20": - version "8.5.20" - resolved "https://registry.yarnpkg.com/@luma.gl/webgl/-/webgl-8.5.20.tgz#7eef0d695a2a62d0bbe57227c239930a4acf179f" - integrity sha512-p/kt9KztywH4l+09XHoZ4cPFOoE7xlZXIBMT8rxRVgfe1w0lvi7QYh4tOG7gk+iixQ34EyDQacoHCsabdpmqQg== - dependencies: - "@babel/runtime" "^7.0.0" - "@luma.gl/constants" "8.5.20" - "@luma.gl/gltools" "8.5.20" - "@probe.gl/env" "^3.5.0" - "@probe.gl/stats" "^3.5.0" +"@loaders.gl/zip@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@loaders.gl/zip/-/zip-4.2.0.tgz#602b77f1e6f41892bcbe36a02721610eb8ba200d" + integrity sha512-BrdGE0AIt9ZwlLMx7knZ/fsEUr2bL5RHDYE2f4A4vlH3LBRnXaiZDSfMPwQWJinEKpSHRnysGwqD6zSSUyhVHQ== + dependencies: + "@loaders.gl/compression" "4.2.0" + "@loaders.gl/crypto" "4.2.0" + "@loaders.gl/loader-utils" "4.2.0" + jszip "^3.1.5" + md5 "^2.3.0" + +"@luma.gl/constants@9.0.9", "@luma.gl/constants@^9.0.9": + version "9.0.9" + resolved "https://registry.yarnpkg.com/@luma.gl/constants/-/constants-9.0.9.tgz#4fdb735c4b78f09aa92db2b8020b0175ed279bb9" + integrity sha512-o8NgH4F//e2wVWyZoYmaoopoTejDEITBP78fJtU2ivmCW1viCvByUawEXISPzsekHosDYo9q1/XFjmusXZa3fQ== + +"@luma.gl/core@^9.0.9": + version "9.0.9" + resolved "https://registry.yarnpkg.com/@luma.gl/core/-/core-9.0.9.tgz#1199400c94d60171875dcbbaa3d2ed2579607df1" + integrity sha512-G0N4+bSWLU6gt3grgzF5xf+vMnfYaryHFLDkAeZV5kJ2helnfzUsjwUKCEYk36V2vygu7TEXlByYgwestB7+Ew== + dependencies: + "@math.gl/types" "^4.0.0" + "@probe.gl/env" "^4.0.2" + "@probe.gl/log" "^4.0.2" + "@probe.gl/stats" "^4.0.2" + "@types/offscreencanvas" "^2019.6.4" + +"@luma.gl/engine@^9.0.9": + version "9.0.9" + resolved "https://registry.yarnpkg.com/@luma.gl/engine/-/engine-9.0.9.tgz#5eaeb784a4731969eca62acf4cf8fdb4d0d239ab" + integrity sha512-4qW4OCYaGZJ/iGqerAtnP8FzcNtnXvv+aShLkE4ay2D4zdOIML5kZSLslmU/ByZ3FR606k0c5AjTBOgZ77lkiQ== + dependencies: + "@luma.gl/shadertools" "9.0.9" + "@math.gl/core" "^4.0.0" + "@probe.gl/log" "^4.0.2" + "@probe.gl/stats" "^4.0.2" + +"@luma.gl/gltf@^9.0.9": + version "9.0.9" + resolved "https://registry.yarnpkg.com/@luma.gl/gltf/-/gltf-9.0.9.tgz#9c326e066cd73806b01bf8f79b46c0b942b9cf74" + integrity sha512-QuV4gbxIZ8qGOmZsf9DGvavogQUyplpDVAs38eczBBqIKCGFq2d+mOIQMmn1SWFF0RjicjyjnQ2KAFWgdy2jIQ== + dependencies: + "@loaders.gl/textures" "^4.1.0" + "@luma.gl/shadertools" "9.0.9" + "@math.gl/core" "^4.0.0" + +"@luma.gl/shadertools@9.0.9", "@luma.gl/shadertools@^9.0.9": + version "9.0.9" + resolved "https://registry.yarnpkg.com/@luma.gl/shadertools/-/shadertools-9.0.9.tgz#88269c9889a32cd8636e7bb2351fe8d5d8b77ba9" + integrity sha512-99wfDMtkIeWziAf96UrqXteJi4uBFvMN0TdU8TvTv0V6BJRjd1xZVWnF9Xx2D+DPH9Mmn4q/hQH0NJ0sQlYeHw== + dependencies: + "@math.gl/core" "^4.0.0" + "@math.gl/types" "^4.0.0" + +"@luma.gl/webgl@^9.0.9": + version "9.0.9" + resolved "https://registry.yarnpkg.com/@luma.gl/webgl/-/webgl-9.0.9.tgz#c8d9563a0e45bef2a2cb3ddfc9efbff558e3f954" + integrity sha512-dP91Md5u6OnK3PFt0h1uqcxWh3T/COBHyZ5OcAirRUB1laFdzhdXUWbtuvLgpF6b7o0MsaEUcXaAbYf+e7lEzA== + dependencies: + "@luma.gl/constants" "9.0.9" + "@probe.gl/env" "^4.0.2" "@mapbox/martini@^0.2.0": version "0.2.0" @@ -2319,53 +2382,76 @@ dependencies: "@mapbox/point-geometry" "~0.1.0" -"@math.gl/core@3.6.3", "@math.gl/core@^3.5.0", "@math.gl/core@^3.5.1", "@math.gl/core@^3.6.2": - version "3.6.3" - resolved "https://registry.yarnpkg.com/@math.gl/core/-/core-3.6.3.tgz#a6bf796ed421093099749d609de8d99a3ac20a53" - integrity sha512-jBABmDkj5uuuE0dTDmwwss7Cup5ZwQ6Qb7h1pgvtkEutTrhkcv8SuItQNXmF45494yIHeoGue08NlyeY6wxq2A== +"@math.gl/core@4.0.0", "@math.gl/core@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@math.gl/core/-/core-4.0.0.tgz#db64af16743ee4def7c1e294b3d1247621d2dabc" + integrity sha512-qGbP4R8G0dsh5OUO+eWKX5NJwZitkV8CdVEolRFSoPteE0lrWxsg01FwAjegKv4jCm975VJ4HxDcb4L6KAiGGw== dependencies: "@babel/runtime" "^7.12.0" - "@math.gl/types" "3.6.3" - gl-matrix "^3.4.0" + "@math.gl/types" "4.0.0" -"@math.gl/culling@^3.5.1", "@math.gl/culling@^3.6.2": - version "3.6.3" - resolved "https://registry.yarnpkg.com/@math.gl/culling/-/culling-3.6.3.tgz#91cdfa496748e8873a2e6261415a27a27b6af5f2" - integrity sha512-3UERXHbaPlM6pnTk2MI7LeQ5CoelDZzDzghTTcv+HdQCZsT/EOEuEdYimETHtSxiyiOmsX2Un65UBLYT/rbKZg== +"@math.gl/core@4.0.1", "@math.gl/core@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@math.gl/core/-/core-4.0.1.tgz#0deafe0f0cab7afb119aa58c57671c86a2659e80" + integrity sha512-9IewNjR9V66o+gYIIq5agFoHy6ZT6DRpRGQBfsUpZz4glAqOjVt64he8GGzjpmqfT+kKT4qwQ7nQl/hZLF15qA== + dependencies: + "@math.gl/types" "4.0.1" + +"@math.gl/culling@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@math.gl/culling/-/culling-4.0.0.tgz#5bb96ec38645944088176911a6f4aab43b265cb9" + integrity sha512-8+btkQZtirG64kGbWs/UBoLnXPLw83D1g0sKgZQG32bQLm2dnArMynfqkPs/Mkj5Cm3MvwkTSdz6vN4a3FF6UA== dependencies: "@babel/runtime" "^7.12.0" - "@math.gl/core" "3.6.3" - gl-matrix "^3.4.0" + "@math.gl/core" "4.0.0" -"@math.gl/geospatial@^3.5.1": - version "3.6.3" - resolved "https://registry.yarnpkg.com/@math.gl/geospatial/-/geospatial-3.6.3.tgz#011ebbe8d1660ff79020a81ed218886c353a62e1" - integrity sha512-6xf657lJnaecSarSzn02t0cnsCSkWb+39m4+im96v20dZTrLCWZ2glDQVzfuL91meDnDXjH4oyvynp12Mj5MFg== +"@math.gl/culling@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@math.gl/culling/-/culling-4.0.1.tgz#1b61e40dc89a83364f5c5a334759b009a3ea60cf" + integrity sha512-lv83sMKp0n1HjORhuNtWgX9ylYyj+/zHEPF0xxRXZvcpurB85fhgFLhvR81KLjmSbhQmFgzl0fZe7Ei3WxEP5Q== + dependencies: + "@math.gl/core" "4.0.1" + +"@math.gl/geospatial@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@math.gl/geospatial/-/geospatial-4.0.0.tgz#fdaf8546dc6e2459134a0b2e2bc20a0cc6baac9d" + integrity sha512-bfUqDbu9ZftmiMERMkM1b1N01RVrFUT0d6VuiMRER0d8R5GrWuRccZxROPoS52lyo692nJa0Z4Or97WJxLUYYw== dependencies: "@babel/runtime" "^7.12.0" - "@math.gl/core" "3.6.3" - gl-matrix "^3.4.0" + "@math.gl/core" "4.0.0" -"@math.gl/polygon@^3.5.1", "@math.gl/polygon@^3.6.2": - version "3.6.3" - resolved "https://registry.yarnpkg.com/@math.gl/polygon/-/polygon-3.6.3.tgz#0c19c0b059cedde1cd760cc3796e9180f75bcbde" - integrity sha512-FivQ1ZnYcAss1wVifOkHP/ZnlfQy1IL/769uzNtiHxwUbW0kZG3yyOZ9I7fwyzR5Hvqt3ErJKHjSYZr0uVlz5g== +"@math.gl/geospatial@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@math.gl/geospatial/-/geospatial-4.0.1.tgz#d41205c03b8a3f2bc95f4c2636c1844c7c2cf10e" + integrity sha512-FfTUMk8uRlBa4W3dMSFwPjRgdEBnOeVjBr3mcGqb3lHA/PPMvKuE+o7OJfA61Wj6ItuZqCEZHbLbA3WRAENoqQ== dependencies: - "@math.gl/core" "3.6.3" + "@math.gl/core" "4.0.1" -"@math.gl/sun@^3.6.2": - version "3.6.3" - resolved "https://registry.yarnpkg.com/@math.gl/sun/-/sun-3.6.3.tgz#30c15612313b56349c568f21f39c0e0f0e77b2df" - integrity sha512-mrx6CGYYeTNSQttvcw0KVUy+35YDmnjMqpO/o0t06Vcghrt0HNruB/ScRgUSbJrgkbOg1Vcqm23HBd++clzQzw== +"@math.gl/polygon@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@math.gl/polygon/-/polygon-4.0.0.tgz#17d2b1c7569d5a7fd1cde67e885d77e5742c23ec" + integrity sha512-BsseetloYtSZkphH5Fqn02uCL9UWsD26DNLfGhvd2farhU9BaJnn0JGuZnRWT/rf+glZZcDJkyqHq5pDnSX/BQ== + dependencies: + "@math.gl/core" "4.0.0" + +"@math.gl/sun@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@math.gl/sun/-/sun-4.0.0.tgz#20cf7960093e26d29685d76ee8b7364e38f9460e" + integrity sha512-CEjq/IC/RWjrqgmG/496yJDmwgiASKBnFPjEsGcbVpwFh0kM8wLUGykf9z3nHQ0nY54RwgbrR1nyzQuAqDLShw== dependencies: "@babel/runtime" "^7.12.0" -"@math.gl/types@3.6.3": - version "3.6.3" - resolved "https://registry.yarnpkg.com/@math.gl/types/-/types-3.6.3.tgz#9fa9866feabcbb76de107d78ff3a89c0243ac374" - integrity sha512-3uWLVXHY3jQxsXCr/UCNPSc2BG0hNUljhmOBt9l+lNFDp7zHgm0cK2Tw4kj2XfkJy4TgwZTBGwRDQgWEbLbdTA== +"@math.gl/types@4.0.0", "@math.gl/types@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@math.gl/types/-/types-4.0.0.tgz#20c649dcef8459d9dd1f83a708d7410fe06a3309" + integrity sha512-ZqU7o0LFaWQK/0wYobCwQKrKhRHaihps8oE74CLnWAdTTjXkM2vA8dU7vdx238QfXkNkz4Mv+KYklHpXMQJ8Hw== -"@math.gl/web-mercator@^3.5.1", "@math.gl/web-mercator@^3.5.5", "@math.gl/web-mercator@^3.6.2": +"@math.gl/types@4.0.1", "@math.gl/types@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@math.gl/types/-/types-4.0.1.tgz#a6f8539f6de39e5483a305d70f8bfa44b3248b69" + integrity sha512-E9qBKAjVBiZD8Is7TbygiLGtYBP3GSLus6RUJSuzFQegdYXeVagvrs4UkBJxhrRAxw4crfH0Tq7IhTMKuuJNQw== + +"@math.gl/web-mercator@^3.5.5": version "3.6.3" resolved "https://registry.yarnpkg.com/@math.gl/web-mercator/-/web-mercator-3.6.3.tgz#ef91168e030eecffc788618d686e8a6c1d7a0bf8" integrity sha512-UVrkSOs02YLehKaehrxhAejYMurehIHPfFQvPFZmdJHglHOU4V2cCUApTVEwOksvCp161ypEqVp+9H6mGhTTcw== @@ -2373,6 +2459,13 @@ "@babel/runtime" "^7.12.0" gl-matrix "^3.4.0" +"@math.gl/web-mercator@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@math.gl/web-mercator/-/web-mercator-4.0.0.tgz#2df70ec478b464337991b9fcdc3acaacf41311cc" + integrity sha512-dtzjaJPckyAEsCT0eHayPoZ8RrHg7XkQq9fZAHAn8CPiyLX0J0ZdvpH1x4a3qe7Ct7CPo6ChnqSk0DwItA4aNQ== + dependencies: + "@babel/runtime" "^7.12.0" + "@mdx-js/mdx@^1.6.22": version "1.6.22" resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" @@ -2523,76 +2616,6 @@ prop-types "^15.8.1" react-is "^18.2.0" -"@nebula.gl/edit-modes@1.0.4", "@nebula.gl/edit-modes@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@nebula.gl/edit-modes/-/edit-modes-1.0.4.tgz#df37751768239fb37dfcb697b0b90e11371a47a3" - integrity sha512-x0t73q2wmiVLK15+0DnkpsO7e7L69dZ/3xISEZlo/2pEJc0op2UCJ7BynRyuZq6Bb8ZvwJCVjyspaUGYQqabNg== - dependencies: - "@turf/along" ">=6.3.0" - "@turf/area" ">=4.0.0" - "@turf/bbox" ">=4.0.0" - "@turf/bbox-polygon" ">=4.0.0" - "@turf/bearing" ">=4.0.0" - "@turf/boolean-point-in-polygon" ">=4.0.0" - "@turf/buffer" ">=4.0.0" - "@turf/center" ">=4.0.0" - "@turf/centroid" ">=4.0.0" - "@turf/circle" ">=4.0.0" - "@turf/destination" ">=4.0.0" - "@turf/difference" ">=4.0.0" - "@turf/distance" ">=4.0.0" - "@turf/ellipse" ">=4.0.0" - "@turf/helpers" ">=4.0.0" - "@turf/intersect" ">=4.0.0" - "@turf/line-intersect" ">=4.0.0" - "@turf/midpoint" ">=4.0.0" - "@turf/nearest-point-on-line" ">=4.0.0" - "@turf/point-to-line-distance" ">=4.0.0" - "@turf/polygon-to-line" ">=4.0.0" - "@turf/rewind" ">=4.0.0" - "@turf/transform-rotate" ">=4.0.0" - "@turf/transform-scale" ">=4.0.0" - "@turf/transform-translate" ">=4.0.0" - "@turf/union" ">=4.0.0" - geojson "0.5.0" - lodash.throttle "^4.1.1" - viewport-mercator-project ">=6.0.0" - -"@nebula.gl/layers@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@nebula.gl/layers/-/layers-1.0.4.tgz#5acea95db132cbcb02bbb4a8afa805a0d9adc606" - integrity sha512-jwBGvQK7iIdq05DWl5q7vOIhpU+rVFhR+y30G1P5toz/SD9z3Qadfm2SYDgIcX36Ez45mJMKVllY7hLEG1tSRA== - dependencies: - "@danmarshall/deckgl-typings" "4.9.12" - "@nebula.gl/edit-modes" "1.0.4" - "@turf/bbox" ">=4.0.0" - "@turf/bbox-polygon" ">=4.0.0" - "@turf/bearing" ">=4.0.0" - "@turf/boolean-point-in-polygon" ">=4.0.0" - "@turf/buffer" ">=4.0.0" - "@turf/center" ">=4.0.0" - "@turf/centroid" ">=4.0.0" - "@turf/circle" ">=4.0.0" - "@turf/destination" ">=4.0.0" - "@turf/difference" ">=4.0.0" - "@turf/distance" ">=4.0.0" - "@turf/ellipse" ">=4.0.0" - "@turf/helpers" ">=4.0.0" - "@turf/intersect" ">=4.0.0" - "@turf/line-intersect" ">=4.0.0" - "@turf/nearest-point-on-line" ">=4.0.0" - "@turf/point-to-line-distance" ">=4.0.0" - "@turf/polygon-to-line" ">=4.0.0" - "@turf/transform-rotate" ">=4.0.0" - "@turf/transform-scale" ">=4.0.0" - "@turf/transform-translate" ">=4.0.0" - "@turf/union" ">=4.0.0" - cubic-hermite-spline "^1.0.1" - geojson-types "^2.0.1" - global ">=4.3.0" - h3-js "^3.6.4" - viewport-mercator-project ">=6.0.0" - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -3040,50 +3063,52 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.7.tgz#ccab5c8f7dc557a52ca3288c10075c9ccd37fff7" integrity sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw== -"@probe.gl/env@3.6.0", "@probe.gl/env@^3.5.0": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@probe.gl/env/-/env-3.6.0.tgz#33343fd9041a14d21374c1911826d4a2f9d9a35d" - integrity sha512-4tTZYUg/8BICC3Yyb9rOeoKeijKbZHRXBEKObrfPmX4sQmYB15ZOUpoVBhAyJkOYVAM8EkPci6Uw5dLCwx2BEQ== +"@probe.gl/env@4.0.4", "@probe.gl/env@^4.0.2": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@probe.gl/env/-/env-4.0.4.tgz#ea4e7d16f143faaf1e863316c6ccfe68db8b66a4" + integrity sha512-sYNGqesDfWD6dFP5oNZtTeFA4Z6ak5T4a8BNPdNhoqy7PK9w70JHrb6mv+RKWqKXq33KiwCDWL7fYxx2HuEH2w== dependencies: "@babel/runtime" "^7.0.0" -"@probe.gl/env@4.0.3": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@probe.gl/env/-/env-4.0.3.tgz#c437b139953ceda9c1a13bad2be9c14d3ff3ba03" - integrity sha512-Iz2/xPHMa5adDBw/m7nyQ0bKgLXZqMauPfV2ePU9ZOfkt6NnWMzQAjBeeXufujE6vndJUAALgpweO/YjYkKo+Q== - dependencies: - "@babel/runtime" "^7.0.0" +"@probe.gl/env@4.0.9", "@probe.gl/env@^4.0.9": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@probe.gl/env/-/env-4.0.9.tgz#cd0ed5214ed68021f3facc82cd885faebad21642" + integrity sha512-AOmVMD0/j78mX+k4+qX7ZhE0sY9H+EaJgIO6trik0BwV6VcrwxTGCGFAeuRsIGhETDnye06tkLXccYatYxAYwQ== -"@probe.gl/log@^3.5.0": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@probe.gl/log/-/log-3.6.0.tgz#c645bfd22b4769dc65161caa17f13bd2b231e413" - integrity sha512-hjpyenpEvOdowgZ1qMeCJxfRD4JkKdlXz0RC14m42Un62NtOT+GpWyKA4LssT0+xyLULCByRAtG2fzZorpIAcA== +"@probe.gl/log@^4.0.2", "@probe.gl/log@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@probe.gl/log/-/log-4.0.4.tgz#e42d1d0e22981c4010521c350cad2305bce02976" + integrity sha512-WpmXl6njlBMwrm8HBh/b4kSp/xnY1VVmeT4PWUKF+RkVbFuKQbsU11dA1IxoMd7gSY+5DGIwxGfAv1H5OMzA4A== dependencies: "@babel/runtime" "^7.0.0" - "@probe.gl/env" "3.6.0" + "@probe.gl/env" "4.0.4" -"@probe.gl/log@^4.0.1": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@probe.gl/log/-/log-4.0.3.tgz#69c57aac4394f21e7786285028403fa7504bc4f4" - integrity sha512-GAvGo87nYAcS/sLs00qts+thzlYPXLzkAG1xdtY3NxeI9oJAo+EU/sw+qcnfews4HO/u60QLMHrQJgSSbCGmjQ== +"@probe.gl/log@^4.0.9": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@probe.gl/log/-/log-4.0.9.tgz#5971bb12558c470634f7e30b490252965af22c2a" + integrity sha512-ebuZaodSRE9aC+3bVC7cKRHT8garXeT1jTbj1R5tQRqQYc9iGeT3iemVOHx5bN9Q6gAs/0j54iPI+1DvWMAW4A== dependencies: - "@babel/runtime" "^7.0.0" - "@probe.gl/env" "4.0.3" + "@probe.gl/env" "4.0.9" -"@probe.gl/stats@^3.3.0", "@probe.gl/stats@^3.5.0": +"@probe.gl/stats@^3.3.0": version "3.6.0" resolved "https://registry.yarnpkg.com/@probe.gl/stats/-/stats-3.6.0.tgz#a1bb12860fa6f40b9c028f9eb575d7ada0b4dbdd" integrity sha512-JdALQXB44OP4kUBN/UrQgzbJe4qokbVF4Y8lkIA8iVCFnjVowWIgkD/z/0QO65yELT54tTrtepw1jScjKB+rhQ== dependencies: "@babel/runtime" "^7.0.0" -"@probe.gl/stats@^4.0.1": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@probe.gl/stats/-/stats-4.0.3.tgz#a17ea752eb3d7540d0a5c92d8c9cea268a48930a" - integrity sha512-8BNKDmgwNqvcBNEcsIavtEWQp1WvBfryLodAv1YX8/Swg60Ky3ElDNNpSDuIVMnFDvI/De0zXiuXXydtn86/vA== +"@probe.gl/stats@^4.0.2": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@probe.gl/stats/-/stats-4.0.4.tgz#b33a47bf192951d0789dfd2044b295c3709386bd" + integrity sha512-SDuSY/D4yDL6LQDa69l/GCcnZLRiGYdyvYkxWb0CgnzTPdPrcdrzGkzkvpC3zsA4fEFw2smlDje370QGHwlisg== dependencies: "@babel/runtime" "^7.0.0" +"@probe.gl/stats@^4.0.9": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@probe.gl/stats/-/stats-4.0.9.tgz#3a175c1a0207d54bf911bd01f4f5414b9f3e6f2a" + integrity sha512-Q9Xt/sJUQaMsbjRKjOscv2t7wXIymTrOEJ4a3da4FTCn7bkKvcdxdyFAQySCrtPxE+YZ5I5lXpWPgv9BwmpE1g== + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -4075,7 +4100,7 @@ "@tufjs/canonical-json" "1.0.0" minimatch "^9.0.0" -"@turf/along@>=6.3.0": +"@turf/along@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/along/-/along-6.5.0.tgz#ab12eec58a14de60fe243a62d31a474f415c8fef" integrity sha512-LLyWQ0AARqJCmMcIEAXF4GEu8usmd4Kbz3qk1Oy5HoRNpZX47+i5exQtmIWKdqJ1MMhW26fCTXgpsEs5zgJ5gw== @@ -4086,7 +4111,7 @@ "@turf/helpers" "^6.5.0" "@turf/invariant" "^6.5.0" -"@turf/area@>=4.0.0": +"@turf/area@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/area/-/area-6.5.0.tgz#1d0d7aee01d8a4a3d4c91663ed35cc615f36ad56" integrity sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg== @@ -4102,14 +4127,14 @@ "@turf/helpers" "^6.5.0" "@turf/invariant" "^6.5.0" -"@turf/bbox-polygon@>=4.0.0", "@turf/bbox-polygon@^6.3.0": +"@turf/bbox-polygon@^6.3.0", "@turf/bbox-polygon@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/bbox-polygon/-/bbox-polygon-6.5.0.tgz#f18128b012eedfa860a521d8f2b3779cc0801032" integrity sha512-+/r0NyL1lOG3zKZmmf6L8ommU07HliP4dgYToMoTxqzsWzyLjaj/OzgQ8rBmv703WJX+aS6yCmLuIhYqyufyuw== dependencies: "@turf/helpers" "^6.5.0" -"@turf/bbox@*", "@turf/bbox@>=4.0.0", "@turf/bbox@^6.5.0": +"@turf/bbox@*", "@turf/bbox@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/bbox/-/bbox-6.5.0.tgz#bec30a744019eae420dac9ea46fb75caa44d8dc5" integrity sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw== @@ -4117,7 +4142,7 @@ "@turf/helpers" "^6.5.0" "@turf/meta" "^6.5.0" -"@turf/bearing@>=4.0.0", "@turf/bearing@^6.5.0": +"@turf/bearing@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/bearing/-/bearing-6.5.0.tgz#462a053c6c644434bdb636b39f8f43fb0cd857b0" integrity sha512-dxINYhIEMzgDOztyMZc20I7ssYVNEpSv04VbMo5YPQsqa80KO3TFvbuCahMsCAW5z8Tncc8dwBlEFrmRjJG33A== @@ -4161,7 +4186,7 @@ "@turf/helpers" "^6.5.0" "@turf/meta" "^6.5.0" -"@turf/boolean-point-in-polygon@>=4.0.0", "@turf/boolean-point-in-polygon@^6.5.0": +"@turf/boolean-point-in-polygon@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-6.5.0.tgz#6d2e9c89de4cd2e4365004c1e51490b7795a63cf" integrity sha512-DtSuVFB26SI+hj0SjrvXowGTUCHlgevPAIsukssW6BG5MlNSBQAo70wpICBNJL6RjukXg8d2eXaAWuD/CqL00A== @@ -4188,7 +4213,7 @@ "@turf/helpers" "^6.5.0" "@turf/invariant" "^6.5.0" -"@turf/buffer@>=4.0.0": +"@turf/buffer@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/buffer/-/buffer-6.5.0.tgz#22bd0d05b4e1e73eaebc69b8f574a410ff704842" integrity sha512-qeX4N6+PPWbKqp1AVkBVWFerGjMYMUyencwfnkCesoznU6qvfugFHNAngNqIBVnJjZ5n8IFyOf+akcxnrt9sNg== @@ -4201,7 +4226,7 @@ d3-geo "1.7.1" turf-jsts "*" -"@turf/center@>=4.0.0", "@turf/center@^6.5.0": +"@turf/center@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/center/-/center-6.5.0.tgz#3bcb6bffcb8ba147430cfea84aabaed5dbdd4f07" integrity sha512-T8KtMTfSATWcAX088rEDKjyvQCBkUsLnK/Txb6/8WUXIeOZyHu42G7MkdkHRoHtwieLdduDdmPLFyTdG5/e7ZQ== @@ -4209,7 +4234,7 @@ "@turf/bbox" "^6.5.0" "@turf/helpers" "^6.5.0" -"@turf/centroid@>=4.0.0", "@turf/centroid@^6.5.0": +"@turf/centroid@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/centroid/-/centroid-6.5.0.tgz#ecaa365412e5a4d595bb448e7dcdacfb49eb0009" integrity sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A== @@ -4217,7 +4242,7 @@ "@turf/helpers" "^6.5.0" "@turf/meta" "^6.5.0" -"@turf/circle@>=4.0.0": +"@turf/circle@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/circle/-/circle-6.5.0.tgz#dc017d8c0131d1d212b7c06f76510c22bbeb093c" integrity sha512-oU1+Kq9DgRnoSbWFHKnnUdTmtcRUMmHoV9DjTXu9vOLNV5OWtAAh1VZ+mzsioGGzoDNT/V5igbFOkMfBQc0B6A== @@ -4239,7 +4264,7 @@ dependencies: "@turf/helpers" "^6.5.0" -"@turf/destination@>=4.0.0", "@turf/destination@^6.5.0": +"@turf/destination@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/destination/-/destination-6.5.0.tgz#30a84702f9677d076130e0440d3223ae503fdae1" integrity sha512-4cnWQlNC8d1tItOz9B4pmJdWpXqS0vEvv65bI/Pj/genJnsL7evI0/Xw42RvEGROS481MPiU80xzvwxEvhQiMQ== @@ -4247,7 +4272,7 @@ "@turf/helpers" "^6.5.0" "@turf/invariant" "^6.5.0" -"@turf/difference@>=4.0.0": +"@turf/difference@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/difference/-/difference-6.5.0.tgz#677b0d5641a93bba2e82f2c683f0d880105b3197" integrity sha512-l8iR5uJqvI+5Fs6leNbhPY5t/a3vipUF/3AeVLpwPQcgmedNXyheYuy07PcMGH5Jdpi5gItOiTqwiU/bUH4b3A== @@ -4256,7 +4281,7 @@ "@turf/invariant" "^6.5.0" polygon-clipping "^0.15.3" -"@turf/distance@>=4.0.0", "@turf/distance@^6.5.0": +"@turf/distance@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/distance/-/distance-6.5.0.tgz#21f04d5f86e864d54e2abde16f35c15b4f36149a" integrity sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg== @@ -4264,7 +4289,7 @@ "@turf/helpers" "^6.5.0" "@turf/invariant" "^6.5.0" -"@turf/ellipse@>=4.0.0": +"@turf/ellipse@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/ellipse/-/ellipse-6.5.0.tgz#1e20cc9eb968f35ab891572892a0bffcef5e552a" integrity sha512-kuXtwFviw/JqnyJXF1mrR/cb496zDTSbGKtSiolWMNImYzGGkbsAsFTjwJYgD7+4FixHjp0uQPzo70KDf3AIBw== @@ -4274,7 +4299,7 @@ "@turf/rhumb-destination" "^6.5.0" "@turf/transform-rotate" "^6.5.0" -"@turf/helpers@6.x", "@turf/helpers@>=4.0.0", "@turf/helpers@^6.3.0", "@turf/helpers@^6.5.0": +"@turf/helpers@6.x", "@turf/helpers@^6.3.0", "@turf/helpers@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/helpers/-/helpers-6.5.0.tgz#f79af094bd6b8ce7ed2bd3e089a8493ee6cae82e" integrity sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw== @@ -4284,7 +4309,7 @@ resolved "https://registry.yarnpkg.com/@turf/helpers/-/helpers-5.1.5.tgz#153405227ab933d004a5bb9641a9ed999fcbe0cf" integrity sha512-/lF+JR+qNDHZ8bF9d+Cp58nxtZWJ3sqFe6n3u3Vpj+/0cqkjk4nXKYBSY0azm+GIYB5mWKxUXvuP/m0ZnKj1bw== -"@turf/intersect@>=4.0.0", "@turf/intersect@^6.3.0": +"@turf/intersect@^6.3.0", "@turf/intersect@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/intersect/-/intersect-6.5.0.tgz#a14e161ddd0264d0f07ac4e325553c70c421f9e6" integrity sha512-2legGJeKrfFkzntcd4GouPugoqPUjexPZnOvfez+3SfIMrHvulw8qV8u7pfVyn2Yqs53yoVCEjS5sEpvQ5YRQg== @@ -4314,7 +4339,7 @@ dependencies: "@turf/helpers" "^6.5.0" -"@turf/line-intersect@>=4.0.0", "@turf/line-intersect@^6.5.0": +"@turf/line-intersect@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/line-intersect/-/line-intersect-6.5.0.tgz#dea48348b30c093715d2195d2dd7524aee4cf020" integrity sha512-CS6R1tZvVQD390G9Ea4pmpM6mJGPWoL82jD46y0q1KSor9s6HupMIo1kY4Ny+AEYQl9jd21V3Scz20eldpbTVA== @@ -4348,7 +4373,7 @@ dependencies: "@turf/helpers" "^5.1.5" -"@turf/midpoint@>=4.0.0": +"@turf/midpoint@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/midpoint/-/midpoint-6.5.0.tgz#5f9428959309feccaf3f55873a8de70d4121bdce" integrity sha512-MyTzV44IwmVI6ec9fB2OgZ53JGNlgOpaYl9ArKoF49rXpL84F9rNATndbe0+MQIhdkw8IlzA6xVP4lZzfMNVCw== @@ -4358,7 +4383,7 @@ "@turf/distance" "^6.5.0" "@turf/helpers" "^6.5.0" -"@turf/nearest-point-on-line@>=4.0.0": +"@turf/nearest-point-on-line@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/nearest-point-on-line/-/nearest-point-on-line-6.5.0.tgz#8e1cd2cdc0b5acaf4c8d8b3b33bb008d3cb99e7b" integrity sha512-WthrvddddvmymnC+Vf7BrkHGbDOUu6Z3/6bFYUGv1kxw8tiZ6n83/VG6kHz4poHOfS0RaNflzXSkmCi64fLBlg== @@ -4371,7 +4396,7 @@ "@turf/line-intersect" "^6.5.0" "@turf/meta" "^6.5.0" -"@turf/point-to-line-distance@>=4.0.0": +"@turf/point-to-line-distance@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/point-to-line-distance/-/point-to-line-distance-6.5.0.tgz#bc46fe09ea630aaf73f13c40b38a7df79050fff8" integrity sha512-opHVQ4vjUhNBly1bob6RWy+F+hsZDH9SA0UW36pIRzfpu27qipU18xup0XXEePfY6+wvhF6yL/WgCO2IbrLqEA== @@ -4385,7 +4410,7 @@ "@turf/rhumb-bearing" "^6.5.0" "@turf/rhumb-distance" "^6.5.0" -"@turf/polygon-to-line@>=4.0.0", "@turf/polygon-to-line@^6.5.0": +"@turf/polygon-to-line@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/polygon-to-line/-/polygon-to-line-6.5.0.tgz#4dc86db66168b32bb83ce448cf966208a447d952" integrity sha512-5p4n/ij97EIttAq+ewSnKt0ruvuM+LIDzuczSzuHTpq4oS7Oq8yqg5TQ4nzMVuK41r/tALCk7nAoBuw3Su4Gcw== @@ -4402,17 +4427,6 @@ "@turf/helpers" "^6.5.0" "@turf/meta" "^6.5.0" -"@turf/rewind@>=4.0.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/rewind/-/rewind-6.5.0.tgz#bc0088f8ec56f00c8eacd902bbe51e3786cb73a0" - integrity sha512-IoUAMcHWotBWYwSYuYypw/LlqZmO+wcBpn8ysrBNbazkFNkLf3btSDZMkKJO/bvOzl55imr/Xj4fi3DdsLsbzQ== - dependencies: - "@turf/boolean-clockwise" "^6.5.0" - "@turf/clone" "^6.5.0" - "@turf/helpers" "^6.5.0" - "@turf/invariant" "^6.5.0" - "@turf/meta" "^6.5.0" - "@turf/rewind@^5.1.5": version "5.1.5" resolved "https://registry.yarnpkg.com/@turf/rewind/-/rewind-5.1.5.tgz#9ea3db4a68b73c1fd1dd11f57631b143cfefa1c9" @@ -4424,6 +4438,17 @@ "@turf/invariant" "^5.1.5" "@turf/meta" "^5.1.5" +"@turf/rewind@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/rewind/-/rewind-6.5.0.tgz#bc0088f8ec56f00c8eacd902bbe51e3786cb73a0" + integrity sha512-IoUAMcHWotBWYwSYuYypw/LlqZmO+wcBpn8ysrBNbazkFNkLf3btSDZMkKJO/bvOzl55imr/Xj4fi3DdsLsbzQ== + dependencies: + "@turf/boolean-clockwise" "^6.5.0" + "@turf/clone" "^6.5.0" + "@turf/helpers" "^6.5.0" + "@turf/invariant" "^6.5.0" + "@turf/meta" "^6.5.0" + "@turf/rhumb-bearing@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/rhumb-bearing/-/rhumb-bearing-6.5.0.tgz#8c41ad62b44fb4e57c14fe790488056684eee7b9" @@ -4448,7 +4473,7 @@ "@turf/helpers" "^6.5.0" "@turf/invariant" "^6.5.0" -"@turf/transform-rotate@>=4.0.0", "@turf/transform-rotate@^6.5.0": +"@turf/transform-rotate@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/transform-rotate/-/transform-rotate-6.5.0.tgz#e50e96a8779af91d58149eedb00ffd7f6395c804" integrity sha512-A2Ip1v4246ZmpssxpcL0hhiVBEf4L8lGnSPWTgSv5bWBEoya2fa/0SnFX9xJgP40rMP+ZzRaCN37vLHbv1Guag== @@ -4462,7 +4487,7 @@ "@turf/rhumb-destination" "^6.5.0" "@turf/rhumb-distance" "^6.5.0" -"@turf/transform-scale@>=4.0.0": +"@turf/transform-scale@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/transform-scale/-/transform-scale-6.5.0.tgz#dcccd8b0f139de32e32225a29c107a1279137120" integrity sha512-VsATGXC9rYM8qTjbQJ/P7BswKWXHdnSJ35JlV4OsZyHBMxJQHftvmZJsFbOqVtQnIQIzf2OAly6rfzVV9QLr7g== @@ -4478,7 +4503,7 @@ "@turf/rhumb-destination" "^6.5.0" "@turf/rhumb-distance" "^6.5.0" -"@turf/transform-translate@>=4.0.0": +"@turf/transform-translate@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/transform-translate/-/transform-translate-6.5.0.tgz#631b13aca6402898029e03fc2d1f4bc1c667fc3e" integrity sha512-NABLw5VdtJt/9vSstChp93pc6oel4qXEos56RBMsPlYB8hzNTEKYtC146XJvyF4twJeeYS8RVe1u7KhoFwEM5w== @@ -4489,7 +4514,7 @@ "@turf/meta" "^6.5.0" "@turf/rhumb-destination" "^6.5.0" -"@turf/union@>=4.0.0", "@turf/union@^6.3.0": +"@turf/union@^6.3.0", "@turf/union@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@turf/union/-/union-6.5.0.tgz#82d28f55190608f9c7d39559b7f543393b03b82d" integrity sha512-igYWCwP/f0RFHIlC2c0SKDuM/ObBaqSljI3IdV/x71805QbIvY/BYGcJdyNcgEA6cylIGl/0VSlIbpJHZ9ldhw== @@ -4536,6 +4561,40 @@ dependencies: "@babel/types" "^7.3.0" +"@types/brotli@^1.3.0": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@types/brotli/-/brotli-1.3.4.tgz#3eefc5493218a99141771f351142dd640efde5d8" + integrity sha512-cKYjgaS2DMdCKF7R0F5cgx1nfBYObN2ihIuPGQ4/dlIY6RpV7OWNwe9L8V4tTVKL2eZqOkNM9FM/rgTvLf4oXw== + dependencies: + "@types/node" "*" + +"@types/crypto-js@^4.0.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.2.2.tgz#771c4a768d94eb5922cc202a3009558204df0cea" + integrity sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ== + +"@types/d3-array@^3.0.2": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.2.1.tgz#1f6658e3d2006c4fceac53fde464166859f8b8c5" + integrity sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg== + +"@types/d3-color@^1.4.2": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-1.4.5.tgz#23bb1afda325549c6314ab60aa2aa28c4c6b1c37" + integrity sha512-5sNP3DmtSnSozxcjqmzQKsDOuVJXZkceo1KJScDc1982kk/TS9mTPc6lpli1gTu1MIBF1YWutpHpjucNWcIj5g== + +"@types/d3-scale@^3.0.0": + version "3.3.5" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-3.3.5.tgz#c89ff1550a4246f717e3c2e35deb35e183a338ba" + integrity sha512-YOpKj0kIEusRf7ofeJcSZQsvKbnTwpe1DUF+P2qsotqG53kEsjm7EzzliqQxMkAWdkZcHrg5rRhB4JiDOQPX+A== + dependencies: + "@types/d3-time" "^2" + +"@types/d3-time@^2": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-2.1.4.tgz#43587aa57d565ab60a1d2201edeebc497d5c1252" + integrity sha512-BTfLsxTeo7yFxI/haOOf1ZwJ6xKgQLT9dCp+EcmQv87Gox6X+oKl4mLKfO6fnWm3P22+A6DknMNEZany8ql2Rw== + "@types/duplexify@^3.6.0": version "3.6.1" resolved "https://registry.yarnpkg.com/@types/duplexify/-/duplexify-3.6.1.tgz#5685721cf7dc4a21b6f0e8a8efbec6b4d2fbafad" @@ -4602,6 +4661,11 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/google.maps@^3.48.6": + version "3.55.7" + resolved "https://registry.yarnpkg.com/@types/google.maps/-/google.maps-3.55.7.tgz#545176fb29ab81dda154e9d6dcda3dec26efe832" + integrity sha512-SlWFx0vo7RSAOC63+PTz8FeqLDaRYs7PrS/L0bZSKswxIN5TnCuckbeIwZpgD/S+DWalPteXfDbg5JsUER5Cyw== + "@types/graceful-fs@^4.1.2": version "4.1.6" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" @@ -4609,7 +4673,7 @@ dependencies: "@types/node" "*" -"@types/hammerjs@^2.0.36", "@types/hammerjs@^2.0.41": +"@types/hammerjs@^2.0.41": version "2.0.41" resolved "https://registry.yarnpkg.com/@types/hammerjs/-/hammerjs-2.0.41.tgz#f6ecf57d1b12d2befcce00e928a6a097c22980aa" integrity sha512-ewXv/ceBaJprikMcxCmWU1FKyMAQ2X7a9Gtmzw8fcg2kIePI1crERDM818W+XYrxqdBBOdlf2rm137bU+BltCA== @@ -4744,10 +4808,15 @@ resolved "https://registry.yarnpkg.com/@types/npmlog/-/npmlog-4.1.4.tgz#30eb872153c7ead3e8688c476054ddca004115f6" integrity sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ== -"@types/offscreencanvas@^2019.7.0": - version "2019.7.0" - resolved "https://registry.yarnpkg.com/@types/offscreencanvas/-/offscreencanvas-2019.7.0.tgz#e4a932069db47bb3eabeb0b305502d01586fa90d" - integrity sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg== +"@types/offscreencanvas@^2019.6.4": + version "2019.7.3" + resolved "https://registry.yarnpkg.com/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz#90267db13f64d6e9ccb5ae3eac92786a7c77a516" + integrity sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A== + +"@types/pako@^1.0.1": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@types/pako/-/pako-1.0.7.tgz#aa0e4af9855d81153a29ff84cc44cce25298eda9" + integrity sha512-YBtzT2ztNF6R/9+UXj2wTGFnC9NklAnASt3sC0h2m1bbH7G6FyBIkt4AN8ThZpNfxUo1b2iMVO0UawiJymEt8A== "@types/parse-json@^4.0.0": version "4.0.0" @@ -6087,7 +6156,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.0.2, base64-js@^1.3.0, base64-js@^1.3.1, base64-js@^1.5.1: +base64-js@^1.0.2, base64-js@^1.1.2, base64-js@^1.3.0, base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -6339,6 +6408,13 @@ brorand@^1.0.1, brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== +brotli@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/brotli/-/brotli-1.3.3.tgz#7365d8cc00f12cf765d2b2c898716bcf4b604d48" + integrity sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg== + dependencies: + base64-js "^1.1.2" + browser-process-hrtime@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" @@ -6838,6 +6914,11 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== +charenc@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== + chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" @@ -7652,6 +7733,11 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +crypt@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== + crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" @@ -8286,10 +8372,10 @@ dotenv@~10.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== -draco3d@1.5.5: - version "1.5.5" - resolved "https://registry.yarnpkg.com/draco3d/-/draco3d-1.5.5.tgz#6bf4bbdd65950e6153e991cb0dcb8a10323f610e" - integrity sha512-JVuNV0EJzD3LBYhGyIXJLeBID/EVtmFO1ZNhAYflTgiMiAJlbhXQmRRda/azjc8MRVMHh0gqGhiqHUo5dIXM8Q== +draco3d@1.5.7: + version "1.5.7" + resolved "https://registry.yarnpkg.com/draco3d/-/draco3d-1.5.7.tgz#94f9bce293eb8920c159dc91a4ce9124a9e899e0" + integrity sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ== duplexer2@~0.1.4: version "0.1.4" @@ -8318,7 +8404,7 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" -earcut@^2.0.6, earcut@^2.2.4: +earcut@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.4.tgz#6d02fd4d68160c114825d06890a92ecaae60343a" integrity sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ== @@ -8967,6 +9053,11 @@ eventemitter3@^4.0.4: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +eventemitter3@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + events-listener@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/events-listener/-/events-listener-1.1.0.tgz#dd49b4628480eba58fde31b870ee346b3990b349" @@ -9291,10 +9382,10 @@ fast-url-parser@^1.1.3: dependencies: punycode "^1.3.2" -fast-xml-parser@^4.1.3: - version "4.2.2" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.2.2.tgz#cb7310d1e9cf42d22c687b0fae41f3c926629368" - integrity sha512-DLzIPtQqmvmdq3VUKR7T6omPK/VCRNqgFlGtbESfyhcH2R4I8EzK1/K6E8PkRCK2EabWrUHK32NjYRbEFnnz0Q== +fast-xml-parser@^4.2.5: + version "4.3.4" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.3.4.tgz#385cc256ad7bbc57b91515a38a22502a9e1fca0d" + integrity sha512-utnwm92SyozgA3hhH2I8qldf2lBqm6qHOICawRNRFu1qMe3+oqr+GcXjGqTmXTMGE5T4eC03kr/rlh5C1IRdZA== dependencies: strnum "^1.0.5" @@ -9327,6 +9418,11 @@ fetch-retry@^5.0.2: resolved "https://registry.yarnpkg.com/fetch-retry/-/fetch-retry-5.0.4.tgz#06e8e4533030bf6faa00ffbb9450cb9264c23c12" integrity sha512-LXcdgpdcVedccGg0AZqg+S8lX/FCdwXD92WNZ5k5qsb0irRhSFsBOpcJt7oevyqT2/C2nEE0zSFNdBEpj3YOSw== +fflate@0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.7.4.tgz#61587e5d958fdabb5a9368a302c25363f4f69f50" + integrity sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw== + figgy-pudding@^3.5.1: version "3.5.2" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" @@ -9785,7 +9881,7 @@ fs-extra@^11.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^7.0.0, fs-extra@^7.0.1: +fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== @@ -9975,11 +10071,6 @@ geojson-types@^2.0.1: resolved "https://registry.yarnpkg.com/geojson-types/-/geojson-types-2.0.1.tgz#91040649b7ad39b2904643bd9ad51e5e86d524e3" integrity sha512-lF593HhpxQx8PjW7E7R/XsMKk01KbBRMciqg+NR7pkaaIPefS1NZDUep+w1L1QusXKcWDgZzvvgI4s7kDOe3aA== -geojson@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/geojson/-/geojson-0.5.0.tgz#3cd6c96399be65b56ee55596116fe9191ce701c0" - integrity sha512-/Bx5lEn+qRF4TfQ5aLu6NH+UKtvIv7Lhc487y/c8BdludrCTpiWf9wyI0RTyqg49MFefIAvFDuEi5Dfd/zgNxQ== - get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -10236,7 +10327,7 @@ global-dirs@^2.0.1: dependencies: ini "1.3.7" -global@>=4.3.0, global@^4.4.0: +global@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== @@ -10401,11 +10492,16 @@ gtoken@^4.1.0: jws "^4.0.0" mime "^2.2.0" -h3-js@^3.6.4, h3-js@^3.7.0, h3-js@^3.7.2: +h3-js@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/h3-js/-/h3-js-3.7.2.tgz#61d4feb7bb42868ca9cdb2d5cf9d9dda94f9e5a3" integrity sha512-LPjlHSwB9zQZrMqKloCZmmmt3yZzIK7nqPcXqwU93zT3TtYG6jP4tZBzAPouxut7lLjdFbMQ75wRBiKfpsnY7w== +h3-js@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/h3-js/-/h3-js-4.1.0.tgz#f8c4a8ad36612489a954f1a0bb3f4b7657d364e5" + integrity sha512-LQhmMl1dRQQjMXPzJc7MpZ/CqPOWWuAvVEoVJM9n/s7vHypj+c3Pd5rLQCkAsOgAoAYKbNCsYFE++LF7MvSfCQ== + hammerjs@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/hammerjs/-/hammerjs-2.0.8.tgz#04ef77862cff2bb79d30f7692095930222bf60f1" @@ -10913,6 +11009,11 @@ image-size@^0.7.4: resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.7.5.tgz#269f357cf5797cb44683dfa99790e54c705ead04" integrity sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g== +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + immer@^9.0.16: version "9.0.21" resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" @@ -10944,14 +11045,6 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== -indefinitely-typed@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/indefinitely-typed/-/indefinitely-typed-1.1.0.tgz#d0acd3645445e89ae1c70129be21609a0aa5a114" - integrity sha512-giaI0hCj+wWZIZZLsmWHI+LrM4Hwc+rEZ/VrgCafKePcnE42fLnQTFt4xspqLin8fCjI5WnQr2fep/0EFqjaxw== - dependencies: - fs-extra "^7.0.0" - minimist "^1.2.5" - indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" @@ -11218,7 +11311,7 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^1.1.5: +is-buffer@^1.1.5, is-buffer@~1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== @@ -12485,6 +12578,16 @@ jsprim@^1.2.2: array-includes "^3.1.5" object.assign "^4.1.3" +jszip@^3.1.5: + version "3.10.1" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" + integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + setimmediate "^1.0.5" + junk@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" @@ -12629,11 +12732,6 @@ lazystream@^1.0.0: dependencies: readable-stream "^2.0.5" -lerc@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lerc/-/lerc-4.0.1.tgz#a7cc8d4d8e16320d3888fdc743320bdf29c54f2b" - integrity sha512-b351eOjY3DKm1H2hDVhXswsd2RCK6bgREBK6Z639ctClOuYXTi9a44l8yO3zm1pYM2o4WrriloTAKgyrb/0EyA== - lerna@6.6.2: version "6.6.2" resolved "https://registry.yarnpkg.com/lerna/-/lerna-6.6.2.tgz#ad921f913aca4e7307123a598768b6f15ca5804f" @@ -12761,6 +12859,13 @@ libnpmpublish@7.1.4: sigstore "^1.4.0" ssri "^10.0.1" +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -13215,6 +13320,16 @@ lz-string@^1.4.4: resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== +lz4js@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/lz4js/-/lz4js-0.2.0.tgz#09f1a397cb2158f675146c3351dde85058cb322f" + integrity sha512-gY2Ia9Lm7Ep8qMiuGRhvUq0Q7qUereeldZPP1PMEJxPtEWHJLqw9pgX68oHajBH0nzJK4MaZEA/YNV3jT8u8Bg== + +lzo-wasm@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/lzo-wasm/-/lzo-wasm-0.0.4.tgz#49152521a0b67a1da3a3e113dd38f150f303230a" + integrity sha512-VKlnoJRFrB8SdJhlVKvW5vI1gGwcZ+mvChEXcSX6r2xDNc/Q2FD9esfBmGCuPZdrJ1feO+YcVFd2PTk0c137Gw== + make-dir@3.1.0, make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" @@ -13329,13 +13444,6 @@ marked@^0.7.0: resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg== -math.gl@^3.6.2: - version "3.6.3" - resolved "https://registry.yarnpkg.com/math.gl/-/math.gl-3.6.3.tgz#f87e0d24cb33c1a215185ae3a4e16839f1ce6db2" - integrity sha512-Yq9CyECvSDox9+5ETi2+x1bGTY5WvGUGL3rJfC4KPoCZAM51MGfrCm6rIn4yOJUVfMPs2a5RwMD+yGS/n1g3gg== - dependencies: - "@math.gl/core" "3.6.3" - md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -13345,6 +13453,15 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +md5@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" + integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== + dependencies: + charenc "0.0.2" + crypt "0.0.2" + is-buffer "~1.1.6" + mdast-squeeze-paragraphs@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz#7c4c114679c3bee27ef10b58e2e015be79f1ef97" @@ -14915,7 +15032,7 @@ pacote@^15.0.0, pacote@^15.0.8: ssri "^10.0.0" tar "^6.1.11" -pako@~1.0.5: +pako@1.0.11, pako@~1.0.2, pako@~1.0.5: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== @@ -15704,6 +15821,13 @@ quadbin@^0.1.9: dependencies: "@mapbox/tile-cover" "3.0.1" +quadbin@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/quadbin/-/quadbin-0.2.0.tgz#ee962448bc009967a85c463790269af136d1cccb" + integrity sha512-bPgyRreIsFVwKxHRY+GFdaXatNmfQ1LzaQZj7aKEz07/gL893uWREhmRZpG6UuvlGHdTOPw/NGvqLsJica2goA== + dependencies: + "@mapbox/tile-cover" "3.0.1" + querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -16811,7 +16935,7 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.4, setimmediate@~1.0.4: +setimmediate@^1.0.4, setimmediate@^1.0.5, setimmediate@~1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== @@ -16973,6 +17097,11 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" +snappyjs@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/snappyjs/-/snappyjs-0.6.1.tgz#9bca9ff8c54b133a9cc84a71d22779e97fc51878" + integrity sha512-YIK6I2lsH072UE0aOFxxY1dPDCS43I5ktqHpeAsuLNYWkE5pGxRGWfDM4/vSUfNzXjC1Ivzt3qx31PCLmc9yqg== + socks-proxy-agent@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" @@ -18608,6 +18737,11 @@ uuid@8.3.2, uuid@^8.3.0, uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + uuid@^3.0.0, uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -18707,7 +18841,7 @@ vfile@^4.0.0: unist-util-stringify-position "^2.0.0" vfile-message "^2.0.0" -viewport-mercator-project@>=6.0.0: +viewport-mercator-project@>=6.2.3: version "7.0.4" resolved "https://registry.yarnpkg.com/viewport-mercator-project/-/viewport-mercator-project-7.0.4.tgz#67feec04135484bf424dd4890d630e82116b31e6" integrity sha512-0jzpL6pIMocCKWg1C3mqi/N4UPgZC3FzwghEm1H+XsUo8hNZAyJc3QR7YqC816ibOR8aWT5pCsV+gCu8/BMJgg== @@ -19353,6 +19487,11 @@ zrender@5.4.3: dependencies: tslib "2.3.0" +zstd-codec@^0.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/zstd-codec/-/zstd-codec-0.1.4.tgz#6abb311b63cfacbd06e72797ee6c6e1c7c65248c" + integrity sha512-KYnWoFWgGtWyQEKNnUcb3u8ZtKO8dn5d8u+oGpxPlopqsPyv60U8suDyfk7Z7UtAO6Sk5i1aVcAs9RbaB1n36A== + zwitch@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920"