diff --git a/.github/workflows/publish_package_client.yaml b/.github/workflows/publish_package_client.yaml index 316e201..9e489f0 100644 --- a/.github/workflows/publish_package_client.yaml +++ b/.github/workflows/publish_package_client.yaml @@ -16,7 +16,7 @@ jobs: with: node-version: "20" - run: npm ci - - run: npx lerna run build + - run: npx lerna run build --scope '{@map-colonies/detiler-common,@map-colonies/detiler-client}' - uses: JS-DevTools/npm-publish@v3 with: token: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/publish_package_common.yaml b/.github/workflows/publish_package_common.yaml index 6e9c034..bf9ad68 100644 --- a/.github/workflows/publish_package_common.yaml +++ b/.github/workflows/publish_package_common.yaml @@ -16,7 +16,7 @@ jobs: with: node-version: "20" - run: npm ci - - run: npx lerna run build + - run: npx lerna run build --scope=@map-colonies/detiler-common - uses: JS-DevTools/npm-publish@v3 with: token: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/pull_request.yaml b/.github/workflows/pull_request.yaml index 848f1e8..dc314f9 100644 --- a/.github/workflows/pull_request.yaml +++ b/.github/workflows/pull_request.yaml @@ -9,7 +9,7 @@ jobs: strategy: matrix: - node: [18.x, 20.x] + node: [20.x] steps: - name: Check out TS Project Git repository @@ -85,7 +85,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node: [18.x, 20.x] + node: [20.x] steps: - name: Check out Git repository diff --git a/.redocly.yaml b/.redocly.yaml index c95d2bd..c12b289 100644 --- a/.redocly.yaml +++ b/.redocly.yaml @@ -22,7 +22,7 @@ lint: rules: boolean-parameter-prefixes: - severity: error + severity: warn prefixes: ['should', 'is', 'has'] no-unused-components: severity: error diff --git a/README.md b/README.md index 736742e..56736d4 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ data is colored in relation to some metric (state, update count, skip count, cur "updateCount":13, "renderCount":11, "skipCount":2, + "coolCount":0, "geoshape":"POLYGON ((34.453125 31.541748046875, 34.453125 31.53076171875, 34.464111328125 31.53076171875, 34.464111328125 31.541748046875, 34.453125 31.541748046875))", "coordinates":"34.458618, 31.536255" } @@ -55,36 +56,47 @@ to achieve runtime variables we inject for each variable it's value in runtime i see [.env.production](/packages/frontend/config/.env.production) and [env.sh](/packages/frontend/env.sh). ## Redis -### redis search index creation: +### redis search tile details index creation: ``` -FT.CREATE tileDetailsIdx ON JSON PREFIX 1 tile: -SCHEMA $.kit AS kit TEXT $.updatedAt AS updatedAt NUMERIC $.renderedAt AS renderedAt NUMERIC $.createdAt AS createdAt NUMERIC $.updateCount AS updateCount NUMERIC $.renderCount AS renderCount NUMERIC $.skipCount AS skipCount NUMERIC $.coordiantes AS coordinates GEO $.geoshape AS geoshape GEOSHAPE SPHERICAL $.state AS state NUMERIC $.states[*] AS states NUMERIC $.z AS z NUMERIC $.x AS x NUMERIC $.y AS y NUMERIC +FT.CREATE tileDetailsIdx ON JSON PREFIX 1 tile: SCHEMA $.kit AS kit TEXT $.updatedAt AS updatedAt NUMERIC $.renderedAt AS renderedAt NUMERIC $.createdAt AS createdAt NUMERIC $.geoshape AS geoshape GEOSHAPE SPHERICAL $.state AS state NUMERIC $.states[*] AS states NUMERIC $.z AS z NUMERIC $.x AS x NUMERIC $.y AS y NUMERIC ``` -### redis post processing: -preferably we would use the `Redis Gears` module, but in the meantime the deprecated `Triggers and Functions` module is in use. +### redis search cooldowns index creation: +``` +FT.CREATE cooldownIdx ON JSON PREFIX 1 cooldown: SCHEMA $.kits[*] AS kits TAG $.minZoom AS minZoom NUMERIC $.maxZoom AS maxZoom NUMERIC $.enabled AS enabled TAG $.geoshape AS geoshape GEOSHAPE SPHERICAL +``` -the following post processing function is being used to maintain additional metadata for each kit - it's `maxState` and `maxUpdatedAt` +### redis post processing: +using `Redis Gears` the following post processing function is being used to maintain additional metadata for each kit - it's `maxState` and `maxUpdatedAt` see [maintain_kit_metadata.py](/packages/backend/gears/maintain_kit_metadata.py) for full documented python code execute with `redis-cli` ``` -TFUNCTION LOAD REPLACE "#!js name=LibName api_version=1.0\n - function getMaximum(client, data) { - currentKit = client.call('json.get', data.key, 'kit'); - currentState = client.call('json.get', data.key, 'state'); - currentUpdatedAt = client.call('json.get', data.key, 'updatedAt'); - key = 'kit:' + currentKit.slice(1, currentKit.length - 1); - maxState = client.call('hget', key, 'maxState'); - if(maxState < currentState) { - client.call('hset', key, 'maxState', currentState); - } - maxUpdatedAt = client.call('hget', key, 'maxUpdatedAt'); - if(maxUpdatedAt < currentUpdatedAt) { - client.call('hset', key, 'maxUpdatedAt', currentUpdatedAt); - } - } - - redis.registerKeySpaceTrigger('KitLibrary', 'tile:', getMaximum);" +RG.PYEXECUTE " +def extract_data(record):\n + data_key = record['key']\n + + kit = execute('JSON.GET', data_key, 'kit')\n + state = execute('JSON.GET', data_key, 'state')\n + updated_at = execute('JSON.GET', data_key, 'updatedAt')\n + return { 'kit': kit[1:-1], 'state': int(state), 'updated_at': int(updated_at) }\n + +def update_maximums(data):\n + kit_key = 'kit:' + data['kit']\n + + max_state = execute('HGET', kit_key, 'maxState')\n + max_state = int(max_state) if max_state else 0\n + if data['state'] > max_state:\n + execute('HSET', kit_key, 'maxState', data['state'])\n + + max_updated_at = execute('HGET', kit_key, 'maxUpdatedAt')\n + max_updated_at = int(max_updated_at) if max_updated_at else 0\n + if data['updated_at'] > max_updated_at:\n + execute('HSET', kit_key, 'maxUpdatedAt', data['updated_at'])\n + +gb = GearsBuilder()\n +gb.map(extract_data)\n +gb.foreach(update_maximums)\n +gb.register('tile:*')" ``` ## Development diff --git a/package-lock.json b/package-lock.json index 2079352..1a21e0c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ } }, "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "11.7.0", + "version": "11.7.2", "license": "MIT", "dependencies": { "@jsdevtools/ono": "^7.1.3", @@ -51,25 +51,26 @@ } }, "node_modules/@arcgis/core": { - "version": "4.30.9", + "version": "4.31.5", "license": "SEE LICENSE IN copyright.txt", "peer": true, "dependencies": { - "@esri/arcgis-html-sanitizer": "~4.0.3", + "@esri/arcgis-html-sanitizer": "~4.1.0-next.4", "@esri/calcite-colors": "~6.1.0", - "@esri/calcite-components": "^2.8.5", - "@vaadin/grid": "~24.3.13", - "@zip.js/zip.js": "~2.7.44", - "luxon": "~3.4.4", - "marked": "~12.0.2", - "sortablejs": "~1.15.2" + "@esri/calcite-components": "^2.13.0", + "@vaadin/grid": "~24.5.0", + "@zip.js/zip.js": "~2.7.52", + "luxon": "~3.5.0", + "marked": "~14.1.3", + "sortablejs": "~1.15.3" } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", + "version": "7.26.2", "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -77,7 +78,7 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.4", + "version": "7.26.2", "dev": true, "license": "MIT", "engines": { @@ -85,20 +86,20 @@ } }, "node_modules/@babel/core": { - "version": "7.25.2", + "version": "7.26.0", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -127,7 +128,7 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.25.1", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { @@ -160,49 +161,50 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.6", + "version": "7.26.2", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.6", + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -219,16 +221,16 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.4", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/traverse": "^7.25.4", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", "semver": "^6.3.1" }, "engines": { @@ -247,12 +249,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.2", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "regexpu-core": "^5.3.1", + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.1.1", "semver": "^6.3.1" }, "engines": { @@ -271,7 +273,7 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", + "version": "0.6.3", "dev": true, "license": "MIT", "dependencies": { @@ -286,37 +288,36 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.8", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.8" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", + "version": "7.25.9", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", + "version": "7.26.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -326,18 +327,18 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", + "version": "7.25.9", "dev": true, "license": "MIT", "engines": { @@ -345,13 +346,13 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.0", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-wrap-function": "^7.25.0", - "@babel/traverse": "^7.25.0" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -361,13 +362,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.0", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -377,45 +378,45 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", + "version": "7.25.9", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", + "version": "7.25.9", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", + "version": "7.25.9", "dev": true, "license": "MIT", "engines": { @@ -423,105 +424,35 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.25.0", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.25.6", + "version": "7.26.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { - "version": "7.25.6", + "version": "7.26.2", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.6" + "@babel/types": "^7.26.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -531,12 +462,12 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.3", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.3" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -546,11 +477,11 @@ } }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.0", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -560,11 +491,11 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.0", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -574,13 +505,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -590,12 +521,12 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.0", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -620,13 +551,13 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-decorators": "^7.24.7" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-decorators": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -755,11 +686,11 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -768,34 +699,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.24.7", + "version": "7.26.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -805,11 +714,11 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.25.6", + "version": "7.26.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -819,11 +728,11 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.25.6", + "version": "7.26.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -855,11 +764,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -963,11 +872,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.4", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -992,11 +901,11 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1006,14 +915,13 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.4", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-remap-async-to-generator": "^7.25.0", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/traverse": "^7.25.4" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1023,13 +931,13 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1039,11 +947,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1053,11 +961,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.0", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1067,12 +975,12 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.4", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.4", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1082,13 +990,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.7", + "version": "7.26.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1098,15 +1005,15 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.4", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/traverse": "^7.25.4", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", "globals": "^11.1.0" }, "engines": { @@ -1117,12 +1024,12 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/template": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1132,11 +1039,11 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.8", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1146,12 +1053,12 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1161,11 +1068,11 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1175,12 +1082,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.0", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1190,12 +1097,11 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1205,12 +1111,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1220,12 +1126,11 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1235,12 +1140,12 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.25.2", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/plugin-syntax-flow": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-flow": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1250,12 +1155,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1265,13 +1170,13 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.1", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.1" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1281,12 +1186,11 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1296,11 +1200,11 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.2", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1310,12 +1214,11 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1325,11 +1228,11 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1339,12 +1242,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1354,13 +1257,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.8", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-simple-access": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-simple-access": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1370,14 +1273,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.0", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1387,12 +1290,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1402,12 +1305,12 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1417,11 +1320,11 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1431,12 +1334,11 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1446,12 +1348,11 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1461,14 +1362,13 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.7" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1478,12 +1378,12 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1493,12 +1393,11 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1508,13 +1407,12 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.8", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1524,11 +1422,11 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1538,12 +1436,12 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.4", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.4", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1553,14 +1451,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1570,11 +1467,11 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1584,11 +1481,11 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1598,15 +1495,15 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.2", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/types": "^7.25.2" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1616,11 +1513,11 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.24.7" + "@babel/plugin-transform-react-jsx": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1630,11 +1527,11 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1644,11 +1541,11 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1658,12 +1555,12 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1673,11 +1570,11 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.9", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1687,12 +1584,27 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1702,12 +1614,12 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.25.4", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", @@ -1729,11 +1641,11 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1743,12 +1655,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1758,11 +1670,11 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1772,11 +1684,11 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1786,11 +1698,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.8", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1800,15 +1712,15 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.25.2", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-syntax-typescript": "^7.24.7" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1818,11 +1730,11 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1832,12 +1744,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1847,12 +1759,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1862,12 +1774,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.4", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1877,92 +1789,78 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.25.4", + "version": "7.26.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.4", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-option": "^7.24.8", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", + "@babel/compat-data": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.7", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.4", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.25.4", - "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.25.4", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-dotall-regex": "^7.24.7", - "@babel/plugin-transform-duplicate-keys": "^7.24.7", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", - "@babel/plugin-transform-dynamic-import": "^7.24.7", - "@babel/plugin-transform-exponentiation-operator": "^7.24.7", - "@babel/plugin-transform-export-namespace-from": "^7.24.7", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-member-expression-literals": "^7.24.7", - "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-modules-systemjs": "^7.25.0", - "@babel/plugin-transform-modules-umd": "^7.24.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-new-target": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-object-super": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.25.4", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-property-literals": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-reserved-words": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.8", - "@babel/plugin-transform-unicode-escapes": "^7.24.7", - "@babel/plugin-transform-unicode-property-regex": "^7.24.7", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.4", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.37.1", + "core-js-compat": "^3.38.1", "semver": "^6.3.1" }, "engines": { @@ -1994,16 +1892,16 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.24.7", + "version": "7.25.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-transform-react-display-name": "^7.24.7", - "@babel/plugin-transform-react-jsx": "^7.24.7", - "@babel/plugin-transform-react-jsx-development": "^7.24.7", - "@babel/plugin-transform-react-pure-annotations": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-transform-react-display-name": "^7.25.9", + "@babel/plugin-transform-react-jsx": "^7.25.9", + "@babel/plugin-transform-react-jsx-development": "^7.25.9", + "@babel/plugin-transform-react-pure-annotations": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2013,15 +1911,15 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.24.7", + "version": "7.26.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-typescript": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2030,13 +1928,8 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "dev": true, - "license": "MIT" - }, "node_modules/@babel/runtime": { - "version": "7.25.6", + "version": "7.26.0", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2046,26 +1939,26 @@ } }, "node_modules/@babel/template": { - "version": "7.25.0", + "version": "7.25.9", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.6", + "version": "7.25.9", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.6", - "@babel/parser": "^7.25.6", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6", + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2074,12 +1967,11 @@ } }, "node_modules/@babel/types": { - "version": "7.25.6", + "version": "7.26.0", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2091,16 +1983,16 @@ "license": "MIT" }, "node_modules/@commitlint/cli": { - "version": "19.4.1", + "version": "19.6.0", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/format": "^19.3.0", - "@commitlint/lint": "^19.4.1", - "@commitlint/load": "^19.4.0", - "@commitlint/read": "^19.4.0", - "@commitlint/types": "^19.0.3", - "execa": "^8.0.1", + "@commitlint/format": "^19.5.0", + "@commitlint/lint": "^19.6.0", + "@commitlint/load": "^19.5.0", + "@commitlint/read": "^19.5.0", + "@commitlint/types": "^19.5.0", + "tinyexec": "^0.3.0", "yargs": "^17.0.0" }, "bin": { @@ -2111,11 +2003,11 @@ } }, "node_modules/@commitlint/config-conventional": { - "version": "19.4.1", + "version": "19.6.0", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^19.0.3", + "@commitlint/types": "^19.5.0", "conventional-changelog-conventionalcommits": "^7.0.2" }, "engines": { @@ -2123,11 +2015,11 @@ } }, "node_modules/@commitlint/config-validator": { - "version": "19.0.3", + "version": "19.5.0", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^19.0.3", + "@commitlint/types": "^19.5.0", "ajv": "^8.11.0" }, "engines": { @@ -2135,11 +2027,11 @@ } }, "node_modules/@commitlint/ensure": { - "version": "19.0.3", + "version": "19.5.0", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^19.0.3", + "@commitlint/types": "^19.5.0", "lodash.camelcase": "^4.3.0", "lodash.kebabcase": "^4.1.1", "lodash.snakecase": "^4.1.1", @@ -2151,7 +2043,7 @@ } }, "node_modules/@commitlint/execute-rule": { - "version": "19.0.0", + "version": "19.5.0", "dev": true, "license": "MIT", "engines": { @@ -2159,11 +2051,11 @@ } }, "node_modules/@commitlint/format": { - "version": "19.3.0", + "version": "19.5.0", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^19.0.3", + "@commitlint/types": "^19.5.0", "chalk": "^5.3.0" }, "engines": { @@ -2171,11 +2063,11 @@ } }, "node_modules/@commitlint/is-ignored": { - "version": "19.2.2", + "version": "19.6.0", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^19.0.3", + "@commitlint/types": "^19.5.0", "semver": "^7.6.0" }, "engines": { @@ -2183,28 +2075,28 @@ } }, "node_modules/@commitlint/lint": { - "version": "19.4.1", + "version": "19.6.0", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/is-ignored": "^19.2.2", - "@commitlint/parse": "^19.0.3", - "@commitlint/rules": "^19.4.1", - "@commitlint/types": "^19.0.3" + "@commitlint/is-ignored": "^19.6.0", + "@commitlint/parse": "^19.5.0", + "@commitlint/rules": "^19.6.0", + "@commitlint/types": "^19.5.0" }, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/load": { - "version": "19.4.0", + "version": "19.5.0", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/config-validator": "^19.0.3", - "@commitlint/execute-rule": "^19.0.0", - "@commitlint/resolve-extends": "^19.1.0", - "@commitlint/types": "^19.0.3", + "@commitlint/config-validator": "^19.5.0", + "@commitlint/execute-rule": "^19.5.0", + "@commitlint/resolve-extends": "^19.5.0", + "@commitlint/types": "^19.5.0", "chalk": "^5.3.0", "cosmiconfig": "^9.0.0", "cosmiconfig-typescript-loader": "^5.0.0", @@ -2217,7 +2109,7 @@ } }, "node_modules/@commitlint/message": { - "version": "19.0.0", + "version": "19.5.0", "dev": true, "license": "MIT", "engines": { @@ -2225,11 +2117,11 @@ } }, "node_modules/@commitlint/parse": { - "version": "19.0.3", + "version": "19.5.0", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^19.0.3", + "@commitlint/types": "^19.5.0", "conventional-changelog-angular": "^7.0.0", "conventional-commits-parser": "^5.0.0" }, @@ -2238,27 +2130,27 @@ } }, "node_modules/@commitlint/read": { - "version": "19.4.0", + "version": "19.5.0", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/top-level": "^19.0.0", - "@commitlint/types": "^19.0.3", - "execa": "^8.0.1", + "@commitlint/top-level": "^19.5.0", + "@commitlint/types": "^19.5.0", "git-raw-commits": "^4.0.0", - "minimist": "^1.2.8" + "minimist": "^1.2.8", + "tinyexec": "^0.3.0" }, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/resolve-extends": { - "version": "19.1.0", + "version": "19.5.0", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/config-validator": "^19.0.3", - "@commitlint/types": "^19.0.3", + "@commitlint/config-validator": "^19.5.0", + "@commitlint/types": "^19.5.0", "global-directory": "^4.0.1", "import-meta-resolve": "^4.0.0", "lodash.mergewith": "^4.6.2", @@ -2269,22 +2161,21 @@ } }, "node_modules/@commitlint/rules": { - "version": "19.4.1", + "version": "19.6.0", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/ensure": "^19.0.3", - "@commitlint/message": "^19.0.0", - "@commitlint/to-lines": "^19.0.0", - "@commitlint/types": "^19.0.3", - "execa": "^8.0.1" + "@commitlint/ensure": "^19.5.0", + "@commitlint/message": "^19.5.0", + "@commitlint/to-lines": "^19.5.0", + "@commitlint/types": "^19.5.0" }, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/to-lines": { - "version": "19.0.0", + "version": "19.5.0", "dev": true, "license": "MIT", "engines": { @@ -2292,7 +2183,7 @@ } }, "node_modules/@commitlint/top-level": { - "version": "19.0.0", + "version": "19.5.0", "dev": true, "license": "MIT", "dependencies": { @@ -2303,7 +2194,7 @@ } }, "node_modules/@commitlint/types": { - "version": "19.0.3", + "version": "19.5.0", "dev": true, "license": "MIT", "dependencies": { @@ -2335,37 +2226,37 @@ } }, "node_modules/@deck.gl/aggregation-layers": { - "version": "9.0.28", + "version": "9.0.35", "license": "MIT", "dependencies": { - "@luma.gl/constants": "^9.0.15", - "@luma.gl/shadertools": "^9.0.15", + "@luma.gl/constants": "~9.0.27", + "@luma.gl/shadertools": "~9.0.27", "@math.gl/web-mercator": "^4.0.0", "d3-hexbin": "^0.2.1" }, "peerDependencies": { "@deck.gl/core": "^9.0.0", "@deck.gl/layers": "^9.0.0", - "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "^9.0.0" + "@luma.gl/core": "~9.0.0", + "@luma.gl/engine": "~9.0.0" } }, "node_modules/@deck.gl/arcgis": { - "version": "9.0.28", + "version": "9.0.35", "license": "MIT", "dependencies": { - "@luma.gl/constants": "^9.0.15", + "@luma.gl/constants": "~9.0.27", "esri-loader": "^3.7.0" }, "peerDependencies": { "@arcgis/core": "^4.0.0", "@deck.gl/core": "^9.0.0", - "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "^9.0.0" + "@luma.gl/core": "~9.0.0", + "@luma.gl/engine": "~9.0.0" } }, "node_modules/@deck.gl/carto": { - "version": "9.0.28", + "version": "9.0.35", "license": "MIT", "dependencies": { "@loaders.gl/gis": "^4.2.0", @@ -2373,8 +2264,8 @@ "@loaders.gl/mvt": "^4.2.0", "@loaders.gl/schema": "^4.2.0", "@loaders.gl/tiles": "^4.2.0", - "@luma.gl/core": "^9.0.15", - "@luma.gl/shadertools": "^9.0.15", + "@luma.gl/core": "~9.0.27", + "@luma.gl/shadertools": "~9.0.27", "@math.gl/web-mercator": "^4.0.0", "@types/d3-array": "^3.0.2", "@types/d3-color": "^1.4.2", @@ -2415,16 +2306,16 @@ "license": "MIT" }, "node_modules/@deck.gl/core": { - "version": "9.0.28", + "version": "9.0.35", "license": "MIT", "dependencies": { "@loaders.gl/core": "^4.2.0", "@loaders.gl/images": "^4.2.0", - "@luma.gl/constants": "^9.0.15", - "@luma.gl/core": "^9.0.15", - "@luma.gl/engine": "^9.0.15", - "@luma.gl/shadertools": "^9.0.15", - "@luma.gl/webgl": "^9.0.15", + "@luma.gl/constants": "~9.0.27", + "@luma.gl/core": "~9.0.27", + "@luma.gl/engine": "~9.0.27", + "@luma.gl/shadertools": "~9.0.27", + "@luma.gl/webgl": "~9.0.27", "@math.gl/core": "^4.0.0", "@math.gl/sun": "^4.0.0", "@math.gl/web-mercator": "^4.0.0", @@ -2437,21 +2328,21 @@ } }, "node_modules/@deck.gl/extensions": { - "version": "9.0.28", + "version": "9.0.35", "license": "MIT", "dependencies": { - "@luma.gl/constants": "^9.0.15", - "@luma.gl/shadertools": "^9.0.15", + "@luma.gl/constants": "~9.0.27", + "@luma.gl/shadertools": "~9.0.27", "@math.gl/core": "^4.0.0" }, "peerDependencies": { "@deck.gl/core": "^9.0.0", - "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "^9.0.0" + "@luma.gl/core": "~9.0.0", + "@luma.gl/engine": "~9.0.0" } }, "node_modules/@deck.gl/geo-layers": { - "version": "9.0.28", + "version": "9.0.35", "license": "MIT", "dependencies": { "@loaders.gl/3d-tiles": "^4.2.0", @@ -2462,8 +2353,8 @@ "@loaders.gl/terrain": "^4.2.0", "@loaders.gl/tiles": "^4.2.0", "@loaders.gl/wms": "^4.2.0", - "@luma.gl/gltf": "^9.0.15", - "@luma.gl/shadertools": "^9.0.15", + "@luma.gl/gltf": "~9.0.27", + "@luma.gl/shadertools": "~9.0.27", "@math.gl/core": "^4.0.0", "@math.gl/culling": "^4.0.0", "@math.gl/web-mercator": "^4.0.0", @@ -2477,42 +2368,35 @@ "@deck.gl/layers": "^9.0.0", "@deck.gl/mesh-layers": "^9.0.0", "@loaders.gl/core": "^4.2.0", - "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "^9.0.0" - } - }, - "node_modules/@deck.gl/geo-layers/node_modules/long": { - "version": "3.2.0", - "license": "Apache-2.0", - "engines": { - "node": ">=0.6" + "@luma.gl/core": "~9.0.0", + "@luma.gl/engine": "~9.0.0" } }, "node_modules/@deck.gl/google-maps": { - "version": "9.0.28", + "version": "9.0.35", "license": "MIT", "dependencies": { - "@luma.gl/constants": "^9.0.15", + "@luma.gl/constants": "~9.0.27", "@math.gl/core": "^4.0.0", "@types/google.maps": "^3.48.6" }, "peerDependencies": { "@deck.gl/core": "^9.0.0", - "@luma.gl/core": "^9.0.0" + "@luma.gl/core": "~9.0.0" } }, "node_modules/@deck.gl/json": { - "version": "9.0.28", + "version": "9.0.35", "license": "MIT", "dependencies": { - "expression-eval": "^5.0.0" + "jsep": "^0.3.0" }, "peerDependencies": { "@deck.gl/core": "^9.0.0" } }, "node_modules/@deck.gl/layers": { - "version": "9.0.28", + "version": "9.0.35", "license": "MIT", "dependencies": { "@loaders.gl/images": "^4.2.0", @@ -2526,38 +2410,38 @@ "peerDependencies": { "@deck.gl/core": "^9.0.0", "@loaders.gl/core": "^4.2.0", - "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "^9.0.0" + "@luma.gl/core": "~9.0.0", + "@luma.gl/engine": "~9.0.0" } }, "node_modules/@deck.gl/mapbox": { - "version": "9.0.28", + "version": "9.0.35", "license": "MIT", "dependencies": { - "@luma.gl/constants": "^9.0.15", + "@luma.gl/constants": "~9.0.27", "@math.gl/web-mercator": "^4.0.0" }, "peerDependencies": { "@deck.gl/core": "^9.0.0", - "@luma.gl/core": "^9.0.0" + "@luma.gl/core": "~9.0.0" } }, "node_modules/@deck.gl/mesh-layers": { - "version": "9.0.28", + "version": "9.0.35", "license": "MIT", "dependencies": { "@loaders.gl/gltf": "^4.2.0", - "@luma.gl/gltf": "^9.0.15", - "@luma.gl/shadertools": "^9.0.15" + "@luma.gl/gltf": "~9.0.27", + "@luma.gl/shadertools": "~9.0.27" }, "peerDependencies": { "@deck.gl/core": "^9.0.0", - "@luma.gl/core": "^9.0.0", - "@luma.gl/engine": "^9.0.0" + "@luma.gl/core": "~9.0.0", + "@luma.gl/engine": "~9.0.0" } }, "node_modules/@deck.gl/react": { - "version": "9.0.28", + "version": "9.0.35", "license": "MIT", "peerDependencies": { "@deck.gl/core": "^9.0.0", @@ -2566,7 +2450,7 @@ } }, "node_modules/@deck.gl/widgets": { - "version": "9.0.28", + "version": "9.0.35", "license": "MIT", "dependencies": { "preact": "^10.17.0" @@ -2576,7 +2460,7 @@ } }, "node_modules/@emnapi/core": { - "version": "1.2.0", + "version": "1.3.1", "dev": true, "license": "MIT", "dependencies": { @@ -2585,7 +2469,7 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.2.0", + "version": "1.3.1", "dev": true, "license": "MIT", "dependencies": { @@ -2601,14 +2485,14 @@ } }, "node_modules/@emotion/babel-plugin": { - "version": "11.12.0", + "version": "11.13.5", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", - "@emotion/serialize": "^1.2.0", + "@emotion/serialize": "^1.3.3", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", @@ -2618,12 +2502,12 @@ } }, "node_modules/@emotion/cache": { - "version": "11.13.1", + "version": "11.13.5", "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0", "@emotion/sheet": "^1.4.0", - "@emotion/utils": "^1.4.0", + "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "stylis": "4.2.0" } @@ -2633,7 +2517,7 @@ "license": "MIT" }, "node_modules/@emotion/is-prop-valid": { - "version": "1.3.0", + "version": "1.3.1", "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0" @@ -2644,15 +2528,15 @@ "license": "MIT" }, "node_modules/@emotion/react": { - "version": "11.13.3", + "version": "11.13.5", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.12.0", - "@emotion/cache": "^11.13.0", - "@emotion/serialize": "^1.3.1", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", - "@emotion/utils": "^1.4.0", + "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "hoist-non-react-statics": "^3.3.1" }, @@ -2666,13 +2550,13 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.3.1", + "version": "1.3.3", "license": "MIT", "dependencies": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/unitless": "^0.10.0", - "@emotion/utils": "^1.4.0", + "@emotion/utils": "^1.4.2", "csstype": "^3.0.2" } }, @@ -2681,15 +2565,15 @@ "license": "MIT" }, "node_modules/@emotion/styled": { - "version": "11.13.0", + "version": "11.13.5", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.12.0", + "@emotion/babel-plugin": "^11.13.5", "@emotion/is-prop-valid": "^1.3.0", - "@emotion/serialize": "^1.3.0", + "@emotion/serialize": "^1.3.3", "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", - "@emotion/utils": "^1.4.0" + "@emotion/utils": "^1.4.2" }, "peerDependencies": { "@emotion/react": "^11.0.0-rc.0", @@ -2713,7 +2597,7 @@ } }, "node_modules/@emotion/utils": { - "version": "1.4.0", + "version": "1.4.2", "license": "MIT" }, "node_modules/@emotion/weak-memoize": { @@ -2736,21 +2620,24 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", + "version": "4.4.1", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", + "version": "4.12.1", "dev": true, "license": "MIT", "engines": { @@ -2825,7 +2712,7 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.0", + "version": "8.57.1", "dev": true, "license": "MIT", "engines": { @@ -2833,7 +2720,7 @@ } }, "node_modules/@esri/arcgis-html-sanitizer": { - "version": "4.0.3", + "version": "4.1.0-next.4", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -2849,44 +2736,28 @@ "peer": true }, "node_modules/@esri/calcite-components": { - "version": "2.12.0", + "version": "2.13.2", "license": "SEE LICENSE.md", "peer": true, "dependencies": { - "@esri/calcite-ui-icons": "3.31.0", - "@floating-ui/dom": "1.6.10", + "@esri/calcite-ui-icons": "3.32.0", + "@floating-ui/dom": "1.6.11", "@stencil/core": "4.20.0", "@types/color": "3.0.6", - "@types/sortablejs": "1.15.7", + "@types/sortablejs": "1.15.8", "color": "4.2.3", "composed-offset-position": "0.0.6", - "dayjs": "1.11.12", - "focus-trap": "7.5.4", + "dayjs": "1.11.13", + "focus-trap": "7.6.0", "interactjs": "1.10.27", "lodash-es": "4.17.21", - "sortablejs": "1.15.1", - "timezone-groups": "0.9.1", + "sortablejs": "1.15.3", + "timezone-groups": "0.10.2", "type-fest": "4.18.2" } }, - "node_modules/@esri/calcite-components/node_modules/sortablejs": { - "version": "1.15.1", - "license": "MIT", - "peer": true - }, - "node_modules/@esri/calcite-components/node_modules/type-fest": { - "version": "4.18.2", - "license": "(MIT OR CC0-1.0)", - "peer": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@esri/calcite-ui-icons": { - "version": "3.31.0", + "version": "3.32.0", "license": "SEE LICENSE.md", "peer": true, "bin": { @@ -2894,24 +2765,24 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.6.7", + "version": "1.6.8", "license": "MIT", "peer": true, "dependencies": { - "@floating-ui/utils": "^0.2.7" + "@floating-ui/utils": "^0.2.8" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.10", + "version": "1.6.11", "license": "MIT", "peer": true, "dependencies": { "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.7" + "@floating-ui/utils": "^0.2.8" } }, "node_modules/@floating-ui/utils": { - "version": "0.2.7", + "version": "0.2.8", "license": "MIT", "peer": true }, @@ -2923,7 +2794,7 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.11.1", + "version": "1.12.2", "license": "Apache-2.0", "dependencies": { "@grpc/proto-loader": "^0.7.13", @@ -2949,6 +2820,10 @@ "node": ">=6" } }, + "node_modules/@grpc/proto-loader/node_modules/long": { + "version": "5.2.3", + "license": "Apache-2.0" + }, "node_modules/@hapi/b64": { "version": "5.0.0", "license": "BSD-3-Clause", @@ -3024,11 +2899,11 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", + "version": "0.13.0", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -3083,7 +2958,7 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", + "version": "6.1.0", "dev": true, "license": "MIT", "engines": { @@ -3724,14 +3599,14 @@ "license": "MIT" }, "node_modules/@lerna/create": { - "version": "8.1.8", + "version": "8.1.9", "dev": true, "license": "MIT", "dependencies": { "@npmcli/arborist": "7.5.4", "@npmcli/package-json": "5.2.0", "@npmcli/run-script": "8.1.0", - "@nx/devkit": ">=17.1.2 < 20", + "@nx/devkit": ">=17.1.2 < 21", "@octokit/plugin-enterprise-rest": "6.0.1", "@octokit/rest": "19.0.11", "aproba": "2.0.0", @@ -3744,7 +3619,7 @@ "console-control-strings": "^1.1.0", "conventional-changelog-core": "5.0.1", "conventional-recommended-bump": "7.0.1", - "cosmiconfig": "^8.2.0", + "cosmiconfig": "9.0.0", "dedent": "1.5.3", "execa": "5.0.0", "fs-extra": "^11.2.0", @@ -3770,7 +3645,7 @@ "npm-package-arg": "11.0.2", "npm-packlist": "8.0.2", "npm-registry-fetch": "^17.1.0", - "nx": ">=17.1.2 < 20", + "nx": ">=17.1.2 < 21", "p-map": "4.0.0", "p-map-series": "2.1.0", "p-queue": "6.6.2", @@ -3833,31 +3708,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@lerna/create/node_modules/cosmiconfig": { - "version": "8.3.6", - "dev": true, - "license": "MIT", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@lerna/create/node_modules/dedent": { "version": "1.5.3", "dev": true, @@ -3934,17 +3784,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@lerna/create/node_modules/glob-parent": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/@lerna/create/node_modules/glob/node_modules/brace-expansion": { "version": "2.0.1", "dev": true, @@ -3967,14 +3806,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@lerna/create/node_modules/human-signals": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/@lerna/create/node_modules/ini": { "version": "1.3.8", "dev": true, @@ -3988,14 +3819,6 @@ "node": ">=8" } }, - "node_modules/@lerna/create/node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@lerna/create/node_modules/minimatch": { "version": "3.0.5", "dev": true, @@ -4034,31 +3857,6 @@ } } }, - "node_modules/@lerna/create/node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@lerna/create/node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@lerna/create/node_modules/rimraf": { "version": "4.4.1", "dev": true, @@ -4076,21 +3874,8 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@lerna/create/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "node_modules/@lerna/create/node_modules/strip-final-newline": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@lerna/create/node_modules/uuid": { - "version": "10.0.0", + "node_modules/@lerna/create/node_modules/uuid": { + "version": "10.0.0", "dev": true, "funding": [ "https://github.com/sponsors/broofa", @@ -4138,34 +3923,38 @@ } }, "node_modules/@loaders.gl/3d-tiles": { - "version": "4.2.2", + "version": "4.3.2", "license": "MIT", "dependencies": { - "@loaders.gl/compression": "4.2.2", - "@loaders.gl/crypto": "4.2.2", - "@loaders.gl/draco": "4.2.2", - "@loaders.gl/gltf": "4.2.2", - "@loaders.gl/images": "4.2.2", - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/math": "4.2.2", - "@loaders.gl/tiles": "4.2.2", - "@loaders.gl/zip": "4.2.2", - "@math.gl/core": "^4.0.1", - "@math.gl/culling": "^4.0.1", - "@math.gl/geospatial": "^4.0.1", + "@loaders.gl/compression": "4.3.2", + "@loaders.gl/crypto": "4.3.2", + "@loaders.gl/draco": "4.3.2", + "@loaders.gl/gltf": "4.3.2", + "@loaders.gl/images": "4.3.2", + "@loaders.gl/loader-utils": "4.3.2", + "@loaders.gl/math": "4.3.2", + "@loaders.gl/tiles": "4.3.2", + "@loaders.gl/zip": "4.3.2", + "@math.gl/core": "^4.1.0", + "@math.gl/culling": "^4.1.0", + "@math.gl/geospatial": "^4.1.0", "@probe.gl/log": "^4.0.4", "long": "^5.2.1" }, "peerDependencies": { - "@loaders.gl/core": "^4.0.0" + "@loaders.gl/core": "^4.3.0" } }, + "node_modules/@loaders.gl/3d-tiles/node_modules/long": { + "version": "5.2.3", + "license": "Apache-2.0" + }, "node_modules/@loaders.gl/compression": { - "version": "4.2.2", + "version": "4.3.2", "license": "MIT", "dependencies": { - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/worker-utils": "4.2.2", + "@loaders.gl/loader-utils": "4.3.2", + "@loaders.gl/worker-utils": "4.3.2", "@types/brotli": "^1.3.0", "@types/pako": "^1.0.1", "fflate": "0.7.4", @@ -4179,223 +3968,225 @@ "zstd-codec": "^0.1" }, "peerDependencies": { - "@loaders.gl/core": "^4.0.0" + "@loaders.gl/core": "^4.3.0" } }, "node_modules/@loaders.gl/core": { - "version": "4.2.2", + "version": "4.3.2", "license": "MIT", "dependencies": { - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/schema": "4.2.2", - "@loaders.gl/worker-utils": "4.2.2", + "@loaders.gl/loader-utils": "4.3.2", + "@loaders.gl/schema": "4.3.2", + "@loaders.gl/worker-utils": "4.3.2", "@probe.gl/log": "^4.0.2" } }, "node_modules/@loaders.gl/crypto": { - "version": "4.2.2", + "version": "4.3.2", "license": "MIT", "dependencies": { - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/worker-utils": "4.2.2", + "@loaders.gl/loader-utils": "4.3.2", + "@loaders.gl/worker-utils": "4.3.2", "@types/crypto-js": "^4.0.2" }, "peerDependencies": { - "@loaders.gl/core": "^4.0.0" + "@loaders.gl/core": "^4.3.0" } }, "node_modules/@loaders.gl/draco": { - "version": "4.2.2", + "version": "4.3.2", "license": "MIT", "dependencies": { - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/schema": "4.2.2", - "@loaders.gl/worker-utils": "4.2.2", + "@loaders.gl/loader-utils": "4.3.2", + "@loaders.gl/schema": "4.3.2", + "@loaders.gl/worker-utils": "4.3.2", "draco3d": "1.5.7" }, "peerDependencies": { - "@loaders.gl/core": "^4.0.0" + "@loaders.gl/core": "^4.3.0" } }, "node_modules/@loaders.gl/gis": { - "version": "4.2.2", + "version": "4.3.2", "license": "MIT", "dependencies": { - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/schema": "4.2.2", + "@loaders.gl/loader-utils": "4.3.2", + "@loaders.gl/schema": "4.3.2", "@mapbox/vector-tile": "^1.3.1", - "@math.gl/polygon": "^4.0.0", + "@math.gl/polygon": "^4.1.0", "pbf": "^3.2.1" }, "peerDependencies": { - "@loaders.gl/core": "^4.0.0" + "@loaders.gl/core": "^4.3.0" } }, "node_modules/@loaders.gl/gltf": { - "version": "4.2.2", + "version": "4.3.2", "license": "MIT", "dependencies": { - "@loaders.gl/draco": "4.2.2", - "@loaders.gl/images": "4.2.2", - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/schema": "4.2.2", - "@loaders.gl/textures": "4.2.2", - "@math.gl/core": "^4.0.0" + "@loaders.gl/draco": "4.3.2", + "@loaders.gl/images": "4.3.2", + "@loaders.gl/loader-utils": "4.3.2", + "@loaders.gl/schema": "4.3.2", + "@loaders.gl/textures": "4.3.2", + "@math.gl/core": "^4.1.0" }, "peerDependencies": { - "@loaders.gl/core": "^4.0.0" + "@loaders.gl/core": "^4.3.0" } }, "node_modules/@loaders.gl/images": { - "version": "4.2.2", + "version": "4.3.2", "license": "MIT", "dependencies": { - "@loaders.gl/loader-utils": "4.2.2" + "@loaders.gl/loader-utils": "4.3.2" }, "peerDependencies": { - "@loaders.gl/core": "^4.0.0" + "@loaders.gl/core": "^4.3.0" } }, "node_modules/@loaders.gl/loader-utils": { - "version": "4.2.2", + "version": "4.3.2", "license": "MIT", "dependencies": { - "@loaders.gl/schema": "4.2.2", - "@loaders.gl/worker-utils": "4.2.2", + "@loaders.gl/schema": "4.3.2", + "@loaders.gl/worker-utils": "4.3.2", + "@probe.gl/log": "^4.0.2", "@probe.gl/stats": "^4.0.2" }, "peerDependencies": { - "@loaders.gl/core": "^4.0.0" + "@loaders.gl/core": "^4.3.0" } }, "node_modules/@loaders.gl/math": { - "version": "4.2.2", + "version": "4.3.2", "license": "MIT", "dependencies": { - "@loaders.gl/images": "4.2.2", - "@loaders.gl/loader-utils": "4.2.2", - "@math.gl/core": "^4.0.0" + "@loaders.gl/images": "4.3.2", + "@loaders.gl/loader-utils": "4.3.2", + "@math.gl/core": "^4.1.0" }, "peerDependencies": { - "@loaders.gl/core": "^4.0.0" + "@loaders.gl/core": "^4.3.0" } }, "node_modules/@loaders.gl/mvt": { - "version": "4.2.2", + "version": "4.3.2", "license": "MIT", "dependencies": { - "@loaders.gl/gis": "4.2.2", - "@loaders.gl/images": "4.2.2", - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/schema": "4.2.2", - "@math.gl/polygon": "^4.0.0", + "@loaders.gl/gis": "4.3.2", + "@loaders.gl/images": "4.3.2", + "@loaders.gl/loader-utils": "4.3.2", + "@loaders.gl/schema": "4.3.2", + "@math.gl/polygon": "^4.1.0", + "@probe.gl/stats": "^4.0.0", "pbf": "^3.2.1" }, "peerDependencies": { - "@loaders.gl/core": "^4.0.0" + "@loaders.gl/core": "^4.3.0" } }, "node_modules/@loaders.gl/schema": { - "version": "4.2.2", + "version": "4.3.2", "license": "MIT", "dependencies": { "@types/geojson": "^7946.0.7" }, "peerDependencies": { - "@loaders.gl/core": "^4.0.0" + "@loaders.gl/core": "^4.3.0" } }, "node_modules/@loaders.gl/terrain": { - "version": "4.2.2", + "version": "4.3.2", "license": "MIT", "dependencies": { - "@loaders.gl/images": "4.2.2", - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/schema": "4.2.2", + "@loaders.gl/images": "4.3.2", + "@loaders.gl/loader-utils": "4.3.2", + "@loaders.gl/schema": "4.3.2", "@mapbox/martini": "^0.2.0" }, "peerDependencies": { - "@loaders.gl/core": "^4.0.0" + "@loaders.gl/core": "^4.3.0" } }, "node_modules/@loaders.gl/textures": { - "version": "4.2.2", + "version": "4.3.2", "license": "MIT", "dependencies": { - "@loaders.gl/images": "4.2.2", - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/schema": "4.2.2", - "@loaders.gl/worker-utils": "4.2.2", - "@math.gl/types": "^4.0.1", - "ktx-parse": "^0.0.4", + "@loaders.gl/images": "4.3.2", + "@loaders.gl/loader-utils": "4.3.2", + "@loaders.gl/schema": "4.3.2", + "@loaders.gl/worker-utils": "4.3.2", + "@math.gl/types": "^4.1.0", + "ktx-parse": "^0.7.0", "texture-compressor": "^1.0.2" }, "peerDependencies": { - "@loaders.gl/core": "^4.0.0" + "@loaders.gl/core": "^4.3.0" } }, "node_modules/@loaders.gl/tiles": { - "version": "4.2.2", + "version": "4.3.2", "license": "MIT", "dependencies": { - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/math": "4.2.2", - "@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", + "@loaders.gl/loader-utils": "4.3.2", + "@loaders.gl/math": "4.3.2", + "@math.gl/core": "^4.1.0", + "@math.gl/culling": "^4.1.0", + "@math.gl/geospatial": "^4.1.0", + "@math.gl/web-mercator": "^4.1.0", "@probe.gl/stats": "^4.0.2" }, "peerDependencies": { - "@loaders.gl/core": "^4.0.0" + "@loaders.gl/core": "^4.3.0" } }, "node_modules/@loaders.gl/wms": { - "version": "4.2.2", + "version": "4.3.2", "license": "MIT", "dependencies": { - "@loaders.gl/images": "4.2.2", - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/schema": "4.2.2", - "@loaders.gl/xml": "4.2.2", + "@loaders.gl/images": "4.3.2", + "@loaders.gl/loader-utils": "4.3.2", + "@loaders.gl/schema": "4.3.2", + "@loaders.gl/xml": "4.3.2", "@turf/rewind": "^5.1.5", "deep-strict-equal": "^0.2.0" }, "peerDependencies": { - "@loaders.gl/core": "^4.0.0" + "@loaders.gl/core": "^4.3.0" } }, "node_modules/@loaders.gl/worker-utils": { - "version": "4.2.2", + "version": "4.3.2", "license": "MIT", "peerDependencies": { - "@loaders.gl/core": "^4.0.0" + "@loaders.gl/core": "^4.3.0" } }, "node_modules/@loaders.gl/xml": { - "version": "4.2.2", + "version": "4.3.2", "license": "MIT", "dependencies": { - "@loaders.gl/loader-utils": "4.2.2", - "@loaders.gl/schema": "4.2.2", + "@loaders.gl/loader-utils": "4.3.2", + "@loaders.gl/schema": "4.3.2", "fast-xml-parser": "^4.2.5" }, "peerDependencies": { - "@loaders.gl/core": "^4.0.0" + "@loaders.gl/core": "^4.3.0" } }, "node_modules/@loaders.gl/zip": { - "version": "4.2.2", + "version": "4.3.2", "license": "MIT", "dependencies": { - "@loaders.gl/compression": "4.2.2", - "@loaders.gl/crypto": "4.2.2", - "@loaders.gl/loader-utils": "4.2.2", + "@loaders.gl/compression": "4.3.2", + "@loaders.gl/crypto": "4.3.2", + "@loaders.gl/loader-utils": "4.3.2", "jszip": "^3.1.5", "md5": "^2.3.0" }, "peerDependencies": { - "@loaders.gl/core": "^4.0.0" + "@loaders.gl/core": "^4.3.0" } }, "node_modules/@luma.gl/constants": { @@ -4503,21 +4294,22 @@ } }, "node_modules/@map-colonies/express-access-log-middleware": { - "version": "2.0.1", + "version": "2.1.0", "license": "ISC", "dependencies": { - "http-status-codes": "^2.1.4", - "pino-http": "^8.3.3" + "http-status-codes": "^2.3.0", + "pino-http": "^10.3.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=20" } }, "node_modules/@map-colonies/js-logger": { - "version": "1.0.1", + "version": "1.1.0", "license": "ISC", "dependencies": { "pino": "^8.11.0", + "pino-caller": "^3.4.0", "pino-pretty": "^10.0.0" } }, @@ -4542,6 +4334,16 @@ "type-fest": "^2.3.2" } }, + "node_modules/@map-colonies/read-pkg/node_modules/type-fest": { + "version": "2.19.0", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@map-colonies/standard-version-update-helm-version": { "version": "2.0.1", "dev": true, @@ -4559,7 +4361,7 @@ } }, "node_modules/@map-colonies/telemetry": { - "version": "6.1.0", + "version": "6.1.1", "license": "ISC", "dependencies": { "@map-colonies/read-pkg": "^0.0.1", @@ -4591,16 +4393,6 @@ "geojson-rewind": "geojson-rewind" } }, - "node_modules/@mapbox/geojson-rewind/node_modules/get-stream": { - "version": "6.0.1", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@mapbox/jsonlint-lines-primitives": { "version": "2.0.2", "engines": { @@ -4666,44 +4458,49 @@ } }, "node_modules/@math.gl/core": { - "version": "4.0.1", + "version": "4.1.0", "license": "MIT", "dependencies": { - "@math.gl/types": "4.0.1" + "@math.gl/types": "4.1.0" } }, "node_modules/@math.gl/culling": { - "version": "4.0.1", + "version": "4.1.0", "license": "MIT", "dependencies": { - "@math.gl/core": "4.0.1" + "@math.gl/core": "4.1.0", + "@math.gl/types": "4.1.0" } }, "node_modules/@math.gl/geospatial": { - "version": "4.0.1", + "version": "4.1.0", "license": "MIT", "dependencies": { - "@math.gl/core": "4.0.1" + "@math.gl/core": "4.1.0", + "@math.gl/types": "4.1.0" } }, "node_modules/@math.gl/polygon": { - "version": "4.0.1", + "version": "4.1.0", "license": "MIT", "dependencies": { - "@math.gl/core": "4.0.1" + "@math.gl/core": "4.1.0" } }, "node_modules/@math.gl/sun": { - "version": "4.0.1", + "version": "4.1.0", "license": "MIT" }, "node_modules/@math.gl/types": { - "version": "4.0.1", + "version": "4.1.0", "license": "MIT" }, "node_modules/@math.gl/web-mercator": { - "version": "4.0.1", - "license": "MIT" + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "@math.gl/core": "4.1.0" + } }, "node_modules/@mui/core-downloads-tracker": { "version": "5.16.7", @@ -4874,7 +4671,7 @@ } }, "node_modules/@mui/types": { - "version": "7.2.16", + "version": "7.2.19", "license": "MIT", "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" @@ -5392,32 +5189,11 @@ "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/@nrwl/devkit": { - "version": "19.6.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@nx/devkit": "19.6.4" - } - }, - "node_modules/@nrwl/tao": { - "version": "19.6.4", - "dev": true, - "license": "MIT", - "dependencies": { - "nx": "19.6.4", - "tslib": "^2.3.0" - }, - "bin": { - "tao": "index.js" - } - }, "node_modules/@nx/devkit": { - "version": "19.6.4", + "version": "20.1.2", "dev": true, "license": "MIT", "dependencies": { - "@nrwl/devkit": "19.6.4", "ejs": "^3.1.7", "enquirer": "~2.3.6", "ignore": "^5.0.4", @@ -5428,7 +5204,7 @@ "yargs-parser": "21.1.1" }, "peerDependencies": { - "nx": ">= 17 <= 20" + "nx": ">= 19 <= 21" } }, "node_modules/@nx/devkit/node_modules/brace-expansion": { @@ -5462,7 +5238,7 @@ } }, "node_modules/@nx/nx-linux-x64-gnu": { - "version": "19.6.4", + "version": "20.1.2", "cpu": [ "x64" ], @@ -5477,7 +5253,7 @@ } }, "node_modules/@nx/nx-linux-x64-musl": { - "version": "19.6.4", + "version": "20.1.2", "cpu": [ "x64" ], @@ -5793,7 +5569,7 @@ } }, "node_modules/@opentelemetry/context-async-hooks": { - "version": "1.26.0", + "version": "1.28.0", "license": "Apache-2.0", "engines": { "node": ">=14" @@ -5803,7 +5579,7 @@ } }, "node_modules/@opentelemetry/core": { - "version": "1.26.0", + "version": "1.28.0", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "1.27.0" @@ -6990,7 +6766,7 @@ } }, "node_modules/@opentelemetry/propagation-utils": { - "version": "0.30.11", + "version": "0.30.13", "license": "Apache-2.0", "engines": { "node": ">=14" @@ -7012,11 +6788,24 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/propagator-b3": { + "node_modules/@opentelemetry/propagator-aws-xray/node_modules/@opentelemetry/core": { "version": "1.26.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0" + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "1.28.0", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.28.0" }, "engines": { "node": ">=14" @@ -7026,10 +6815,10 @@ } }, "node_modules/@opentelemetry/propagator-jaeger": { - "version": "1.26.0", + "version": "1.28.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0" + "@opentelemetry/core": "1.28.0" }, "engines": { "node": ">=14" @@ -7060,7 +6849,7 @@ } }, "node_modules/@opentelemetry/resource-detector-aws": { - "version": "1.6.1", + "version": "1.8.0", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^1.0.0", @@ -7089,11 +6878,11 @@ } }, "node_modules/@opentelemetry/resource-detector-gcp": { - "version": "0.29.11", + "version": "0.29.13", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^1.0.0", - "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/resources": "^1.10.0", "@opentelemetry/semantic-conventions": "^1.27.0", "gcp-metadata": "^6.0.0" }, @@ -7105,10 +6894,10 @@ } }, "node_modules/@opentelemetry/resources": { - "version": "1.26.0", + "version": "1.28.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", + "@opentelemetry/core": "1.28.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { @@ -7168,11 +6957,11 @@ } }, "node_modules/@opentelemetry/sdk-metrics": { - "version": "1.26.0", + "version": "1.28.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0" + "@opentelemetry/core": "1.28.0", + "@opentelemetry/resources": "1.28.0" }, "engines": { "node": ">=14" @@ -7325,11 +7114,11 @@ } }, "node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.26.0", + "version": "1.28.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0", + "@opentelemetry/core": "1.28.0", + "@opentelemetry/resources": "1.28.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { @@ -7340,14 +7129,14 @@ } }, "node_modules/@opentelemetry/sdk-trace-node": { - "version": "1.26.0", + "version": "1.28.0", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/context-async-hooks": "1.26.0", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/propagator-b3": "1.26.0", - "@opentelemetry/propagator-jaeger": "1.26.0", - "@opentelemetry/sdk-trace-base": "1.26.0", + "@opentelemetry/context-async-hooks": "1.28.0", + "@opentelemetry/core": "1.28.0", + "@opentelemetry/propagator-b3": "1.28.0", + "@opentelemetry/propagator-jaeger": "1.28.0", + "@opentelemetry/sdk-trace-base": "1.28.0", "semver": "^7.5.2" }, "engines": { @@ -7387,7 +7176,7 @@ } }, "node_modules/@polymer/polymer": { - "version": "3.5.1", + "version": "3.5.2", "license": "BSD-3-Clause", "peer": true, "dependencies": { @@ -7513,14 +7302,14 @@ } }, "node_modules/@redocly/ajv": { - "version": "8.11.0", + "version": "8.11.2", "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js-replace": "^1.0.1" }, "funding": { "type": "github", @@ -7629,7 +7418,7 @@ } }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.21.2", + "version": "4.27.3", "cpu": [ "x64" ], @@ -7641,7 +7430,7 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.21.2", + "version": "4.27.3", "cpu": [ "x64" ], @@ -7652,11 +7441,21 @@ "linux" ] }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, "node_modules/@rushstack/eslint-patch": { "version": "1.10.4", "dev": true, "license": "MIT" }, + "node_modules/@scarf/scarf": { + "version": "1.4.0", + "hasInstallScript": true, + "license": "Apache-2.0" + }, "node_modules/@sideway/address": { "version": "4.1.5", "license": "BSD-3-Clause", @@ -7835,99 +7634,4479 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@turf/boolean-clockwise": { - "version": "5.1.5", + "node_modules/@turf/along": { + "version": "7.1.0", "license": "MIT", "dependencies": { - "@turf/helpers": "^5.1.5", - "@turf/invariant": "^5.1.5" + "@turf/bearing": "^7.1.0", + "@turf/destination": "^7.1.0", + "@turf/distance": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/boolean-clockwise/node_modules/@turf/helpers": { - "version": "5.1.5", - "license": "MIT" - }, - "node_modules/@turf/clone": { - "version": "5.1.5", + "node_modules/@turf/along/node_modules/@turf/helpers": { + "version": "7.1.0", "license": "MIT", "dependencies": { - "@turf/helpers": "^5.1.5" + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/clone/node_modules/@turf/helpers": { - "version": "5.1.5", - "license": "MIT" - }, - "node_modules/@turf/helpers": { - "version": "6.5.0", - "dev": true, + "node_modules/@turf/along/node_modules/@turf/invariant": { + "version": "7.1.0", "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, "funding": { "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/invariant": { - "version": "5.2.0", + "node_modules/@turf/angle": { + "version": "7.1.0", "license": "MIT", "dependencies": { - "@turf/helpers": "^5.1.5" + "@turf/bearing": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/rhumb-bearing": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/invariant/node_modules/@turf/helpers": { - "version": "5.1.5", - "license": "MIT" - }, - "node_modules/@turf/meta": { - "version": "5.2.0", + "node_modules/@turf/angle/node_modules/@turf/helpers": { + "version": "7.1.0", "license": "MIT", "dependencies": { - "@turf/helpers": "^5.1.5" + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/meta/node_modules/@turf/helpers": { - "version": "5.1.5", - "license": "MIT" - }, - "node_modules/@turf/rewind": { - "version": "5.1.5", + "node_modules/@turf/angle/node_modules/@turf/invariant": { + "version": "7.1.0", "license": "MIT", "dependencies": { - "@turf/boolean-clockwise": "^5.1.5", - "@turf/clone": "^5.1.5", - "@turf/helpers": "^5.1.5", - "@turf/invariant": "^5.1.5", - "@turf/meta": "^5.1.5" + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/rewind/node_modules/@turf/helpers": { - "version": "5.1.5", - "license": "MIT" - }, - "node_modules/@tybys/wasm-util": { - "version": "0.9.0", - "dev": true, + "node_modules/@turf/area": { + "version": "7.1.0", "license": "MIT", "dependencies": { - "tslib": "^2.4.0" + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" } }, - "node_modules/@types/accepts": { - "version": "1.3.7", + "node_modules/@turf/area/node_modules/@turf/helpers": { + "version": "7.1.0", "license": "MIT", "dependencies": { - "@types/node": "*" + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" } }, - "node_modules/@types/aws-lambda": { - "version": "8.10.122", - "license": "MIT" + "node_modules/@turf/area/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "dev": true, + "node_modules/@turf/bbox": { + "version": "7.1.0", "license": "MIT", "dependencies": { - "@babel/parser": "^7.20.7", + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bbox-clip": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bbox-clip/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bbox-clip/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bbox-polygon": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bbox-polygon/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bbox/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bbox/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bearing": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bearing/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bearing/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bezier-spline": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bezier-spline/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bezier-spline/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-clockwise": { + "version": "5.1.5", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "node_modules/@turf/boolean-clockwise/node_modules/@turf/helpers": { + "version": "5.1.5", + "license": "MIT" + }, + "node_modules/@turf/boolean-concave": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-concave/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-concave/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-contains": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.1.0", + "@turf/boolean-point-in-polygon": "^7.1.0", + "@turf/boolean-point-on-line": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-contains/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-contains/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-crosses": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/boolean-point-in-polygon": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/line-intersect": "^7.1.0", + "@turf/polygon-to-line": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-crosses/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-crosses/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-disjoint": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/boolean-point-in-polygon": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/line-intersect": "^7.1.0", + "@turf/meta": "^7.1.0", + "@turf/polygon-to-line": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-disjoint/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-disjoint/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-equal": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/clean-coords": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "geojson-equality-ts": "^1.0.2", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-equal/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-equal/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-intersects": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/boolean-disjoint": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-intersects/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-intersects/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-overlap": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/line-intersect": "^7.1.0", + "@turf/line-overlap": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "geojson-equality-ts": "^1.0.2", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-overlap/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-overlap/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-overlap/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-parallel": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/clean-coords": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/line-segment": "^7.1.0", + "@turf/rhumb-bearing": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-parallel/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-point-in-polygon": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "point-in-polygon-hao": "^1.1.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-point-in-polygon/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-point-in-polygon/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-point-on-line": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-point-on-line/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-point-on-line/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-touches": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/boolean-point-in-polygon": "^7.1.0", + "@turf/boolean-point-on-line": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-touches/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-touches/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-valid": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.1.0", + "@turf/boolean-crosses": "^7.1.0", + "@turf/boolean-disjoint": "^7.1.0", + "@turf/boolean-overlap": "^7.1.0", + "@turf/boolean-point-in-polygon": "^7.1.0", + "@turf/boolean-point-on-line": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/line-intersect": "^7.1.0", + "@types/geojson": "^7946.0.10", + "geojson-polygon-self-intersections": "^1.2.1", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-valid/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-valid/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-within": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.1.0", + "@turf/boolean-point-in-polygon": "^7.1.0", + "@turf/boolean-point-on-line": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-within/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-within/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/buffer": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.1.0", + "@turf/center": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/jsts": "^2.7.1", + "@turf/meta": "^7.1.0", + "@turf/projection": "^7.1.0", + "@types/geojson": "^7946.0.10", + "d3-geo": "1.7.1" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/buffer/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/buffer/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/buffer/node_modules/d3-array": { + "version": "1.2.4", + "license": "BSD-3-Clause" + }, + "node_modules/@turf/buffer/node_modules/d3-geo": { + "version": "1.7.1", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1" + } + }, + "node_modules/@turf/center": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/center-mean": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/center-mean/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/center-mean/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/center-median": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/center-mean": "^7.1.0", + "@turf/centroid": "^7.1.0", + "@turf/distance": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/center-median/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/center-median/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/center-of-mass": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/centroid": "^7.1.0", + "@turf/convex": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/center-of-mass/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/center-of-mass/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/center-of-mass/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/center/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/centroid": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/centroid/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/centroid/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/circle": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/destination": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/circle/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clean-coords": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clean-coords/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clean-coords/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clone": { + "version": "5.1.5", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^5.1.5" + } + }, + "node_modules/@turf/clone/node_modules/@turf/helpers": { + "version": "5.1.5", + "license": "MIT" + }, + "node_modules/@turf/clusters": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clusters-dbscan": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/clone": "^7.1.0", + "@turf/distance": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "rbush": "^3.0.1", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clusters-dbscan/node_modules/@turf/clone": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clusters-dbscan/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clusters-dbscan/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clusters-kmeans": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/clone": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "skmeans": "0.9.7", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clusters-kmeans/node_modules/@turf/clone": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clusters-kmeans/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clusters-kmeans/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clusters-kmeans/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clusters/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/clusters/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/collect": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.1.0", + "@turf/boolean-point-in-polygon": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "rbush": "^3.0.1", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/collect/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/combine": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/combine/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/combine/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/concave": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/clone": "^7.1.0", + "@turf/distance": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/meta": "^7.1.0", + "@turf/tin": "^7.1.0", + "@types/geojson": "^7946.0.10", + "topojson-client": "3.x", + "topojson-server": "3.x", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/concave/node_modules/@turf/clone": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/concave/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/concave/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/concave/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/convex": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "concaveman": "^1.2.1", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/convex/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/convex/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/destination": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/destination/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/destination/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/difference": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "polygon-clipping": "^0.15.3", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/difference/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/difference/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/dissolve": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/flatten": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "polygon-clipping": "^0.15.3", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/dissolve/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/dissolve/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/dissolve/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/distance": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/distance-weight": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/centroid": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/distance-weight/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/distance-weight/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/distance-weight/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/distance/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/distance/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/ellipse": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/rhumb-destination": "^7.1.0", + "@turf/transform-rotate": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/ellipse/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/ellipse/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/envelope": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.1.0", + "@turf/bbox-polygon": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/envelope/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/explode": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/explode/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/explode/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/flatten": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/flatten/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/flatten/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/flip": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/clone": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/flip/node_modules/@turf/clone": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/flip/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/flip/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/geojson-rbush": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "rbush": "^3.0.1" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/geojson-rbush/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/geojson-rbush/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/great-circle": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/great-circle/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/great-circle/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/helpers": { + "version": "6.5.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/hex-grid": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/distance": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/intersect": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/hex-grid/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/hex-grid/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/interpolate": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.1.0", + "@turf/centroid": "^7.1.0", + "@turf/clone": "^7.1.0", + "@turf/distance": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/hex-grid": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/meta": "^7.1.0", + "@turf/point-grid": "^7.1.0", + "@turf/square-grid": "^7.1.0", + "@turf/triangle-grid": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/interpolate/node_modules/@turf/clone": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/interpolate/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/interpolate/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/interpolate/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/intersect": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "polygon-clipping": "^0.15.3", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/intersect/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/intersect/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/invariant": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^5.1.5" + } + }, + "node_modules/@turf/invariant/node_modules/@turf/helpers": { + "version": "5.1.5", + "license": "MIT" + }, + "node_modules/@turf/isobands": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/area": "^7.1.0", + "@turf/bbox": "^7.1.0", + "@turf/boolean-point-in-polygon": "^7.1.0", + "@turf/explode": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "marchingsquares": "^1.3.3", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/isobands/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/isobands/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/isobands/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/isolines": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "marchingsquares": "^1.3.3", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/isolines/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/isolines/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/isolines/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/jsts": { + "version": "2.7.1", + "license": "(EDL-1.0 OR EPL-1.0)", + "dependencies": { + "jsts": "2.7.1" + } + }, + "node_modules/@turf/kinks": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/kinks/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/length": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/distance": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/length/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/length/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-arc": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/circle": "^7.1.0", + "@turf/destination": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-arc/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-chunk": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/length": "^7.1.0", + "@turf/line-slice-along": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-chunk/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-chunk/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-intersect": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "sweepline-intersections": "^1.5.0", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-intersect/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-offset": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-offset/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-offset/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-offset/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-overlap": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/boolean-point-on-line": "^7.1.0", + "@turf/geojson-rbush": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/line-segment": "^7.1.0", + "@turf/meta": "^7.1.0", + "@turf/nearest-point-on-line": "^7.1.0", + "@types/geojson": "^7946.0.10", + "fast-deep-equal": "^3.1.3", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-overlap/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-overlap/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-overlap/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-segment": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-segment/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-segment/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-segment/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-slice": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/nearest-point-on-line": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-slice-along": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/bearing": "^7.1.0", + "@turf/destination": "^7.1.0", + "@turf/distance": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-slice-along/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-slice/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-slice/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-split": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.1.0", + "@turf/geojson-rbush": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/line-intersect": "^7.1.0", + "@turf/line-segment": "^7.1.0", + "@turf/meta": "^7.1.0", + "@turf/nearest-point-on-line": "^7.1.0", + "@turf/square": "^7.1.0", + "@turf/truncate": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-split/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-split/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-split/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-to-polygon": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.1.0", + "@turf/clone": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-to-polygon/node_modules/@turf/clone": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-to-polygon/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-to-polygon/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/mask": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/clone": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "polygon-clipping": "^0.15.3", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/mask/node_modules/@turf/clone": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/mask/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/meta": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^5.1.5" + } + }, + "node_modules/@turf/meta/node_modules/@turf/helpers": { + "version": "5.1.5", + "license": "MIT" + }, + "node_modules/@turf/midpoint": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/bearing": "^7.1.0", + "@turf/destination": "^7.1.0", + "@turf/distance": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/midpoint/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/moran-index": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/distance-weight": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/moran-index/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/moran-index/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/nearest-neighbor-analysis": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/area": "^7.1.0", + "@turf/bbox": "^7.1.0", + "@turf/bbox-polygon": "^7.1.0", + "@turf/centroid": "^7.1.0", + "@turf/distance": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@turf/nearest-point": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/nearest-neighbor-analysis/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/nearest-neighbor-analysis/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/nearest-point": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/clone": "^7.1.0", + "@turf/distance": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/nearest-point-on-line": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/bearing": "^7.1.0", + "@turf/destination": "^7.1.0", + "@turf/distance": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/line-intersect": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/nearest-point-on-line/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/nearest-point-on-line/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/nearest-point-on-line/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/nearest-point-to-line": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/meta": "^7.1.0", + "@turf/point-to-line-distance": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/nearest-point-to-line/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/nearest-point-to-line/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/nearest-point-to-line/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/nearest-point/node_modules/@turf/clone": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/nearest-point/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/nearest-point/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/planepoint": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/planepoint/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/planepoint/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/point-grid": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/boolean-within": "^7.1.0", + "@turf/distance": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/point-grid/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/point-grid/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/point-on-feature": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/boolean-point-in-polygon": "^7.1.0", + "@turf/center": "^7.1.0", + "@turf/explode": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/nearest-point": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/point-on-feature/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/point-to-line-distance": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/bearing": "^7.1.0", + "@turf/distance": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/meta": "^7.1.0", + "@turf/projection": "^7.1.0", + "@turf/rhumb-bearing": "^7.1.0", + "@turf/rhumb-distance": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/point-to-line-distance/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/point-to-line-distance/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/point-to-line-distance/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/points-within-polygon": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/boolean-point-in-polygon": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/points-within-polygon/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/points-within-polygon/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/polygon-smooth": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/polygon-smooth/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/polygon-smooth/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/polygon-tangents": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.1.0", + "@turf/boolean-within": "^7.1.0", + "@turf/explode": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/nearest-point": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/polygon-tangents/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/polygon-tangents/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/polygon-to-line": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/polygon-to-line/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/polygon-to-line/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/polygonize": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/boolean-point-in-polygon": "^7.1.0", + "@turf/envelope": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/polygonize/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/polygonize/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/polygonize/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/projection": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/clone": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/projection/node_modules/@turf/clone": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/projection/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/projection/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/quadrat-analysis": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/area": "^7.1.0", + "@turf/bbox": "^7.1.0", + "@turf/bbox-polygon": "^7.1.0", + "@turf/centroid": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/point-grid": "^7.1.0", + "@turf/random": "^7.1.0", + "@turf/square-grid": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/quadrat-analysis/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/quadrat-analysis/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/random": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/random/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/rectangle-grid": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/boolean-intersects": "^7.1.0", + "@turf/distance": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/rectangle-grid/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/rewind": { + "version": "5.1.5", + "license": "MIT", + "dependencies": { + "@turf/boolean-clockwise": "^5.1.5", + "@turf/clone": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "node_modules/@turf/rewind/node_modules/@turf/helpers": { + "version": "5.1.5", + "license": "MIT" + }, + "node_modules/@turf/rhumb-bearing": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/rhumb-bearing/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/rhumb-bearing/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/rhumb-destination": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/rhumb-destination/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/rhumb-destination/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/rhumb-distance": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/rhumb-distance/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/rhumb-distance/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/sample": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/sample/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/sector": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/circle": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/line-arc": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/sector/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/sector/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/sector/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/shortest-path": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.1.0", + "@turf/bbox-polygon": "^7.1.0", + "@turf/boolean-point-in-polygon": "^7.1.0", + "@turf/clean-coords": "^7.1.0", + "@turf/distance": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/meta": "^7.1.0", + "@turf/transform-scale": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/shortest-path/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/shortest-path/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/shortest-path/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/simplify": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/clean-coords": "^7.1.0", + "@turf/clone": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/simplify/node_modules/@turf/clone": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/simplify/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/simplify/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/square": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/distance": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/square-grid": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/rectangle-grid": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/square-grid/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/square/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/standard-deviational-ellipse": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/center-mean": "^7.1.0", + "@turf/ellipse": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/meta": "^7.1.0", + "@turf/points-within-polygon": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/standard-deviational-ellipse/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/standard-deviational-ellipse/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/standard-deviational-ellipse/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/tag": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/boolean-point-in-polygon": "^7.1.0", + "@turf/clone": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/tag/node_modules/@turf/clone": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/tag/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/tag/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/tesselate": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "earcut": "^2.2.4", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/tesselate/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/tin": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/tin/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/transform-rotate": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/centroid": "^7.1.0", + "@turf/clone": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/meta": "^7.1.0", + "@turf/rhumb-bearing": "^7.1.0", + "@turf/rhumb-destination": "^7.1.0", + "@turf/rhumb-distance": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/transform-rotate/node_modules/@turf/clone": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/transform-rotate/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/transform-rotate/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/transform-rotate/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/transform-scale": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/bbox": "^7.1.0", + "@turf/center": "^7.1.0", + "@turf/centroid": "^7.1.0", + "@turf/clone": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/meta": "^7.1.0", + "@turf/rhumb-bearing": "^7.1.0", + "@turf/rhumb-destination": "^7.1.0", + "@turf/rhumb-distance": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/transform-scale/node_modules/@turf/clone": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/transform-scale/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/transform-scale/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/transform-scale/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/transform-translate": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/clone": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/meta": "^7.1.0", + "@turf/rhumb-destination": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/transform-translate/node_modules/@turf/clone": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/transform-translate/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/transform-translate/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/transform-translate/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/triangle-grid": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/distance": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/intersect": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/triangle-grid/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/truncate": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/truncate/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/truncate/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/turf": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/along": "^7.1.0", + "@turf/angle": "^7.1.0", + "@turf/area": "^7.1.0", + "@turf/bbox": "^7.1.0", + "@turf/bbox-clip": "^7.1.0", + "@turf/bbox-polygon": "^7.1.0", + "@turf/bearing": "^7.1.0", + "@turf/bezier-spline": "^7.1.0", + "@turf/boolean-clockwise": "^7.1.0", + "@turf/boolean-concave": "^7.1.0", + "@turf/boolean-contains": "^7.1.0", + "@turf/boolean-crosses": "^7.1.0", + "@turf/boolean-disjoint": "^7.1.0", + "@turf/boolean-equal": "^7.1.0", + "@turf/boolean-intersects": "^7.1.0", + "@turf/boolean-overlap": "^7.1.0", + "@turf/boolean-parallel": "^7.1.0", + "@turf/boolean-point-in-polygon": "^7.1.0", + "@turf/boolean-point-on-line": "^7.1.0", + "@turf/boolean-touches": "^7.1.0", + "@turf/boolean-valid": "^7.1.0", + "@turf/boolean-within": "^7.1.0", + "@turf/buffer": "^7.1.0", + "@turf/center": "^7.1.0", + "@turf/center-mean": "^7.1.0", + "@turf/center-median": "^7.1.0", + "@turf/center-of-mass": "^7.1.0", + "@turf/centroid": "^7.1.0", + "@turf/circle": "^7.1.0", + "@turf/clean-coords": "^7.1.0", + "@turf/clone": "^7.1.0", + "@turf/clusters": "^7.1.0", + "@turf/clusters-dbscan": "^7.1.0", + "@turf/clusters-kmeans": "^7.1.0", + "@turf/collect": "^7.1.0", + "@turf/combine": "^7.1.0", + "@turf/concave": "^7.1.0", + "@turf/convex": "^7.1.0", + "@turf/destination": "^7.1.0", + "@turf/difference": "^7.1.0", + "@turf/dissolve": "^7.1.0", + "@turf/distance": "^7.1.0", + "@turf/distance-weight": "^7.1.0", + "@turf/ellipse": "^7.1.0", + "@turf/envelope": "^7.1.0", + "@turf/explode": "^7.1.0", + "@turf/flatten": "^7.1.0", + "@turf/flip": "^7.1.0", + "@turf/geojson-rbush": "^7.1.0", + "@turf/great-circle": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/hex-grid": "^7.1.0", + "@turf/interpolate": "^7.1.0", + "@turf/intersect": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/isobands": "^7.1.0", + "@turf/isolines": "^7.1.0", + "@turf/kinks": "^7.1.0", + "@turf/length": "^7.1.0", + "@turf/line-arc": "^7.1.0", + "@turf/line-chunk": "^7.1.0", + "@turf/line-intersect": "^7.1.0", + "@turf/line-offset": "^7.1.0", + "@turf/line-overlap": "^7.1.0", + "@turf/line-segment": "^7.1.0", + "@turf/line-slice": "^7.1.0", + "@turf/line-slice-along": "^7.1.0", + "@turf/line-split": "^7.1.0", + "@turf/line-to-polygon": "^7.1.0", + "@turf/mask": "^7.1.0", + "@turf/meta": "^7.1.0", + "@turf/midpoint": "^7.1.0", + "@turf/moran-index": "^7.1.0", + "@turf/nearest-neighbor-analysis": "^7.1.0", + "@turf/nearest-point": "^7.1.0", + "@turf/nearest-point-on-line": "^7.1.0", + "@turf/nearest-point-to-line": "^7.1.0", + "@turf/planepoint": "^7.1.0", + "@turf/point-grid": "^7.1.0", + "@turf/point-on-feature": "^7.1.0", + "@turf/point-to-line-distance": "^7.1.0", + "@turf/points-within-polygon": "^7.1.0", + "@turf/polygon-smooth": "^7.1.0", + "@turf/polygon-tangents": "^7.1.0", + "@turf/polygon-to-line": "^7.1.0", + "@turf/polygonize": "^7.1.0", + "@turf/projection": "^7.1.0", + "@turf/quadrat-analysis": "^7.1.0", + "@turf/random": "^7.1.0", + "@turf/rectangle-grid": "^7.1.0", + "@turf/rewind": "^7.1.0", + "@turf/rhumb-bearing": "^7.1.0", + "@turf/rhumb-destination": "^7.1.0", + "@turf/rhumb-distance": "^7.1.0", + "@turf/sample": "^7.1.0", + "@turf/sector": "^7.1.0", + "@turf/shortest-path": "^7.1.0", + "@turf/simplify": "^7.1.0", + "@turf/square": "^7.1.0", + "@turf/square-grid": "^7.1.0", + "@turf/standard-deviational-ellipse": "^7.1.0", + "@turf/tag": "^7.1.0", + "@turf/tesselate": "^7.1.0", + "@turf/tin": "^7.1.0", + "@turf/transform-rotate": "^7.1.0", + "@turf/transform-scale": "^7.1.0", + "@turf/transform-translate": "^7.1.0", + "@turf/triangle-grid": "^7.1.0", + "@turf/truncate": "^7.1.0", + "@turf/union": "^7.1.0", + "@turf/unkink-polygon": "^7.1.0", + "@turf/voronoi": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/turf/node_modules/@turf/boolean-clockwise": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/turf/node_modules/@turf/clone": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/turf/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/turf/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/turf/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/turf/node_modules/@turf/rewind": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/boolean-clockwise": "^7.1.0", + "@turf/clone": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/union": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "polygon-clipping": "^0.15.3", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/union/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/union/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/unkink-polygon": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/area": "^7.1.0", + "@turf/boolean-point-in-polygon": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/meta": "^7.1.0", + "@types/geojson": "^7946.0.10", + "rbush": "^3.0.1", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/unkink-polygon/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/unkink-polygon/node_modules/@turf/meta": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/voronoi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/clone": "^7.1.0", + "@turf/helpers": "^7.1.0", + "@turf/invariant": "^7.1.0", + "@types/d3-voronoi": "^1.1.12", + "@types/geojson": "^7946.0.10", + "d3-voronoi": "1.1.2", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/voronoi/node_modules/@turf/clone": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/voronoi/node_modules/@turf/helpers": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/voronoi/node_modules/@turf/invariant": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^7.1.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.6.2" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/accepts": { + "version": "1.3.7", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/aws-lambda": { + "version": "8.10.122", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", @@ -7995,15 +12174,15 @@ } }, "node_modules/@types/color-convert": { - "version": "2.0.3", + "version": "2.0.4", "license": "MIT", "peer": true, "dependencies": { - "@types/color-name": "*" + "@types/color-name": "^1.1.0" } }, "node_modules/@types/color-name": { - "version": "1.1.4", + "version": "1.1.5", "license": "MIT", "peer": true }, @@ -8016,7 +12195,7 @@ } }, "node_modules/@types/config": { - "version": "3.3.4", + "version": "3.3.5", "dev": true, "license": "MIT" }, @@ -8243,7 +12422,7 @@ "license": "MIT" }, "node_modules/@types/d3-selection": { - "version": "3.0.10", + "version": "3.0.11", "dev": true, "license": "MIT" }, @@ -8271,13 +12450,17 @@ "license": "MIT" }, "node_modules/@types/d3-transition": { - "version": "3.0.8", + "version": "3.0.9", "dev": true, "license": "MIT", "dependencies": { "@types/d3-selection": "*" } }, + "node_modules/@types/d3-voronoi": { + "version": "1.1.12", + "license": "MIT" + }, "node_modules/@types/d3-zoom": { "version": "3.0.8", "dev": true, @@ -8297,7 +12480,7 @@ } }, "node_modules/@types/estree": { - "version": "1.0.5", + "version": "1.0.6", "dev": true, "license": "MIT" }, @@ -8312,7 +12495,7 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.5", + "version": "4.19.6", "license": "MIT", "dependencies": { "@types/node": "*", @@ -8335,7 +12518,7 @@ } }, "node_modules/@types/google.maps": { - "version": "3.57.0", + "version": "3.58.1", "license": "MIT" }, "node_modules/@types/graceful-fs": { @@ -8347,7 +12530,7 @@ } }, "node_modules/@types/hammerjs": { - "version": "2.0.45", + "version": "2.0.46", "license": "MIT" }, "node_modules/@types/hapi__catbox": { @@ -8383,7 +12566,7 @@ } }, "node_modules/@types/http-assert": { - "version": "1.5.5", + "version": "1.5.6", "license": "MIT" }, "node_modules/@types/http-errors": { @@ -8420,7 +12603,7 @@ } }, "node_modules/@types/jest": { - "version": "29.5.12", + "version": "29.5.14", "dev": true, "license": "MIT", "dependencies": { @@ -8470,7 +12653,7 @@ } }, "node_modules/@types/lodash": { - "version": "4.17.7", + "version": "4.17.13", "dev": true, "license": "MIT" }, @@ -8488,7 +12671,7 @@ } }, "node_modules/@types/mapbox-gl": { - "version": "3.4.0", + "version": "3.4.1", "license": "MIT", "dependencies": { "@types/geojson": "*" @@ -8544,7 +12727,7 @@ } }, "node_modules/@types/node": { - "version": "20.16.3", + "version": "20.17.6", "license": "MIT", "dependencies": { "undici-types": "~6.19.2" @@ -8588,11 +12771,11 @@ } }, "node_modules/@types/prop-types": { - "version": "15.7.12", + "version": "15.7.13", "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.9.15", + "version": "6.9.17", "license": "MIT" }, "node_modules/@types/range-parser": { @@ -8600,7 +12783,7 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.5", + "version": "18.3.12", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -8616,7 +12799,7 @@ } }, "node_modules/@types/react-dom": { - "version": "18.3.0", + "version": "18.3.1", "dev": true, "license": "MIT", "dependencies": { @@ -8642,13 +12825,14 @@ } }, "node_modules/@types/request/node_modules/form-data": { - "version": "2.5.1", + "version": "2.5.2", "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "mime-types": "^2.1.12", + "safe-buffer": "^5.2.1" }, "engines": { "node": ">= 0.12" @@ -8681,7 +12865,7 @@ "license": "MIT" }, "node_modules/@types/sortablejs": { - "version": "1.15.7", + "version": "1.15.8", "license": "MIT", "peer": true }, @@ -8710,7 +12894,7 @@ } }, "node_modules/@types/swagger-ui-express": { - "version": "4.1.6", + "version": "4.1.7", "dev": true, "license": "MIT", "dependencies": { @@ -9073,34 +13257,34 @@ "license": "ISC" }, "node_modules/@vaadin/a11y-base": { - "version": "24.3.21", + "version": "24.5.3", "license": "Apache-2.0", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.21", + "@vaadin/component-base": "~24.5.3", "lit": "^3.0.0" } }, "node_modules/@vaadin/checkbox": { - "version": "24.3.21", + "version": "24.5.3", "license": "Apache-2.0", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.3.21", - "@vaadin/component-base": "~24.3.21", - "@vaadin/field-base": "~24.3.21", - "@vaadin/vaadin-lumo-styles": "~24.3.21", - "@vaadin/vaadin-material-styles": "~24.3.21", - "@vaadin/vaadin-themable-mixin": "~24.3.21", + "@vaadin/a11y-base": "~24.5.3", + "@vaadin/component-base": "~24.5.3", + "@vaadin/field-base": "~24.5.3", + "@vaadin/vaadin-lumo-styles": "~24.5.3", + "@vaadin/vaadin-material-styles": "~24.5.3", + "@vaadin/vaadin-themable-mixin": "~24.5.3", "lit": "^3.0.0" } }, "node_modules/@vaadin/component-base": { - "version": "24.3.21", + "version": "24.5.3", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -9112,62 +13296,63 @@ } }, "node_modules/@vaadin/field-base": { - "version": "24.3.21", + "version": "24.5.3", "license": "Apache-2.0", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.3.21", - "@vaadin/component-base": "~24.3.21", + "@vaadin/a11y-base": "~24.5.3", + "@vaadin/component-base": "~24.5.3", "lit": "^3.0.0" } }, "node_modules/@vaadin/grid": { - "version": "24.3.21", + "version": "24.5.3", "license": "Apache-2.0", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.3.21", - "@vaadin/checkbox": "~24.3.21", - "@vaadin/component-base": "~24.3.21", - "@vaadin/lit-renderer": "~24.3.21", - "@vaadin/text-field": "~24.3.21", - "@vaadin/vaadin-lumo-styles": "~24.3.21", - "@vaadin/vaadin-material-styles": "~24.3.21", - "@vaadin/vaadin-themable-mixin": "~24.3.21" + "@vaadin/a11y-base": "~24.5.3", + "@vaadin/checkbox": "~24.5.3", + "@vaadin/component-base": "~24.5.3", + "@vaadin/lit-renderer": "~24.5.3", + "@vaadin/text-field": "~24.5.3", + "@vaadin/vaadin-lumo-styles": "~24.5.3", + "@vaadin/vaadin-material-styles": "~24.5.3", + "@vaadin/vaadin-themable-mixin": "~24.5.3", + "lit": "^3.0.0" } }, "node_modules/@vaadin/icon": { - "version": "24.3.21", + "version": "24.5.3", "license": "Apache-2.0", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.21", - "@vaadin/vaadin-lumo-styles": "~24.3.21", - "@vaadin/vaadin-themable-mixin": "~24.3.21", + "@vaadin/component-base": "~24.5.3", + "@vaadin/vaadin-lumo-styles": "~24.5.3", + "@vaadin/vaadin-themable-mixin": "~24.5.3", "lit": "^3.0.0" } }, "node_modules/@vaadin/input-container": { - "version": "24.3.21", + "version": "24.5.3", "license": "Apache-2.0", "peer": true, "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.21", - "@vaadin/vaadin-lumo-styles": "~24.3.21", - "@vaadin/vaadin-material-styles": "~24.3.21", - "@vaadin/vaadin-themable-mixin": "~24.3.21", + "@vaadin/component-base": "~24.5.3", + "@vaadin/vaadin-lumo-styles": "~24.5.3", + "@vaadin/vaadin-material-styles": "~24.5.3", + "@vaadin/vaadin-themable-mixin": "~24.5.3", "lit": "^3.0.0" } }, "node_modules/@vaadin/lit-renderer": { - "version": "24.3.21", + "version": "24.5.3", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -9175,19 +13360,19 @@ } }, "node_modules/@vaadin/text-field": { - "version": "24.3.21", + "version": "24.5.3", "license": "Apache-2.0", "peer": true, "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.3.21", - "@vaadin/component-base": "~24.3.21", - "@vaadin/field-base": "~24.3.21", - "@vaadin/input-container": "~24.3.21", - "@vaadin/vaadin-lumo-styles": "~24.3.21", - "@vaadin/vaadin-material-styles": "~24.3.21", - "@vaadin/vaadin-themable-mixin": "~24.3.21", + "@vaadin/a11y-base": "~24.5.3", + "@vaadin/component-base": "~24.5.3", + "@vaadin/field-base": "~24.5.3", + "@vaadin/input-container": "~24.5.3", + "@vaadin/vaadin-lumo-styles": "~24.5.3", + "@vaadin/vaadin-material-styles": "~24.5.3", + "@vaadin/vaadin-themable-mixin": "~24.5.3", "lit": "^3.0.0" } }, @@ -9197,28 +13382,28 @@ "peer": true }, "node_modules/@vaadin/vaadin-lumo-styles": { - "version": "24.3.21", + "version": "24.5.3", "license": "Apache-2.0", "peer": true, "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.21", - "@vaadin/icon": "~24.3.21", - "@vaadin/vaadin-themable-mixin": "~24.3.21" + "@vaadin/component-base": "~24.5.3", + "@vaadin/icon": "~24.5.3", + "@vaadin/vaadin-themable-mixin": "~24.5.3" } }, "node_modules/@vaadin/vaadin-material-styles": { - "version": "24.3.21", + "version": "24.5.3", "license": "Apache-2.0", "peer": true, "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.3.21", - "@vaadin/vaadin-themable-mixin": "~24.3.21" + "@vaadin/component-base": "~24.5.3", + "@vaadin/vaadin-themable-mixin": "~24.5.3" } }, "node_modules/@vaadin/vaadin-themable-mixin": { - "version": "24.3.21", + "version": "24.5.3", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -9239,13 +13424,13 @@ } }, "node_modules/@vitejs/plugin-react": { - "version": "4.3.1", + "version": "4.3.3", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.24.5", - "@babel/plugin-transform-react-jsx-self": "^7.24.5", - "@babel/plugin-transform-react-jsx-source": "^7.24.1", + "@babel/core": "^7.25.2", + "@babel/plugin-transform-react-jsx-self": "^7.24.7", + "@babel/plugin-transform-react-jsx-source": "^7.24.7", "@types/babel__core": "^7.20.5", "react-refresh": "^0.14.2" }, @@ -9267,7 +13452,7 @@ "license": "BSD-2-Clause" }, "node_modules/@yarnpkg/parsers": { - "version": "3.0.0-rc.46", + "version": "3.0.2", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -9275,7 +13460,7 @@ "tslib": "^2.4.0" }, "engines": { - "node": ">=14.15.0" + "node": ">=18.12.0" } }, "node_modules/@yarnpkg/parsers/node_modules/argparse": { @@ -9304,7 +13489,7 @@ "license": "BSD-3-Clause" }, "node_modules/@zip.js/zip.js": { - "version": "2.7.52", + "version": "2.7.53", "license": "BSD-3-Clause", "peer": true, "engines": { @@ -9353,8 +13538,15 @@ "node": ">= 0.6" } }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { - "version": "8.12.1", + "version": "8.14.0", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -9379,7 +13571,7 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.3", + "version": "8.3.4", "dev": true, "license": "MIT", "dependencies": { @@ -9539,11 +13731,11 @@ "license": "Python-2.0" }, "node_modules/aria-query": { - "version": "5.1.3", + "version": "5.3.2", "dev": true, "license": "Apache-2.0", - "dependencies": { - "deep-equal": "^2.0.5" + "engines": { + "node": ">= 0.4" } }, "node_modules/arr-union": { @@ -9804,7 +13996,7 @@ } }, "node_modules/axe-core": { - "version": "4.10.0", + "version": "4.10.2", "dev": true, "license": "MPL-2.0", "engines": { @@ -9829,11 +14021,11 @@ } }, "node_modules/axobject-query": { - "version": "3.1.1", + "version": "4.1.0", "dev": true, "license": "Apache-2.0", - "dependencies": { - "deep-equal": "^2.0.5" + "engines": { + "node": ">= 0.4" } }, "node_modules/babel-jest": { @@ -9965,12 +14157,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", + "version": "0.4.12", "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", + "@babel/helper-define-polyfill-provider": "^0.6.3", "semver": "^6.3.1" }, "peerDependencies": { @@ -9998,11 +14190,11 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", + "version": "0.6.3", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" + "@babel/helper-define-polyfill-provider": "^0.6.3" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -10125,6 +14317,17 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/bin-links/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/bin-links/node_modules/write-file-atomic": { "version": "5.0.1", "dev": true, @@ -10176,7 +14379,7 @@ } }, "node_modules/body-parser": { - "version": "1.20.2", + "version": "1.20.3", "license": "MIT", "dependencies": { "bytes": "3.1.2", @@ -10187,7 +14390,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -10197,13 +14400,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", "license": "MIT", @@ -10225,6 +14421,19 @@ "version": "2.0.0", "license": "MIT" }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "dev": true, @@ -10254,7 +14463,7 @@ } }, "node_modules/browserslist": { - "version": "4.23.3", + "version": "4.24.2", "dev": true, "funding": [ { @@ -10272,10 +14481,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -10355,7 +14564,7 @@ } }, "node_modules/bytes": { - "version": "3.0.0", + "version": "3.1.2", "license": "MIT", "engines": { "node": ">= 0.8" @@ -10501,7 +14710,7 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001655", + "version": "1.0.30001683", "dev": true, "funding": [ { @@ -10580,6 +14789,17 @@ "fsevents": "~2.3.2" } }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/chownr": { "version": "2.0.0", "dev": true, @@ -10603,7 +14823,7 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.4.0", + "version": "1.4.1", "license": "MIT" }, "node_modules/clean-stack": { @@ -10816,7 +15036,7 @@ } }, "node_modules/commitizen": { - "version": "4.3.0", + "version": "4.3.1", "dev": true, "license": "MIT", "dependencies": { @@ -10853,12 +15073,12 @@ } }, "node_modules/commitlint": { - "version": "19.4.1", + "version": "19.6.0", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/cli": "^19.4.1", - "@commitlint/types": "^19.0.3" + "@commitlint/cli": "^19.6.0", + "@commitlint/types": "^19.5.0" }, "bin": { "commitlint": "cli.js" @@ -10908,15 +15128,15 @@ } }, "node_modules/compression": { - "version": "1.7.4", + "version": "1.7.5", "license": "MIT", "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", + "bytes": "3.1.2", + "compressible": "~2.0.18", "debug": "2.6.9", + "negotiator": "~0.6.4", "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", + "safe-buffer": "5.2.1", "vary": "~1.1.2" }, "engines": { @@ -10966,6 +15186,20 @@ "node": ">= 6" } }, + "node_modules/concaveman": { + "version": "1.2.1", + "license": "ISC", + "dependencies": { + "point-in-polygon": "^1.1.0", + "rbush": "^3.0.1", + "robust-predicates": "^2.0.4", + "tinyqueue": "^2.0.3" + } + }, + "node_modules/concaveman/node_modules/robust-predicates": { + "version": "2.0.4", + "license": "Unlicense" + }, "node_modules/config": { "version": "3.3.12", "license": "MIT", @@ -10996,24 +15230,6 @@ "node": ">= 0.6" } }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/content-type": { "version": "1.0.5", "license": "MIT", @@ -12472,7 +16688,7 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.6.0", + "version": "0.7.1", "license": "MIT", "engines": { "node": ">= 0.6" @@ -12559,11 +16775,11 @@ } }, "node_modules/core-js-compat": { - "version": "3.38.1", + "version": "3.39.0", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.23.3" + "browserslist": "^4.24.2" }, "funding": { "type": "opencollective", @@ -12611,11 +16827,11 @@ } }, "node_modules/cosmiconfig-typescript-loader": { - "version": "5.0.0", + "version": "5.1.0", "dev": true, "license": "MIT", "dependencies": { - "jiti": "^1.19.1" + "jiti": "^1.21.6" }, "engines": { "node": ">=v16" @@ -12681,7 +16897,7 @@ "license": "MIT" }, "node_modules/cross-spawn": { - "version": "7.0.3", + "version": "7.0.6", "dev": true, "license": "MIT", "dependencies": { @@ -12700,6 +16916,10 @@ "node": "*" } }, + "node_modules/crypto": { + "version": "1.0.1", + "license": "ISC" + }, "node_modules/csscolorparser": { "version": "1.0.3", "license": "MIT" @@ -13136,6 +17356,10 @@ "d3-selection": "2 - 3" } }, + "node_modules/d3-voronoi": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, "node_modules/d3-zoom": { "version": "3.0.0", "license": "ISC", @@ -13223,15 +17447,15 @@ } }, "node_modules/dayjs": { - "version": "1.11.12", + "version": "1.11.13", "license": "MIT", "peer": true }, "node_modules/debug": { - "version": "4.3.6", + "version": "4.3.7", "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -13274,25 +17498,25 @@ } }, "node_modules/deck.gl": { - "version": "9.0.28", - "license": "MIT", - "dependencies": { - "@deck.gl/aggregation-layers": "9.0.28", - "@deck.gl/arcgis": "9.0.28", - "@deck.gl/carto": "9.0.28", - "@deck.gl/core": "9.0.28", - "@deck.gl/extensions": "9.0.28", - "@deck.gl/geo-layers": "9.0.28", - "@deck.gl/google-maps": "9.0.28", - "@deck.gl/json": "9.0.28", - "@deck.gl/layers": "9.0.28", - "@deck.gl/mapbox": "9.0.28", - "@deck.gl/mesh-layers": "9.0.28", - "@deck.gl/react": "9.0.28", - "@deck.gl/widgets": "9.0.28", + "version": "9.0.35", + "license": "MIT", + "dependencies": { + "@deck.gl/aggregation-layers": "9.0.35", + "@deck.gl/arcgis": "9.0.35", + "@deck.gl/carto": "9.0.35", + "@deck.gl/core": "9.0.35", + "@deck.gl/extensions": "9.0.35", + "@deck.gl/geo-layers": "9.0.35", + "@deck.gl/google-maps": "9.0.35", + "@deck.gl/json": "9.0.35", + "@deck.gl/layers": "9.0.35", + "@deck.gl/mapbox": "9.0.35", + "@deck.gl/mesh-layers": "9.0.35", + "@deck.gl/react": "9.0.35", + "@deck.gl/widgets": "9.0.35", "@loaders.gl/core": "^4.2.0", - "@luma.gl/core": "^9.0.15", - "@luma.gl/engine": "^9.0.15" + "@luma.gl/core": "~9.0.27", + "@luma.gl/engine": "~9.0.27" }, "peerDependencies": { "@arcgis/core": "^4.0.0", @@ -13316,37 +17540,6 @@ "dev": true, "license": "MIT" }, - "node_modules/deep-equal": { - "version": "2.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/deep-is": { "version": "0.1.4", "dev": true, @@ -13564,11 +17757,11 @@ } }, "node_modules/dotenv-expand": { - "version": "11.0.6", + "version": "11.0.7", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "dotenv": "^16.4.4" + "dotenv": "^16.4.5" }, "engines": { "node": ">=12" @@ -13682,7 +17875,7 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.13", + "version": "1.5.63", "dev": true, "license": "ISC" }, @@ -13703,7 +17896,7 @@ "license": "MIT" }, "node_modules/encodeurl": { - "version": "1.0.2", + "version": "2.0.0", "license": "MIT", "engines": { "node": ">= 0.8" @@ -13774,7 +17967,7 @@ } }, "node_modules/es-abstract": { - "version": "1.23.3", + "version": "1.23.5", "dev": true, "license": "MIT", "dependencies": { @@ -13793,7 +17986,7 @@ "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.4", "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", + "globalthis": "^1.0.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", @@ -13809,10 +18002,10 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", + "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.2", "safe-regex-test": "^1.0.3", "string.prototype.trim": "^1.2.9", @@ -13849,27 +18042,8 @@ "node": ">= 0.4" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-iterator-helpers": { - "version": "1.0.19", + "version": "1.2.0", "dev": true, "license": "MIT", "dependencies": { @@ -13880,12 +18054,13 @@ "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", + "globalthis": "^1.0.4", + "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", + "iterator.prototype": "^1.1.3", "safe-array-concat": "^1.1.2" }, "engines": { @@ -13999,15 +18174,15 @@ } }, "node_modules/eslint": { - "version": "8.57.0", + "version": "8.57.1", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -14332,7 +18507,7 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.2", + "version": "2.12.0", "dev": true, "license": "MIT", "dependencies": { @@ -14373,33 +18548,35 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.29.1", + "version": "2.31.0", "dev": true, "license": "MIT", "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/debug": { @@ -14569,36 +18746,35 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.9.0", + "version": "6.10.2", "dev": true, "license": "MIT", "dependencies": { - "aria-query": "~5.1.3", + "aria-query": "^5.3.2", "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", - "axe-core": "^4.9.1", - "axobject-query": "~3.1.1", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.19", "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.0" + "string.prototype.includes": "^2.0.1" }, "engines": { "node": ">=4.0" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, "node_modules/eslint-plugin-react": { - "version": "7.35.0", + "version": "7.37.2", "dev": true, "license": "MIT", "dependencies": { @@ -14607,7 +18783,7 @@ "array.prototype.flatmap": "^1.3.2", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", + "es-iterator-helpers": "^1.1.0", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", @@ -14889,17 +19065,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/eslint/node_modules/globals": { "version": "13.24.0", "dev": true, @@ -15068,22 +19233,22 @@ } }, "node_modules/execa": { - "version": "8.0.1", + "version": "5.1.1", "dev": true, "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=16.17" + "node": ">=10" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" @@ -15136,35 +19301,35 @@ "license": "Apache-2.0" }, "node_modules/express": { - "version": "4.19.2", + "version": "4.21.1", "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -15176,11 +19341,11 @@ } }, "node_modules/express-openapi-validator": { - "version": "5.3.4", + "version": "5.3.9", "license": "MIT", "dependencies": { "@apidevtools/json-schema-ref-parser": "^11.7.0", - "@types/multer": "^1.4.11", + "@types/multer": "^1.4.12", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "ajv-formats": "^2.1.1", @@ -15191,15 +19356,18 @@ "media-typer": "^1.1.0", "multer": "^1.4.5-lts.1", "ono": "^7.1.3", - "path-to-regexp": "^6.2.2" + "path-to-regexp": "^8.1.0" }, "peerDependencies": { "express": "*" } }, "node_modules/express-openapi-validator/node_modules/path-to-regexp": { - "version": "6.2.2", - "license": "MIT" + "version": "8.2.0", + "license": "MIT", + "engines": { + "node": ">=16" + } }, "node_modules/express-prom-bundle": { "version": "6.6.0", @@ -15226,29 +19394,17 @@ "version": "2.0.0", "license": "MIT" }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/expression-eval": { - "version": "5.0.1", - "license": "MIT", + "node_modules/express/node_modules/qs": { + "version": "6.13.0", + "license": "BSD-3-Clause", "dependencies": { - "jsep": "^0.3.0" + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/extend": { @@ -15312,6 +19468,17 @@ "node": ">=8.6.0" } }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "dev": true, @@ -15334,11 +19501,11 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.1", - "license": "MIT" + "version": "3.0.3", + "license": "BSD-3-Clause" }, "node_modules/fast-xml-parser": { - "version": "4.4.1", + "version": "4.5.0", "funding": [ { "type": "github", @@ -15449,11 +19616,11 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", + "version": "1.3.1", "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -15539,27 +19706,13 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/flatted": { - "version": "3.3.1", + "version": "3.3.2", "dev": true, "license": "ISC" }, "node_modules/focus-trap": { - "version": "7.5.4", + "version": "7.6.0", "license": "MIT", "peer": true, "dependencies": { @@ -15567,7 +19720,7 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.6", + "version": "1.15.9", "funding": [ { "type": "individual", @@ -15607,8 +19760,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { - "version": "4.0.0", + "version": "4.0.1", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -15761,16 +19925,6 @@ "node": ">=14" } }, - "node_modules/gaxios/node_modules/is-stream": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/gcp-metadata": { "version": "6.1.0", "license": "Apache-2.0", @@ -15804,6 +19958,31 @@ "node": ">= 0.10" } }, + "node_modules/geojson-equality-ts": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.14" + } + }, + "node_modules/geojson-polygon-self-intersections": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "rbush": "^2.0.1" + } + }, + "node_modules/geojson-polygon-self-intersections/node_modules/quickselect": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/geojson-polygon-self-intersections/node_modules/rbush": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "quickselect": "^1.0.1" + } + }, "node_modules/geojson-vt": { "version": "3.2.1", "license": "ISC" @@ -15931,11 +20110,10 @@ } }, "node_modules/get-stream": { - "version": "8.0.1", - "dev": true, + "version": "6.0.1", "license": "MIT", "engines": { - "node": ">=16" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -16279,14 +20457,14 @@ } }, "node_modules/glob-parent": { - "version": "5.1.2", + "version": "6.0.2", "dev": true, "license": "ISC", "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, "node_modules/glob-promise": { @@ -16317,22 +20495,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/global-dirs": { - "version": "0.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "^1.3.4" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "1.3.8", - "dev": true, - "license": "ISC" - }, "node_modules/global-modules": { "version": "1.0.0", "dev": true, @@ -16445,7 +20607,7 @@ } }, "node_modules/goober": { - "version": "2.1.14", + "version": "2.1.16", "license": "MIT", "peerDependencies": { "csstype": "^3.0.10" @@ -16700,11 +20862,11 @@ } }, "node_modules/human-signals": { - "version": "5.0.0", + "version": "2.1.0", "dev": true, "license": "Apache-2.0", "engines": { - "node": ">=16.17.0" + "node": ">=10.17.0" } }, "node_modules/husky": { @@ -17017,21 +21179,6 @@ "node": ">= 0.10" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-array-buffer": { "version": "3.0.4", "dev": true, @@ -17401,11 +21548,10 @@ } }, "node_modules/is-stream": { - "version": "3.0.0", - "dev": true, + "version": "2.0.1", "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -17537,8 +21683,7 @@ } }, "node_modules/isarray": { - "version": "2.0.5", - "dev": true, + "version": "1.0.0", "license": "MIT" }, "node_modules/isexe": { @@ -17622,7 +21767,7 @@ } }, "node_modules/iterator.prototype": { - "version": "1.1.2", + "version": "1.1.3", "dev": true, "license": "MIT", "dependencies": { @@ -17631,6 +21776,9 @@ "has-symbols": "^1.0.3", "reflect.getprototypeof": "^1.0.4", "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/jackspeak": { @@ -17731,104 +21879,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-changed-files/node_modules/execa": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/jest-changed-files/node_modules/get-stream": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-changed-files/node_modules/human-signals": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/jest-changed-files/node_modules/is-stream": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-changed-files/node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-changed-files/node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-changed-files/node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-changed-files/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "node_modules/jest-changed-files/node_modules/strip-final-newline": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/jest-circus": { "version": "29.7.0", "dev": true, @@ -18949,13 +22999,13 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", + "version": "3.0.2", "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-bigint": { @@ -19058,6 +23108,13 @@ "node": "*" } }, + "node_modules/jsts": { + "version": "2.7.1", + "license": "(EDL-1.0 OR EPL-1.0)", + "engines": { + "node": ">= 12" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "dev": true, @@ -19120,7 +23177,7 @@ } }, "node_modules/ktx-parse": { - "version": "0.0.4", + "version": "0.7.1", "license": "MIT" }, "node_modules/language-subtag-registry": { @@ -19140,15 +23197,15 @@ } }, "node_modules/lerna": { - "version": "8.1.8", + "version": "8.1.9", "dev": true, "license": "MIT", "dependencies": { - "@lerna/create": "8.1.8", + "@lerna/create": "8.1.9", "@npmcli/arborist": "7.5.4", "@npmcli/package-json": "5.2.0", "@npmcli/run-script": "8.1.0", - "@nx/devkit": ">=17.1.2 < 20", + "@nx/devkit": ">=17.1.2 < 21", "@octokit/plugin-enterprise-rest": "6.0.1", "@octokit/rest": "19.0.11", "aproba": "2.0.0", @@ -19162,7 +23219,7 @@ "conventional-changelog-angular": "7.0.0", "conventional-changelog-core": "5.0.1", "conventional-recommended-bump": "7.0.1", - "cosmiconfig": "^8.2.0", + "cosmiconfig": "9.0.0", "dedent": "1.5.3", "envinfo": "7.13.0", "execa": "5.0.0", @@ -19193,7 +23250,7 @@ "npm-package-arg": "11.0.2", "npm-packlist": "8.0.2", "npm-registry-fetch": "^17.1.0", - "nx": ">=17.1.2 < 20", + "nx": ">=17.1.2 < 21", "p-map": "4.0.0", "p-map-series": "2.1.0", "p-pipe": "3.1.0", @@ -19262,31 +23319,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/lerna/node_modules/cosmiconfig": { - "version": "8.3.6", - "dev": true, - "license": "MIT", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/lerna/node_modules/dedent": { "version": "1.5.3", "dev": true, @@ -19363,17 +23395,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/lerna/node_modules/glob-parent": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/lerna/node_modules/glob/node_modules/brace-expansion": { "version": "2.0.1", "dev": true, @@ -19396,14 +23417,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/lerna/node_modules/human-signals": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/lerna/node_modules/import-local": { "version": "3.1.0", "dev": true, @@ -19435,14 +23448,6 @@ "node": ">=8" } }, - "node_modules/lerna/node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/lerna/node_modules/minimatch": { "version": "3.0.5", "dev": true, @@ -19473,37 +23478,12 @@ "node": "4.x || >=6.0.0" }, "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/lerna/node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lerna/node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" + "encoding": "^0.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, "node_modules/lerna/node_modules/rimraf": { @@ -19523,19 +23503,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/lerna/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "node_modules/lerna/node_modules/strip-final-newline": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/lerna/node_modules/uuid": { "version": "10.0.0", "dev": true, @@ -19622,7 +23589,7 @@ } }, "node_modules/libnpmpublish/node_modules/ci-info": { - "version": "4.0.0", + "version": "4.1.0", "dev": true, "funding": [ { @@ -19643,7 +23610,7 @@ } }, "node_modules/lines-and-columns": { - "version": "2.0.4", + "version": "2.0.3", "dev": true, "license": "MIT", "engines": { @@ -19651,7 +23618,7 @@ } }, "node_modules/lit": { - "version": "3.2.0", + "version": "3.2.1", "license": "BSD-3-Clause", "peer": true, "dependencies": { @@ -19661,7 +23628,7 @@ } }, "node_modules/lit-element": { - "version": "4.1.0", + "version": "4.1.1", "license": "BSD-3-Clause", "peer": true, "dependencies": { @@ -19671,7 +23638,7 @@ } }, "node_modules/lit-html": { - "version": "3.2.0", + "version": "3.2.1", "license": "BSD-3-Clause", "peer": true, "dependencies": { @@ -19745,11 +23712,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.isfunction": { - "version": "3.0.9", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.ismatch": { "version": "4.4.0", "dev": true, @@ -19849,8 +23811,11 @@ } }, "node_modules/long": { - "version": "5.2.3", - "license": "Apache-2.0" + "version": "3.2.0", + "license": "Apache-2.0", + "engines": { + "node": ">=0.6" + } }, "node_modules/longest": { "version": "2.0.1", @@ -19879,7 +23844,7 @@ } }, "node_modules/luxon": { - "version": "3.4.4", + "version": "3.5.0", "license": "MIT", "peer": true, "engines": { @@ -19986,8 +23951,12 @@ "vt-pbf": "^3.1.3" } }, + "node_modules/marchingsquares": { + "version": "1.3.3", + "license": "AGPL-3.0" + }, "node_modules/marked": { - "version": "12.0.2", + "version": "14.1.4", "license": "MIT", "peer": true, "bin": { @@ -20030,8 +23999,11 @@ "license": "MIT" }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "license": "MIT" + "version": "1.0.3", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -20100,14 +24072,11 @@ } }, "node_modules/mimic-fn": { - "version": "4.0.0", + "version": "2.1.0", "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/min-indent": { @@ -20344,7 +24313,7 @@ } }, "node_modules/moment-timezone": { - "version": "0.5.45", + "version": "0.5.46", "license": "MIT", "dependencies": { "moment": "^2.29.4" @@ -20362,7 +24331,7 @@ } }, "node_modules/ms": { - "version": "2.1.2", + "version": "2.1.3", "license": "MIT" }, "node_modules/multer": { @@ -20463,7 +24432,7 @@ "license": "MIT" }, "node_modules/negotiator": { - "version": "0.6.3", + "version": "0.6.4", "license": "MIT", "engines": { "node": ">= 0.6" @@ -20475,7 +24444,7 @@ "license": "MIT" }, "node_modules/nock": { - "version": "13.5.5", + "version": "13.5.6", "dev": true, "license": "MIT", "dependencies": { @@ -20786,40 +24755,25 @@ } }, "node_modules/npm-run-path": { - "version": "5.3.0", + "version": "4.0.1", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "path-key": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "dev": true, - "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/nx": { - "version": "19.6.4", + "version": "20.1.2", "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { "@napi-rs/wasm-runtime": "0.2.4", - "@nrwl/tao": "19.6.4", "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.0-rc.46", + "@yarnpkg/parsers": "3.0.2", "@zkochan/js-yaml": "0.0.7", "axios": "^1.7.4", "chalk": "^4.1.0", @@ -20832,11 +24786,10 @@ "figures": "3.2.0", "flat": "^5.0.2", "front-matter": "^4.0.2", - "fs-extra": "^11.1.0", "ignore": "^5.0.4", "jest-diff": "^29.4.1", "jsonc-parser": "3.2.0", - "lines-and-columns": "~2.0.3", + "lines-and-columns": "2.0.3", "minimatch": "9.0.3", "node-machine-id": "1.1.12", "npm-run-path": "^4.0.1", @@ -20844,7 +24797,6 @@ "ora": "5.3.0", "semver": "^7.5.3", "string-width": "^4.2.3", - "strong-log-transformer": "^2.1.0", "tar-stream": "~2.2.0", "tmp": "~0.2.1", "tsconfig-paths": "^4.1.2", @@ -20857,16 +24809,16 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "19.6.4", - "@nx/nx-darwin-x64": "19.6.4", - "@nx/nx-freebsd-x64": "19.6.4", - "@nx/nx-linux-arm-gnueabihf": "19.6.4", - "@nx/nx-linux-arm64-gnu": "19.6.4", - "@nx/nx-linux-arm64-musl": "19.6.4", - "@nx/nx-linux-x64-gnu": "19.6.4", - "@nx/nx-linux-x64-musl": "19.6.4", - "@nx/nx-win32-arm64-msvc": "19.6.4", - "@nx/nx-win32-x64-msvc": "19.6.4" + "@nx/nx-darwin-arm64": "20.1.2", + "@nx/nx-darwin-x64": "20.1.2", + "@nx/nx-freebsd-x64": "20.1.2", + "@nx/nx-linux-arm-gnueabihf": "20.1.2", + "@nx/nx-linux-arm64-gnu": "20.1.2", + "@nx/nx-linux-arm64-musl": "20.1.2", + "@nx/nx-linux-x64-gnu": "20.1.2", + "@nx/nx-linux-x64-musl": "20.1.2", + "@nx/nx-win32-arm64-msvc": "20.1.2", + "@nx/nx-win32-x64-msvc": "20.1.2" }, "peerDependencies": { "@swc-node/register": "^1.8.0", @@ -20918,19 +24870,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/nx/node_modules/fs-extra": { - "version": "11.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/nx/node_modules/minimatch": { "version": "9.0.3", "dev": true, @@ -20945,17 +24884,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/nx/node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/nx/node_modules/ora": { "version": "5.3.0", "dev": true, @@ -21014,23 +24942,8 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "dev": true, + "version": "1.13.3", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, "engines": { "node": ">= 0.4" }, @@ -21154,14 +25067,14 @@ } }, "node_modules/onetime": { - "version": "6.0.0", + "version": "5.1.2", "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^4.0.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=12" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -21453,7 +25366,7 @@ } }, "node_modules/p-timeout": { - "version": "6.1.2", + "version": "6.1.3", "license": "MIT", "engines": { "node": ">=14.16" @@ -21485,7 +25398,7 @@ } }, "node_modules/package-json-from-dist": { - "version": "1.0.0", + "version": "1.0.1", "dev": true, "license": "BlueOak-1.0.0" }, @@ -21664,7 +25577,7 @@ "license": "ISC" }, "node_modules/path-to-regexp": { - "version": "0.1.7", + "version": "0.1.10", "license": "MIT" }, "node_modules/path-type": { @@ -21693,7 +25606,7 @@ } }, "node_modules/pg-protocol": { - "version": "1.6.1", + "version": "1.7.0", "license": "MIT" }, "node_modules/pg-types": { @@ -21711,7 +25624,7 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", + "version": "1.1.1", "license": "ISC" }, "node_modules/picomatch": { @@ -21800,24 +25713,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/pino-abstract-transport/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/pino-abstract-transport/node_modules/string_decoder": { "version": "1.3.0", "license": "MIT", @@ -21825,14 +25720,76 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/pino-caller": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "source-map-support": "^0.5.13" + }, + "engines": { + "node": ">6.0.0" + }, + "peerDependencies": { + "pino": "*" + } + }, "node_modules/pino-http": { - "version": "8.6.1", + "version": "10.3.0", "license": "MIT", "dependencies": { "get-caller-file": "^2.0.5", - "pino": "^8.17.1", - "pino-std-serializers": "^6.2.2", - "process-warning": "^3.0.0" + "pino": "^9.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0" + } + }, + "node_modules/pino-http/node_modules/pino": { + "version": "9.5.0", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^2.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-http/node_modules/pino-abstract-transport": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "split2": "^4.0.0" + } + }, + "node_modules/pino-http/node_modules/pino-std-serializers": { + "version": "7.0.0", + "license": "MIT" + }, + "node_modules/pino-http/node_modules/process-warning": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/pino-http/node_modules/sonic-boom": { + "version": "4.2.0", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/pino-http/node_modules/thread-stream": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "real-require": "^0.2.0" } }, "node_modules/pino-pretty": { @@ -21905,24 +25862,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/pino-pretty/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/pino-pretty/node_modules/string_decoder": { "version": "1.3.0", "license": "MIT", @@ -22017,6 +25956,22 @@ "node": ">=4" } }, + "node_modules/point-in-polygon": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/point-in-polygon-hao": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/polygon-clipping": { + "version": "0.15.7", + "license": "MIT", + "dependencies": { + "robust-predicates": "^3.0.2", + "splaytree": "^3.1.0" + } + }, "node_modules/portfinder": { "version": "1.0.32", "dev": true, @@ -22066,7 +26021,7 @@ } }, "node_modules/postcss": { - "version": "8.4.44", + "version": "8.4.49", "dev": true, "funding": [ { @@ -22085,8 +26040,8 @@ "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -22140,7 +26095,7 @@ "license": "ISC" }, "node_modules/preact": { - "version": "10.23.2", + "version": "10.24.3", "license": "MIT", "funding": { "type": "opencollective", @@ -22261,17 +26216,6 @@ "node": ">=8.12.0" } }, - "node_modules/pretty-quick/node_modules/is-stream": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pretty-quick/node_modules/locate-path": { "version": "5.0.0", "dev": true, @@ -22283,39 +26227,6 @@ "node": ">=8" } }, - "node_modules/pretty-quick/node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pretty-quick/node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-quick/node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pretty-quick/node_modules/p-limit": { "version": "2.3.0", "dev": true, @@ -22360,19 +26271,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pretty-quick/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "node_modules/pretty-quick/node_modules/strip-final-newline": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/proc-log": { "version": "4.2.0", "dev": true, @@ -22424,7 +26322,7 @@ } }, "node_modules/promise-call-limit": { - "version": "3.0.1", + "version": "3.0.2", "dev": true, "license": "ISC", "funding": { @@ -22514,6 +26412,10 @@ "node": ">=12.0.0" } }, + "node_modules/protobufjs/node_modules/long": { + "version": "5.2.3", + "license": "Apache-2.0" + }, "node_modules/protocol-buffers-schema": { "version": "3.6.0", "license": "MIT" @@ -22539,7 +26441,7 @@ "license": "MIT" }, "node_modules/pump": { - "version": "3.0.0", + "version": "3.0.2", "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -22579,10 +26481,10 @@ } }, "node_modules/qs": { - "version": "6.11.0", + "version": "6.13.1", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -22664,13 +26566,6 @@ "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/raw-body/node_modules/iconv-lite": { "version": "0.4.24", "license": "MIT", @@ -22681,6 +26576,13 @@ "node": ">=0.10.0" } }, + "node_modules/rbush": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "quickselect": "^2.0.0" + } + }, "node_modules/react": { "version": "18.3.1", "license": "MIT", @@ -22976,8 +26878,8 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/readable-stream/node_modules/isarray": { - "version": "1.0.0", + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", "license": "MIT" }, "node_modules/readdirp": { @@ -23055,7 +26957,7 @@ "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", + "version": "10.2.0", "dev": true, "license": "MIT", "dependencies": { @@ -23078,14 +26980,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", + "version": "1.5.3", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -23095,14 +26997,14 @@ } }, "node_modules/regexpu-core": { - "version": "5.3.2", + "version": "6.1.1", "dev": true, "license": "MIT", "dependencies": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.11.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, @@ -23110,24 +27012,22 @@ "node": ">=4" } }, + "node_modules/regjsgen": { + "version": "0.8.0", + "dev": true, + "license": "MIT" + }, "node_modules/regjsparser": { - "version": "0.9.1", + "version": "0.11.2", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, "node_modules/require-directory": { "version": "2.1.1", "license": "MIT", @@ -23200,17 +27100,6 @@ "node": ">=8" } }, - "node_modules/resolve-global": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "global-dirs": "^0.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/resolve-protobuf-schema": { "version": "2.1.0", "license": "MIT", @@ -23238,33 +27127,6 @@ "node": ">=8" } }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, "node_modules/retry": { "version": "0.12.0", "dev": true, @@ -23283,55 +27145,14 @@ } }, "node_modules/rimraf": { - "version": "5.0.10", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "10.4.5", + "version": "3.0.2", "dev": true, "license": "ISC", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "glob": "^7.1.3" }, "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "9.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" + "rimraf": "bin.js" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -23342,11 +27163,11 @@ "license": "Unlicense" }, "node_modules/rollup": { - "version": "4.21.2", + "version": "4.27.3", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.6" }, "bin": { "rollup": "dist/bin/rollup" @@ -23356,22 +27177,24 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.21.2", - "@rollup/rollup-android-arm64": "4.21.2", - "@rollup/rollup-darwin-arm64": "4.21.2", - "@rollup/rollup-darwin-x64": "4.21.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.21.2", - "@rollup/rollup-linux-arm-musleabihf": "4.21.2", - "@rollup/rollup-linux-arm64-gnu": "4.21.2", - "@rollup/rollup-linux-arm64-musl": "4.21.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2", - "@rollup/rollup-linux-riscv64-gnu": "4.21.2", - "@rollup/rollup-linux-s390x-gnu": "4.21.2", - "@rollup/rollup-linux-x64-gnu": "4.21.2", - "@rollup/rollup-linux-x64-musl": "4.21.2", - "@rollup/rollup-win32-arm64-msvc": "4.21.2", - "@rollup/rollup-win32-ia32-msvc": "4.21.2", - "@rollup/rollup-win32-x64-msvc": "4.21.2", + "@rollup/rollup-android-arm-eabi": "4.27.3", + "@rollup/rollup-android-arm64": "4.27.3", + "@rollup/rollup-darwin-arm64": "4.27.3", + "@rollup/rollup-darwin-x64": "4.27.3", + "@rollup/rollup-freebsd-arm64": "4.27.3", + "@rollup/rollup-freebsd-x64": "4.27.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.27.3", + "@rollup/rollup-linux-arm-musleabihf": "4.27.3", + "@rollup/rollup-linux-arm64-gnu": "4.27.3", + "@rollup/rollup-linux-arm64-musl": "4.27.3", + "@rollup/rollup-linux-powerpc64le-gnu": "4.27.3", + "@rollup/rollup-linux-riscv64-gnu": "4.27.3", + "@rollup/rollup-linux-s390x-gnu": "4.27.3", + "@rollup/rollup-linux-x64-gnu": "4.27.3", + "@rollup/rollup-linux-x64-musl": "4.27.3", + "@rollup/rollup-win32-arm64-msvc": "4.27.3", + "@rollup/rollup-win32-ia32-msvc": "4.27.3", + "@rollup/rollup-win32-x64-msvc": "4.27.3", "fsevents": "~2.3.2" } }, @@ -23434,8 +27257,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, "node_modules/safe-buffer": { - "version": "5.1.2", + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT" }, "node_modules/safe-regex-test": { @@ -23492,7 +27334,7 @@ } }, "node_modules/send": { - "version": "0.18.0", + "version": "0.19.0", "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -23524,18 +27366,21 @@ "version": "2.0.0", "license": "MIT" }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "license": "MIT" + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, "node_modules/serve-static": { - "version": "1.15.0", + "version": "1.16.2", "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -23664,15 +27509,9 @@ } }, "node_modules/signal-exit": { - "version": "4.1.0", + "version": "3.0.7", "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "license": "ISC" }, "node_modules/sigstore": { "version": "2.3.1", @@ -23747,6 +27586,10 @@ "dev": true, "license": "MIT" }, + "node_modules/skmeans": { + "version": "0.9.7", + "license": "MIT" + }, "node_modules/slash": { "version": "3.0.0", "dev": true, @@ -23854,7 +27697,7 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", + "version": "1.2.1", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -23863,7 +27706,6 @@ }, "node_modules/source-map-support": { "version": "0.5.13", - "dev": true, "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", @@ -23872,7 +27714,6 @@ }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -23906,6 +27747,10 @@ "dev": true, "license": "CC0-1.0" }, + "node_modules/splaytree": { + "version": "3.1.2", + "license": "MIT" + }, "node_modules/split": { "version": "1.0.1", "dev": true, @@ -24548,17 +28393,6 @@ "node": ">= 0.8" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/stoppable": { "version": "1.1.0", "license": "MIT", @@ -24580,6 +28414,10 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, "node_modules/string-length": { "version": "4.0.2", "dev": true, @@ -24633,12 +28471,16 @@ "license": "MIT" }, "node_modules/string.prototype.includes": { - "version": "2.0.0", + "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/string.prototype.matchall": { @@ -24757,14 +28599,11 @@ } }, "node_modules/strip-final-newline": { - "version": "3.0.0", + "version": "2.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/strip-indent": { @@ -24884,8 +28723,11 @@ } }, "node_modules/swagger-ui-dist": { - "version": "5.17.14", - "license": "Apache-2.0" + "version": "5.18.2", + "license": "Apache-2.0", + "dependencies": { + "@scarf/scarf": "=1.4.0" + } }, "node_modules/swagger-ui-express": { "version": "4.6.3", @@ -24900,6 +28742,13 @@ "express": ">=4.0.0 || >=5.0.0-beta" } }, + "node_modules/sweepline-intersections": { + "version": "1.5.0", + "license": "MIT", + "dependencies": { + "tinyqueue": "^2.0.0" + } + }, "node_modules/tabbable": { "version": "6.2.0", "license": "MIT", @@ -25076,7 +28925,7 @@ "license": "MIT" }, "node_modules/timezone-groups": { - "version": "0.9.1", + "version": "0.10.2", "license": "MIT", "peer": true, "engines": { @@ -25087,6 +28936,11 @@ "version": "2.1.0", "license": "MIT" }, + "node_modules/tinyexec": { + "version": "0.3.1", + "dev": true, + "license": "MIT" + }, "node_modules/tinyqueue": { "version": "2.0.3", "license": "ISC" @@ -25107,13 +28961,6 @@ "dev": true, "license": "BSD-3-Clause" }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "dev": true, @@ -25136,6 +28983,36 @@ "node": ">=0.6" } }, + "node_modules/topojson-client": { + "version": "3.1.0", + "license": "ISC", + "dependencies": { + "commander": "2" + }, + "bin": { + "topo2geo": "bin/topo2geo", + "topomerge": "bin/topomerge", + "topoquantize": "bin/topoquantize" + } + }, + "node_modules/topojson-client/node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, + "node_modules/topojson-server": { + "version": "3.0.1", + "license": "ISC", + "dependencies": { + "commander": "2" + }, + "bin": { + "geo2topo": "bin/geo2topo" + } + }, + "node_modules/topojson-server/node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, "node_modules/tr46": { "version": "0.0.3", "license": "MIT" @@ -25157,7 +29034,7 @@ } }, "node_modules/ts-api-utils": { - "version": "1.3.0", + "version": "1.4.0", "dev": true, "license": "MIT", "engines": { @@ -25287,8 +29164,7 @@ } }, "node_modules/tslib": { - "version": "2.7.0", - "dev": true, + "version": "2.8.1", "license": "0BSD" }, "node_modules/tsutils": { @@ -25357,10 +29233,11 @@ } }, "node_modules/type-fest": { - "version": "2.19.0", + "version": "4.18.2", "license": "(MIT OR CC0-1.0)", + "peer": true, "engines": { - "node": ">=12.20" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -25463,7 +29340,7 @@ "license": "MIT" }, "node_modules/typescript": { - "version": "5.5.4", + "version": "5.6.3", "dev": true, "license": "Apache-2.0", "bin": { @@ -25516,7 +29393,7 @@ "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", + "version": "2.0.1", "dev": true, "license": "MIT", "engines": { @@ -25536,7 +29413,7 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", + "version": "2.2.0", "dev": true, "license": "MIT", "engines": { @@ -25635,7 +29512,7 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", + "version": "1.1.1", "dev": true, "funding": [ { @@ -25653,8 +29530,8 @@ ], "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -25671,6 +29548,11 @@ "punycode": "^2.1.0" } }, + "node_modules/uri-js-replace": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, "node_modules/url-value-parser": { "version": "2.2.0", "license": "MIT-0", @@ -25748,12 +29630,12 @@ } }, "node_modules/vite": { - "version": "5.4.2", + "version": "5.4.11", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.41", + "postcss": "^8.4.43", "rollup": "^4.20.0" }, "bin": { @@ -25820,7 +29702,7 @@ } }, "node_modules/vite-plugin-eslint/node_modules/rollup": { - "version": "2.79.1", + "version": "2.79.2", "dev": true, "license": "MIT", "bin": { @@ -25890,10 +29772,6 @@ "typedarray": "~0.0.5" } }, - "node_modules/wellknown/node_modules/isarray": { - "version": "1.0.0", - "license": "MIT" - }, "node_modules/wellknown/node_modules/process-nextick-args": { "version": "1.0.7", "license": "MIT" @@ -25915,7 +29793,7 @@ "license": "MIT" }, "node_modules/wgsl_reflect": { - "version": "1.0.10", + "version": "1.0.16", "license": "MIT" }, "node_modules/whatwg-url": { @@ -25980,6 +29858,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, "node_modules/which-collection": { "version": "1.0.2", "dev": true, @@ -26111,11 +29994,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, "node_modules/write-json-file": { "version": "3.2.0", "dev": true, @@ -26168,11 +30046,6 @@ "semver": "bin/semver" } }, - "node_modules/write-json-file/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, "node_modules/write-json-file/node_modules/write-file-atomic": { "version": "2.4.3", "dev": true, @@ -26329,7 +30202,7 @@ "dependencies": { "@godaddy/terminus": "^4.12.1", "@map-colonies/cleanup-registry": "^1.1.0", - "@map-colonies/detiler-common": "^1.2.0", + "@map-colonies/detiler-common": "^1.3.0-rc2", "@map-colonies/error-express-handler": "^2.1.0", "@map-colonies/express-access-log-middleware": "^2.0.1", "@map-colonies/js-logger": "^1.0.1", @@ -26341,16 +30214,19 @@ "@opentelemetry/api-metrics": "0.23.0", "@opentelemetry/instrumentation-express": "0.32.1", "@opentelemetry/instrumentation-http": "0.35.0", + "@turf/turf": "^7.1.0", "compression": "^1.7.4", "config": "^3.3.9", "cors": "^2.8.5", + "crypto": "^1.0.1", "express": "^4.18.2", "express-openapi-validator": "^5.0.4", "http-status-codes": "^2.2.0", "mime-types": "^2.1.35", "redis": "^4.6.12", "reflect-metadata": "^0.1.13", - "tsyringe": "^4.8.0" + "tsyringe": "^4.8.0", + "wellknown": "^0.5.0" }, "devDependencies": { "@commitlint/cli": "^18.4.4", @@ -26364,11 +30240,13 @@ "@types/config": "^3.3.0", "@types/cors": "^2.8.17", "@types/express": "^4.17.17", + "@types/geojson": "7946.0.14", "@types/jest": "^29.5.2", "@types/mime-types": "^2.1.4", "@types/multer": "^1.4.7", "@types/supertest": "^2.0.12", "@types/swagger-ui-express": "^4.1.3", + "@types/wellknown": "^0.5.8", "commitlint": "^17.6.6", "copyfiles": "^2.4.1", "cz-conventional-changelog": "^3.3.0", @@ -26631,6 +30509,14 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "packages/backend/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "packages/backend/node_modules/chalk": { "version": "4.1.2", "dev": true, @@ -26968,28 +30854,6 @@ "node": ">=8" } }, - "packages/backend/node_modules/execa": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, "packages/backend/node_modules/find-up": { "version": "5.0.0", "dev": true, @@ -27018,17 +30882,6 @@ "node": ">=14.14" } }, - "packages/backend/node_modules/get-stream": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "packages/backend/node_modules/git-raw-commits": { "version": "2.0.11", "dev": true, @@ -27047,6 +30900,25 @@ "node": ">=10" } }, + "packages/backend/node_modules/glob": { + "version": "10.4.5", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "packages/backend/node_modules/hosted-git-info": { "version": "4.1.0", "dev": true, @@ -27058,25 +30930,6 @@ "node": ">=10" } }, - "packages/backend/node_modules/human-signals": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "packages/backend/node_modules/is-stream": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "packages/backend/node_modules/is-text-path": { "version": "1.0.1", "dev": true, @@ -27137,12 +30990,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/backend/node_modules/mimic-fn": { - "version": "2.1.0", + "packages/backend/node_modules/minimatch": { + "version": "9.0.5", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">=6" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "packages/backend/node_modules/normalize-package-data": { @@ -27159,31 +31018,6 @@ "node": ">=10" } }, - "packages/backend/node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/backend/node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "packages/backend/node_modules/p-locate": { "version": "5.0.0", "dev": true, @@ -27337,6 +31171,20 @@ "node": ">= 6" } }, + "packages/backend/node_modules/rimraf": { + "version": "5.0.10", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "packages/backend/node_modules/semver": { "version": "7.6.0", "dev": true, @@ -27351,11 +31199,6 @@ "node": ">=10" } }, - "packages/backend/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, "packages/backend/node_modules/split2": { "version": "3.2.2", "dev": true, @@ -27364,14 +31207,6 @@ "readable-stream": "^3.0.0" } }, - "packages/backend/node_modules/strip-final-newline": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "packages/backend/node_modules/text-extensions": { "version": "1.9.0", "dev": true, @@ -27414,10 +31249,10 @@ }, "packages/client": { "name": "@map-colonies/detiler-client", - "version": "1.2.0", + "version": "1.3.0-rc2", "license": "ISC", "dependencies": { - "@map-colonies/detiler-common": "^1.2.0", + "@map-colonies/detiler-common": "^1.3.0-rc2", "axios": "^1.6.5", "axios-retry": "^3.9.1", "http-status-codes": "^2.2.0", @@ -27442,26 +31277,69 @@ "typescript": "^5.3.3" } }, - "packages/client/node_modules/qs": { - "version": "6.13.0", - "license": "BSD-3-Clause", + "packages/client/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", "dependencies": { - "side-channel": "^1.0.6" + "balanced-match": "^1.0.0" + } + }, + "packages/client/node_modules/glob": { + "version": "10.4.5", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/client/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=0.6" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/client/node_modules/rimraf": { + "version": "5.0.10", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "packages/common": { "name": "@map-colonies/detiler-common", - "version": "1.2.0", + "version": "1.3.0-rc2", "license": "ISC", "devDependencies": { "@map-colonies/eslint-config": "^4.0.0", "@map-colonies/prettier-config": "0.0.1", + "@types/geojson": "7946.0.14", "@types/jest": "^29.5.2", "eslint": "^8.56.0", "jest": "^29.5.0", @@ -27475,6 +31353,61 @@ "typescript": "^5.3.3" } }, + "packages/common/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "packages/common/node_modules/glob": { + "version": "10.4.5", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/common/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/common/node_modules/rimraf": { + "version": "5.0.10", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "packages/frontend": { "name": "detiler-frontend", "version": "1.2.0", @@ -27482,8 +31415,8 @@ "dependencies": { "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", - "@map-colonies/detiler-client": "^1.2.0", - "@map-colonies/detiler-common": "^1.2.0", + "@map-colonies/detiler-client": "^1.3.0-rc2", + "@map-colonies/detiler-common": "^1.3.0-rc2", "@map-colonies/js-logger": "^1.0.1", "@map-colonies/tile-calc": "^0.1.5", "@mui/icons-material": "^5.15.19", @@ -27525,7 +31458,7 @@ } }, "packages/frontend/node_modules/husky": { - "version": "9.1.5", + "version": "9.1.7", "license": "MIT", "bin": { "husky": "bin.js" diff --git a/packages/backend/.redocly.yaml b/packages/backend/.redocly.yaml index c95d2bd..c12b289 100644 --- a/packages/backend/.redocly.yaml +++ b/packages/backend/.redocly.yaml @@ -22,7 +22,7 @@ lint: rules: boolean-parameter-prefixes: - severity: error + severity: warn prefixes: ['should', 'is', 'has'] no-unused-components: severity: error diff --git a/packages/backend/gears/maintain_kit_metadata.py b/packages/backend/gears/maintain_kit_metadata.py new file mode 100644 index 0000000..4771c12 --- /dev/null +++ b/packages/backend/gears/maintain_kit_metadata.py @@ -0,0 +1,35 @@ +def extract_data(record): + """ + Extracts the relevant data fields (`kit`, `state`, and `updatedAt`) from a JSON record. + """ + data_key = record['key'] + + # fetch JSON fields + kit = execute('JSON.GET', data_key, 'kit') + state = execute('JSON.GET', data_key, 'state') + updated_at = execute('JSON.GET', data_key, 'updatedAt') + + return { 'kit': kit[1:-1], 'state': int(state), 'updated_at': int(updated_at) } #trim kit without `"` at the beginning and the end + +def update_maximums(data): + """ + Compares and updates the maximum `state` and `updatedAt` for the given `kit`. + """ + kit_key = 'kit:' + data['kit'] + + # update max state + max_state = execute('HGET', kit_key, 'maxState') + max_state = int(max_state) if max_state else 0 + if data['state'] > max_state: + execute('HSET', kit_key, 'maxState', data['state']) + + # update max updatedAt + max_updated_at = execute('HGET', kit_key, 'maxUpdatedAt') + max_updated_at = int(max_updated_at) if max_updated_at else 0 + if data['updated_at'] > max_updated_at: + execute('HSET', kit_key, 'maxUpdatedAt', data['updated_at']) + +gb = GearsBuilder() +gb.map(extract_data) +gb.foreach(update_maximums) +gb.register('tile:*') diff --git a/packages/backend/openapi3.yaml b/packages/backend/openapi3.yaml index f4dc6f7..b59dd6c 100644 --- a/packages/backend/openapi3.yaml +++ b/packages/backend/openapi3.yaml @@ -52,6 +52,93 @@ paths: $ref: '#/components/responses/Conflict' 5XX: $ref: '#/components/responses/UnexpectedError' + /cooldown: + get: + operationId: getCooldowns + tags: + - cooldown + summary: Get a list of cooldowns according to query + parameters: + - in: query + name: kits + description: return cooldowns in specified kits + schema: + type: array + items: + $ref: '#/components/schemas/kitName' + minItems: 0 + default: [] + uniqueItems: true + - in: query + name: minZoom + description: min zoom level + schema: + $ref: '#/components/schemas/z' + - in: query + name: maxZoom + description: max zoom level + schema: + $ref: '#/components/schemas/z' + - in: query + name: area + description: cooldowns consisting the area + schema: + type: array + items: + anyOf: + - $ref: '#/components/schemas/longitude' + - $ref: '#/components/schemas/latitude' + minItems: 4 + maxItems: 4 + - in: query + name: enabled + description: cooldowns which are enabled or disabled + schema: + type: boolean + - in: query + name: size + description: pagination query size limitation + schema: + $ref: '#/components/schemas/size' + - in: query + name: from + description: pagination query from + schema: + $ref: '#/components/schemas/from' + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/cooldownResponse' + 4XX: + $ref: '#/components/responses/BadRequest' + 5XX: + $ref: '#/components/responses/UnexpectedError' + post: + summary: Register a new cooldown + requestBody: + description: cooldown to be created + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/baseCooldown' + - $ref: '#/components/schemas/cooldownWithBboxRequest' + - $ref: '#/components/schemas/cooldownWithGeometryRequest' + operationId: createCooldown + tags: + - cooldown + responses: + '201': + description: created + '400': + $ref: '#/components/responses/BadRequest' + 5XX: + $ref: '#/components/responses/UnexpectedError' /detail: get: operationId: getTileDetails @@ -301,6 +388,113 @@ components: properties: message: type: string + Geometry: + type: object + description: Geojson geometry + discriminator: + propertyName: type + required: + - type + externalDocs: + url: http://geojson.org/geojson-spec.html#geometry-objects + properties: + type: + type: string + enum: + - Point + - LineString + - Polygon + - MultiPoint + - MultiLineString + - MultiPolygon + description: the geometry type + Point3D: + type: array + description: Point in 3D space + externalDocs: + url: http://geojson.org/geojson-spec.html#id2 + minItems: 2 + maxItems: 3 + items: + type: number + Point: + type: object + description: Geojson geometry + externalDocs: + url: http://geojson.org/geojson-spec.html#id2 + allOf: + - $ref: '#/components/schemas/Geometry' + - properties: + coordinates: + $ref: '#/components/schemas/Point3D' + LineString: + type: object + description: Geojson geometry + externalDocs: + url: http://geojson.org/geojson-spec.html#id3 + allOf: + - $ref: '#/components/schemas/Geometry' + - properties: + coordinates: + type: array + items: + $ref: '#/components/schemas/Point3D' + Polygon: + type: object + description: Geojson geometry + externalDocs: + url: http://geojson.org/geojson-spec.html#id4 + allOf: + - $ref: '#/components/schemas/Geometry' + - properties: + coordinates: + type: array + items: + type: array + items: + $ref: '#/components/schemas/Point3D' + MultiPoint: + type: object + description: Geojson geometry + externalDocs: + url: http://geojson.org/geojson-spec.html#id5 + allOf: + - $ref: '#/components/schemas/Geometry' + - properties: + coordinates: + type: array + items: + $ref: '#/components/schemas/Point3D' + MultiLineString: + type: object + description: Geojson geometry + externalDocs: + url: http://geojson.org/geojson-spec.html#id6 + allOf: + - $ref: '#/components/schemas/Geometry' + - properties: + coordinates: + type: array + items: + type: array + items: + $ref: '#/components/schemas/Point3D' + MultiPolygon: + type: object + description: Geojson geometry + externalDocs: + url: http://geojson.org/geojson-spec.html#id6 + allOf: + - $ref: '#/components/schemas/Geometry' + - properties: + coordinates: + type: array + items: + type: array + items: + type: array + items: + $ref: '#/components/schemas/Point3D' longitude: type: number minimum: -180 @@ -315,6 +509,10 @@ components: minimum: 0 maximum: 1000 default: 100 + from: + type: number + minimum: 0 + default: 0 cursor: type: number z: @@ -349,8 +547,9 @@ components: $ref: '#/components/schemas/unixTimestamp' state: $ref: '#/components/schemas/state' - hasSkipped: - type: boolean + status: + type: string + enum: [rendered, skipped, cooled] required: - timestamp additionalProperties: false @@ -366,6 +565,82 @@ components: additionalProperties: true allOf: - $ref: '#/components/schemas/kit' + baseCooldown: + type: object + required: + - duration + - kits + - minZoom + - maxZoom + - enabled + properties: + duration: + type: integer + minimum: 1 + example: 3600 + kits: + type: array + items: + $ref: '#/components/schemas/kitName' + minZoom: + $ref: '#/components/schemas/z' + maxZoom: + $ref: '#/components/schemas/z' + enabled: + type: boolean + default: true + ttl: + type: integer + minimum: 1 + example: 666 + description: + type: string + cooldownWithBboxRequest: + allOf: + - $ref: '#/components/schemas/baseCooldown' + - type: object + required: + - area + properties: + area: + type: array + description: WGS84 bbox + items: + type: number + minItems: 4 + maxItems: 4 + example: + - -85 + - -85 + - 85 + - 85 + cooldownWithGeometryRequest: + allOf: + - $ref: '#/components/schemas/baseCooldown' + - type: object + required: + - area + properties: + area: + $ref: '#/components/schemas/Geometry' + cooldownResponse: + allOf: + - $ref: '#/components/schemas/baseCooldown' + - type: object + required: + - duration + - kits + - minZoom + - maxZoom + - createdAt + - updatedAt + properties: + geoshape: + type: string + createdAt: + $ref: '#/components/schemas/unixTimestamp' + updatedAt: + $ref: '#/components/schemas/unixTimestamp' getTileDetailsResponse: type: object additionalProperties: false @@ -406,6 +681,8 @@ components: $ref: '#/components/schemas/counter' skipCount: $ref: '#/components/schemas/counter' + coolCount: + $ref: '#/components/schemas/counter' coordinates: $ref: '#/components/schemas/coordinates' required: @@ -421,4 +698,5 @@ components: - updateCount - renderCount - skipCount + - coolCount - coordinates diff --git a/packages/backend/package.json b/packages/backend/package.json index 1f7d74e..50b9bad 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -33,7 +33,7 @@ "dependencies": { "@godaddy/terminus": "^4.12.1", "@map-colonies/cleanup-registry": "^1.1.0", - "@map-colonies/detiler-common": "^1.2.0", + "@map-colonies/detiler-common": "^1.3.0-rc2", "@map-colonies/error-express-handler": "^2.1.0", "@map-colonies/express-access-log-middleware": "^2.0.1", "@map-colonies/js-logger": "^1.0.1", @@ -45,16 +45,19 @@ "@opentelemetry/api-metrics": "0.23.0", "@opentelemetry/instrumentation-express": "0.32.1", "@opentelemetry/instrumentation-http": "0.35.0", + "@turf/turf": "^7.1.0", "compression": "^1.7.4", "config": "^3.3.9", "cors": "^2.8.5", + "crypto": "^1.0.1", "express": "^4.18.2", "express-openapi-validator": "^5.0.4", "http-status-codes": "^2.2.0", "mime-types": "^2.1.35", "redis": "^4.6.12", "reflect-metadata": "^0.1.13", - "tsyringe": "^4.8.0" + "tsyringe": "^4.8.0", + "wellknown": "^0.5.0" }, "devDependencies": { "@commitlint/cli": "^18.4.4", @@ -68,11 +71,13 @@ "@types/config": "^3.3.0", "@types/cors": "^2.8.17", "@types/express": "^4.17.17", + "@types/geojson": "7946.0.14", "@types/jest": "^29.5.2", "@types/mime-types": "^2.1.4", "@types/multer": "^1.4.7", "@types/supertest": "^2.0.12", "@types/swagger-ui-express": "^4.1.3", + "@types/wellknown": "^0.5.8", "commitlint": "^17.6.6", "copyfiles": "^2.4.1", "cz-conventional-changelog": "^3.3.0", diff --git a/packages/backend/src/common/constants.ts b/packages/backend/src/common/constants.ts index 706b516..3dde383 100644 --- a/packages/backend/src/common/constants.ts +++ b/packages/backend/src/common/constants.ts @@ -21,9 +21,15 @@ export const HEALTHCHECK = Symbol('healthcheck'); export const METATILE_SIZE = 8; export const COORDINATES_FRACTION_DIGITS = 6; +export const SEARCHED_GEOSHAPE_NAME = 'polygon'; +export const REDIS_SEARCH_DIALECT = 3; +export const REDIS_WILDCARD = '*'; + +export const REDIS_TILE_INDEX_NAME = 'tileDetailsIdx'; +export const TILE_DETAILS_KEY_PREFIX = 'tile'; -export const REDIS_INDEX_NAME = 'tileDetailsIdx'; export const REDIS_KITS_HASH_PREFIX = 'kit'; export const REDIS_KITS_SET = 'kits'; -export const TILE_DETAILS_KEY_PREFIX = 'tile'; -export const SEARCHED_GEOSHAPE_NAME = 'polygon'; + +export const REDIS_COOLDOWN_INDEX_NAME = 'cooldownIdx'; +export const COOLDOWN_KEY_PREFIX = 'cooldown'; diff --git a/packages/backend/src/common/util.ts b/packages/backend/src/common/util.ts index cc70e45..8dc46e4 100644 --- a/packages/backend/src/common/util.ts +++ b/packages/backend/src/common/util.ts @@ -1,3 +1,4 @@ +import { createHash } from 'crypto'; import { TileParams, TileParamsWithKit } from '@map-colonies/detiler-common'; import { BoundingBox, LonLat } from '@map-colonies/tile-calc'; import { TileRequestParams } from '../tileDetails/controllers/tileDetailsController'; @@ -47,3 +48,9 @@ export const stringifyCoordinates = (coordinates: LonLat): string => `${coordinates.lon.toFixed(COORDINATES_FRACTION_DIGITS)}, ${coordinates.lat.toFixed(COORDINATES_FRACTION_DIGITS)}`; export const keyfy = (params: TileParamsWithKit): string => `${TILE_DETAILS_KEY_PREFIX}:${params.kit}:${params.z}/${params.x}/${params.y}`; + +export const hashValue = (value: unknown): string => { + const hash = createHash('sha256'); + hash.update(JSON.stringify(value)); + return hash.digest('hex'); +}; diff --git a/packages/backend/src/containerConfig.ts b/packages/backend/src/containerConfig.ts index 9e2aa41..9062136 100644 --- a/packages/backend/src/containerConfig.ts +++ b/packages/backend/src/containerConfig.ts @@ -13,6 +13,7 @@ import { tileDetailsRouterFactory, TILE_DETAILS_ROUTER_SYMBOL } from './tileDeta import { InjectionObject, registerDependencies } from './common/dependencyRegistration'; import { healthCheckFunctionFactory, RedisClient, redisClientFactory } from './redis'; import { kitRouterFactory, KIT_ROUTER_SYMBOL } from './kit/routes/kitRouter'; +import { COOLDOWN_ROUTER_SYMBOL, cooldownRouterFactory } from './cooldown/routes/cooldownRouter'; export interface RegisterOptions { override?: InjectionObject[]; @@ -45,6 +46,7 @@ export const registerExternalValues = async (options?: RegisterOptions): Promise { token: SERVICES.METER, provider: { useValue: OtelMetrics.getMeterProvider().getMeter(SERVICE_NAME) } }, { token: TILE_DETAILS_ROUTER_SYMBOL, provider: { useFactory: tileDetailsRouterFactory } }, { token: KIT_ROUTER_SYMBOL, provider: { useFactory: kitRouterFactory } }, + { token: COOLDOWN_ROUTER_SYMBOL, provider: { useFactory: cooldownRouterFactory } }, { token: SERVICES.REDIS, provider: { useFactory: instancePerContainerCachingFactory(redisClientFactory) }, diff --git a/packages/backend/src/cooldown/controllers/cooldownController.ts b/packages/backend/src/cooldown/controllers/cooldownController.ts new file mode 100644 index 0000000..c4e1977 --- /dev/null +++ b/packages/backend/src/cooldown/controllers/cooldownController.ts @@ -0,0 +1,93 @@ +import { Logger } from '@map-colonies/js-logger'; +import { RequestHandler } from 'express'; +import httpStatus from 'http-status-codes'; +import { injectable, inject } from 'tsyringe'; +import { BoundingBox, TILEGRID_WEB_MERCATOR, validateTileGridBoundingBox } from '@map-colonies/tile-calc'; +import { Cooldown, CooldownCreationRequest, CooldownQueryParams } from '@map-colonies/detiler-common'; +import mime from 'mime-types'; +import isGeojson from '@turf/boolean-valid'; +import { SERVICES } from '../../common/constants'; +import { CooldownManager } from '../models/cooldownManager'; +import { RequestValidationError } from '../models/errors'; +import { DEFAULT_PAGE_SIZE } from '../../redis'; + +const txtplain = mime.contentType('text/plain') as string; + +type GetCooldownsHandler = RequestHandler; +type PostCooldownHandler = RequestHandler; + +@injectable() +export class CooldownController { + public constructor(@inject(SERVICES.LOGGER) private readonly logger: Logger, @inject(CooldownManager) private readonly manager: CooldownManager) {} + + public getCooldowns: GetCooldownsHandler = async (req, res, next) => { + try { + const { area, from, size, ...queryParams } = req.query; + + if (area !== undefined && Array.isArray(area)) { + const [west, south, east, north] = area; + const bbox: BoundingBox = { west: +west, south: +south, east: +east, north: +north }; + validateTileGridBoundingBox(bbox, TILEGRID_WEB_MERCATOR); + } + + const params = { + area, + from: from !== undefined ? +from : 0, + size: size !== undefined ? +size : DEFAULT_PAGE_SIZE, + ...queryParams, + }; + + const cooldowns = await this.manager.queryCooldowns(params); + + return res.status(httpStatus.OK).json(cooldowns); + } catch (error) { + return next(error); + } + }; + + public postCooldown: PostCooldownHandler = async (req, res, next) => { + try { + this.validateRequest(req.body); + + await this.manager.createCooldown(req.body); + return res.status(httpStatus.CREATED).type(txtplain).send(httpStatus.getStatusText(httpStatus.CREATED)); + } catch (error) { + return next(error); + } + }; + + private validateRequest(request: CooldownCreationRequest): void { + const { minZoom, maxZoom, area } = request; + + // validate zooms + if (minZoom > maxZoom) { + const error = new RequestValidationError('minZoom must be less than or equal to maxZoom'); + this.logger.error({ msg: 'validation failed', invalidParam: ['minZoom', 'maxZoom'], received: { minZoom, maxZoom }, err: error }); + throw error; + } + + if (area === undefined) { + return; + } + + // validate bbox + if (Array.isArray(area)) { + try { + const [west, south, east, north] = area; + const bbox: BoundingBox = { west: +west, south: +south, east: +east, north: +north }; + validateTileGridBoundingBox(bbox, TILEGRID_WEB_MERCATOR); + return; + } catch (error) { + this.logger.error({ msg: 'validation failed', invalidParam: 'area', received: area, err: error }); + throw new RequestValidationError((error as Error).message); + } + } + + // validate geojson + if (!isGeojson(area)) { + const error = new RequestValidationError('area is an invalid geojson'); + this.logger.error({ msg: 'validation failed', invalidParam: 'area', received: area, err: error }); + throw error; + } + } +} diff --git a/packages/backend/src/cooldown/models/constants.ts b/packages/backend/src/cooldown/models/constants.ts new file mode 100644 index 0000000..9d32427 --- /dev/null +++ b/packages/backend/src/cooldown/models/constants.ts @@ -0,0 +1,4 @@ +import { BoundingBox } from '@map-colonies/tile-calc'; + +// for some reason redis geospacial search won't respond to larger bbox +export const HALF_GLOBE_BBOX: BoundingBox = { west: -90, south: -85.05112877980659, east: 90, north: 85.05112877980659 }; diff --git a/packages/backend/src/cooldown/models/cooldownManager.ts b/packages/backend/src/cooldown/models/cooldownManager.ts new file mode 100644 index 0000000..4513355 --- /dev/null +++ b/packages/backend/src/cooldown/models/cooldownManager.ts @@ -0,0 +1,137 @@ +import { Logger } from '@map-colonies/js-logger'; +import { inject, injectable } from 'tsyringe'; +import { SearchOptions } from 'redis'; +import { BoundingBox } from '@map-colonies/tile-calc'; +import { Cooldown, CooldownCreationRequest, CooldownQueryParams } from '@map-colonies/detiler-common'; +import isGeojson from '@turf/boolean-valid'; +import { Geometry } from 'geojson'; +import { stringify as geojsonToWkt, GeoJSONGeometry } from 'wellknown'; +import { bboxToWktPolygon, hashValue } from '../../common/util'; +import { + SERVICES, + COOLDOWN_KEY_PREFIX, + REDIS_COOLDOWN_INDEX_NAME, + SEARCHED_GEOSHAPE_NAME, + REDIS_SEARCH_DIALECT, + REDIS_WILDCARD, +} from '../../common/constants'; +import { RedisClient } from '../../redis'; +import { HALF_GLOBE_BBOX } from './constants'; + +@injectable() +export class CooldownManager { + public constructor(@inject(SERVICES.LOGGER) private readonly logger: Logger, @inject(SERVICES.REDIS) private readonly redis: RedisClient) {} + + public async queryCooldowns(params: CooldownQueryParams & Required>): Promise { + this.logger.info('quering cooldowns', params); + + const { kits, minZoom, maxZoom, area, enabled, from, size } = params; + + const queryParts: string[] = []; + + /* eslint-disable @typescript-eslint/naming-convention */ // node-redis does not follow eslint naming convention + let options: SearchOptions & Required> = { + DIALECT: REDIS_SEARCH_DIALECT, + LIMIT: { from, size }, + }; + + if (area) { + const [west, south, east, north] = area; + const bbox: BoundingBox = { west: +west, south: +south, east: +east, north: +north }; + queryParts.push(`@geoshape:[CONTAINS $${SEARCHED_GEOSHAPE_NAME}]`); + options = { + ...options, + PARAMS: { + [SEARCHED_GEOSHAPE_NAME]: bboxToWktPolygon(bbox), + }, + }; + } + /* eslint-enable @typescript-eslint/naming-convention */ + + if (kits && kits.length > 0) { + const kitsQuery = kits.map((kit) => `@kits:{${kit}}`).join(' '); + queryParts.push(kitsQuery); + } + + if (minZoom !== undefined) { + queryParts.push(`@minZoom:[-inf ${minZoom}]`); + } + + if (maxZoom !== undefined) { + queryParts.push(`@maxZoom:[${maxZoom} inf]`); + } + + if (enabled !== undefined) { + queryParts.push(`@enabled:{${enabled}}`); + } + + const query = queryParts.length !== 0 ? queryParts.join(' ').trim() : REDIS_WILDCARD; + + this.logger.debug({ msg: 'attempting the following search', query, options }); + + const result = await this.redis.ft.search(REDIS_COOLDOWN_INDEX_NAME, query, options); + + this.logger.debug({ + msg: 'finished search', + query, + options, + result, + }); + + if (result.total === 0) { + return []; + } + + const cooldowns = result.documents.map((document) => document.value[0]); + + return cooldowns as unknown as Cooldown[]; + } + + public async createCooldown(params: CooldownCreationRequest): Promise { + this.logger.info({ msg: 'creating new cooldown', params }); + + const { area, ...restOfParams } = params; + + let cooldown: Partial = { + ...restOfParams, + }; + + if (area !== undefined && Array.isArray(area)) { + const [west, south, east, north] = area; + const bbox: BoundingBox = { west: +west, south: +south, east: +east, north: +north }; + + cooldown.geoshape = bboxToWktPolygon(bbox); + } + + if (area !== undefined && isGeojson(area as Geometry)) { + cooldown.geoshape = geojsonToWkt(area as GeoJSONGeometry); + } + + if (area === undefined) { + cooldown.geoshape = bboxToWktPolygon(HALF_GLOBE_BBOX); + } + + const key = `${COOLDOWN_KEY_PREFIX}:${hashValue(cooldown)}`; + + const now = Date.now(); + cooldown = { + ...cooldown, + createdAt: now, + updatedAt: now, + }; + + this.logger.info({ msg: 'attempting to create cooldown', key, cooldown, area }); + + await this.redis.executeIsolated(async (isolatedClient) => { + const transaction = isolatedClient.multi(); + + transaction.json.set(key, '$', { ...cooldown }); + + if (cooldown.ttl !== undefined) { + transaction.expire(key, cooldown.ttl); + } + + await transaction.exec(); + }); + } +} diff --git a/packages/backend/src/cooldown/models/errors.ts b/packages/backend/src/cooldown/models/errors.ts new file mode 100644 index 0000000..bc601e2 --- /dev/null +++ b/packages/backend/src/cooldown/models/errors.ts @@ -0,0 +1,6 @@ +export class RequestValidationError extends Error { + public constructor(message: string) { + super(message); + Object.setPrototypeOf(this, RequestValidationError.prototype); + } +} diff --git a/packages/backend/src/cooldown/routes/cooldownRouter.ts b/packages/backend/src/cooldown/routes/cooldownRouter.ts new file mode 100644 index 0000000..afbd16d --- /dev/null +++ b/packages/backend/src/cooldown/routes/cooldownRouter.ts @@ -0,0 +1,15 @@ +import { Router } from 'express'; +import { FactoryFunction } from 'tsyringe'; +import { CooldownController } from '../controllers/cooldownController'; + +export const COOLDOWN_ROUTER_SYMBOL = Symbol('cooldownRouterFactory'); + +export const cooldownRouterFactory: FactoryFunction = (dependencyContainer) => { + const router = Router(); + const controller = dependencyContainer.resolve(CooldownController); + + router.get('/', controller.getCooldowns); + router.post('/', controller.postCooldown); + + return router; +}; diff --git a/packages/backend/src/serverBuilder.ts b/packages/backend/src/serverBuilder.ts index 9e4c53d..6294dba 100644 --- a/packages/backend/src/serverBuilder.ts +++ b/packages/backend/src/serverBuilder.ts @@ -13,6 +13,7 @@ import { SERVICES } from './common/constants'; import { IConfig } from './common/interfaces'; import { TILE_DETAILS_ROUTER_SYMBOL } from './tileDetails/routes/tileDetailsRouter'; import { KIT_ROUTER_SYMBOL } from './kit/routes/kitRouter'; +import { COOLDOWN_ROUTER_SYMBOL } from './cooldown/routes/cooldownRouter'; @injectable() export class ServerBuilder { @@ -22,7 +23,8 @@ export class ServerBuilder { @inject(SERVICES.CONFIG) private readonly config: IConfig, @inject(SERVICES.LOGGER) private readonly logger: Logger, @inject(TILE_DETAILS_ROUTER_SYMBOL) private readonly tileDetailsRouter: Router, - @inject(KIT_ROUTER_SYMBOL) private readonly kitRouter: Router + @inject(KIT_ROUTER_SYMBOL) private readonly kitRouter: Router, + @inject(COOLDOWN_ROUTER_SYMBOL) private readonly cooldownRouter: Router ) { this.serverInstance = express(); } @@ -47,6 +49,7 @@ export class ServerBuilder { private buildRoutes(): void { this.serverInstance.use('/kits', this.kitRouter); this.serverInstance.use('/detail', this.tileDetailsRouter); + this.serverInstance.use('/cooldown', this.cooldownRouter); this.buildDocsRoutes(); } diff --git a/packages/backend/src/tileDetails/controllers/tileDetailsController.ts b/packages/backend/src/tileDetails/controllers/tileDetailsController.ts index 019177d..d2bcd19 100644 --- a/packages/backend/src/tileDetails/controllers/tileDetailsController.ts +++ b/packages/backend/src/tileDetails/controllers/tileDetailsController.ts @@ -10,7 +10,7 @@ import { numerifyTileRequestParams, UpsertStatus } from '../../common/util'; import { KitNotFoundError, TileDetailsNotFoundError } from '../models/errors'; import { TileDetailsManager } from '../models/tileDetailsManager'; -type GetTilesDetailsHandler = RequestHandler>; +type GetTilesDetailsHandler = RequestHandler>; type GetMultiKitsTilesDetailsHandler = RequestHandler; type GetTileDetailsByKitHandler = RequestHandler; type PutTileDetailsByKitHandler = RequestHandler; diff --git a/packages/backend/src/tileDetails/models/tileDetailsManager.ts b/packages/backend/src/tileDetails/models/tileDetailsManager.ts index 7deb167..3672d57 100644 --- a/packages/backend/src/tileDetails/models/tileDetailsManager.ts +++ b/packages/backend/src/tileDetails/models/tileDetailsManager.ts @@ -13,9 +13,16 @@ import { WatchError } from 'redis'; import { BoundingBox, TILEGRID_WORLD_CRS84, tileToBoundingBox } from '@map-colonies/tile-calc'; import { AggregateReply, DEFAULT_LIMIT, DEFAULT_PAGE_SIZE, RedisClient } from '../../redis'; import { keyfy, stringifyCoordinates, bboxToWktPolygon, UpsertStatus, bboxToLonLat } from '../../common/util'; -import { REDIS_KITS_HASH_PREFIX, METATILE_SIZE, SERVICES, REDIS_INDEX_NAME, SEARCHED_GEOSHAPE_NAME } from '../../common/constants'; +import { + REDIS_KITS_HASH_PREFIX, + METATILE_SIZE, + SERVICES, + REDIS_TILE_INDEX_NAME, + SEARCHED_GEOSHAPE_NAME, + REDIS_SEARCH_DIALECT, +} from '../../common/constants'; import { KitNotFoundError, TileDetailsNotFoundError } from './errors'; -import { LOAD_FIELDS, transformDocument } from './util'; +import { LOAD_FIELDS, NEWLY_INSERTED_TILE_COUNTERS, transformDocument } from './util'; export interface TilesDetailsQueryParams extends Omit { bbox: BoundingBox; @@ -40,7 +47,7 @@ export class TileDetailsManager { const geoshape = bboxToWktPolygon(bbox); /* eslint-disable @typescript-eslint/naming-convention */ // node-redis does not follow eslint naming convention const options = { - DIALECT: 3, + DIALECT: REDIS_SEARCH_DIALECT, PARAMS: { [SEARCHED_GEOSHAPE_NAME]: geoshape }, LOAD: LOAD_FIELDS, TIMEOUT: 0, @@ -48,9 +55,9 @@ export class TileDetailsManager { }; if (cursor === undefined) { - response = await this.redis.ft.aggregateWithCursor(REDIS_INDEX_NAME, query, options); + response = await this.redis.ft.aggregateWithCursor(REDIS_TILE_INDEX_NAME, query, options); } else { - response = await this.redis.ft.cursorRead(REDIS_INDEX_NAME, cursor, { COUNT: size ?? DEFAULT_PAGE_SIZE }); + response = await this.redis.ft.cursorRead(REDIS_TILE_INDEX_NAME, cursor, { COUNT: size ?? DEFAULT_PAGE_SIZE }); } /* eslint-enable @typescript-eslint/naming-convention */ @@ -104,7 +111,7 @@ export class TileDetailsManager { const { z, x, y } = tileParams; /* eslint-disable @typescript-eslint/naming-convention */ // node-redis does not follow eslint nmaing convention - const result = await this.redis.ft.search(REDIS_INDEX_NAME, `@z:[${z} ${z}] @x:[${x} ${x}] @y:[${y} ${y}]`, { + const result = await this.redis.ft.search(REDIS_TILE_INDEX_NAME, `@z:[${z} ${z}] @x:[${x} ${x}] @y:[${y} ${y}]`, { LIMIT: DEFAULT_LIMIT, }); @@ -161,11 +168,13 @@ export class TileDetailsManager { ], ]; - if (payload.hasSkipped !== true) { + if (payload.status === 'rendered') { transaction.json.numIncrBy(key, '$.renderCount', 1); jsonMSetItems[0].push({ key, path: '$.renderedAt', value: payload.timestamp }); - } else { + } else if (payload.status === 'skipped') { transaction.json.numIncrBy(key, '$.skipCount', 1); + } else if (payload.status === 'cooled') { + transaction.json.numIncrBy(key, '$.coolCount', 1); } transaction.json.mSet(jsonMSetItems.flat()); @@ -191,9 +200,7 @@ export class TileDetailsManager { updatedAt: payload.timestamp, createdAt: payload.timestamp, renderedAt: payload.timestamp, - updateCount: 1, - renderCount: 1, - skipCount: 0, + ...NEWLY_INSERTED_TILE_COUNTERS, geoshape: wkt, coordinates: stringifyCoordinates(tileCoordinates), }; diff --git a/packages/backend/src/tileDetails/models/util.ts b/packages/backend/src/tileDetails/models/util.ts index 932b9f8..dbb4aa2 100644 --- a/packages/backend/src/tileDetails/models/util.ts +++ b/packages/backend/src/tileDetails/models/util.ts @@ -19,6 +19,7 @@ export const LOAD_FIELDS: LoadField[] = [ { identifier: '$.updateCount', AS: 'updateCount' }, { identifier: '$.renderCount', AS: 'renderCount' }, { identifier: '$.skipCount', AS: 'skipCount' }, + { identifier: '$.coolCount', AS: 'coolCount' }, { identifier: '$.geoshape', AS: 'geoshape' }, { identifier: '$.coordinates', AS: 'coordinates' }, ]; @@ -43,3 +44,10 @@ export const transformDocument = (input: Record): Record ({ + ...jest.requireActual('redis'), + createClient: jest.fn().mockImplementation(() => ({ + executeIsolated: executeIsolatedMock, + multi: multiMock, + expire: expireMock, + exec: execMock, + json: { + set: setMock, + }, + ft: { + search: searchMock, + }, + })), +})); + +type RedisClient = ReturnType; + +describe('CooldownManager', () => { + let cooldownManager: CooldownManager; + let mockedRedis: jest.Mocked; + + beforeAll(() => { + mockedRedis = createClient({}) as jest.Mocked; + cooldownManager = new CooldownManager(jsLogger({ enabled: false }), mockedRedis); + }); + + beforeEach(() => { + jest.resetAllMocks(); + }); + + describe('#queryCooldowns', () => { + it('should query cooldowns according to wildcard filter', async () => { + const params = { from: 0, size: 2 }; + const cooldown1 = { a: 1 }; + const cooldown2 = { b: 2 }; + searchMock.mockResolvedValue({ + documents: [ + { id: 1, value: [cooldown1] }, + { id: 2, value: [cooldown2] }, + ], + total: 2, + }); + + const response = await cooldownManager.queryCooldowns(params); + + expect(response).toMatchObject([cooldown1, cooldown2]); + expect(searchMock).toHaveBeenCalledTimes(1); + expect(searchMock).toHaveBeenCalledWith(REDIS_COOLDOWN_INDEX_NAME, REDIS_WILDCARD, { + DIALECT: REDIS_SEARCH_DIALECT, + LIMIT: { from: params.from, size: params.size }, + }); + }); + + it('should query cooldowns according to no area filter', async () => { + const params = { from: 0, size: 2, enabled: true, kits: ['a', 'b'], minZoom: 3, maxZoom: 4 }; + const cooldown1 = { a: 1 }; + const cooldown2 = { b: 2 }; + searchMock.mockResolvedValue({ + documents: [ + { id: 1, value: [cooldown1] }, + { id: 2, value: [cooldown2] }, + ], + total: 2, + }); + + const response = await cooldownManager.queryCooldowns(params); + + expect(response).toMatchObject([cooldown1, cooldown2]); + expect(searchMock).toHaveBeenCalledTimes(1); + expect(searchMock).toHaveBeenCalledWith( + REDIS_COOLDOWN_INDEX_NAME, + `@kits:{${params.kits[0]}} @kits:{${params.kits[1]}} @minZoom:[-inf ${params.minZoom}] @maxZoom:[${params.maxZoom} inf] @enabled:{${params.enabled}}`, + { DIALECT: REDIS_SEARCH_DIALECT, LIMIT: { from: params.from, size: params.size } } + ); + }); + + it('should query cooldowns according to filter with area', async () => { + const area: [number, number, number, number] = [1, 2, 3, 4]; + const params = { from: 0, size: 2, enabled: true, kits: ['a', 'b'], minZoom: 3, maxZoom: 4, area }; + const cooldown1 = { a: 1 }; + const cooldown2 = { b: 2 }; + searchMock.mockResolvedValue({ + documents: [ + { id: 1, value: [cooldown1] }, + { id: 2, value: [cooldown2] }, + ], + total: 2, + }); + + const response = await cooldownManager.queryCooldowns(params); + + expect(response).toMatchObject([cooldown1, cooldown2]); + expect(searchMock).toHaveBeenCalledTimes(1); + expect(searchMock).toHaveBeenCalledWith( + REDIS_COOLDOWN_INDEX_NAME, + `@geoshape:[CONTAINS $${SEARCHED_GEOSHAPE_NAME}] @kits:{${params.kits[0]}} @kits:{${params.kits[1]}} @minZoom:[-inf ${params.minZoom}] @maxZoom:[${params.maxZoom} inf] @enabled:{${params.enabled}}`, + { + DIALECT: REDIS_SEARCH_DIALECT, + LIMIT: { from: params.from, size: params.size }, + PARAMS: { + [SEARCHED_GEOSHAPE_NAME]: 'POLYGON ((1 4, 1 2, 3 2, 3 4, 1 4))', + }, + } + ); + }); + + it('should query cooldowns according to filter and return empty array if no result was found', async () => { + const params = { from: 0, size: 2, enabled: true, kits: ['a', 'b'], minZoom: 3, maxZoom: 4 }; + searchMock.mockResolvedValue({ documents: [], total: 0 }); + + const response = await cooldownManager.queryCooldowns(params); + + expect(response).toMatchObject([]); + expect(searchMock).toHaveBeenCalledTimes(1); + expect(searchMock).toHaveBeenCalledWith( + REDIS_COOLDOWN_INDEX_NAME, + `@kits:{${params.kits[0]}} @kits:{${params.kits[1]}} @minZoom:[-inf ${params.minZoom}] @maxZoom:[${params.maxZoom} inf] @enabled:{${params.enabled}}`, + { DIALECT: REDIS_SEARCH_DIALECT, LIMIT: { from: params.from, size: params.size } } + ); + }); + }); + + describe('#createCooldown', () => { + it('should create a new cooldown with no ttl and default area', async () => { + jest.spyOn(Date, 'now').mockImplementation(() => NOW_MOCK); + executeIsolatedMock.mockImplementation(async (fn: (client: RedisClient) => Promise) => fn(mockedRedis)); + multiMock.mockReturnValue(mockedRedis); + + const newCooldownRequest: CooldownCreationRequest = { enabled: true, duration: 100, kits: ['a'], minZoom: 0, maxZoom: 1 }; + const expectedToBeHashed = { ...newCooldownRequest, geoshape: bboxToWktPolygon(HALF_GLOBE_BBOX) }; + const expected: Cooldown = { ...expectedToBeHashed, createdAt: NOW_MOCK, updatedAt: NOW_MOCK }; + const expectedKey = `${COOLDOWN_KEY_PREFIX}:${hashValue(expectedToBeHashed)}`; + + await cooldownManager.createCooldown(newCooldownRequest); + + expect(executeIsolatedMock).toHaveBeenCalledTimes(1); + expect(multiMock).toHaveBeenCalledTimes(1); + expect(setMock).toHaveBeenCalledTimes(1); + expect(setMock).toHaveBeenCalledWith(expectedKey, '$', expected); + expect(expireMock).not.toHaveBeenCalled(); + expect(execMock).toHaveBeenCalledTimes(1); + }); + + it('should create a new cooldown with ttl and default area', async () => { + jest.spyOn(Date, 'now').mockImplementation(() => NOW_MOCK); + executeIsolatedMock.mockImplementation(async (fn: (client: RedisClient) => Promise) => fn(mockedRedis)); + multiMock.mockReturnValue(mockedRedis); + + const newCooldownRequest: CooldownCreationRequest = { + enabled: true, + duration: 100, + kits: ['a'], + minZoom: 0, + maxZoom: 1, + ttl: 1000, + description: 'desc', + }; + const expectedToBeHashed = { ...newCooldownRequest, geoshape: bboxToWktPolygon(HALF_GLOBE_BBOX) }; + const expected: Cooldown = { ...expectedToBeHashed, createdAt: NOW_MOCK, updatedAt: NOW_MOCK }; + const expectedKey = `${COOLDOWN_KEY_PREFIX}:${hashValue(expectedToBeHashed)}`; + + await cooldownManager.createCooldown(newCooldownRequest); + + expect(executeIsolatedMock).toHaveBeenCalledTimes(1); + expect(multiMock).toHaveBeenCalledTimes(1); + expect(setMock).toHaveBeenCalledTimes(1); + expect(setMock).toHaveBeenCalledWith(expectedKey, '$', expected); + expect(expireMock).toHaveBeenCalledTimes(1); + expect(expireMock).toHaveBeenCalledWith(expectedKey, newCooldownRequest.ttl); + expect(execMock).toHaveBeenCalledTimes(1); + }); + + it('should create a new cooldown with no ttl and given bbox area', async () => { + jest.spyOn(Date, 'now').mockImplementation(() => NOW_MOCK); + executeIsolatedMock.mockImplementation(async (fn: (client: RedisClient) => Promise) => fn(mockedRedis)); + multiMock.mockReturnValue(mockedRedis); + + const newCooldownRequest: CooldownCreationRequest = { enabled: true, duration: 100, kits: ['a'], minZoom: 0, maxZoom: 1, area: [1, 2, 3, 4] }; + const { area, ...restOfParams } = newCooldownRequest; + const expectedToBeHashed = { ...restOfParams, geoshape: 'POLYGON ((1 4, 1 2, 3 2, 3 4, 1 4))' }; + const expected: Cooldown = { ...expectedToBeHashed, createdAt: NOW_MOCK, updatedAt: NOW_MOCK }; + const expectedKey = `${COOLDOWN_KEY_PREFIX}:${hashValue(expectedToBeHashed)}`; + + await cooldownManager.createCooldown(newCooldownRequest); + + expect(executeIsolatedMock).toHaveBeenCalledTimes(1); + expect(multiMock).toHaveBeenCalledTimes(1); + expect(setMock).toHaveBeenCalledTimes(1); + expect(setMock).toHaveBeenCalledWith(expectedKey, '$', expected); + expect(expireMock).not.toHaveBeenCalled(); + expect(execMock).toHaveBeenCalledTimes(1); + }); + + it('should create a new cooldown with no ttl and given geojson area', async () => { + jest.spyOn(Date, 'now').mockImplementation(() => NOW_MOCK); + executeIsolatedMock.mockImplementation(async (fn: (client: RedisClient) => Promise) => fn(mockedRedis)); + multiMock.mockReturnValue(mockedRedis); + + const newCooldownRequest: CooldownCreationRequest = { + enabled: true, + duration: 100, + kits: ['a'], + minZoom: 0, + maxZoom: 1, + area: { + type: 'Polygon', + coordinates: [ + [ + [1, 4], + [1, 2], + [3, 2], + [3, 4], + [1, 4], + ], + ], + }, + }; + const { area, ...restOfParams } = newCooldownRequest; + const expectedToBeHashed = { ...restOfParams, geoshape: 'POLYGON ((1 4, 1 2, 3 2, 3 4, 1 4))' }; + const expected: Cooldown = { ...expectedToBeHashed, createdAt: NOW_MOCK, updatedAt: NOW_MOCK }; + const expectedKey = `${COOLDOWN_KEY_PREFIX}:${hashValue(expectedToBeHashed)}`; + + await cooldownManager.createCooldown(newCooldownRequest); + + expect(executeIsolatedMock).toHaveBeenCalledTimes(1); + expect(multiMock).toHaveBeenCalledTimes(1); + expect(setMock).toHaveBeenCalledTimes(1); + expect(setMock).toHaveBeenCalledWith(expectedKey, '$', expected); + expect(expireMock).not.toHaveBeenCalled(); + expect(execMock).toHaveBeenCalledTimes(1); + }); + }); +}); diff --git a/packages/backend/tests/unit/tileDetails/tileDetails.spec.ts b/packages/backend/tests/unit/tileDetails/tileDetails.spec.ts index 0b2b4eb..334ed97 100644 --- a/packages/backend/tests/unit/tileDetails/tileDetails.spec.ts +++ b/packages/backend/tests/unit/tileDetails/tileDetails.spec.ts @@ -2,12 +2,18 @@ import { KitMetadata, TileDetailsPayload, TileParams, TileParamsWithKit, UNSPECIFIED_STATE } from '@map-colonies/detiler-common'; import jsLogger from '@map-colonies/js-logger'; import { createClient, WatchError } from 'redis'; -import { REDIS_INDEX_NAME, REDIS_KITS_HASH_PREFIX, SEARCHED_GEOSHAPE_NAME, TILE_DETAILS_KEY_PREFIX } from '../../../src/common/constants'; +import { + REDIS_KITS_HASH_PREFIX, + REDIS_SEARCH_DIALECT, + REDIS_TILE_INDEX_NAME, + SEARCHED_GEOSHAPE_NAME, + TILE_DETAILS_KEY_PREFIX, +} from '../../../src/common/constants'; import { bboxToWktPolygon, UpsertStatus } from '../../../src/common/util'; import { DEFAULT_LIMIT, DEFAULT_PAGE_SIZE } from '../../../src/redis'; import { KitNotFoundError, TileDetailsNotFoundError } from '../../../src/tileDetails/models/errors'; import { TileDetailsManager, TilesDetailsQueryParams } from '../../../src/tileDetails/models/tileDetailsManager'; -import { LOAD_FIELDS } from '../../../src/tileDetails/models/util'; +import { LOAD_FIELDS, NEWLY_INSERTED_TILE_COUNTERS } from '../../../src/tileDetails/models/util'; const mGetMock = jest.fn(); const searchMock = jest.fn(); @@ -78,10 +84,10 @@ describe('TileDetailsManager', () => { bbox: { east: 1, north: 2, south: 3, west: 4 }, }; aggregateWithCursorMock.mockResolvedValue({ results: [], cursor: undefined }); - const index = REDIS_INDEX_NAME; + const index = REDIS_TILE_INDEX_NAME; const query = `@z:[${params.minZoom} ${params.maxZoom}] @kit:(kit1) @geoshape:[WITHIN $${SEARCHED_GEOSHAPE_NAME}]`; const options = { - DIALECT: 3, + DIALECT: REDIS_SEARCH_DIALECT, PARAMS: { [SEARCHED_GEOSHAPE_NAME]: bboxToWktPolygon(params.bbox) }, LOAD: LOAD_FIELDS, TIMEOUT: 0, @@ -104,10 +110,10 @@ describe('TileDetailsManager', () => { bbox: { east: 1, north: 2, south: 3, west: 4 }, }; aggregateWithCursorMock.mockResolvedValue({ results: [{ a: '1' }], cursor: undefined }); - const index = REDIS_INDEX_NAME; + const index = REDIS_TILE_INDEX_NAME; const query = `@z:[${params.minZoom} ${params.maxZoom}] @kit:(kit1) @geoshape:[WITHIN $${SEARCHED_GEOSHAPE_NAME}]`; const options = { - DIALECT: 3, + DIALECT: REDIS_SEARCH_DIALECT, PARAMS: { [SEARCHED_GEOSHAPE_NAME]: bboxToWktPolygon(params.bbox) }, LOAD: LOAD_FIELDS, TIMEOUT: 0, @@ -130,10 +136,10 @@ describe('TileDetailsManager', () => { bbox: { east: 1, north: 2, south: 3, west: 4 }, }; aggregateWithCursorMock.mockResolvedValue({ total: 2, results: [{ a: '1' }, { a: '2' }], cursor: undefined }); - const index = REDIS_INDEX_NAME; + const index = REDIS_TILE_INDEX_NAME; const query = `@z:[${params.minZoom} ${params.maxZoom}] @kit:(kit1|kit2) @geoshape:[WITHIN $${SEARCHED_GEOSHAPE_NAME}]`; const searchParams = { - DIALECT: 3, + DIALECT: REDIS_SEARCH_DIALECT, PARAMS: { [SEARCHED_GEOSHAPE_NAME]: bboxToWktPolygon(params.bbox) }, LOAD: LOAD_FIELDS, TIMEOUT: 0, @@ -158,10 +164,10 @@ describe('TileDetailsManager', () => { bbox: { east: 1, north: 2, south: 3, west: 4 }, }; aggregateWithCursorMock.mockResolvedValue({ results: [{ a: '1' }, { a: 'abc' }] }); - const index = REDIS_INDEX_NAME; + const index = REDIS_TILE_INDEX_NAME; const query = `@z:[${params.minZoom} ${params.maxZoom}] @state:[${params.minState} +inf] @kit:(kit1|kit2) @geoshape:[WITHIN $${SEARCHED_GEOSHAPE_NAME}]`; const searchParams = { - DIALECT: 3, + DIALECT: REDIS_SEARCH_DIALECT, PARAMS: { [SEARCHED_GEOSHAPE_NAME]: bboxToWktPolygon(params.bbox) }, LOAD: LOAD_FIELDS, TIMEOUT: 0, @@ -185,10 +191,10 @@ describe('TileDetailsManager', () => { bbox: { east: 1, north: 2, south: 3, west: 4 }, }; aggregateWithCursorMock.mockResolvedValue({ results: [{ a: '1' }, { a: '2' }], cursor: undefined }); - const index = REDIS_INDEX_NAME; + const index = REDIS_TILE_INDEX_NAME; const query = `@z:[${params.minZoom} ${params.maxZoom}] @states:[-inf ${params.maxState}] @kit:(kit1|kit2) @geoshape:[WITHIN $${SEARCHED_GEOSHAPE_NAME}]`; const searchParams = { - DIALECT: 3, + DIALECT: REDIS_SEARCH_DIALECT, PARAMS: { [SEARCHED_GEOSHAPE_NAME]: bboxToWktPolygon(params.bbox) }, LOAD: LOAD_FIELDS, TIMEOUT: 0, @@ -214,10 +220,10 @@ describe('TileDetailsManager', () => { bbox: { east: 1, north: 2, south: 3, west: 4 }, }; aggregateWithCursorMock.mockResolvedValue({ results: [{ a: '1' }, { a: '2' }], cursor: undefined }); - const index = REDIS_INDEX_NAME; + const index = REDIS_TILE_INDEX_NAME; const query = `@z:[${params.minZoom} ${params.maxZoom}] @state:[${params.minState} ${params.maxState}] @kit:(kit1|kit2) @geoshape:[WITHIN $${SEARCHED_GEOSHAPE_NAME}]`; const searchParams = { - DIALECT: 3, + DIALECT: REDIS_SEARCH_DIALECT, PARAMS: { [SEARCHED_GEOSHAPE_NAME]: bboxToWktPolygon(params.bbox) }, LOAD: LOAD_FIELDS, TIMEOUT: 0, @@ -241,7 +247,7 @@ describe('TileDetailsManager', () => { cursor: 666, }; cursorReadMock.mockResolvedValue({ results: [{ a: '1' }, { a: '2' }], cursor: 667 }); - const index = REDIS_INDEX_NAME; + const index = REDIS_TILE_INDEX_NAME; const response = await manager.queryTilesDetails(params); @@ -259,7 +265,7 @@ describe('TileDetailsManager', () => { cursor: 666, }; cursorReadMock.mockResolvedValue({ results: [{ a: '1' }, { a: '2' }], cursor: 667 }); - const index = REDIS_INDEX_NAME; + const index = REDIS_TILE_INDEX_NAME; const response = await manager.queryTilesDetails(params); @@ -327,7 +333,7 @@ describe('TileDetailsManager', () => { expect(response).toMatchObject([{ a: 1 }]); expect(searchMock).toHaveBeenCalledTimes(1); expect(searchMock).toHaveBeenCalledWith( - REDIS_INDEX_NAME, + REDIS_TILE_INDEX_NAME, `@z:[${params.z} ${params.z}] @x:[${params.x} ${params.x}] @y:[${params.y} ${params.y}]`, { LIMIT: DEFAULT_LIMIT } ); @@ -342,7 +348,7 @@ describe('TileDetailsManager', () => { expect(response).toMatchObject([{ a: 1 }, { a: 2 }]); expect(searchMock).toHaveBeenCalledTimes(1); expect(searchMock).toHaveBeenCalledWith( - REDIS_INDEX_NAME, + REDIS_TILE_INDEX_NAME, `@z:[${params.z} ${params.z}] @x:[${params.x} ${params.x}] @y:[${params.y} ${params.y}]`, { LIMIT: DEFAULT_LIMIT } ); @@ -357,7 +363,7 @@ describe('TileDetailsManager', () => { expect(response).toMatchObject([]); expect(searchMock).toHaveBeenCalledTimes(1); expect(searchMock).toHaveBeenCalledWith( - REDIS_INDEX_NAME, + REDIS_TILE_INDEX_NAME, `@z:[${params.z} ${params.z}] @x:[${params.x} ${params.x}] @y:[${params.y} ${params.y}]`, { LIMIT: DEFAULT_LIMIT } ); @@ -415,7 +421,14 @@ describe('TileDetailsManager', () => { expect(setMock).toHaveBeenCalledWith( `${TILE_DETAILS_KEY_PREFIX}:kit1:1/0/0`, '$', - expect.objectContaining({ ...params, state: UNSPECIFIED_STATE, createdAt: payload.timestamp, updatedAt: payload.timestamp, updateCount: 1 }) + expect.objectContaining({ + ...params, + state: UNSPECIFIED_STATE, + states: [UNSPECIFIED_STATE], + createdAt: payload.timestamp, + updatedAt: payload.timestamp, + ...NEWLY_INSERTED_TILE_COUNTERS, + }) ); expect(execMock).toHaveBeenCalledTimes(1); }); @@ -450,7 +463,15 @@ describe('TileDetailsManager', () => { expect(setMock).toHaveBeenCalledWith( `${TILE_DETAILS_KEY_PREFIX}:kit1:1/0/0`, '$', - expect.objectContaining({ ...params, state: 666, createdAt: payload.timestamp, updatedAt: payload.timestamp, updateCount: 1 }) + expect.objectContaining({ + ...params, + state: 666, + states: [666], + createdAt: payload.timestamp, + updatedAt: payload.timestamp, + renderedAt: payload.timestamp, + ...NEWLY_INSERTED_TILE_COUNTERS, + }) ); expect(execMock).toHaveBeenCalledTimes(1); }); @@ -468,7 +489,7 @@ describe('TileDetailsManager', () => { x: 0, y: 0, }; - const payload: TileDetailsPayload = { timestamp: 1000 }; + const payload: TileDetailsPayload = { status: 'rendered', timestamp: 1000 }; const response = await manager.upsertTilesDetails(params, payload); @@ -507,7 +528,7 @@ describe('TileDetailsManager', () => { x: 0, y: 0, }; - const payload: TileDetailsPayload = { state: 666, timestamp: 1000 }; + const payload: TileDetailsPayload = { status: 'rendered', state: 666, timestamp: 1000 }; const response = await manager.upsertTilesDetails(params, payload); @@ -533,7 +554,7 @@ describe('TileDetailsManager', () => { expect(execMock).toHaveBeenCalledTimes(1); }); - it('should update in transaction the tile according to params and payload with skip flag', async () => { + it('should update in transaction the tile according to params and payload with skipped status', async () => { executeIsolatedMock.mockImplementation(async (fn: (client: RedisClient) => Promise) => fn(mockedRedis)); multiMock.mockReturnValue(mockedRedis); const exisingKits: KitMetadata[] = [{ name: 'kit1' }]; @@ -546,7 +567,7 @@ describe('TileDetailsManager', () => { x: 0, y: 0, }; - const payload: TileDetailsPayload = { hasSkipped: true, state: 666, timestamp: 1000 }; + const payload: TileDetailsPayload = { status: 'skipped', state: 666, timestamp: 1000 }; const response = await manager.upsertTilesDetails(params, payload); @@ -571,6 +592,44 @@ describe('TileDetailsManager', () => { expect(execMock).toHaveBeenCalledTimes(1); }); + it('should update in transaction the tile according to params and payload with cooled status', async () => { + executeIsolatedMock.mockImplementation(async (fn: (client: RedisClient) => Promise) => fn(mockedRedis)); + multiMock.mockReturnValue(mockedRedis); + const exisingKits: KitMetadata[] = [{ name: 'kit1' }]; + hGetMock.mockResolvedValue(exisingKits); + existsMock.mockResolvedValue(1); + + const params: TileParamsWithKit = { + kit: 'kit1', + z: 1, + x: 0, + y: 0, + }; + const payload: TileDetailsPayload = { status: 'cooled', state: 666, timestamp: 1000 }; + + const response = await manager.upsertTilesDetails(params, payload); + + expect(response).toBe(UpsertStatus.UPDATED); + expect(hGetMock).toHaveBeenCalledTimes(1); + expect(hGetMock).toHaveBeenCalledWith(`${REDIS_KITS_HASH_PREFIX}:${params.kit}`, 'name'); + expect(executeIsolatedMock).toHaveBeenCalledTimes(1); + expect(watchMock).toHaveBeenCalledTimes(1); + expect(existsMock).toHaveBeenCalledTimes(1); + expect(multiMock).toHaveBeenCalledTimes(1); + expect(mSetMock).toHaveBeenCalledTimes(1); + expect(mSetMock).toHaveBeenCalledWith([ + { key: `${TILE_DETAILS_KEY_PREFIX}:kit1:1/0/0`, path: '$.state', value: payload.state }, + { key: `${TILE_DETAILS_KEY_PREFIX}:kit1:1/0/0`, path: '$.updatedAt', value: payload.timestamp }, + ]); + expect(numIncrByMock).toHaveBeenCalledTimes(2); + expect(numIncrByMock).toHaveBeenNthCalledWith(1, `${TILE_DETAILS_KEY_PREFIX}:kit1:1/0/0`, '$.updateCount', 1); + expect(numIncrByMock).toHaveBeenNthCalledWith(2, `${TILE_DETAILS_KEY_PREFIX}:kit1:1/0/0`, '$.coolCount', 1); + expect(arrAppendMock).toHaveBeenCalledTimes(1); + expect(arrAppendMock).toHaveBeenCalledWith(`${TILE_DETAILS_KEY_PREFIX}:kit1:1/0/0`, '$.states', payload.state); + expect(setMock).not.toHaveBeenCalled(); + expect(execMock).toHaveBeenCalledTimes(1); + }); + it('should throw if watch error detected', async () => { executeIsolatedMock.mockImplementation(async (fn: (client: RedisClient) => Promise) => fn(mockedRedis)); multiMock.mockReturnValue(mockedRedis); @@ -586,7 +645,7 @@ describe('TileDetailsManager', () => { x: 0, y: 0, }; - const payload: TileDetailsPayload = { state: 666, timestamp: 1000 }; + const payload: TileDetailsPayload = { status: 'rendered', state: 666, timestamp: 1000 }; await expect(manager.upsertTilesDetails(params, payload)).rejects.toThrow(expected); @@ -624,7 +683,7 @@ describe('TileDetailsManager', () => { x: 0, y: 0, }; - const payload: TileDetailsPayload = { state: 666, timestamp: 1000 }; + const payload: TileDetailsPayload = { status: 'rendered', state: 666, timestamp: 1000 }; await expect(manager.upsertTilesDetails(params, payload)).rejects.toThrow(expected); diff --git a/packages/client/package.json b/packages/client/package.json index 964d7da..41657b6 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@map-colonies/detiler-client", - "version": "1.2.0", + "version": "1.3.0-rc2", "description": "detiler client", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -28,7 +28,7 @@ "dist" ], "dependencies": { - "@map-colonies/detiler-common": "^1.2.0", + "@map-colonies/detiler-common": "^1.3.0-rc2", "axios": "^1.6.5", "axios-retry": "^3.9.1", "http-status-codes": "^2.2.0", diff --git a/packages/client/src/client/index.ts b/packages/client/src/client/index.ts index 82c52d7..5624db5 100644 --- a/packages/client/src/client/index.ts +++ b/packages/client/src/client/index.ts @@ -11,6 +11,8 @@ import { TileParamsWithKit, TileQueryParams, TileQueryResponse, + Cooldown, + CooldownQueryParams, } from '@map-colonies/detiler-common'; import { DEFAULT_PAGE_SIZE, DEFAULT_RETRY_STRATEGY_DELAY, DetilerClientConfig, DetilerOptions, RetryStrategy } from './config'; @@ -21,6 +23,7 @@ export interface IDetilerClient { getTileDetails: (params: TileParamsWithKit) => Promise; getTilesDetails: (params: TileParams & { kits?: string[] }) => Promise; setTileDetails: (params: TileParamsWithKit, payload: TileDetailsPayload) => Promise; + queryCooldownsAsyncGenerator: (params: CooldownQueryParams) => AsyncGenerator; } export class DetilerClient implements IDetilerClient { @@ -188,6 +191,45 @@ export class DetilerClient implements IDetilerClient { } } + public async *queryCooldownsAsyncGenerator(params: CooldownQueryParams): AsyncGenerator { + let currentPage = params.from ?? 0; + const pageSize = params.size ?? DEFAULT_PAGE_SIZE; + + this.logger?.debug({ msg: `getting cooldowns`, url: this.config.url, pageSize, ...params }); + + /* eslint-disable-next-line @typescript-eslint/no-unnecessary-condition */ // get the next page unconditionally until done + while (true) { + const pageParams: CooldownQueryParams = { ...params, from: currentPage * pageSize, size: pageSize }; + try { + const res = await this.axios.get(`${this.config.url}/cooldown`, { + params: pageParams, + paramsSerializer: (params) => stringify(params), + }); + + if (res.data.length < pageSize) { + if (res.data.length !== 0) { + yield res.data; + } + break; + } + + yield res.data; + currentPage++; + } catch (error) { + const axiosError = error as AxiosError; + + this.logger?.error({ + msg: `failed to get cooldowns page ${currentPage}`, + err: axiosError, + url: this.config.url, + params: pageParams, + }); + + throw axiosError; + } + } + } + private configureRetryStrategy(retryStrategy: RetryStrategy): void { const config: IAxiosRetryConfig = { retries: retryStrategy.retries, diff --git a/packages/client/tests/unit/client.spec.ts b/packages/client/tests/unit/client.spec.ts index 92e2bb8..5666ec0 100644 --- a/packages/client/tests/unit/client.spec.ts +++ b/packages/client/tests/unit/client.spec.ts @@ -1,11 +1,21 @@ import nock from 'nock'; import { AxiosError } from 'axios'; import httpStatusCodes from 'http-status-codes'; -import { TileDetails, TileDetailsPayload, TileParams, TileParamsWithKit, TileQueryParams } from '@map-colonies/detiler-common'; +import { + Cooldown, + CooldownQueryParams, + TileDetails, + TileDetailsPayload, + TileParams, + TileParamsWithKit, + TileQueryParams, +} from '@map-colonies/detiler-common'; import { DetilerClient } from '../../src'; import { DEFAULT_PAGE_SIZE } from '../../src/client/config'; const MOCK_DETILER_URL = 'http://detiler.com'; +const TILE_DETAILS_ENDPOINT = '/detail'; +const COOLDOWN_ENDPOINT = '/cooldown'; describe('Client', () => { let detiler: DetilerClient; @@ -45,7 +55,7 @@ describe('Client', () => { const details = { a: 1 }; const params: TileQueryParams = { kits: ['a'], minZoom: 1, maxZoom: 2, bbox: [1, 2, 3, 4] }; nock(MOCK_DETILER_URL) - .get(`/detail`) + .get(TILE_DETAILS_ENDPOINT) .query({ ...params }) .reply(httpStatusCodes.OK, details); const getSpy = jest.spyOn(detiler['axios'], 'get'); @@ -60,7 +70,7 @@ describe('Client', () => { it('should throw an error if the http get request has errored', async function () { const params: TileQueryParams = { kits: ['a'], minZoom: 1, maxZoom: 2, bbox: [1, 2, 3, 4] }; nock(MOCK_DETILER_URL) - .get(`/detail`) + .get(TILE_DETAILS_ENDPOINT) .query({ ...params }) .reply(httpStatusCodes.INTERNAL_SERVER_ERROR); const getSpy = jest.spyOn(detiler['axios'], 'get'); @@ -86,22 +96,22 @@ describe('Client', () => { const lastParams: TileQueryParams = { size: 1, cursor: 4, kits: ['a'], minZoom: 1, maxZoom: 2, bbox: [1, 2, 3, 4] }; nock(MOCK_DETILER_URL) - .get(`/detail`) + .get(TILE_DETAILS_ENDPOINT) .query({ ...params1 }) .once() .reply(httpStatusCodes.OK, details1); nock(MOCK_DETILER_URL) - .get(`/detail`) + .get(TILE_DETAILS_ENDPOINT) .query({ ...params2 }) .twice() .reply(httpStatusCodes.OK, details2); nock(MOCK_DETILER_URL) - .get(`/detail`) + .get(TILE_DETAILS_ENDPOINT) .query({ ...params3 }) .thrice() .reply(httpStatusCodes.OK, details3); nock(MOCK_DETILER_URL) - .get(`/detail`) + .get(TILE_DETAILS_ENDPOINT) .query({ ...lastParams }) .reply(httpStatusCodes.OK, details4); const getSpy = jest.spyOn(detiler['axios'], 'get'); @@ -128,17 +138,17 @@ describe('Client', () => { const params3: TileQueryParams = { size: 2, cursor: 3, kits: ['a'], minZoom: 1, maxZoom: 2, bbox: [1, 2, 3, 4] }; nock(MOCK_DETILER_URL) - .get(`/detail`) + .get(TILE_DETAILS_ENDPOINT) .query({ ...params1 }) .once() .reply(httpStatusCodes.OK, details1); nock(MOCK_DETILER_URL) - .get(`/detail`) + .get(TILE_DETAILS_ENDPOINT) .query({ ...params2 }) .twice() .reply(httpStatusCodes.OK, details2); nock(MOCK_DETILER_URL) - .get(`/detail`) + .get(TILE_DETAILS_ENDPOINT) .query({ ...params3 }) .thrice() .reply(httpStatusCodes.OK, details3); @@ -160,7 +170,7 @@ describe('Client', () => { const params: TileQueryParams = { kits: ['a'], minZoom: 1, maxZoom: 2, bbox: [1, 2, 3, 4] }; nock(MOCK_DETILER_URL) - .get(`/detail`) + .get(TILE_DETAILS_ENDPOINT) .query({ ...params, size: DEFAULT_PAGE_SIZE }) .once() .reply(httpStatusCodes.OK, details); @@ -179,7 +189,7 @@ describe('Client', () => { it('should throw an error if the http get request has errored', async function () { const params: TileQueryParams = { size: 10, kits: ['a'], minZoom: 1, maxZoom: 2, bbox: [1, 2, 3, 4] }; nock(MOCK_DETILER_URL) - .get(`/detail`) + .get(TILE_DETAILS_ENDPOINT) .query({ ...params }) .reply(httpStatusCodes.INTERNAL_SERVER_ERROR); const getSpy = jest.spyOn(detiler['axios'], 'get'); @@ -279,6 +289,127 @@ describe('Client', () => { }); }); + describe('#queryCooldownsAsyncGenerator', () => { + it('should query generate cooldowns according to params including extra empty res call', async function () { + const cooldown1 = [{ duration: 100 }]; + const cooldown2 = [{ duration: 100 }]; + const cooldown3 = [{ duration: 100 }]; + const cooldown4: Cooldown[] = []; + + let data: Cooldown[] = []; + + const params1: CooldownQueryParams = { enabled: true, minZoom: 1, maxZoom: 2, area: [1, 2, 3, 4], size: 1, from: 0 }; + const params2: CooldownQueryParams = { ...params1, from: 1 }; + const params3: CooldownQueryParams = { ...params1, from: 2 }; + const lastParams: CooldownQueryParams = { ...params1, from: 3 }; + + nock(MOCK_DETILER_URL) + .get(COOLDOWN_ENDPOINT) + .query({ ...params1 }) + .once() + .reply(httpStatusCodes.OK, cooldown1); + nock(MOCK_DETILER_URL) + .get(COOLDOWN_ENDPOINT) + .query({ ...params2 }) + .twice() + .reply(httpStatusCodes.OK, cooldown2); + nock(MOCK_DETILER_URL) + .get(COOLDOWN_ENDPOINT) + .query({ ...params3 }) + .thrice() + .reply(httpStatusCodes.OK, cooldown3); + nock(MOCK_DETILER_URL) + .get(COOLDOWN_ENDPOINT) + .query({ ...lastParams }) + .reply(httpStatusCodes.OK, cooldown4); + const getSpy = jest.spyOn(detiler['axios'], 'get'); + + const queryGenerator = detiler.queryCooldownsAsyncGenerator(params1); + + for await (const pageData of queryGenerator) { + data = [...data, ...pageData]; + } + + expect(data).toMatchObject([...cooldown1, ...cooldown2, ...cooldown3]); + expect(getSpy).toHaveBeenCalledTimes(4); + }); + + it('should query generate details according to params until done', async function () { + const cooldown1 = [{ a: 1 }, { a: 2 }]; + const cooldown2 = [{ a: 3 }, { a: 4 }]; + const cooldown3 = [{ a: 5 }]; + + let data: Cooldown[] = []; + + const params1: CooldownQueryParams = { from: 0, size: 2 }; + const params2: CooldownQueryParams = { from: 2, size: 2 }; + const params3: CooldownQueryParams = { from: 4, size: 2 }; + + nock(MOCK_DETILER_URL) + .get(COOLDOWN_ENDPOINT) + .query({ ...params1 }) + .once() + .reply(httpStatusCodes.OK, cooldown1); + nock(MOCK_DETILER_URL) + .get(COOLDOWN_ENDPOINT) + .query({ ...params2 }) + .twice() + .reply(httpStatusCodes.OK, cooldown2); + nock(MOCK_DETILER_URL) + .get(COOLDOWN_ENDPOINT) + .query({ ...params3 }) + .thrice() + .reply(httpStatusCodes.OK, cooldown3); + const getSpy = jest.spyOn(detiler['axios'], 'get'); + + const queryGenerator = detiler.queryCooldownsAsyncGenerator({ size: 2 }); + + for await (const pageData of queryGenerator) { + data = [...data, ...pageData]; + } + + expect(data).toMatchObject([...cooldown1, ...cooldown2, ...cooldown3]); + expect(getSpy).toHaveBeenCalledTimes(3); + }); + + it('should query generate details according to params with default size', async function () { + const cooldowns = [{ a: 1 }]; + let data: Cooldown[] = []; + const params: CooldownQueryParams = { kits: ['a'], minZoom: 1, maxZoom: 2, area: [1, 2, 3, 4] }; + + nock(MOCK_DETILER_URL) + .get(COOLDOWN_ENDPOINT) + .query({ ...params, from: 0, size: DEFAULT_PAGE_SIZE }) + .once() + .reply(httpStatusCodes.OK, cooldowns); + const getSpy = jest.spyOn(detiler['axios'], 'get'); + + const queryGenerator = detiler.queryCooldownsAsyncGenerator(params); + + for await (const pageData of queryGenerator) { + data = [...data, ...pageData]; + } + + expect(data).toMatchObject(cooldowns); + expect(getSpy).toHaveBeenCalledTimes(1); + }); + + it('should throw an error if the http get request has errored', async function () { + const params: CooldownQueryParams = { from: 0, size: 10, kits: ['a'], minZoom: 1, maxZoom: 2, area: [1, 2, 3, 4] }; + nock(MOCK_DETILER_URL) + .get(COOLDOWN_ENDPOINT) + .query({ ...params }) + .reply(httpStatusCodes.INTERNAL_SERVER_ERROR); + const getSpy = jest.spyOn(detiler['axios'], 'get'); + + const queryGenerator = detiler.queryCooldownsAsyncGenerator(params); + + await expect(queryGenerator.next()).rejects.toThrow(AxiosError); + expect(getSpy).toHaveBeenCalledTimes(1); + expect(getSpy).toHaveBeenCalledWith(`${MOCK_DETILER_URL}${COOLDOWN_ENDPOINT}`, expect.objectContaining({ params })); + }); + }); + describe('#configuration', () => { it('should throw an error if http request has errored with a retry strategy on every attempt', async function () { const networkError = new Error('Some connection error'); diff --git a/packages/common/package.json b/packages/common/package.json index 54b73b4..aff6ff9 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,6 +1,6 @@ { "name": "@map-colonies/detiler-common", - "version": "1.2.0", + "version": "1.3.0-rc2", "description": "detiler common types", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -29,6 +29,7 @@ "devDependencies": { "@map-colonies/eslint-config": "^4.0.0", "@map-colonies/prettier-config": "0.0.1", + "@types/geojson": "7946.0.14", "@types/jest": "^29.5.2", "eslint": "^8.56.0", "jest": "^29.5.0", diff --git a/packages/common/src/types/index.ts b/packages/common/src/types/index.ts index 38727d9..973081f 100644 --- a/packages/common/src/types/index.ts +++ b/packages/common/src/types/index.ts @@ -1,8 +1,12 @@ +import { Geometry } from 'geojson'; + interface LogFn { (obj: unknown, msg?: string, ...args: unknown[]): void; (msg: string, ...args: unknown[]): void; } +type BBox = [number, number, number, number]; + export interface ILogger { trace?: LogFn; debug: LogFn; @@ -31,6 +35,7 @@ export interface TileDetails extends TileParamsWithKit { updateCount: number; renderCount: number; skipCount: number; + coolCount: number; coordinates: string; geoshape: string; } @@ -40,10 +45,12 @@ export interface TileQueryResponse { cursor?: number; } +export type TileProcessStatus = 'rendered' | 'skipped' | 'cooled'; + export interface TileDetailsPayload { timestamp: number; state?: number; - hasSkipped?: boolean; + status?: TileProcessStatus; } export interface BaseQueryParams { @@ -65,3 +72,30 @@ export interface KitMetadata { [property: string]: string; name: string; } + +export interface Cooldown { + duration: number; + kits: string[]; + minZoom: number; + maxZoom: number; + enabled: boolean; + ttl?: number; + description?: string; + geoshape?: string; + createdAt: number; + updatedAt: number; +} + +export interface CooldownQueryParams { + enabled?: boolean; + kits?: string[]; + minZoom?: number; + maxZoom?: number; + area?: BBox; + from?: number; + size?: number; +} + +export interface CooldownCreationRequest extends Omit { + area?: A; +} diff --git a/packages/frontend/config/.env.production b/packages/frontend/config/.env.production index 2a3a6c5..2122a5b 100644 --- a/packages/frontend/config/.env.production +++ b/packages/frontend/config/.env.production @@ -15,9 +15,9 @@ CONFIG_APP_TILES_FETCH_TIMEOUT=CONFIG_APP_TILES_FETCH_TIMEOUT_PLACEHOLDER CONFIG_APP_TILES_FETCH_INTERVAL=CONFIG_APP_TILES_FETCH_INTERVAL_PLACEHOLDER CONFIG_DETILER_CLIENT_URL=CONFIG_DETILER_CLIENT_URL_PLACEHOLDER -#CONFIG_DETILER_CLIENT_TIMEOUT -#CONFIG_DETILER_CLIENT_ENABLE_RETRY_STRATEGY -#CONFIG_DETILER_CLIENT_RETRY_STRATEGY_RETRIES -#CONFIG_DETILER_CLIENT_RETRY_STRATEGY_SHOULD_RESET_TIMEOUT -#CONFIG_DETILER_CLIENT_RETRY_STRATEGY_IS_EXPONENTIAL -#CONFIG_DETILER_CLIENT_RETRY_STRATEGY_DELAY +CONFIG_DETILER_CLIENT_TIMEOUT=CONFIG_DETILER_CLIENT_TIMEOUT_PLACEHOLDER +CONFIG_DETILER_CLIENT_ENABLE_RETRY_STRATEGY=CONFIG_DETILER_CLIENT_ENABLE_RETRY_STRATEGY_PLACEHOLDER +CONFIG_DETILER_CLIENT_RETRY_STRATEGY_RETRIES=CONFIG_DETILER_CLIENT_RETRY_STRATEGY_RETRIES_PLACEHOLDER +CONFIG_DETILER_CLIENT_RETRY_STRATEGY_SHOULD_RESET_TIMEOUT=CONFIG_DETILER_CLIENT_RETRY_STRATEGY_SHOULD_RESET_TIMEOUT_PLACEHOLDER +CONFIG_DETILER_CLIENT_RETRY_STRATEGY_IS_EXPONENTIAL=CONFIG_DETILER_CLIENT_RETRY_STRATEGY_IS_EXPONENTIAL_PLACEHOLDER +CONFIG_DETILER_CLIENT_RETRY_STRATEGY_DELAY=CONFIG_DETILER_CLIENT_RETRY_STRATEGY_DELAY_PLACEHOLDER diff --git a/packages/frontend/package.json b/packages/frontend/package.json index a3dade7..190dd99 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -16,8 +16,8 @@ "dependencies": { "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", - "@map-colonies/detiler-client": "^1.2.0", - "@map-colonies/detiler-common": "^1.2.0", + "@map-colonies/detiler-client": "^1.3.0-rc2", + "@map-colonies/detiler-common": "^1.3.0-rc2", "@map-colonies/js-logger": "^1.0.1", "@map-colonies/tile-calc": "^0.1.5", "@mui/icons-material": "^5.15.19", diff --git a/packages/frontend/src/app.tsx b/packages/frontend/src/app.tsx index 720e643..f28a6e8 100644 --- a/packages/frontend/src/app.tsx +++ b/packages/frontend/src/app.tsx @@ -7,13 +7,15 @@ import { GeoJsonLayer } from '@deck.gl/layers'; import { ViewStateChangeParameters } from '@deck.gl/core/src/controllers/controller'; import { PickingInfo } from '@deck.gl/core/src/lib/picking/pick-info'; import { Feature, Geometry } from 'geojson'; -import { KitMetadata, TileDetails, TileParams, TileQueryParams } from '@map-colonies/detiler-common'; +import { Cooldown, KitMetadata, TileDetails, TileParams, TileQueryParams } from '@map-colonies/detiler-common'; import { setIntervalAsync, clearIntervalAsync } from 'set-interval-async'; import { useSnackbar } from 'notistack'; import pTimeout from 'p-timeout'; import { uniqBy } from 'lodash'; +import { TILEGRID_WORLD_CRS84, tileToBoundingBox } from '@map-colonies/tile-calc'; import { AxiosError } from 'axios'; -import { appHelper, compareQueries, parseDataToFeatures, timerify, querifyBounds } from './utils/helpers'; +import { parse as WktToGeojson } from 'wellknown'; +import { appHelper, compareQueries, parseDataToFeatures, timerify, querifyBounds, geometryToFeature } from './utils/helpers'; import { ZOOM_OFFEST, INITIAL_VIEW_STATE, @@ -27,25 +29,29 @@ import { DEFAULT_TILES_BATCH_SIZE, MIN_ZOOM_LEVEL, MAX_ZOOM_LEVEL, + METATILE_SIZE, + NOT_FOUND_INDEX, } from './utils/constants'; import { colorFactory, ColorScale, colorScaleParser, ColorScaleFunc, DEFAULT_TILE_COLOR } from './utils/style'; import { METRICS, INITIAL_MIN_MAX, Metric } from './utils/metric'; import { INIT_STATS, calcHttpStat, Stats } from './utils/stats'; -import { Preferences, Sidebar, Tooltip, CornerTabs } from './components'; +import { Preferences, Sidebar, Tooltip, CornerTabs, ExtendedCooldown } from './components'; import { comparatorFuncWrapper, filterRangeFuncWrapper, transformFuncWrapper } from './deck-gl'; -import { CONSTANT_GEOJSON_LAYER_PROPERTIES, GEOJSON_LAYER_ID, BASEMAP_LAYER_ID } from './deck-gl/constants'; +import { CONSTANT_GEOJSON_LAYER_PROPERTIES, TILES_LAYER_ID, BASEMAP_LAYER_ID } from './deck-gl/constants'; import { basemapLayerFactory } from './deck-gl/basemap'; import { logger } from './logger'; import { config } from './config'; import { client } from './client'; import { MapLibreGL, TargetetEvent } from './deck-gl/types'; import { AppConfig } from './utils/interfaces'; +import { cooldownLayerFactory } from './deck-gl/cooldown'; const appConfig = config.get('app'); export const App: React.FC = () => { const [viewState, setViewState] = useState(INITIAL_VIEW_STATE); const [loadedData, setLoadedData] = useState([]); + const [cooldownData, setCooldownData] = useState([]); const [hoverInfo, setHoverInfo] = useState(); const [selectedKit, setSelectedKit] = useState(); const [stateRange, setStateRange] = useState([DEFAULT_MIN_STATE, DEFAULT_MAX_STATE]); @@ -56,7 +62,7 @@ export const App: React.FC = () => { value: colorScaleParser('heat'), }); const [statsTable, setStatsTable] = useState(INIT_STATS); - const [sidebarData, setSidebarData] = useState([]); + const [sidebarData, setSidebarData] = useState<{ details: TileDetails[]; cooldowns: Cooldown[] }>({ details: [], cooldowns: [] }); const [isSidebarOpen, setIsSidebarOpen] = useState(false); const [isPaused, setIsPaused] = useState(false); const [isLoading, setIsLoading] = useState(false); @@ -143,14 +149,16 @@ export const App: React.FC = () => { handleQueryZoomChangeByViewport(nextZoom); }; - const handleOpenSidebar = (data: TileDetails[]): void => { + const handleOpenSidebar = (data: { details: TileDetails[]; cooldowns: Cooldown[] }): void => { setSidebarData(data); setIsSidebarOpen(true); + setCooldownData([]); }; const handleCloseSidebar = (): void => { - setSidebarData([]); + setSidebarData({ details: [], cooldowns: [] }); setIsSidebarOpen(false); + setCooldownData([]); }; const handleActionClicked = (): void => { @@ -312,7 +320,7 @@ export const App: React.FC = () => { const fetchTile = async (tile: TileParams): Promise => { try { - const [result, duration] = await timerify>, [TileParams]>( + const [details, duration] = await timerify>, [TileParams]>( client.getTilesDetails.bind(client), tile ); @@ -321,17 +329,43 @@ export const App: React.FC = () => { return { ...prevStatsTable, httpInvokes: { ...prevStatsTable.httpInvokes, tile: nextHttpStat } }; }); - handleOpenSidebar(result); + const { west, south, east, north } = tileToBoundingBox({ ...tile, metatile: METATILE_SIZE }, TILEGRID_WORLD_CRS84, true); + const cooldownsGenerator = client.queryCooldownsAsyncGenerator({ + enabled: true, + minZoom: tile.z, + maxZoom: tile.z, + area: [west, south, east, north], + }); + const cooldowns: Cooldown[] = []; + for await (const pageCooldowns of cooldownsGenerator) { + cooldowns.push(...pageCooldowns); + } + + handleOpenSidebar({ details, cooldowns }); } catch (err) { logger.error({ msg: 'error getting tile details', err, tile }); enqueueSnackbar(JSON.stringify(err), { variant: 'error' }); } }; + const handleCooldownToggle = (cooldown: ExtendedCooldown): void => { + setCooldownData((prev) => { + const index = prev.findIndex((f) => f.id === cooldown.id); + + if (index === NOT_FOUND_INDEX) { + const geometry = WktToGeojson(cooldown.geoshape!); + const feature = { ...geometryToFeature(geometry as Geometry), id: cooldown.id }; + return [...prev, feature]; + } else { + return prev.filter((f) => f.id !== cooldown.id); + } + }); + }; + const basemapLayer = basemapLayerFactory(BASEMAP_LAYER_ID); - const layer = new GeoJsonLayer({ - id: GEOJSON_LAYER_ID, + const tilesLayer = new GeoJsonLayer({ + id: TILES_LAYER_ID, ...CONSTANT_GEOJSON_LAYER_PROPERTIES, data: loadedData, dataTransform: transformFuncWrapper(statsTable.metric), @@ -359,9 +393,16 @@ export const App: React.FC = () => { }, }); + const cooldownsLayer = cooldownLayerFactory(cooldownData); + return (
- + @@ -388,7 +429,14 @@ export const App: React.FC = () => { onActionClicked={handleActionClicked} /> - +
); }; diff --git a/packages/frontend/src/components/overviewMap.tsx b/packages/frontend/src/components/overviewMap.tsx index 1f03f06..8024cbb 100644 --- a/packages/frontend/src/components/overviewMap.tsx +++ b/packages/frontend/src/components/overviewMap.tsx @@ -43,7 +43,7 @@ export const OverviewMap: React.FC = ({ bounds, zoom }) => { id: OVERVIEW_GEOJSON_LAYER_ID, ...CONSTANT_GEOJSON_LAYER_PROPERTIES, getFillColor: theme.palette.mode === 'dark' ? [...DARK_MODE_MAIN_RGB, DEFAULT_COLORED_ALPHA] : [...LIGHT_MODE_MAIN_RGB, DEFAULT_COLORED_ALPHA], - pickable: true, + pickable: false, getLineWidth: 2, getLineColor: BACKGROUND_RGBA, data: overviewData, diff --git a/packages/frontend/src/components/sidebar.tsx b/packages/frontend/src/components/sidebar.tsx index 7a3f678..7f85214 100644 --- a/packages/frontend/src/components/sidebar.tsx +++ b/packages/frontend/src/components/sidebar.tsx @@ -1,30 +1,46 @@ import React, { useState, useEffect } from 'react'; -import { TileDetails } from '@map-colonies/detiler-common'; +import { Cooldown, TileDetails } from '@map-colonies/detiler-common'; import IconButton from '@mui/material/IconButton'; import CloseIcon from '@mui/icons-material/Close'; import FileCopy from '@mui/icons-material/FileCopy'; +import VisibilityIcon from '@mui/icons-material/Visibility'; +import VisibilityOffIcon from '@mui/icons-material/VisibilityOff'; import Drawer from '@mui/material/Drawer'; import { CopyToClipboard } from 'react-copy-to-clipboard'; import { parse as WktToGeojson } from 'wellknown'; -import { Card, CardContent, Typography, Box, Stack, Pagination, Tooltip, CircularProgress } from '@mui/material'; +import { + Card, + CardContent, + Typography, + Box, + Stack, + Pagination, + Tooltip, + CircularProgress, + Accordion, + AccordionSummary, + FormLabel, +} from '@mui/material'; import { styled } from '@mui/material/styles'; import { useSnackbar } from 'notistack'; import { TileParams } from '@map-colonies/detiler-common'; import { TILEGRID_WORLD_CRS84, tileToBoundingBox } from '@map-colonies/tile-calc'; import LocationOnIcon from '@mui/icons-material/LocationOn'; +import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; import RefreshIcon from '@mui/icons-material/Refresh'; import { presentifyValue } from '../utils/metric'; -import { LOAD_TIMEOUT_MS, METATILE_SIZE, ZOOM_OFFEST } from '../utils/constants'; +import { LOAD_TIMEOUT_MS, METATILE_SIZE, MILLISECONDS_IN_SECOND, ZOOM_OFFEST } from '../utils/constants'; import { bboxToLonLat, promiseWithTimeout } from '../utils/helpers'; import { config } from '../config'; import { AppConfig } from '../utils/interfaces'; +import { COOLDOWN_COLOR } from '../utils/style'; const DEFAULT_TILES_PER_PAGE = 4; const FIRST_PAGE = 1; const DRAWER_WIDTH = 345; const SUCCESS_COPY_MESSAGE = 'Copied to Clipboard'; -const tilesPerPage = config.get('app').style.tilesPerPage ?? DEFAULT_TILES_PER_PAGE; +const cardsPerPage = config.get('app').style.tilesPerPage ?? DEFAULT_TILES_PER_PAGE; const StyledCardContent = styled(CardContent)(` padding: 10px; @@ -35,33 +51,52 @@ const StyledCardContent = styled(CardContent)(` interface SidebarProps { isOpen: boolean; - data: TileDetails[]; + data: { details: TileDetails[]; cooldowns: ExtendedCooldown[] }; onClose: () => void; onGoToClicked: (longitude: number, latitude: number, zoom?: number) => void; onRefreshClicked: (tile: TileParams) => Promise; + onCooldownClicked: (cooldown: ExtendedCooldown) => void; } -export const Sidebar: React.FC = ({ isOpen, data, onClose, onGoToClicked, onRefreshClicked }) => { - const [currentPage, setCurrentPage] = useState(FIRST_PAGE); +export type ExtendedCooldown = Cooldown & { id?: number; selected?: boolean }; + +export const Sidebar: React.FC = ({ isOpen, data, onClose, onGoToClicked, onRefreshClicked, onCooldownClicked }) => { + const [selectedCooldowns, setSelectedCooldowns] = useState([]); + const [currentDetailsPage, setCurrentDetailsPage] = useState(FIRST_PAGE); + const [currentCooldownsPage, setCurrentCooldownsPage] = useState(FIRST_PAGE); const [isLoading, setIsLoading] = useState(false); + const [isTileAccordionExpanded, setTileAccordionExpanded] = useState(true); const { enqueueSnackbar } = useSnackbar(); - data = data.sort((a, b) => a.kit.localeCompare(b.kit)); + data.details = data.details.sort((a, b) => a.kit.localeCompare(b.kit)); + data.cooldowns = data.cooldowns.map((cooldown, index) => { + return { ...cooldown, selected: false, id: index }; + }); useEffect(() => { - setCurrentPage(FIRST_PAGE); + setCurrentDetailsPage(FIRST_PAGE); + setCurrentCooldownsPage(FIRST_PAGE); + setSelectedCooldowns([]); }, [data]); if (!isOpen) { return null; } - const startIndex = (currentPage - 1) * tilesPerPage; - const endIndex = startIndex + tilesPerPage; - const currentData = data.slice(startIndex, endIndex); + const startDetailsIndex = (currentDetailsPage - 1) * cardsPerPage; + const endDetailsIndex = startDetailsIndex + cardsPerPage; + const currentDetails = data.details.slice(startDetailsIndex, endDetailsIndex); + + const startCooldownsIndex = (currentCooldownsPage - 1) * cardsPerPage; + const endCooldownsIndex = startCooldownsIndex + cardsPerPage; + const currentCooldowns = data.cooldowns.slice(startCooldownsIndex, endCooldownsIndex); + + const handleDetailsPageChange = (_: React.ChangeEvent, page: number): void => { + setCurrentDetailsPage(page); + }; - const handlePageChange = (_: React.ChangeEvent, page: number): void => { - setCurrentPage(page); + const handleCooldownsPageChange = (_: React.ChangeEvent, page: number): void => { + setCurrentCooldownsPage(page); }; const onCopy = (_: string, result: boolean): void => { @@ -72,7 +107,7 @@ export const Sidebar: React.FC = ({ isOpen, data, onClose, onGoToC }; const wrappedGoTo = (): void => { - const { z, x, y } = data[0]; + const { z, x, y } = data.details[0]; const tile = { z, x, y, metatile: METATILE_SIZE }; const bbox = tileToBoundingBox(tile, TILEGRID_WORLD_CRS84, true); const { lon, lat } = bboxToLonLat(bbox); @@ -80,14 +115,34 @@ export const Sidebar: React.FC = ({ isOpen, data, onClose, onGoToC }; const wrappedRefresh = async (): Promise => { + setSelectedCooldowns([]); setIsLoading(true); - const { z, x, y } = data[0]; + const { z, x, y } = data.details[0]; await promiseWithTimeout(LOAD_TIMEOUT_MS, onRefreshClicked({ z, x, y })); setIsLoading(false); }; + const toggleTileAccordionExpanded = (): void => { + setTileAccordionExpanded(!isTileAccordionExpanded); + }; + + const handleCooldownClick = (index: number): void => { + let updatedSelectedCooldowns: number[]; + + if (selectedCooldowns.includes(index)) { + // Remove index if it's already selected + updatedSelectedCooldowns = selectedCooldowns.filter((i) => i !== index); + } else { + // Add index if it's not selected + updatedSelectedCooldowns = [...selectedCooldowns, index]; + } + + setSelectedCooldowns(updatedSelectedCooldowns); + onCooldownClicked(data.cooldowns[index]); + }; + /* eslint-disable @typescript-eslint/no-misused-promises */ /* eslint-disable @typescript-eslint/naming-convention */ return ( @@ -115,11 +170,12 @@ export const Sidebar: React.FC = ({ isOpen, data, onClose, onGoToC ) : ( - Tile: {data[0].z}/{data[0].x}/{data[0].y} + Tile: {data.details[0].z}/{data.details[0].x}/{data.details[0].y} - ({data.length} result{data.length === 1 ? '' : 's'}) + ({data.details.length} tile{data.details.length === 1 ? '' : 's'}, {data.cooldowns.length} cooldown + {data.cooldowns.length === 1 ? '' : 's'}) @@ -132,81 +188,141 @@ export const Sidebar: React.FC = ({ isOpen, data, onClose, onGoToC - {currentData.map((tile) => ( - - - - - Kit: {tile.kit} -
- State: {tile.state} -
- States: {presentifyValue(tile.states)} -
- Created At: {presentifyValue(tile.createdAt, 'date')} -
- Updated At: {presentifyValue(tile.updatedAt, 'date')} -
- Rendered At: {presentifyValue(tile.renderedAt, 'date')} -
- Counts:{' '} - - {tile.updateCount} - - - {tile.renderCount} + + } aria-controls="panel3-content" id="panel3-header"> + Tiles ({data.details.length}) + + {currentDetails.map((tile) => ( + + + + + Kit: {tile.kit} +
+ State: {tile.state} +
+ States: {presentifyValue(tile.states)} +
+ Created At: {presentifyValue(tile.createdAt, 'date')} +
+ Updated At: {presentifyValue(tile.updatedAt, 'date')} +
+ Rendered At: {presentifyValue(tile.renderedAt, 'date')} +
+ Counts:{' '} + + {tile.updateCount} + + + {tile.renderCount} + + + {tile.skipCount} + + + {tile.coolCount} +
- - {tile.skipCount} + + + + + +
+
+
+ ))} + + {data.details.length > cardsPerPage && ( + + )} + +
+ + } aria-controls="panel3-content" id="panel3-header"> + Cooldowns ({data.cooldowns.length}) + + {currentCooldowns.map((cooldown) => ( + + + + + Kits: {cooldown.kits.join(', ')} +
+ Created At: {presentifyValue(cooldown.createdAt / MILLISECONDS_IN_SECOND, 'date')} +
+ Duration: {cooldown.duration} +
+ TTL: {cooldown.ttl ?? 'No Limit'} +
+ Zoom: {cooldown.minZoom} - {cooldown.maxZoom} +
-
- - - + handleCooldownClick(cooldown.id!)}> + {selectedCooldowns.includes(cooldown.id!) ? : } - -
-
-
- ))} + + + + ))} + + {data.cooldowns.length > cardsPerPage && ( + + )} + +
)} - - {data.length > tilesPerPage && ( - - )} - ); }; diff --git a/packages/frontend/src/components/tooltip.tsx b/packages/frontend/src/components/tooltip.tsx index 1e55c2c..487141e 100644 --- a/packages/frontend/src/components/tooltip.tsx +++ b/packages/frontend/src/components/tooltip.tsx @@ -14,6 +14,7 @@ const TOOLTIP_PROPERTIES: (Detail | CalculatedDetail)[] = [ 'updateCount', 'renderCount', 'skipCount', + 'coolCount', 'createdAt', 'updatedAt', 'renderedAt', diff --git a/packages/frontend/src/config/index.ts b/packages/frontend/src/config/index.ts index 63fed6f..40b41a2 100644 --- a/packages/frontend/src/config/index.ts +++ b/packages/frontend/src/config/index.ts @@ -5,56 +5,89 @@ import { ConfigStore, IConfig } from './configStore'; const viteConfig = import.meta.env; +const PLACEHOLDER_SUFFIX = '_PLACEHOLDER'; + +type ParseType = 'string' | 'number' | 'boolean'; + +const isPlaceholder = (value: string | undefined): boolean => { + return typeof value === 'string' && value.endsWith(PLACEHOLDER_SUFFIX); +}; + +const parseValue = ( + type: T, + value?: string +): R | undefined => { + if (value === undefined || isPlaceholder(value)) { + return undefined; + } + + switch (type) { + case 'string': { + return value as R; + } + case 'number': { + return parseInt(value) as R; + } + case 'boolean': { + return parseBoolean(value) as R; + } + default: { + return undefined; + } + } +}; + export const config: IConfig = (function (): IConfig { const config = new ConfigStore(); config.set('telemetry.logger', { - level: viteConfig.CONFIG_LOG_LEVEL, - prettyPrint: parseBoolean(viteConfig.CONFIG_LOG_PRETTY_PRINT_ENABLED), + level: parseValue('string', viteConfig.CONFIG_LOG_LEVEL), + prettyPrint: parseValue('boolean', viteConfig.CONFIG_LOG_PRETTY_PRINT_ENABLED), }); - const retryStrategy = parseBoolean(viteConfig.CONFIG_DETILER_CLIENT_ENABLE_RETRY_STRATEGY) - ? { - delay: parseInt(viteConfig.CONFIG_DETILER_CLIENT_RETRY_STRATEGY_DELAY!), - isExponential: parseBoolean(viteConfig.CONFIG_DETILER_CLIENT_RETRY_STRATEGY_IS_EXPONENTIAL!), - retries: parseInt(viteConfig.CONFIG_DETILER_CLIENT_RETRY_STRATEGY_RETRIES!), - shouldResetTimeout: parseBoolean(viteConfig.CONFIG_DETILER_CLIENT_RETRY_STRATEGY_SHOULD_RESET_TIMEOUT!), - } - : undefined; + const retryStrategy = + parseValue('boolean', viteConfig.CONFIG_DETILER_CLIENT_ENABLE_RETRY_STRATEGY) ?? false + ? { + delay: parseValue('number', viteConfig.CONFIG_DETILER_CLIENT_RETRY_STRATEGY_DELAY), + isExponential: parseValue('boolean', viteConfig.CONFIG_DETILER_CLIENT_RETRY_STRATEGY_IS_EXPONENTIAL), + retries: parseValue('number', viteConfig.CONFIG_DETILER_CLIENT_RETRY_STRATEGY_RETRIES), + shouldResetTimeout: parseValue('boolean', viteConfig.CONFIG_DETILER_CLIENT_RETRY_STRATEGY_SHOULD_RESET_TIMEOUT), + } + : undefined; const detilerConfig: DetilerClientConfig = { url: viteConfig.CONFIG_DETILER_CLIENT_URL, - timeout: viteConfig.CONFIG_DETILER_CLIENT_TIMEOUT !== undefined ? parseInt(viteConfig.CONFIG_DETILER_CLIENT_TIMEOUT) : undefined, - enableRetryStrategy: parseBoolean(viteConfig.CONFIG_DETILER_CLIENT_ENABLE_RETRY_STRATEGY), + timeout: parseValue('number', viteConfig.CONFIG_DETILER_CLIENT_TIMEOUT), + enableRetryStrategy: parseValue('boolean', viteConfig.CONFIG_DETILER_CLIENT_ENABLE_RETRY_STRATEGY), retryStrategy, }; const basemap = parseBoolean(viteConfig.CONFIG_APP_BASEMAP_ENABLED) ? { - url: viteConfig.CONFIG_APP_BASEMAP_URL, - xApiKey: viteConfig.CONFIG_APP_BASEMAP_XAPIKEY, - tileSize: parseInt(viteConfig.CONFIG_APP_BASEMAP_TILE_SIZE!), - zoomOffset: parseInt(viteConfig.CONFIG_APP_BASEMAP_ZOOM_OFFSET!), - desaturate: parseInt(viteConfig.CONFIG_APP_BASEMAP_DESATURATE!), + url: parseValue('string', viteConfig.CONFIG_APP_BASEMAP_URL), + xApiKey: parseValue('string', viteConfig.CONFIG_APP_BASEMAP_XAPIKEY), + tileSize: parseValue('number', viteConfig.CONFIG_APP_BASEMAP_TILE_SIZE), + zoomOffset: parseValue('number', viteConfig.CONFIG_APP_BASEMAP_ZOOM_OFFSET), + desaturate: parseValue('number', viteConfig.CONFIG_APP_BASEMAP_DESATURATE), } : {}; const appConfig: AppConfig = { basemap: { - enabled: parseBoolean(viteConfig.CONFIG_APP_BASEMAP_ENABLED), + enabled: parseValue('boolean', viteConfig.CONFIG_APP_BASEMAP_ENABLED) ?? false, ...basemap, }, style: { - dataAlphaChannel: viteConfig.CONFIG_APP_DATA_ALPHA_CHANNEL !== undefined ? parseInt(viteConfig.CONFIG_APP_DATA_ALPHA_CHANNEL) : undefined, - tilesPerPage: viteConfig.CONFIG_APP_UI_TILES_PER_PAGE !== undefined ? parseInt(viteConfig.CONFIG_APP_UI_TILES_PER_PAGE) : undefined, + dataAlphaChannel: parseValue('number', viteConfig.CONFIG_APP_DATA_ALPHA_CHANNEL), + tilesPerPage: parseValue('number', viteConfig.CONFIG_APP_UI_TILES_PER_PAGE), }, kits: { - fetchInterval: viteConfig.CONFIG_APP_KITS_FETCH_INTERVAL !== undefined ? parseInt(viteConfig.CONFIG_APP_KITS_FETCH_INTERVAL) : undefined, + fetchInterval: parseValue('number', viteConfig.CONFIG_APP_KITS_FETCH_INTERVAL), }, tiles: { - batchSize: viteConfig.CONFIG_APP_TILES_BATCH_SIZE !== undefined ? parseInt(viteConfig.CONFIG_APP_TILES_BATCH_SIZE) : undefined, - fetchInterval: viteConfig.CONFIG_APP_TILES_FETCH_INTERVAL !== undefined ? parseInt(viteConfig.CONFIG_APP_TILES_FETCH_INTERVAL) : undefined, - fetchTimeout: viteConfig.CONFIG_APP_TILES_FETCH_TIMEOUT !== undefined ? parseInt(viteConfig.CONFIG_APP_TILES_FETCH_TIMEOUT) : undefined, + batchSize: parseValue('number', viteConfig.CONFIG_APP_TILES_BATCH_SIZE), + fetchInterval: parseValue('number', viteConfig.CONFIG_APP_TILES_FETCH_INTERVAL), + fetchTimeout: parseValue('number', viteConfig.CONFIG_APP_TILES_FETCH_TIMEOUT), }, }; diff --git a/packages/frontend/src/deck-gl/basemap.ts b/packages/frontend/src/deck-gl/basemap.ts index d4b4a2a..5a9da9b 100644 --- a/packages/frontend/src/deck-gl/basemap.ts +++ b/packages/frontend/src/deck-gl/basemap.ts @@ -3,7 +3,7 @@ import { BitmapLayer } from '@deck.gl/layers'; import { COORDINATE_SYSTEM } from '@deck.gl/core'; import { config } from '../config'; import { AppConfig } from '../utils/interfaces'; -import { CONSTANT_TILE_LAYER_PROPERTIES } from './constants'; +import { CONSTANT_BASEMAP_LAYER_PROPERTIES } from './constants'; const X_API_KEY_HEADER = 'x-api-key'; @@ -13,7 +13,7 @@ const appConfig = config.get('app'); export const basemapLayerFactory = (id?: string): TileLayer | undefined => { return appConfig.basemap.enabled ? new TileLayer({ - ...CONSTANT_TILE_LAYER_PROPERTIES, + ...CONSTANT_BASEMAP_LAYER_PROPERTIES, id, data: appConfig.basemap.url, tileSize: appConfig.basemap.tileSize, diff --git a/packages/frontend/src/deck-gl/constants.ts b/packages/frontend/src/deck-gl/constants.ts index 349e377..400a746 100644 --- a/packages/frontend/src/deck-gl/constants.ts +++ b/packages/frontend/src/deck-gl/constants.ts @@ -6,7 +6,8 @@ import { RGBA_MAX, RGBA_MIN } from '../utils/style'; import { MAX_ZOOM_LEVEL, MIN_ZOOM_LEVEL } from '../utils/constants'; export const BASEMAP_LAYER_ID = 'main-basemap-layer'; -export const GEOJSON_LAYER_ID = 'main-geojson-layer'; +export const TILES_LAYER_ID = 'main-tiles-layer'; +export const COOLDOWNS_LAYER_ID = 'cooldowns-layer'; export const OVERVIEW_BASEMAP_LAYER_ID = 'overview-basemap-layer'; export const OVERVIEW_GEOJSON_LAYER_ID = 'overview-geojson-layer'; @@ -26,7 +27,21 @@ export const CONSTANT_GEOJSON_LAYER_PROPERTIES: Partial = { + coordinateSystem: COORDINATE_SYSTEM.LNGLAT, + pickable: true, + stroked: true, + filled: true, + extruded: false, + pointType: 'circle', + lineWidthUnits: 'pixels', + getPointRadius: 100, + getLineWidth: 1, + getElevation: 50, + getLineColor: [RGBA_MIN, RGBA_MAX, RGBA_MIN, RGBA_MAX], +}; + +export const CONSTANT_BASEMAP_LAYER_PROPERTIES = { minZoom: MIN_ZOOM_LEVEL, maxZoom: MAX_ZOOM_LEVEL, coordinateSystem: COORDINATE_SYSTEM.LNGLAT, diff --git a/packages/frontend/src/deck-gl/cooldown.ts b/packages/frontend/src/deck-gl/cooldown.ts new file mode 100644 index 0000000..c10c76d --- /dev/null +++ b/packages/frontend/src/deck-gl/cooldown.ts @@ -0,0 +1,17 @@ +import { GeoJsonLayer } from '@deck.gl/layers'; +import { Feature } from 'geojson'; +import { BACKGROUND_RGBA } from '../components'; +import { COOLDOWN_COLOR_RGB, DEFAULT_COLORED_ALPHA } from '../utils/style'; +import { CONSTANT_GEOJSON_LAYER_PROPERTIES, COOLDOWNS_LAYER_ID } from './constants'; + +export const cooldownLayerFactory = (data: Feature[]): GeoJsonLayer => { + return new GeoJsonLayer({ + id: COOLDOWNS_LAYER_ID, + ...CONSTANT_GEOJSON_LAYER_PROPERTIES, + getFillColor: [COOLDOWN_COLOR_RGB.r, COOLDOWN_COLOR_RGB.g, COOLDOWN_COLOR_RGB.b, DEFAULT_COLORED_ALPHA], + pickable: false, + getLineWidth: 2, + getLineColor: BACKGROUND_RGBA, + data, + }); +}; diff --git a/packages/frontend/src/utils/helpers.ts b/packages/frontend/src/utils/helpers.ts index 6f1a229..5f3042f 100644 --- a/packages/frontend/src/utils/helpers.ts +++ b/packages/frontend/src/utils/helpers.ts @@ -1,6 +1,6 @@ import { TileDetails, TileQueryParams } from '@map-colonies/detiler-common'; import { BoundingBox, LonLat, TILEGRID_WORLD_CRS84, tileToBoundingBox } from '@map-colonies/tile-calc'; -import { Feature } from 'geojson'; +import { Feature, Geometry } from 'geojson'; import { FEATURE_ID_DUMMY, MAX_LATITUDE, MAX_LONGITUDE, MIN_LATITUDE, MIN_LONGITUDE, ZOOM_OFFEST } from './constants'; import { AppHelper } from './interfaces'; @@ -105,6 +105,14 @@ export const parseDataToFeatures = (data: TileDetails[]): Feature[] => { }); }; +export const geometryToFeature = (geometry: Geometry): Feature => { + return { + type: 'Feature', + properties: {}, + geometry, + }; +}; + export const insertDummyFeature = (features: Feature[]): Feature[] => { if (features.length === 0) { features.push({ type: 'Feature', properties: { id: FEATURE_ID_DUMMY }, geometry: { type: 'Point', coordinates: [] } }); diff --git a/packages/frontend/src/utils/metric.ts b/packages/frontend/src/utils/metric.ts index 5d8d673..d6d2118 100644 --- a/packages/frontend/src/utils/metric.ts +++ b/packages/frontend/src/utils/metric.ts @@ -43,6 +43,7 @@ export const METRICS: Metric[] = [ info: "tile's last update time to current system time ratio", }, { name: 'Skip Count', property: 'skipCount', range: INITIAL_MIN_MAX, info: 'the number of times a tile rerendering has been skipped' }, + { name: 'Cooldown Count', property: 'coolCount', range: INITIAL_MIN_MAX, info: 'the number of times a tile rerendering has been cooldowned' }, ]; export const findMinMax = (arr: T[], property: keyof T): MinMax | null => { diff --git a/packages/frontend/src/utils/style.ts b/packages/frontend/src/utils/style.ts index 20acab9..c76b18d 100644 --- a/packages/frontend/src/utils/style.ts +++ b/packages/frontend/src/utils/style.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-magic-numbers */ import * as d3 from 'd3'; import { config } from '../config'; import { INITIAL_MIN_MAX, MinMax } from './metric'; @@ -14,6 +15,9 @@ export const RGBA_MAX = 255; export const DEFAULT_TILE_COLOR: [number, number, number, number] = [RGBA_MIN, RGBA_MIN, RGBA_MIN, DEFAULT_EMPTY_TILE_ALPHA]; +export const COOLDOWN_COLOR = '#fa5c3c'; +export const COOLDOWN_COLOR_RGB = d3.color(COOLDOWN_COLOR) as d3.RGBColor; + export type ColorScale = 'heat' | 'r2g' | 'virdis'; export type ColorScaleFunc = ReturnType; export const COLOR_SCALES: ColorScale[] = ['heat', 'r2g', 'virdis'];