diff --git a/.eslintrc b/.eslintrc index 66ef1e1869..e09d73222a 100644 --- a/.eslintrc +++ b/.eslintrc @@ -15,6 +15,7 @@ "files": ["*.js"], "rules": { "n/no-unpublished-require": "off", // 96 failures across 79 files - many "@playwright/test" related + "n/no-unsupported-features/node-builtins": "off" } } ] diff --git a/Dockerfile b/Dockerfile index 255844bbdd..340c47f0f5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,7 +19,7 @@ RUN dnf install -y epel-release && \ xz RUN mkdir -p /usr/local/nvm ENV NVM_DIR=/usr/local/nvm -ENV NODE_VERSION=20.12.2 +ENV NODE_VERSION=20.16.0 RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash && \ . "$NVM_DIR/nvm.sh" && \ nvm install v${NODE_VERSION} && \ diff --git a/config/default/common/config/metadata/layers/multi-mission/hls/Reflectance.md b/config/default/common/config/metadata/layers/multi-mission/hls/Reflectance.md index 765496deb4..c72d9c5c4b 100644 --- a/config/default/common/config/metadata/layers/multi-mission/hls/Reflectance.md +++ b/config/default/common/config/metadata/layers/multi-mission/hls/Reflectance.md @@ -1,5 +1,7 @@ ### About HLS The Harmonized Landsat and Sentinel-2 (HLS) project provides consistent surface reflectance data from the Operational Land Imager (OLI) aboard the joint NASA/USGS Landsat 8 and 9 satellites and the Multi-Spectral Instrument (MSI) aboard the European Union’s Copernicus Sentinel-2A and Sentinel-2B satellites. The combined measurements between Landsat 8, Landsat 9, Sentinel-2A, and Sentinel-2B enable global observations of the land every 2-3 days at 30 meter (m) spatial resolution. The HLS project uses a set of algorithms to obtain seamless products from OLI and MSI that include atmospheric correction, cloud and cloud-shadow masking, spatial co-registration and common gridding, illumination and view angle normalization, and spectral bandpass adjustment. +NOTE: Stray swaths of incorrectly dated imagery may appear near the dateline by eastern Australia/New Zealand due to an artifact caused by USGS and ESA using UTC time to name the Landsat and Sentinel-2 Level 1 products. The observations are labeled one day early with respect to the local time. + References: [Harmonized Landsat Sentinel-2 (HLS) Product User Guide](https://lpdaac.usgs.gov/documents/1698/HLS_User_Guide_V2.pdf) diff --git a/config/default/common/config/metadata/layers/seawifs/SEAWIFS_ORBVIEW-2_GAC_True_Color.md b/config/default/common/config/metadata/layers/seawifs/SEAWIFS_ORBVIEW-2_GAC_True_Color.md new file mode 100644 index 0000000000..5adc6e1bc9 --- /dev/null +++ b/config/default/common/config/metadata/layers/seawifs/SEAWIFS_ORBVIEW-2_GAC_True_Color.md @@ -0,0 +1,5 @@ +The SeaWiFS Corrected Reflectance (True Color) layer provides true-color or natural color images because the combination of wavelengths produces an image that is similar to what the human eye would see. The images are natural-looking images of land surface, oceanic and atmospheric features. + +The SeaWiFS instrument was launched by Orbital Sciences Corporation on the OrbView-2 (a.k.a. SeaStar) satellite in August 1997, and collected data from September 1997 until the end of mission in December 2010. SeaWiFS had 8 spectral bands from 412 to 865 nm. It collected global data at 4 km resolution, and local data (limited onboard storage and direct broadcast) at 1 km. The mission and sensor were optimized for ocean color measurements, with a local noon (descending) equator crossing time orbit, fore-and-aft tilt capability, full dynamic range, and low polarization sensitivity. + +The SeaWiFS Corrected Reflectance (Global Area Coverage (GAC)) product is available from the OrbView-2 satellite for September 4, 1997 to December 11, 2010. The sensor and imagery resolution is 4 km, and the temporal resolution is daily. \ No newline at end of file diff --git a/config/default/common/config/wv.json/layerOrder.json b/config/default/common/config/wv.json/layerOrder.json index c0a7d2821b..7feeeb235a 100644 --- a/config/default/common/config/wv.json/layerOrder.json +++ b/config/default/common/config/wv.json/layerOrder.json @@ -145,6 +145,7 @@ "VIIRS_NOAA20_Photosynthetically_Available_Radiation", "VIIRS_SNPP_L2_Chlorophyll_A", "VIIRS_SNPP_L2_Photosynthetically_Available_Radiation", + "SEAWIFS_ORBVIEW-2_GAC_True_Color", "SEAWIFS_ORBVIEW-2_GAC_Chlorophyll_a", "GOES-East_ABI_GeoColor", "GOES-West_ABI_GeoColor", diff --git a/config/default/common/config/wv.json/layers/aeronet/AERONET_ANGSTROM_440-870NM.json b/config/default/common/config/wv.json/layers/aeronet/AERONET_ANGSTROM_440-870NM.json index 25def2cb44..218f0f88f8 100644 --- a/config/default/common/config/wv.json/layers/aeronet/AERONET_ANGSTROM_440-870NM.json +++ b/config/default/common/config/wv.json/layers/aeronet/AERONET_ANGSTROM_440-870NM.json @@ -22,7 +22,7 @@ "dateInterval": "60" } ], - "wrapX": true, + "wrapX": false, "projections": { "geographic": { "source": "AERONET" diff --git a/config/default/common/config/wv.json/layers/aeronet/AERONET_AOD_500NM.json b/config/default/common/config/wv.json/layers/aeronet/AERONET_AOD_500NM.json index de01568951..3fcc09e18f 100644 --- a/config/default/common/config/wv.json/layers/aeronet/AERONET_AOD_500NM.json +++ b/config/default/common/config/wv.json/layers/aeronet/AERONET_AOD_500NM.json @@ -22,7 +22,7 @@ "dateInterval": "60" } ], - "wrapX": true, + "wrapX": false, "projections": { "geographic": { "source": "AERONET" diff --git a/config/default/common/config/wv.json/layers/aeronet/DAILY_AERONET_ANGSTROM_440-870NM.json b/config/default/common/config/wv.json/layers/aeronet/DAILY_AERONET_ANGSTROM_440-870NM.json index 1ac9145c31..ccdff0e757 100644 --- a/config/default/common/config/wv.json/layers/aeronet/DAILY_AERONET_ANGSTROM_440-870NM.json +++ b/config/default/common/config/wv.json/layers/aeronet/DAILY_AERONET_ANGSTROM_440-870NM.json @@ -14,7 +14,7 @@ "vectorStyle": { "id": "DAILY_AERONET_ANGSTROM_440-870NM" }, - "wrapX": true, + "wrapX": false, "projections": { "geographic": { "source": "AERONET" diff --git a/config/default/common/config/wv.json/layers/aeronet/DAILY_AERONET_AOD_500NM.json b/config/default/common/config/wv.json/layers/aeronet/DAILY_AERONET_AOD_500NM.json index c66b0c0241..cd441dd0eb 100644 --- a/config/default/common/config/wv.json/layers/aeronet/DAILY_AERONET_AOD_500NM.json +++ b/config/default/common/config/wv.json/layers/aeronet/DAILY_AERONET_AOD_500NM.json @@ -14,7 +14,7 @@ "vectorStyle": { "id": "DAILY_AERONET_AOD_500NM" }, - "wrapX": true, + "wrapX": false, "projections": { "geographic": { "source": "AERONET" diff --git a/config/default/common/config/wv.json/layers/seawifs/SEAWIFS_ORBVIEW-2_GAC_True_Color.json b/config/default/common/config/wv.json/layers/seawifs/SEAWIFS_ORBVIEW-2_GAC_True_Color.json new file mode 100644 index 0000000000..221b557908 --- /dev/null +++ b/config/default/common/config/wv.json/layers/seawifs/SEAWIFS_ORBVIEW-2_GAC_True_Color.json @@ -0,0 +1,12 @@ +{ + "layers": { + "SEAWIFS_ORBVIEW-2_GAC_True_Color": { + "id": "SEAWIFS_ORBVIEW-2_GAC_True_Color", + "description": "seawifs/SEAWIFS_ORBVIEW-2_GAC_True_Color", + "tags": "cr", + "group": "overlays", + "layergroup": "Corrected Reflectance", + "wrapadjacentdays": true + } + } +} \ No newline at end of file diff --git a/config/default/common/config/wv.json/measurements/Corrected Reflectance.json b/config/default/common/config/wv.json/measurements/Corrected Reflectance.json index dae277aaa1..7ab43d36a3 100644 --- a/config/default/common/config/wv.json/measurements/Corrected Reflectance.json +++ b/config/default/common/config/wv.json/measurements/Corrected Reflectance.json @@ -3,7 +3,7 @@ "Corrected Reflectance": { "id": "corrected-reflectance", "title": "Corrected Reflectance", - "subtitle": "Aqua/MODIS, Terra/MODIS, Suomi NPP/VIIRS, NOAA-20/VIIRS, NOAA-21/VIIRS, PACE/OCI, Landsat/WELD", + "subtitle": "Aqua/MODIS, Terra/MODIS, Suomi NPP/VIIRS, NOAA-20/VIIRS, NOAA-21/VIIRS, PACE/OCI, Landsat/WELD, OrbView-2/SeaWiFS", "sources": { "Aqua/MODIS": { "id": "aqua-modis", @@ -93,6 +93,15 @@ "Landsat_WELD_CorrectedReflectance_Bands743_Global_Annual", "Landsat_WELD_CorrectedReflectance_Bands743_Global_Monthly" ] + }, + "OrbView-2/SeaWiFS": { + "id": "orbview-2-seawifs", + "title": "OrbView-2/SeaWiFS", + "description": "", + "image": "", + "settings": [ + "SEAWIFS_ORBVIEW-2_GAC_True_Color" + ] } } } diff --git a/config/default/common/config/wv.json/naturalEvents.json b/config/default/common/config/wv.json/naturalEvents.json index 1760500740..188ec55b7c 100644 --- a/config/default/common/config/wv.json/naturalEvents.json +++ b/config/default/common/config/wv.json/naturalEvents.json @@ -679,7 +679,7 @@ false ], [ - "VIIRS_SNPP_Chlorophyll_a", + "VIIRS_SNPP_L2_Chlorophyll_A", false ] ], diff --git a/e2e/features/layers/layer-picker-test.spec.js b/e2e/features/layers/layer-picker-test.spec.js index 9e1156d473..d9e9cefc35 100644 --- a/e2e/features/layers/layer-picker-test.spec.js +++ b/e2e/features/layers/layer-picker-test.spec.js @@ -155,8 +155,8 @@ test('Disabling coverage filter updates list', async () => { } = selectors await availableFilterCheckbox.click() await expect(availableFilterCheckboxInput).not.toBeChecked() - await expect(layersSearchRow).toHaveCount(14) - await expect(layerResultsCountText).toContainText('Showing 14 out of') + await expect(layersSearchRow).toHaveCount(15) + await expect(layerResultsCountText).toContainText('Showing 15 out of') }) test('Finding layer by ID with search', async () => { diff --git a/package-lock.json b/package-lock.json index 1fb996ea7b..f46db2dcd5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "worldview", - "version": "4.44.0", + "version": "4.45.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "worldview", - "version": "4.44.0", + "version": "4.45.0", "hasInstallScript": true, "license": "NASA-1.3", "dependencies": { @@ -17,8 +17,8 @@ "@fortawesome/free-solid-svg-icons": "^6.6.0", "@fortawesome/react-fontawesome": "^0.2.2", "@khanisak/temperature-converter": "^2.0.1", - "@reduxjs/toolkit": "^2.2.6", - "axios": "^1.7.2", + "@reduxjs/toolkit": "^2.2.7", + "axios": "^1.7.3", "bluebird": "3.7.2", "bootstrap": "^5.3.3", "cachai": "^1.0.2", @@ -46,7 +46,7 @@ "p-queue": "^8.0.1", "proj4": "^2.11.0", "prop-types": "^15.8.1", - "qs": "^6.12.3", + "qs": "^6.13.0", "react": "^18.3.1", "react-beautiful-dnd": "^13.1.1", "react-device-detect": "^2.2.3", @@ -78,16 +78,16 @@ "what-input": "^5.2.12" }, "devDependencies": { - "@babel/core": "^7.24.9", - "@babel/eslint-parser": "^7.24.8", + "@babel/core": "^7.25.2", + "@babel/eslint-parser": "^7.25.1", "@babel/plugin-transform-class-properties": "^7.24.7", "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/preset-env": "^7.24.8", + "@babel/preset-env": "^7.25.3", "@babel/preset-react": "^7.24.7", "@playwright/test": "^1.45.2", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", "@webpack-cli/serve": "^2.0.5", - "ajv": "^8.16.0", + "ajv": "^8.17.1", "autoprefixer": "^10.4.19", "babel-loader": "^9.1.3", "cheerio": "^1.0.0-rc.12", @@ -104,14 +104,14 @@ "eslint-plugin-import": "^2.29.1", "eslint-plugin-jest": "^28.6.0", "eslint-plugin-jsx-a11y": "^6.9.0", - "eslint-plugin-n": "^17.9.0", + "eslint-plugin-n": "^17.10.1", "eslint-plugin-no-storage": "^1.0.2", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^6.4.0", + "eslint-plugin-promise": "^6.6.0", "eslint-plugin-react": "^7.34.4", "express": "^4.19.2", "glob": "^11.0.0", - "husky": "^9.0.11", + "husky": "^9.1.4", "jest": "^29.7.0", "jest-canvas-mock": "^2.5.2", "jest-environment-jsdom": "^29.7.0", @@ -121,20 +121,20 @@ "node-ssh": "^13.2.0", "npm-run-all": "^4.1.5", "patch-package": "^8.0.0", - "postcss": "^8.4.39", + "postcss": "^8.4.40", "postcss-loader": "^8.1.1", "react-refresh": "^0.14.1", "react-test-renderer": "^18.3.0", "redux-mock-store": "^1.5.4", "run-script-os": "^1.1.6", - "sass": "^1.77.6", - "sass-loader": "^14.2.1", + "sass": "^1.77.8", + "sass-loader": "^16.0.0", "shelljs": "^0.8.5", "showdown": "^2.1.0", "stylelint": "^15.11.0", "stylelint-config-standard-scss": "^11.1.0", "stylelint-high-performance-animation": "^1.10.0", - "tar": "^7.4.0", + "tar": "^7.4.3", "terser-webpack-plugin": "^5.3.10", "uuid": "^10.0.0", "webpack": "^5.93.0", @@ -147,7 +147,7 @@ "yargs": "^17.7.2" }, "engines": { - "node": ">= 20.12.2" + "node": ">= 20.16.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -180,30 +180,28 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.8.tgz", - "integrity": "sha512-c4IM7OTg6k1Q+AJ153e2mc2QVTezTwnb4VzquwcyiEzGnW0Kedv4do/TrkU98qPeC5LNiMt/QXwIjzYXLBpyZg==", - "license": "MIT", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz", - "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==", - "license": "MIT", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.9", - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-module-transforms": "^7.24.9", - "@babel/helpers": "^7.24.8", - "@babel/parser": "^7.24.8", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.9", + "@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", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -219,11 +217,10 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.8.tgz", - "integrity": "sha512-nYAikI4XTGokU2QX7Jx+v4rxZKhKivaQaREZjuW3mrJrbdWJ5yUfohnoUULge+zEEaKjPYNxhoRgUKktjXtbwA==", + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.25.1.tgz", + "integrity": "sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg==", "dev": true, - "license": "MIT", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", @@ -238,12 +235,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", - "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", - "license": "MIT", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", "dependencies": { - "@babel/types": "^7.24.9", + "@babel/types": "^7.25.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -288,12 +284,11 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", - "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", - "license": "MIT", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dependencies": { - "@babel/compat-data": "^7.24.8", + "@babel/compat-data": "^7.25.2", "@babel/helper-validator-option": "^7.24.8", "browserslist": "^4.23.1", "lru-cache": "^5.1.1", @@ -337,9 +332,10 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.24.7", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", + "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "regexpu-core": "^5.3.1", @@ -369,6 +365,7 @@ }, "node_modules/@babel/helper-environment-visitor": { "version": "7.24.7", + "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.24.7" @@ -379,6 +376,7 @@ }, "node_modules/@babel/helper-function-name": { "version": "7.24.7", + "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.24.7", @@ -388,23 +386,14 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.7", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", + "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -422,16 +411,14 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", - "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", - "license": "MIT", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -453,8 +440,6 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "dev": true, "license": "MIT", "engines": { @@ -462,13 +447,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.24.7", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", + "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-wrap-function": "^7.24.7" + "@babel/helper-wrap-function": "^7.25.0", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -478,13 +464,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.7", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", + "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7" + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -518,6 +505,7 @@ }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.24.7", + "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.24.7" @@ -544,35 +532,32 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.24.7", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", + "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-function-name": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", - "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", - "license": "MIT", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.8" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -592,10 +577,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", - "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", - "license": "MIT", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "dependencies": { + "@babel/types": "^7.25.2" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -604,12 +591,28 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.7", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", + "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", + "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -619,11 +622,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.7", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", + "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -649,12 +653,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.7", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", + "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -945,14 +950,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.7", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz", + "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@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.0" }, "engines": { "node": ">=6.9.0" @@ -992,11 +998,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.7", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", + "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1037,19 +1044,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.8.tgz", - "integrity": "sha512-VXy91c47uujj758ud9wx+OMgheXm4qJfyhj1P18YvlrQkNOSrwsteHk+EFS3OMGfhMhpZa0A+81eE7G4QC+3CA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz", + "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/traverse": "^7.25.0", "globals": "^11.1.0" }, "engines": { @@ -1076,8 +1080,6 @@ }, "node_modules/@babel/plugin-transform-destructuring": { "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", - "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1119,6 +1121,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", + "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-dynamic-import": { "version": "7.24.7", "dev": true, @@ -1180,13 +1198,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.7", + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", + "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.1" }, "engines": { "node": ">=6.9.0" @@ -1211,11 +1230,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.7", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", + "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1270,8 +1290,6 @@ }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", - "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", "dev": true, "license": "MIT", "dependencies": { @@ -1287,14 +1305,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.7", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", + "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@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" }, "engines": { "node": ">=6.9.0" @@ -1426,8 +1445,6 @@ }, "node_modules/@babel/plugin-transform-optional-chaining": { "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", - "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", "dev": true, "license": "MIT", "dependencies": { @@ -1651,8 +1668,6 @@ }, "node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", - "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", "dev": true, "license": "MIT", "dependencies": { @@ -1725,20 +1740,20 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.8.tgz", - "integrity": "sha512-vObvMZB6hNWuDxhSaEPTKCwcqkAIuDtE+bQGn4XMXne1DSLzFVY8Vmj1bm+mUQXYNN8NmaQEO+r8MMbzPr1jBQ==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz", + "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.24.8", - "@babel/helper-compilation-targets": "^7.24.8", + "@babel/compat-data": "^7.25.2", + "@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.24.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", + "@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.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", "@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", @@ -1759,29 +1774,30 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.0", "@babel/plugin-transform-async-to-generator": "^7.24.7", "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", "@babel/plugin-transform-class-properties": "^7.24.7", "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.24.8", + "@babel/plugin-transform-classes": "^7.25.0", "@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.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^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.24.7", + "@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", @@ -1868,31 +1884,28 @@ } }, "node_modules/@babel/template": { - "version": "7.24.7", - "license": "MIT", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", - "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", - "license": "MIT", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.8", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.8", - "@babel/types": "^7.24.8", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1901,10 +1914,9 @@ } }, "node_modules/@babel/types": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", - "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", - "license": "MIT", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", "dependencies": { "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", @@ -2374,8 +2386,6 @@ }, "node_modules/@isaacs/cliui": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, "license": "ISC", "dependencies": { @@ -2392,8 +2402,6 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, "license": "MIT", "engines": { @@ -2405,8 +2413,6 @@ }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "license": "MIT", "dependencies": { @@ -2423,8 +2429,6 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3293,8 +3297,6 @@ }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, "license": "MIT", "optional": true, @@ -3405,10 +3407,9 @@ } }, "node_modules/@reduxjs/toolkit": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.6.tgz", - "integrity": "sha512-kH0r495c5z1t0g796eDQAkYbEQ3a1OLYN9o8jQQVZyKyw367pfRGS+qZLkHYvFHiUUdafpoSlQ2QYObIApjPWA==", - "license": "MIT", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.7.tgz", + "integrity": "sha512-faI3cZbSdFb8yv9dhDTmGwclW0vk0z5o1cia+kf7gCbaCwHI5e+7tP57mJUv22pNcNbeA62GSrPpfrUfdXcQ6g==", "dependencies": { "immer": "^10.0.3", "redux": "^5.0.1", @@ -3459,8 +3460,6 @@ }, "node_modules/@trysound/sax": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "dev": true, "license": "ISC", "engines": { @@ -4254,14 +4253,16 @@ } }, "node_modules/ajv": { - "version": "8.16.0", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -4689,8 +4690,9 @@ } }, "node_modules/axios": { - "version": "1.7.2", - "license": "MIT", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.3.tgz", + "integrity": "sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -5329,8 +5331,6 @@ }, "node_modules/caniuse-api": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, "license": "MIT", "dependencies": { @@ -5899,8 +5899,6 @@ }, "node_modules/core-js-compat": { "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", - "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", "dev": true, "license": "MIT", "dependencies": { @@ -6103,8 +6101,6 @@ }, "node_modules/css-declaration-sorter": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", - "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", "dev": true, "license": "ISC", "engines": { @@ -6320,8 +6316,6 @@ }, "node_modules/cssnano": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.4.tgz", - "integrity": "sha512-rQgpZra72iFjiheNreXn77q1haS2GEy69zCMbu4cpXCFPMQF+D4Ik5V7ktMzUF/sA7xCIgcqHwGPnCD+0a1vHg==", "dev": true, "license": "MIT", "dependencies": { @@ -6341,8 +6335,6 @@ }, "node_modules/cssnano-preset-default": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.4.tgz", - "integrity": "sha512-jQ6zY9GAomQX7/YNLibMEsRZguqMUGuupXcEk2zZ+p3GUxwCAsobqPYE62VrJ9qZ0l9ltrv2rgjwZPBIFIjYtw==", "dev": true, "license": "MIT", "dependencies": { @@ -6386,8 +6378,6 @@ }, "node_modules/cssnano-utils": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.0.tgz", - "integrity": "sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==", "dev": true, "license": "MIT", "engines": { @@ -6399,8 +6389,6 @@ }, "node_modules/csso": { "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6413,8 +6401,6 @@ }, "node_modules/csso/node_modules/css-tree": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "dev": true, "license": "MIT", "dependencies": { @@ -6428,8 +6414,6 @@ }, "node_modules/csso/node_modules/mdn-data": { "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", "dev": true, "license": "CC0-1.0" }, @@ -7024,8 +7008,6 @@ }, "node_modules/eastasianwidth": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, "license": "MIT" }, @@ -7761,7 +7743,9 @@ } }, "node_modules/eslint-plugin-n": { - "version": "17.9.0", + "version": "17.10.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.10.1.tgz", + "integrity": "sha512-hm/q37W6efDptJXdwirsm6A257iY6ZNtpoSG0wEzFzjJ3AhL7OhEIhdSR2e4OdYfHO5EDeqlCfFrjf9q208IPw==", "dev": true, "license": "MIT", "dependencies": { @@ -7769,9 +7753,9 @@ "enhanced-resolve": "^5.17.0", "eslint-plugin-es-x": "^7.5.0", "get-tsconfig": "^4.7.0", - "globals": "^15.0.0", + "globals": "^15.8.0", "ignore": "^5.2.4", - "minimatch": "^9.0.0", + "minimatch": "^9.0.5", "semver": "^7.5.3" }, "engines": { @@ -7805,7 +7789,9 @@ } }, "node_modules/eslint-plugin-n/node_modules/globals": { - "version": "15.6.0", + "version": "15.8.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.8.0.tgz", + "integrity": "sha512-VZAJ4cewHTExBWDHR6yptdIBlx9YSSZuwojj9Nt5mBRXQzrKakDsVKQ1J63sklLvzAJm0X5+RpO4i3Y2hcOnFw==", "dev": true, "license": "MIT", "engines": { @@ -7865,9 +7851,9 @@ } }, "node_modules/eslint-plugin-promise": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.4.0.tgz", - "integrity": "sha512-/KWWRaD3fGkVCZsdR0RU53PSthFmoHVhZl+y9+6DqeDLSikLdlUVpVEAmI6iCRR5QyOjBYBqHZV/bdv4DJ4Gtw==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", + "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", "dev": true, "license": "ISC", "engines": { @@ -7885,6 +7871,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", "dev": true, + "license": "MIT", "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", @@ -8416,6 +8403,13 @@ "version": "2.0.6", "license": "MIT" }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true, + "license": "MIT" + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "dev": true, @@ -8974,8 +8968,6 @@ }, "node_modules/glob": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", - "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", "dev": true, "license": "ISC", "dependencies": { @@ -9013,8 +9005,6 @@ }, "node_modules/glob/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { @@ -9023,8 +9013,6 @@ }, "node_modules/glob/node_modules/minimatch": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", "dev": true, "license": "ISC", "dependencies": { @@ -9432,11 +9420,12 @@ } }, "node_modules/husky": { - "version": "9.0.11", + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.4.tgz", + "integrity": "sha512-bho94YyReb4JV7LYWRWxZ/xr6TtOTt8cMfmQ39MQYJ7f/YE268s3GdghGwi+y4zAeqewE5zYLvuhV0M0ijsDEA==", "dev": true, - "license": "MIT", "bin": { - "husky": "bin.mjs" + "husky": "bin.js" }, "engines": { "node": ">=18" @@ -10256,8 +10245,6 @@ }, "node_modules/jackspeak": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", - "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -12226,8 +12213,6 @@ }, "node_modules/lodash.memoize": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true, "license": "MIT" }, @@ -12246,8 +12231,6 @@ }, "node_modules/lodash.uniq": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true, "license": "MIT" }, @@ -12574,8 +12557,6 @@ }, "node_modules/minizlib/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { @@ -12584,8 +12565,6 @@ }, "node_modules/minizlib/node_modules/glob": { "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "license": "ISC", "dependencies": { @@ -12605,8 +12584,6 @@ }, "node_modules/minizlib/node_modules/jackspeak": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -12621,15 +12598,11 @@ }, "node_modules/minizlib/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, "license": "ISC" }, "node_modules/minizlib/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -12644,8 +12617,6 @@ }, "node_modules/minizlib/node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -13136,8 +13107,6 @@ }, "node_modules/ol-mapbox-style": { "version": "12.3.4", - "resolved": "https://registry.npmjs.org/ol-mapbox-style/-/ol-mapbox-style-12.3.4.tgz", - "integrity": "sha512-TxGJZw4hmvc6n5dHSyAE8ZpgALJ6hVG5Q9yl0j2Q1KmLS9iq4wMpb383TAitWiG86SvJV4oDkWMGkyyMLfVyew==", "license": "BSD-2-Clause", "dependencies": { "@mapbox/mapbox-gl-style-spec": "^13.23.1", @@ -13581,8 +13550,6 @@ }, "node_modules/path-scurry": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -13598,8 +13565,6 @@ }, "node_modules/path-scurry/node_modules/lru-cache": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz", - "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==", "dev": true, "license": "ISC", "engines": { @@ -13798,9 +13763,9 @@ } }, "node_modules/postcss": { - "version": "8.4.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", - "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "version": "8.4.40", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz", + "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==", "dev": true, "funding": [ { @@ -13828,8 +13793,6 @@ }, "node_modules/postcss-calc": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.0.0.tgz", - "integrity": "sha512-OmjhudoNTP0QleZCwl1i6NeBwN+5MZbY5ersLZz69mjJiDVv/p57RjRuKDkHeDWr4T+S97wQfsqRTNoDHB2e3g==", "dev": true, "license": "MIT", "dependencies": { @@ -13845,8 +13808,6 @@ }, "node_modules/postcss-colormin": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.1.tgz", - "integrity": "sha512-uszdT0dULt3FQs47G5UHCduYK+FnkLYlpu1HpWu061eGsKZ7setoG7kA+WC9NQLsOJf69D5TxGHgnAdRgylnFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13864,8 +13825,6 @@ }, "node_modules/postcss-convert-values": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.2.tgz", - "integrity": "sha512-MuZIF6HJ4izko07Q0TgW6pClalI4al6wHRNPkFzqQdwAwG7hPn0lA58VZdxyb2Vl5AYjJ1piO+jgF9EnTjQwQQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13881,8 +13840,6 @@ }, "node_modules/postcss-discard-comments": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.1.tgz", - "integrity": "sha512-GVrQxUOhmle1W6jX2SvNLt4kmN+JYhV7mzI6BMnkAWR9DtVvg8e67rrV0NfdWhn7x1zxvzdWkMBPdBDCls+uwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13897,8 +13854,6 @@ }, "node_modules/postcss-discard-duplicates": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.0.tgz", - "integrity": "sha512-bAnSuBop5LpAIUmmOSsuvtKAAKREB6BBIYStWUTGq8oG5q9fClDMMuY8i4UPI/cEcDx2TN+7PMnXYIId20UVDw==", "dev": true, "license": "MIT", "engines": { @@ -13910,8 +13865,6 @@ }, "node_modules/postcss-discard-empty": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz", - "integrity": "sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==", "dev": true, "license": "MIT", "engines": { @@ -13923,8 +13876,6 @@ }, "node_modules/postcss-discard-overridden": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.0.tgz", - "integrity": "sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==", "dev": true, "license": "MIT", "engines": { @@ -14013,8 +13964,6 @@ }, "node_modules/postcss-merge-longhand": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.2.tgz", - "integrity": "sha512-06vrW6ZWi9qeP7KMS9fsa9QW56+tIMW55KYqF7X3Ccn+NI2pIgPV6gFfvXTMQ05H90Y5DvnCDPZ2IuHa30PMUg==", "dev": true, "license": "MIT", "dependencies": { @@ -14030,8 +13979,6 @@ }, "node_modules/postcss-merge-rules": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.2.tgz", - "integrity": "sha512-VAR47UNvRsdrTHLe7TV1CeEtF9SJYR5ukIB9U4GZyZOptgtsS20xSxy+k5wMrI3udST6O1XuIn7cjQkg7sDAAw==", "dev": true, "license": "MIT", "dependencies": { @@ -14049,8 +13996,6 @@ }, "node_modules/postcss-minify-font-values": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.0.tgz", - "integrity": "sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==", "dev": true, "license": "MIT", "dependencies": { @@ -14065,8 +14010,6 @@ }, "node_modules/postcss-minify-gradients": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.0.tgz", - "integrity": "sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==", "dev": true, "license": "MIT", "dependencies": { @@ -14083,8 +14026,6 @@ }, "node_modules/postcss-minify-params": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.1.tgz", - "integrity": "sha512-e+Xt8xErSRPgSRFxHeBCSxMiO8B8xng7lh8E0A5ep1VfwYhY8FXhu4Q3APMjgx9YDDbSp53IBGENrzygbUvgUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14101,8 +14042,6 @@ }, "node_modules/postcss-minify-selectors": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.2.tgz", - "integrity": "sha512-dCzm04wqW1uqLmDZ41XYNBJfjgps3ZugDpogAmJXoCb5oCiTzIX4oPXXKxDpTvWOnKxQKR4EbV4ZawJBLcdXXA==", "dev": true, "license": "MIT", "dependencies": { @@ -14173,8 +14112,6 @@ }, "node_modules/postcss-normalize-charset": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.0.tgz", - "integrity": "sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==", "dev": true, "license": "MIT", "engines": { @@ -14186,8 +14123,6 @@ }, "node_modules/postcss-normalize-display-values": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.0.tgz", - "integrity": "sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -14202,8 +14137,6 @@ }, "node_modules/postcss-normalize-positions": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.0.tgz", - "integrity": "sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14218,8 +14151,6 @@ }, "node_modules/postcss-normalize-repeat-style": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.0.tgz", - "integrity": "sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==", "dev": true, "license": "MIT", "dependencies": { @@ -14234,8 +14165,6 @@ }, "node_modules/postcss-normalize-string": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.0.tgz", - "integrity": "sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==", "dev": true, "license": "MIT", "dependencies": { @@ -14250,8 +14179,6 @@ }, "node_modules/postcss-normalize-timing-functions": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.0.tgz", - "integrity": "sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==", "dev": true, "license": "MIT", "dependencies": { @@ -14266,8 +14193,6 @@ }, "node_modules/postcss-normalize-unicode": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.1.tgz", - "integrity": "sha512-PTPGdY9xAkTw+8ZZ71DUePb7M/Vtgkbbq+EoI33EuyQEzbKemEQMhe5QSr0VP5UfZlreANDPxSfcdSprENcbsg==", "dev": true, "license": "MIT", "dependencies": { @@ -14283,8 +14208,6 @@ }, "node_modules/postcss-normalize-url": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.0.tgz", - "integrity": "sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14299,8 +14222,6 @@ }, "node_modules/postcss-normalize-whitespace": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.0.tgz", - "integrity": "sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14315,8 +14236,6 @@ }, "node_modules/postcss-ordered-values": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.1.tgz", - "integrity": "sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==", "dev": true, "license": "MIT", "dependencies": { @@ -14332,8 +14251,6 @@ }, "node_modules/postcss-reduce-initial": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.1.tgz", - "integrity": "sha512-0JDUSV4bGB5FGM5g8MkS+rvqKukJZ7OTHw/lcKn7xPNqeaqJyQbUO8/dJpvyTpaVwPsd3Uc33+CfNzdVowp2WA==", "dev": true, "license": "MIT", "dependencies": { @@ -14349,8 +14266,6 @@ }, "node_modules/postcss-reduce-transforms": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.0.tgz", - "integrity": "sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==", "dev": true, "license": "MIT", "dependencies": { @@ -14422,8 +14337,6 @@ }, "node_modules/postcss-svgo": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.0.1.tgz", - "integrity": "sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==", "dev": true, "license": "MIT", "dependencies": { @@ -14439,8 +14352,6 @@ }, "node_modules/postcss-unique-selectors": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.1.tgz", - "integrity": "sha512-MH7QE/eKUftTB5ta40xcHLl7hkZjgDFydpfTK+QWXeHxghVt3VoPqYL5/G+zYZPPIs+8GuqFXSTgxBSoB1RZtQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14575,10 +14486,9 @@ "license": "MIT" }, "node_modules/qs": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.3.tgz", - "integrity": "sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==", - "license": "BSD-3-Clause", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dependencies": { "side-channel": "^1.0.6" }, @@ -15736,10 +15646,11 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.77.6", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", - "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", + "version": "1.77.8", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz", + "integrity": "sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==", "dev": true, + "license": "MIT", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -15753,9 +15664,10 @@ } }, "node_modules/sass-loader": { - "version": "14.2.1", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.0.tgz", + "integrity": "sha512-n13Z+3rU9A177dk4888czcVFiC8CL9dii4qpXWUg3YIIgZEvi9TCFKjOQcbK0kJM7DJu9VucrZFddvNfYCPwtw==", "dev": true, - "license": "MIT", "dependencies": { "neo-async": "^2.6.2" }, @@ -16546,8 +16458,6 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { @@ -16561,8 +16471,6 @@ }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, @@ -16691,8 +16599,6 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -16749,8 +16655,6 @@ }, "node_modules/stylehacks": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.2.tgz", - "integrity": "sha512-HdkWZS9b4gbgYTdMg4gJLmm7biAUug1qTqXjS+u8X+/pUd+9Px1E+520GnOW3rST9MNsVOVpsJG+mPHNosxjOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17029,8 +16933,6 @@ }, "node_modules/svgo": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", "dev": true, "license": "MIT", "dependencies": { @@ -17082,7 +16984,9 @@ } }, "node_modules/tar": { - "version": "7.4.0", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "dev": true, "license": "ISC", "dependencies": { @@ -17971,6 +17875,7 @@ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.3.0.tgz", "integrity": "sha512-xD2qnNew+F6KwOGZR7kWdbIou/ud7cVqLEXeK1q0nHcNsX/u7ul/fSdlOTX4ntSL5FNFy7ZJJXbf0piF591JYw==", "dev": true, + "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^4.6.0", @@ -18139,8 +18044,6 @@ }, "node_modules/webpack-dev-server/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { @@ -18149,8 +18052,6 @@ }, "node_modules/webpack-dev-server/node_modules/glob": { "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "license": "ISC", "dependencies": { @@ -18192,8 +18093,6 @@ }, "node_modules/webpack-dev-server/node_modules/jackspeak": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -18208,15 +18107,11 @@ }, "node_modules/webpack-dev-server/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, "license": "ISC" }, "node_modules/webpack-dev-server/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -18248,8 +18143,6 @@ }, "node_modules/webpack-dev-server/node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -18512,8 +18405,6 @@ }, "node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18531,8 +18422,6 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { @@ -18549,8 +18438,6 @@ }, "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -18565,8 +18452,6 @@ }, "node_modules/wrap-ansi-cjs/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18578,15 +18463,11 @@ }, "node_modules/wrap-ansi-cjs/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, "license": "MIT", "engines": { @@ -18598,8 +18479,6 @@ }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "license": "MIT", "engines": { @@ -18611,8 +18490,6 @@ }, "node_modules/wrap-ansi/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "license": "MIT", "dependencies": { @@ -18629,8 +18506,6 @@ }, "node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 70b082485f..0a89f62474 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "worldview", - "version": "4.44.0", + "version": "4.45.0", "description": "Interactive interface for browsing full-resolution, global satellite imagery", "keywords": [ "NASA", @@ -23,7 +23,7 @@ "license": "NASA-1.3", "repository": "nasa-gibs/worldview", "engines": { - "node": ">= 20.12.2" + "node": ">= 20.16.0" }, "scripts": { "analyze": "cross-env ANALYZE_MODE=true NODE_ENV=production webpack", @@ -55,7 +55,7 @@ "lint:scss": "npx stylelint ./web/scss/**/*.scss", "lint:js": "npx eslint . --quiet", "preinstall": "node tasks/util/checkNodeVersion.js", - "postinstall": "patch-package && husky install", + "postinstall": "patch-package && husky", "start": "node ./tasks/util/start.js", "t-debug": "npx playwright test --debug", "test": "run-script-os", @@ -77,16 +77,16 @@ "upload": "node tasks/util/upload.js" }, "devDependencies": { - "@babel/core": "^7.24.9", - "@babel/eslint-parser": "^7.24.8", + "@babel/core": "^7.25.2", + "@babel/eslint-parser": "^7.25.1", "@babel/plugin-transform-class-properties": "^7.24.7", "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/preset-env": "^7.24.8", + "@babel/preset-env": "^7.25.3", "@babel/preset-react": "^7.24.7", "@playwright/test": "^1.45.2", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", "@webpack-cli/serve": "^2.0.5", - "ajv": "^8.16.0", + "ajv": "^8.17.1", "autoprefixer": "^10.4.19", "babel-loader": "^9.1.3", "cheerio": "^1.0.0-rc.12", @@ -103,14 +103,14 @@ "eslint-plugin-import": "^2.29.1", "eslint-plugin-jest": "^28.6.0", "eslint-plugin-jsx-a11y": "^6.9.0", - "eslint-plugin-n": "^17.9.0", + "eslint-plugin-n": "^17.10.1", "eslint-plugin-no-storage": "^1.0.2", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^6.4.0", + "eslint-plugin-promise": "^6.6.0", "eslint-plugin-react": "^7.34.4", "express": "^4.19.2", "glob": "^11.0.0", - "husky": "^9.0.11", + "husky": "^9.1.4", "jest": "^29.7.0", "jest-canvas-mock": "^2.5.2", "jest-environment-jsdom": "^29.7.0", @@ -120,20 +120,20 @@ "node-ssh": "^13.2.0", "npm-run-all": "^4.1.5", "patch-package": "^8.0.0", - "postcss": "^8.4.39", + "postcss": "^8.4.40", "postcss-loader": "^8.1.1", "react-refresh": "^0.14.1", "react-test-renderer": "^18.3.0", "redux-mock-store": "^1.5.4", "run-script-os": "^1.1.6", - "sass": "^1.77.6", - "sass-loader": "^14.2.1", + "sass": "^1.77.8", + "sass-loader": "^16.0.0", "shelljs": "^0.8.5", "showdown": "^2.1.0", "stylelint": "^15.11.0", "stylelint-config-standard-scss": "^11.1.0", "stylelint-high-performance-animation": "^1.10.0", - "tar": "^7.4.0", + "tar": "^7.4.3", "terser-webpack-plugin": "^5.3.10", "uuid": "^10.0.0", "webpack": "^5.93.0", @@ -153,8 +153,8 @@ "@fortawesome/free-solid-svg-icons": "^6.6.0", "@fortawesome/react-fontawesome": "^0.2.2", "@khanisak/temperature-converter": "^2.0.1", - "@reduxjs/toolkit": "^2.2.6", - "axios": "^1.7.2", + "@reduxjs/toolkit": "^2.2.7", + "axios": "^1.7.3", "bluebird": "3.7.2", "bootstrap": "^5.3.3", "cachai": "^1.0.2", @@ -182,7 +182,7 @@ "p-queue": "^8.0.1", "proj4": "^2.11.0", "prop-types": "^15.8.1", - "qs": "^6.12.3", + "qs": "^6.13.0", "react": "^18.3.1", "react-beautiful-dnd": "^13.1.1", "react-device-detect": "^2.2.3", diff --git a/tasks/bamboo/linkReport.sh b/tasks/bamboo/linkReport.sh index 7db67e8666..7021219844 100755 --- a/tasks/bamboo/linkReport.sh +++ b/tasks/bamboo/linkReport.sh @@ -6,7 +6,7 @@ set -e -x # Install node.js -NODE_VERSION=v18.15.0 +NODE_VERSION=v20.16.0 curl -O https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-x64.tar.gz tar xf node-${NODE_VERSION}-linux-x64.tar.gz && export PATH=$(pwd)/node-${NODE_VERSION}-linux-x64/bin:${PATH} diff --git a/web/images/layers/previews/geographic/SEAWIFS_ORBVIEW-2_GAC_True_Color.jpg b/web/images/layers/previews/geographic/SEAWIFS_ORBVIEW-2_GAC_True_Color.jpg new file mode 100644 index 0000000000..ad544d3a10 Binary files /dev/null and b/web/images/layers/previews/geographic/SEAWIFS_ORBVIEW-2_GAC_True_Color.jpg differ diff --git a/web/js/components/timeline/timeline-coverage/timeline-coverage.js b/web/js/components/timeline/timeline-coverage/timeline-coverage.js index cb31c37a42..be3450029f 100644 --- a/web/js/components/timeline/timeline-coverage/timeline-coverage.js +++ b/web/js/components/timeline/timeline-coverage/timeline-coverage.js @@ -19,97 +19,6 @@ import Switch from '../../util/switch'; import LayerCoverageInfoModal from './info-modal'; import CoverageItemList from './coverage-item-list'; -function makeTime(date) { - return new Date(date).getTime(); -} - -function mergeSortedGranuleDateRanges(granules) { - return granules.reduce((acc, [start, end]) => { - if (!acc.length) return [[start, end]]; - const startTime = makeTime(start); - const endTime = makeTime(end); - const lastRangeEndTime = makeTime(acc.at(-1)[1]); - const lastRangeStartTime = makeTime(acc.at(-1)[0]); - if ((startTime >= lastRangeStartTime && startTime <= lastRangeEndTime) && (endTime >= lastRangeStartTime && endTime <= lastRangeEndTime)) { // within current range, ignore - return acc; - } - if (startTime > lastRangeEndTime) { // discontinuous, add new range - return [...acc, [start, end]]; - } - if (startTime <= lastRangeEndTime && endTime > lastRangeEndTime) { // intersects current range, merge - return acc.with(-1, [acc.at(-1)[0], end]); - } - return acc; - }, []); -} - -async function requestGranules(params) { - const { - shortName, - extent, - startDate, - endDate, - } = params; - const granules = []; - let hits = Infinity; - let searchAfter = false; - const url = `https://cmr.earthdata.nasa.gov/search/granules.json?shortName=${shortName}&bounding_box=${extent.join(',')}&temporal=${startDate}/${endDate}&sort_key=start_date&pageSize=2000`; - /* eslint-disable no-await-in-loop */ - do { // run the query at least once - const headers = searchAfter ? { 'Cmr-Search-After': searchAfter, 'Client-Id': 'Worldview' } : { 'Client-Id': 'Worldview' }; - const res = await fetch(url, { headers }); - searchAfter = res.headers.get('Cmr-Search-After'); - hits = parseInt(res.headers.get('Cmr-Hits'), 10); - const data = await res.json(); - granules.push(...data.feed.entry); - } while (searchAfter || hits > granules.length); // searchAfter will not be present if there are no more results https://cmr.earthdata.nasa.gov/search/site/docs/search/api.html#search-after - - return granules; -} - -async function getLayerGranuleRanges(layer) { - const extent = [-180, -90, 180, 90]; - const startDate = new Date(layer.startDate).toISOString(); - const endDate = layer.endDate ? new Date(layer.endDate).toISOString() : new Date().toISOString(); - const shortName = layer.conceptIds?.[0]?.shortName; - const nrtParams = { - shortName, - extent, - startDate, - endDate, - }; - const nrtGranules = await requestGranules(nrtParams); - let nonNRTGranules = []; - if (shortName.includes('_NRT')) { // if NRT, also get non-NRT granules - const nonNRTShortName = shortName.replace('_NRT', ''); - const nonNRTParams = { - shortName: nonNRTShortName, - extent, - startDate, - endDate, - }; - nonNRTGranules = await requestGranules(nonNRTParams); - } - const granules = [...nonNRTGranules, ...nrtGranules]; - const granuleDateRanges = granules.map(({ time_start: timeStart, time_end: timeEnd }) => [timeStart, timeEnd]); - const mergedGranuleDateRanges = mergeSortedGranuleDateRanges(granuleDateRanges); // merge overlapping granule ranges to simplify rendering - - return mergedGranuleDateRanges; -} - -async function mapGranulesToLayers(layers) { - const promises = layers.map(async (layer) => { - if (!layer.cmrAvailability) return layer; - - const ranges = await getLayerGranuleRanges(layer); - - return { ...layer, granules: ranges }; - }); - const cmrLayers = await Promise.all(promises); - - return cmrLayers; -} - /* * Timeline Layer Coverage Panel for temporal coverage. * @@ -120,7 +29,6 @@ class TimelineLayerCoveragePanel extends Component { constructor(props) { super(props); this.state = { - cmrLayers: [], activeLayers: [], shouldIncludeHiddenLayers: false, }; @@ -226,8 +134,8 @@ class TimelineLayerCoveragePanel extends Component { futureTime, ongoing, } = layer; - if (layer.granules?.length) { - return layer.granules.map(([startDate, endDate]) => { + if (layer.granuleDateRanges?.length) { + return layer.granuleDateRanges.map(([startDate, endDate]) => { const { gridWidth } = timeScaleOptions[timeScale].timeAxis; const axisFrontDate = new Date(frontDate).getTime(); const axisBackDate = new Date(backDate).getTime(); @@ -357,11 +265,9 @@ class TimelineLayerCoveragePanel extends Component { // eslint-disable-next-line react/destructuring-assignment addMatchingCoverageToTimeline = async (isChecked, layers) => { const { setMatchingTimelineCoverage } = this.props; - const cmrLayers = await mapGranulesToLayers(layers); - const dateRange = this.getNewMatchingDatesRange(cmrLayers); + const dateRange = this.getNewMatchingDatesRange(layers); setMatchingTimelineCoverage(dateRange, isChecked); this.setState({ - cmrLayers, activeLayers: layers, shouldIncludeHiddenLayers: isChecked, }); @@ -379,12 +285,12 @@ class TimelineLayerCoveragePanel extends Component { appNow, } = this.props; if (layers.length > 0) { - return layers.flatMap(({ granules, startDate, endDate }) => { - if (!granules?.length) { + return layers.flatMap(({ granuleDateRanges, startDate, endDate }) => { + if (!granuleDateRanges?.length) { return [{ startDate, endDate: endDate || appNow }]; } - return granules.map(([start, end]) => ({ startDate: start, endDate: end })); + return granuleDateRanges.map(([start, end]) => ({ startDate: start, endDate: end })); }); } }; @@ -481,7 +387,6 @@ class TimelineLayerCoveragePanel extends Component { timeScale, } = this.props; const { - cmrLayers, activeLayers, shouldIncludeHiddenLayers, } = this.state; @@ -536,7 +441,7 @@ class TimelineLayerCoveragePanel extends Component { +
{ + const getQueriedGranuleDates = async (def, selectedDate) => { const { title, } = def; const state = store.getState(); const { proj: { selected: { crs } } } = state; const getGranulesUrl = getGranulesUrlSelector(state); - const params = getParamsForGranuleRequest(def, date, crs); - const nrtParams = getParamsForGranuleRequest(def, date, crs, true); + const params = getParamsForGranuleRequest(def, selectedDate, crs); + const nrtParams = getParamsForGranuleRequest(def, selectedDate, crs, true); let data = []; let nrtData = []; try { @@ -100,7 +101,14 @@ export default function granuleLayerBuilder(cache, store, createLayerWMTS) { return transformGranuleData(entry, date, crs); }); - return transformedData; + const dedupedData = transformedData.reduce((acc, granule) => { + const { date } = granule; + const dateIndex = acc.findIndex((g) => g.date === date); + if (dateIndex >= 0) return acc; + return [...acc, granule]; + }, []); + + return dedupedData; }; /** @@ -138,6 +146,14 @@ export default function granuleLayerBuilder(cache, store, createLayerWMTS) { }); }; + /** + * Check if date is within a range + * @param {Date} date - date to check + * @param {array} ranges - array of date ranges + * @returns {boolean} - true if date is within a range + */ + const isWithinRanges = (date, ranges) => ranges.some(([start, end]) => date >= new Date(start) && date <= new Date(end)); + /** * Get granuleCount number of granules that have visible imagery based on * predetermined longitude bounds. @@ -147,19 +163,21 @@ export default function granuleLayerBuilder(cache, store, createLayerWMTS) { * @param {Date} leadingEdgeDate - timeline date * @returns {array} */ - const getVisibleGranules = (availableGranules, granuleCount, leadingEdgeDate) => { + const getVisibleGranules = (availableGranules, granuleCount, leadingEdgeDate, granuleDateRanges) => { const { proj: { selected: { crs } } } = store.getState(); const granules = []; const availableCount = availableGranules?.length; if (!availableCount) return granules; const count = granuleCount > availableCount ? availableCount : granuleCount; const sortedAvailableGranules = availableGranules.sort((a, b) => new Date(b.date) - new Date(a.date)); - for (let i = 0; granules.length < count; i += 1) { const item = sortedAvailableGranules[i]; if (!item) break; const { date } = item; - if (new Date(date) <= leadingEdgeDate && isWithinBounds(crs, item)) { + const dateDate = new Date(date); + const leadingEdgeDateUTC = new Date(leadingEdgeDate.toUTCString()); + const isWithinRange = isWithinRanges(leadingEdgeDateUTC, granuleDateRanges); + if (dateDate <= leadingEdgeDateUTC && isWithinRange && isWithinBounds(crs, item)) { granules.unshift(item); } } @@ -182,16 +200,27 @@ export default function granuleLayerBuilder(cache, store, createLayerWMTS) { const { granuleCount, date, group } = options; const { count: currentCount } = getGranuleLayer(state, def.id) || {}; const count = currentCount || granuleCount || def.count || DEFAULT_NUM_GRANULES; + let granuleDateRanges = null; // get granule dates waiting for CMR query and filtering (if necessary) const availableGranules = await getQueriedGranuleDates(def, date, group); - const visibleGranules = getVisibleGranules(availableGranules, count, date); + // if opted in to CMR availability, get granule date ranges if needed + if (def.cmrAvailability) { + if (!def.granuleDateRanges) { + granuleDateRanges = await getLayerGranuleRanges(def); + store.dispatch(addGranuleDateRanges(def, granuleDateRanges)); + } else { + granuleDateRanges = def.granuleDateRanges; + } + } + const visibleGranules = getVisibleGranules(availableGranules, count, date, granuleDateRanges); const transformedGranules = transformGranulesForProj(visibleGranules, crs); return { count, granuleDates: transformedGranules.map((g) => g.date), visibleGranules: transformedGranules, + granuleDateRanges, }; }; diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 68b0d9224b..17921c6c4f 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -33,7 +33,9 @@ import { createVectorUrl, getGeographicResolutionWMS, mergeBreakpointLayerAttributes, + getLayerGranuleRanges, } from './util'; +import { addGranuleDateRanges } from '../modules/layers/actions'; import { datesInDateRanges, prevDateInDateRange } from '../modules/layers/util'; import { getSelectedDate } from '../modules/date/selectors'; import { @@ -118,7 +120,8 @@ export default function mapLayerBuilder(config, cache, store) { // Don't key by time if this is a static layer if (def.period) { - date = util.toISOStringSeconds(util.roundTimeOneMinute(options.date)); + const isSubdaily = def.period === 'subdaily'; + date = util.toISOStringSeconds(util.roundTimeOneMinute(options.date), !isSubdaily); } if (isPaletteActive(def.id, activeGroupStr, state)) { style = getPaletteKeys(def.id, undefined, state); @@ -371,7 +374,7 @@ export default function mapLayerBuilder(config, cache, store) { tileSize: tileSize[0], }; - const urlParameters = `?TIME=${util.toISOStringSeconds(layerDate)}`; + const urlParameters = `?TIME=${util.toISOStringSeconds(layerDate, !isSubdaily)}`; const sourceURL = def.sourceOverride || configSource.url; const sourceOptions = { url: sourceURL + urlParameters, @@ -419,6 +422,7 @@ export default function mapLayerBuilder(config, cache, store) { let extent; let start; let res; + const isSubdaily = def.period === 'subdaily'; const source = config.sources[def.source]; extent = selectedProj.maxExtent; @@ -457,7 +461,7 @@ export default function mapLayerBuilder(config, cache, store) { if (day && def.wrapadjacentdays) { date = util.dateAdd(date, 'day', day); } - urlParameters = `?TIME=${util.toISOStringSeconds(util.roundTimeOneMinute(date))}`; + urlParameters = `?TIME=${util.toISOStringSeconds(util.roundTimeOneMinute(date), !isSubdaily)}`; const sourceOptions = { url: source.url + urlParameters, @@ -574,7 +578,7 @@ export default function mapLayerBuilder(config, cache, store) { for (let j = 0; j < split2.length; j += 1) { rowObj[key[j]] = split2[j]; } - if (!!rowObj.AERONET_Site_Name && rowObj.AERONET_Site_Name !== '' && !takenNamesActive[rowObj.AERONET_Site_Name]) { + if (!!rowObj.AERONET_Site_Name && rowObj.AERONET_Site_Name !== '' && !takenNamesActive[rowObj.AERONET_Site_Name] && parseInt(rowObj['Date(dd:mm:yyyy)'].split(':')[0], 10) === date.getUTCDate()) { featuresObj[rowObj.AERONET_Site_Name] = {}; featuresObj[rowObj.AERONET_Site_Name].type = 'Feature'; featuresObj[rowObj.AERONET_Site_Name].geometry = { type: 'Point' }; @@ -1033,6 +1037,7 @@ export default function mapLayerBuilder(config, cache, store) { const proj = state.proj.selected; const { breakPointLayer, + cmrAvailability, id, opacity, period, @@ -1045,6 +1050,17 @@ export default function mapLayerBuilder(config, cache, store) { let { date } = dateOptions; let layer = cache.getItem(key); const isGranule = type === 'granule'; + let granuleDateRanges = null; + + // if opted in to CMR availability, get granule date ranges if needed + if (cmrAvailability) { + if (!def.granuleDateRanges) { + granuleDateRanges = await getLayerGranuleRanges(def); + store.dispatch(addGranuleDateRanges(def, granuleDateRanges)); + } else { + granuleDateRanges = def.granuleDateRanges; + } + } if (!layer || isGranule || def.type === 'titiler') { if (!date) date = options.date || getSelectedDate(state); diff --git a/web/js/map/util.js b/web/js/map/util.js index 6048e07801..8b7eea6161 100644 --- a/web/js/map/util.js +++ b/web/js/map/util.js @@ -274,3 +274,109 @@ export function extractDateFromTileErrorURL(url) { console.error('Date not found in the URL.'); return null; } + +/** + * @method makeTime + * @param {string} date + * @returns {number} time + * @description + * Convert date to time +*/ +function makeTime(date) { + return new Date(date).getTime(); +} + +/** + * @method mergeSortedGranuleDateRanges + * @param {array} granules + * @returns {array} mergedGranuleDateRanges + * @description + * Merge overlapping granule date ranges +*/ +function mergeSortedGranuleDateRanges(granules) { + return granules.reduce((acc, [start, end]) => { + if (!acc.length) return [[start, end]]; + // round start time down and end time up by 1 minute to account for small range gaps + const startTime = makeTime(start) - 60000; + const endTime = makeTime(end) + 60000; + const lastRangeEndTime = makeTime(acc.at(-1)[1]); + const lastRangeStartTime = makeTime(acc.at(-1)[0]); + if ((startTime >= lastRangeStartTime && startTime <= lastRangeEndTime) && (endTime >= lastRangeStartTime && endTime <= lastRangeEndTime)) { // within current range, ignore + return acc; + } + if (startTime > lastRangeEndTime) { // discontinuous, add new range + return [...acc, [start, end]]; + } + if (startTime <= lastRangeEndTime && endTime > lastRangeEndTime) { // intersects current range, merge + return acc.with(-1, [acc.at(-1)[0], end]); + } + return acc; + }, []); +} + +/** + * @method requestGranules + * @param {object} params + * @returns {array} granules + * @description + * Request granules from CMR +*/ +async function requestGranules(params) { + const { + shortName, + extent, + startDate, + endDate, + } = params; + const granules = []; + let hits = Infinity; + let searchAfter = false; + const url = `https://cmr.earthdata.nasa.gov/search/granules.json?shortName=${shortName}&bounding_box=${extent.join(',')}&temporal=${startDate}/${endDate}&sort_key=start_date&pageSize=2000`; + /* eslint-disable no-await-in-loop */ + do { // run the query at least once + const headers = searchAfter ? { 'Cmr-Search-After': searchAfter, 'Client-Id': 'Worldview' } : { 'Client-Id': 'Worldview' }; + const res = await fetch(url, { headers }); + searchAfter = res.headers.get('Cmr-Search-After'); + hits = parseInt(res.headers.get('Cmr-Hits'), 10); + const data = await res.json(); + granules.push(...data.feed.entry); + } while (searchAfter || hits > granules.length); // searchAfter will not be present if there are no more results https://cmr.earthdata.nasa.gov/search/site/docs/search/api.html#search-after + + return granules; +} +/** + * @method getLayerGranuleRanges + * @param {object} layer + * @returns {array} granuleDateRanges + * @description + * Get granule date ranges for a given layer +*/ +export async function getLayerGranuleRanges(layer) { + const extent = [-180, -90, 180, 90]; + const startDate = new Date(layer.startDate).toISOString(); + const endDate = layer.endDate ? new Date(layer.endDate).toISOString() : new Date().toISOString(); + const shortName = layer.conceptIds?.[0]?.shortName; + const nrtParams = { + shortName, + extent, + startDate, + endDate, + }; + const nrtGranules = await requestGranules(nrtParams); + let nonNRTGranules = []; + if (shortName.includes('_NRT')) { // if NRT, also get non-NRT granules + const nonNRTShortName = shortName.replace('_NRT', ''); + const nonNRTParams = { + shortName: nonNRTShortName, + extent, + startDate, + endDate, + }; + nonNRTGranules = await requestGranules(nonNRTParams); + } + const granules = [...nonNRTGranules, ...nrtGranules]; + const granuleDateRanges = granules.map(({ time_start: timeStart, time_end: timeEnd }) => [timeStart, timeEnd]); + const mergedGranuleDateRanges = mergeSortedGranuleDateRanges(granuleDateRanges); // merge overlapping granule ranges to simplify rendering + + return mergedGranuleDateRanges; +} diff --git a/web/js/modules/layers/actions.js b/web/js/modules/layers/actions.js index 4b9ad285e6..9b76ded15b 100644 --- a/web/js/modules/layers/actions.js +++ b/web/js/modules/layers/actions.js @@ -33,6 +33,7 @@ import { CHANGE_GRANULE_SATELLITE_INSTRUMENT_GROUP, UPDATE_COLLECTION, UPDATE_DDV_LAYER, + ADD_GRANULE_DATE_RANGES, } from './constants'; import { updateRecentLayers } from '../product-picker/util'; import { getOverlayGroups, getLayersFromGroups } from './util'; @@ -346,6 +347,21 @@ export function updateGranuleLayerState(layer) { }; } +export function addGranuleDateRanges(layer, granuleDateRanges) { + return (dispatch, getState) => { + const state = getState(); + const { activeString } = state.compare; + const { id } = layer; + + dispatch({ + type: ADD_GRANULE_DATE_RANGES, + activeString, + id, + granuleDateRanges, + }); + }; +} + export function updateGranuleLayerOptions(dates, def, count) { return (dispatch, getState) => { const state = getState(); diff --git a/web/js/modules/layers/constants.js b/web/js/modules/layers/constants.js index 6614064871..86f6e504e5 100644 --- a/web/js/modules/layers/constants.js +++ b/web/js/modules/layers/constants.js @@ -21,3 +21,4 @@ export const DEFAULT_NUM_GRANULES = 10; export const MIN_GRANULES = 1; export const MAX_GRANULES = 30; export const UPDATE_DDV_LAYER = 'LAYERS/UPDATE_DDV_LAYER'; +export const ADD_GRANULE_DATE_RANGES = 'LAYERS/ADD_GRANULE_DATE_RANGES'; diff --git a/web/js/modules/layers/reducers.js b/web/js/modules/layers/reducers.js index 847e9497c0..f25ec7a361 100644 --- a/web/js/modules/layers/reducers.js +++ b/web/js/modules/layers/reducers.js @@ -22,6 +22,7 @@ import { REMOVE_GROUP, UPDATE_DDV_LAYER, UPDATE_COLLECTION, + ADD_GRANULE_DATE_RANGES, } from './constants'; import { SET_CUSTOM as SET_CUSTOM_PALETTE, @@ -296,6 +297,23 @@ export function layerReducer(state = initialState, action) { }); } + case ADD_GRANULE_DATE_RANGES: { + const { + granuleDateRanges, + } = action; + const layerIndex = getLayerIndex(); + + return update(state, { + [compareState]: { + layers: { + [layerIndex]: { + granuleDateRanges: { $set: granuleDateRanges }, + }, + }, + }, + }); + } + case UPDATE_GRANULE_LAYER_OPTIONS: { const { id, activeKey, count, dates, diff --git a/web/js/util/util.js b/web/js/util/util.js index 29c70067dd..ce82d4f4dc 100644 --- a/web/js/util/util.js +++ b/web/js/util/util.js @@ -232,10 +232,12 @@ export default (function(self) { * @method toISOStringSeconds * @static * @param {Date} date the date to convert + * @param {Boolean} shouldRemoveTime if the time should be removed from the date * @return {string} ISO string in the form of `YYYY-MM-DDThh:mm:ssZ`. */ - self.toISOStringSeconds = function(date) { + self.toISOStringSeconds = function(date, shouldRemoveTime = false) { const isString = typeof date === 'string' || date instanceof String; + if (shouldRemoveTime) date = self.clearTimeUTC(date); const dateString = isString ? date : date.toISOString(); return `${dateString.split('.')[0]}Z`; }; diff --git a/web/scss/components/facets.scss b/web/scss/components/facets.scss index 073a6eb2ba..3ec486ef4c 100644 --- a/web/scss/components/facets.scss +++ b/web/scss/components/facets.scss @@ -19,13 +19,12 @@ border-radius: 20px; position: relative; display: inline-block; + cursor: pointer; span { font-weight: 500; } - cursor: pointer; - &:hover { background: #eee; color: #111; diff --git a/web/scss/components/modal.scss b/web/scss/components/modal.scss index 11daa8a84c..854e1136d9 100644 --- a/web/scss/components/modal.scss +++ b/web/scss/components/modal.scss @@ -95,12 +95,12 @@ } .modal-content { + border: none; + border-radius: 6px; + .modal-header { justify-content: space-between; } - - border: none; - border-radius: 6px; } .modal-title { diff --git a/web/scss/features/events.scss b/web/scss/features/events.scss index e61e4438ac..82bd68d72b 100644 --- a/web/scss/features/events.scss +++ b/web/scss/features/events.scss @@ -9,6 +9,7 @@ .event-container { background: #333; + min-height: 166px; .no-events { text-align: center; @@ -18,8 +19,6 @@ margin: 15px auto; } - min-height: 166px; - @media (max-width: $mobile-max-width) { height: calc(var(--vh, 1vh) * 100 - 85px); } @@ -60,13 +59,13 @@ } .map-item-list li.item h4.title { - @media (max-width: $mobile-max-width) { - font-size: 1em; - } - color: #ccc; padding: 0 3px; margin-left: 40px; + + @media (max-width: $mobile-max-width) { + font-size: 1em; + } } .map-item-list li.item p, diff --git a/web/scss/features/share.scss b/web/scss/features/share.scss index 5d675f9cc2..9658ef4605 100644 --- a/web/scss/features/share.scss +++ b/web/scss/features/share.scss @@ -1,9 +1,9 @@ .share-body { height: 108px; -} -.share-body-tall { - height: 148px; + &.tall { + height: 148px; + } } .share-nav-container {