From 103e45b44b5dd4219d9dc74eca8fd4e40c351caa Mon Sep 17 00:00:00 2001 From: Naumov Alexey Date: Fri, 26 Mar 2021 17:25:44 +0300 Subject: [PATCH] feat(plugin-gis-viewer): CB-664 moved types to LeafletMap.tsx --- .../core-cli/configs/webpack.config.js | 56 ++++++------- .../Actions/ResultSet/ResultSetDataAction.ts | 5 -- .../src/GISValuePresentation.tsx | 41 +++++++--- .../src/GISViewerBootstrap.ts | 11 +-- .../src/IDatabaseDataGISAction.ts | 5 +- .../plugin-gis-viewer/src/LeafletMap.tsx | 24 ++++-- .../src/ResultSetGISAction.ts | 34 +++++--- .../plugin-gis-viewer/src/locales/ru.ts | 4 +- .../src/useParseGISValues.tsx | 65 --------------- webapp/yarn.lock | 80 +++++++++++++++++++ 10 files changed, 191 insertions(+), 134 deletions(-) delete mode 100644 webapp/packages/plugin-gis-viewer/src/useParseGISValues.tsx diff --git a/webapp/packages/core-cli/configs/webpack.config.js b/webapp/packages/core-cli/configs/webpack.config.js index fba6402a73..945069da3b 100644 --- a/webapp/packages/core-cli/configs/webpack.config.js +++ b/webapp/packages/core-cli/configs/webpack.config.js @@ -1,24 +1,24 @@ -const { resolve, join } = require('path'); -const ModuleDependencyWarning = require('webpack/lib/ModuleDependencyWarning'); -const MiniCssExtractPlugin = require('mini-css-extract-plugin'); -const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); +const { resolve, join } = require('path') +const ModuleDependencyWarning = require('webpack/lib/ModuleDependencyWarning') +const MiniCssExtractPlugin = require('mini-css-extract-plugin') +const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin') // const ESLintPlugin = require('eslint-webpack-plugin'); class IgnoreNotFoundExportPlugin { - apply(compiler) { - const messageRegExp = /export '.*'( \(imported as '.*'\))? was not found in/ - function doneHook(stats) { + apply (compiler) { + const messageRegExp = /export '.*'( \(imported as '.*'\))? was not found in/; + function doneHook (stats) { stats.compilation.warnings = stats.compilation.warnings.filter(warn => { if (warn instanceof ModuleDependencyWarning && messageRegExp.test(warn.message)) { - return false + return false; } - return true; - }) + return true + }); } if (compiler.hooks) { - compiler.hooks.done.tap('IgnoreNotFoundExportPlugin', doneHook) + compiler.hooks.done.tap('IgnoreNotFoundExportPlugin', doneHook); } else { - compiler.plugin('done', doneHook) + compiler.plugin('done', doneHook); } } } @@ -27,37 +27,37 @@ const nodeModules = [ resolve('node_modules'), // product resolve('../../node_modules'), // workspace resolve('../../node_modules/@cloudbeaver/core-cli/node_modules'), // core-cli -] +]; module.exports = (env, argv) => { - process.env.NODE_ENV = argv.mode; - const devTool = 'source-map' in env && 'source-map'; - const devMode = argv.mode !== 'production'; - function getBaseStyleLoaders() { - const loaders = []; + process.env.NODE_ENV = argv.mode + const devTool = 'source-map' in env && 'source-map' + const devMode = argv.mode !== 'production' + function getBaseStyleLoaders () { + const loaders = [] // Broke styles order in dev mode // if (devMode) { // loaders.push('style-loader'); // } else { - loaders.push(MiniCssExtractPlugin.loader); + loaders.push(MiniCssExtractPlugin.loader) // } - return loaders; + return loaders } - function generateStyleLoaders(options = { hasModule: false }) { - const moduleScope = options.hasModule ? 'local' : 'global'; + function generateStyleLoaders (options = { hasModule: false }) { + const moduleScope = options.hasModule ? 'local' : 'global' const modules = { mode: moduleScope, localIdentName: '[local]___[hash:base64:5]', - }; + } const postCssPlugins = [ require('postcss-preset-env')({ stage: 0 }), // require('postcss-discard-comments'), require('reshadow/postcss')({ scopeBehaviour: moduleScope }), - ]; + ] return [ ...getBaseStyleLoaders(), @@ -88,7 +88,7 @@ module.exports = (env, argv) => { }, }, }, - ]; + ] } var babelLoader = { @@ -96,7 +96,7 @@ module.exports = (env, argv) => { options: { configFile: join(__dirname, 'babel.config.js'), }, - } + }; return { // target: !devMode ? "web" : "browserslist", @@ -149,7 +149,7 @@ module.exports = (env, argv) => { ], }, { - test: /\.png$/, + test: /\.(png|jpg|gif)$/i, use: [ { loader: 'url-loader', @@ -178,5 +178,5 @@ module.exports = (env, argv) => { ignoreOrder: false, // Enable to remove warnings about conflicting order }), ], - }; + } } diff --git a/webapp/packages/plugin-data-viewer/src/DatabaseDataModel/Actions/ResultSet/ResultSetDataAction.ts b/webapp/packages/plugin-data-viewer/src/DatabaseDataModel/Actions/ResultSet/ResultSetDataAction.ts index 2147081279..e0fb9f986a 100644 --- a/webapp/packages/plugin-data-viewer/src/DatabaseDataModel/Actions/ResultSet/ResultSetDataAction.ts +++ b/webapp/packages/plugin-data-viewer/src/DatabaseDataModel/Actions/ResultSet/ResultSetDataAction.ts @@ -1,10 +1,8 @@ -import { IExecutor, Executor } from '@cloudbeaver/core-executor'; import { ResultDataFormat } from '@cloudbeaver/core-sdk'; import type { IDatabaseResultSet } from '../../IDatabaseResultSet'; import { databaseDataAction } from '../DatabaseDataActionDecorator'; import type { IDatabaseResultDataAction } from '../IDatabaseDataAction'; -import type { DatabaseDataEditorActionsData } from '../IDatabaseDataSelectAction'; import type { IResultSetElementKey } from './IResultSetElementKey'; @databaseDataAction() @@ -12,12 +10,9 @@ export class ResultSetDataAction implements IDatabaseResultDataAction>; - constructor( result: IDatabaseResultSet) { this.result = result; - this.actions = new Executor(); } getCellValue(cell: IResultSetElementKey): any { diff --git a/webapp/packages/plugin-gis-viewer/src/GISValuePresentation.tsx b/webapp/packages/plugin-gis-viewer/src/GISValuePresentation.tsx index 7fc194c034..365d2844f4 100644 --- a/webapp/packages/plugin-gis-viewer/src/GISValuePresentation.tsx +++ b/webapp/packages/plugin-gis-viewer/src/GISValuePresentation.tsx @@ -7,16 +7,15 @@ */ import { observer } from 'mobx-react-lite'; -import { useCallback } from 'react'; +import { useCallback, useMemo } from 'react'; +import wkt from 'terraformer-wkt-parser'; import { TabContainerPanelComponent, TextPlaceholder } from '@cloudbeaver/core-blocks'; import { useTranslate } from '@cloudbeaver/core-localization'; import { IDataValuePanelProps, IDatabaseResultSet, ResultSetSelectAction, IResultSetElementKey } from '@cloudbeaver/plugin-data-viewer'; -import { LeafletMap } from './LeafletMap'; +import { IGeoJSONFeature, IAssociatedValue, LeafletMap } from './LeafletMap'; import { ResultSetGISAction } from './ResultSetGISAction'; -import { useParseGISValues } from './useParseGISValues'; -import type { AssociatedValue } from './useParseGISValues'; export const GISValuePresentation: TabContainerPanelComponent> = observer(function GISValuePresentation({ model, @@ -26,7 +25,7 @@ export const GISValuePresentation: TabContainerPanelComponent | null; const selectedCells = selection.getSelectedElements(); @@ -35,18 +34,36 @@ export const GISValuePresentation: TabContainerPanelComponent { + const result: IGeoJSONFeature[] = []; - const getAssociatedValues = useCallback((cell: Required): AssociatedValue[] => { + for (let i = 0; i < selectedCells.length; i++) { + try { + const cell = selectedCells[i]; + const cellValue = gis.getCellValue(cell); + + if (!cellValue) { + continue; + } + + const parsedCellValue = wkt.parse(cellValue.mapText || cellValue.text); + result.push({ type: 'Feature', geometry: parsedCellValue, properties: { associatedCell: cell, srid: cellValue.srid } }); + } catch { + continue; + } + } + + return result; + }, [selectedCells, gis]); + + const getAssociatedValues = useCallback((cell: Required): IAssociatedValue[] => { if (!modelResultData?.data?.columns || !modelResultData?.data?.rows) { return []; } const { column: columnIndex, row: rowIndex } = cell; - return modelResultData.data.columns.reduce((result: AssociatedValue[], column, i) => { + return modelResultData.data.columns.reduce((result: IAssociatedValue[], column, i) => { if (i !== columnIndex) { result.push({ key: column.name!, @@ -60,11 +77,11 @@ export const GISValuePresentation: TabContainerPanelComponent{translate('gis_presentation_placeholder')}; } return ( - + ); }); diff --git a/webapp/packages/plugin-gis-viewer/src/GISViewerBootstrap.ts b/webapp/packages/plugin-gis-viewer/src/GISViewerBootstrap.ts index dfa343b18d..64be251a3e 100644 --- a/webapp/packages/plugin-gis-viewer/src/GISViewerBootstrap.ts +++ b/webapp/packages/plugin-gis-viewer/src/GISViewerBootstrap.ts @@ -8,7 +8,7 @@ import { Bootstrap, injectable } from '@cloudbeaver/core-di'; import { ResultDataFormat } from '@cloudbeaver/core-sdk'; -import { DataValuePanelService, ResultSetDataAction, ResultSetSelectAction } from '@cloudbeaver/plugin-data-viewer'; +import { DataValuePanelService, ResultSetSelectAction } from '@cloudbeaver/plugin-data-viewer'; import { GISValuePresentation } from './GISValuePresentation'; import { ResultSetGISAction } from './ResultSetGISAction'; @@ -32,23 +32,20 @@ export class GISViewerBootstrap extends Bootstrap { } const selection = context.model.source.getAction(context.resultIndex, ResultSetSelectAction); - const GIS = context.model.source.getAction(context.resultIndex, ResultSetGISAction); - const data = context.model.source.getAction(context.resultIndex, ResultSetDataAction); + const gis = context.model.source.getAction(context.resultIndex, ResultSetGISAction); const focusedElement = selection.getFocusedElement(); if (focusedElement) { - const focusedElementValue = data.getCellValue(focusedElement); - return !GIS.isGISFormat(focusedElementValue); + return !gis.isGISFormat(focusedElement); } const selectedCells = selection.getSelectedElements(); if (selectedCells.length > 0) { const firstSelectedCell = selectedCells[0]; - const firstSelectedCellValue = data.getCellValue(firstSelectedCell); - return !GIS.isGISFormat(firstSelectedCellValue); + return !gis.isGISFormat(firstSelectedCell); } return true; diff --git a/webapp/packages/plugin-gis-viewer/src/IDatabaseDataGISAction.ts b/webapp/packages/plugin-gis-viewer/src/IDatabaseDataGISAction.ts index 6ea6b27a0f..f3a471968a 100644 --- a/webapp/packages/plugin-gis-viewer/src/IDatabaseDataGISAction.ts +++ b/webapp/packages/plugin-gis-viewer/src/IDatabaseDataGISAction.ts @@ -8,8 +8,11 @@ import type { IDatabaseDataResult, IDatabaseDataAction, IResultSetElementKey } from '@cloudbeaver/plugin-data-viewer'; +import type { IGISType } from './ResultSetGISAction'; + export interface IDatabaseDataGISAction extends IDatabaseDataAction { getGISDataFor: (selectedCells: Array>) => Array>; - isGISFormat: (value: any) => boolean; + getCellValue: (cell: IResultSetElementKey) => IGISType | undefined; + isGISFormat: (cell: IResultSetElementKey) => boolean; } diff --git a/webapp/packages/plugin-gis-viewer/src/LeafletMap.tsx b/webapp/packages/plugin-gis-viewer/src/LeafletMap.tsx index 85173917f1..04ee532e77 100644 --- a/webapp/packages/plugin-gis-viewer/src/LeafletMap.tsx +++ b/webapp/packages/plugin-gis-viewer/src/LeafletMap.tsx @@ -11,6 +11,7 @@ import 'leaflet/dist/leaflet.css'; +import type geojson from 'geojson'; import leaflet from 'leaflet'; import { useCallback, useEffect, useState } from 'react'; import { MapContainer, GeoJSON, LayersControl, TileLayer } from 'react-leaflet'; @@ -21,16 +22,29 @@ import { useSplit } from '@cloudbeaver/core-blocks'; import { useTranslate } from '@cloudbeaver/core-localization'; import type { IResultSetElementKey } from '@cloudbeaver/plugin-data-viewer'; -import type { AssociatedValue, IGeoJSONFeature } from './useParseGISValues'; +export interface IAssociatedValue { + key: string; + value: any; +} -export interface IBaseTile extends TileLayerProps { +interface IFeatureProperties { + srid: number; + associatedCell: Required; +} + +export interface IGeoJSONFeature extends GeoJSON.Feature { + type: 'Feature'; + bbox?: geojson.BBox; +} + +interface IBaseTile extends TileLayerProps { name: string; checked?: boolean; } interface Props { geoJSON: IGeoJSONFeature[]; - getAssociatedValues: (cell: Required) => AssociatedValue[]; + getAssociatedValues: (cell: Required) => IAssociatedValue[]; } const baseTiles: Record<'street' | 'topography', IBaseTile> = { @@ -90,7 +104,7 @@ function getCRS(feature?: IGeoJSONFeature): leaflet.CRS { } } -const LEAFLET_STYLES = css` +const styles = css` MapContainer { width: 100%; height: 100%; @@ -160,7 +174,7 @@ export const LeafletMap: React.FC = function LeafletMap({ geoJSON, getAss } }, [splitContext.isResizing, splitContext.mode, mapRef, geoJSONLayerRef, crs, geoJSON]); - return styled(LEAFLET_STYLES)( + return styled(styles)( | null; +} @databaseDataAction() export class ResultSetGISAction implements IDatabaseDataGISAction { - GISValueType = 'geometry'; + private readonly GISValueType = 'geometry'; static dataFormat = ResultDataFormat.Resultset; result: IDatabaseResultSet; - readonly actions: IExecutor>; - constructor( result: IDatabaseResultSet) { this.result = result; - this.actions = new Executor(); } - isGISFormat(value: any): boolean { + isGISFormat(cell: IResultSetElementKey): boolean { + if (cell.row === undefined || cell.column === undefined) { + return false; + } + + const value = this.result?.data?.rows?.[cell.row][cell.column]; + if (value !== null && typeof value === 'object' && '$type' in value) { return value.$type === this.GISValueType; } @@ -43,14 +52,21 @@ export class ResultSetGISAction implements IDatabaseDataGISAction | null; -} - -export interface AssociatedValue { - key: string; - value: any; -} - -interface IFeatureProperties { - srid: number; - associatedCell: Required; -} - -export interface IGeoJSONFeature extends GeoJSON.Feature { - properties: IFeatureProperties; -} - -export function useParseGISValues( - model: IDatabaseDataModel, - resultIndex: number, - values: Array> -) { - const geoJSON = useMemo(() => { - const result: IGeoJSONFeature[] = []; - const data = model.source.getAction(resultIndex, ResultSetDataAction); - - for (let i = 0; i < values.length; i++) { - try { - const cell = values[i]; - const cellValue = data.getCellValue(cell) as GISType | undefined; - if (!cellValue) { - continue; - } - - const parsedCellValue = wkt.parse(cellValue.mapText || cellValue.text); - result.push({ type: 'Feature', geometry: parsedCellValue, properties: { associatedCell: cell, srid: cellValue.srid } }); - } catch { - continue; - } - } - - return result; - }, [model, resultIndex, values]); - - return geoJSON; -} diff --git a/webapp/yarn.lock b/webapp/yarn.lock index 38cd8301c4..5a400866d4 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -2557,6 +2557,11 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.6.0.tgz#f022195afdfc942e088ee2101285a1d31c7d727f" integrity sha512-cPqjjzuFWNK3BSKLm0abspP0sp/IGOli4p5I5fKFAzdS8fvjdOwDCfZqAaIiXd9lPkOWi3SUUfZof3hEb7J/uw== +"@react-leaflet/core@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@react-leaflet/core/-/core-1.0.2.tgz#39c6a73f61c666d5dcf673741cea2672fa4bbae1" + integrity sha512-QbleYZTMcgujAEyWGki8Lx6cXQqWkNtQlqf5c7NImlIp8bKW66bFpez/6EVatW7+p9WKBOEOVci/9W7WW70EZg== + "@reshadow/babel@^0.0.1-alpha.76", "@reshadow/babel@^0.0.1-issue-119.0": version "0.0.1-issue-119.0" resolved "https://registry.yarnpkg.com/@reshadow/babel/-/babel-0.0.1-issue-119.0.tgz#ef0e9228e06f821e3d2287f01569fb076153dbb5" @@ -2745,6 +2750,16 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.45.tgz#e9387572998e5ecdac221950dab3e8c3b16af884" integrity sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g== +"@types/geojson@*", "@types/geojson@^7946.0.0 || ^1.0.0": + version "7946.0.7" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.7.tgz#c8fa532b60a0042219cdf173ca21a975ef0666ad" + integrity sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ== + +"@types/geojson@^1.0.0": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-1.0.6.tgz#3e02972728c69248c2af08d60a48cbb8680fffdf" + integrity sha512-Xqg/lIZMrUd0VRmSRbCAewtwGZiAk3mEUDvV4op1tGl+LvyPcb/MIOSxTl9z+9+J+R4/vpjiCAT4xeKzH9ji1w== + "@types/glob@^7.1.1": version "7.1.3" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" @@ -2792,6 +2807,13 @@ dependencies: "@types/node" "*" +"@types/leaflet@*": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@types/leaflet/-/leaflet-1.7.0.tgz#3700fb5d29a8214fbd496565b08ec28e40cee808" + integrity sha512-ltv5jR+VjKSMtoDkxH61Rsbo0zLU7iqyOXpVPkAX4F+79fg2eymC7t0msWsfNaEZO1FGTIQATCCCQe+ijWoicg== + dependencies: + "@types/geojson" "*" + "@types/md5@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@types/md5/-/md5-2.2.1.tgz#0e2d65d8f6cc91aafbc9be5a4c08fee9250406ce" @@ -2841,6 +2863,23 @@ dependencies: "@types/react" "^16" +"@types/react-leaflet@^2.8.1": + version "2.8.1" + resolved "https://registry.yarnpkg.com/@types/react-leaflet/-/react-leaflet-2.8.1.tgz#acda592cf1b7dfe20ac81071c21c1e5521fe71a4" + integrity sha512-BbFyH9R/MecfXaz1Yt29oGBG8AxIKILgAniO61/kv9/sRe5/qj9yDxf3PW7M+nDl5Wn3V7Mp9inKF0LflV+KkQ== + dependencies: + "@types/leaflet" "*" + "@types/react" "*" + +"@types/react@*": + version "17.0.3" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.3.tgz#ba6e215368501ac3826951eef2904574c262cc79" + integrity sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + "@types/react@^16", "@types/react@^16.9.49": version "16.14.2" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.2.tgz#85dcc0947d0645349923c04ccef6018a1ab7538c" @@ -2849,6 +2888,11 @@ "@types/prop-types" "*" csstype "^3.0.2" +"@types/scheduler@*": + version "0.16.1" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275" + integrity sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA== + "@types/tern@*": version "0.23.3" resolved "https://registry.yarnpkg.com/@types/tern/-/tern-0.23.3.tgz#4b54538f04a88c9ff79de1f6f94f575a7f339460" @@ -8247,6 +8291,11 @@ latest-version@5.1.0: dependencies: package-json "^6.3.0" +leaflet@^1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/leaflet/-/leaflet-1.7.1.tgz#10d684916edfe1bf41d688a3b97127c0322a2a19" + integrity sha512-/xwPEBidtg69Q3HlqPdU3DnrXQOvQU/CCHA1tcDQVzOwm91YMYaILjNp7L4Eaw5Z4sOYdbBz6koWyibppd8Zqw== + lerna@^3.22.1: version "3.22.1" resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.22.1.tgz#82027ac3da9c627fd8bf02ccfeff806a98e65b62" @@ -11102,6 +11151,13 @@ react-is@^16.8.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-leaflet@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/react-leaflet/-/react-leaflet-3.1.0.tgz#42deb5e454518016eff8bc85511ae58812f910f5" + integrity sha512-kdZS8NYbYFPmkQr7zSDR2gkKGFeWvkxqoqcmZEckzHL4d5c85dJ2gbbqhaPDpmWWgaRw9O29uA/77qpKmK4mTQ== + dependencies: + "@react-leaflet/core" "^1.0.2" + react-popper@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.2.4.tgz#d2ad3d2474ac9f1abf93df3099d408e5aa6a2e22" @@ -12769,6 +12825,21 @@ temp-write@^3.4.0: temp-dir "^1.0.0" uuid "^3.0.1" +terraformer-wkt-parser@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/terraformer-wkt-parser/-/terraformer-wkt-parser-1.2.1.tgz#8041e2aeb0c9f2b4cbbec8ec2c5c00c45ddfee02" + integrity sha512-+CJyNLWb3lJ9RsZMTM66BY0MT3yIo4l4l22Jd9CrZuwzk54fsu4Sc7zejuS9fCITTuTQy3p06d4MZMVI7v5wSg== + dependencies: + "@types/geojson" "^1.0.0" + terraformer "~1.0.5" + +terraformer@~1.0.5: + version "1.0.12" + resolved "https://registry.yarnpkg.com/terraformer/-/terraformer-1.0.12.tgz#39e08f9c753606421acce02e122440c72dfa12d3" + integrity sha512-MokUp0+MFal4CmJDVL6VAO1bKegeXcBM2RnPVfqcFIp2IIv8EbPAjG0j/vEy/vuKB8NVMMSF2vfpVS/QLe4DBg== + optionalDependencies: + "@types/geojson" "^7946.0.0 || ^1.0.0" + terser-webpack-plugin@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz#7effadee06f7ecfa093dbbd3e9ab23f5f3ed8673" @@ -13249,6 +13320,15 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= +url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + url-parse-lax@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"