diff --git a/config/default/common/config/metadata/layers/merra/MERRA2_Air_Temperature_250hPa_Monthly.md b/config/default/common/config/metadata/layers/merra/MERRA2_Air_Temperature_250hPa_Monthly.md index a803cd8df6..185aaf05c7 100644 --- a/config/default/common/config/metadata/layers/merra/MERRA2_Air_Temperature_250hPa_Monthly.md +++ b/config/default/common/config/metadata/layers/merra/MERRA2_Air_Temperature_250hPa_Monthly.md @@ -1,3 +1,3 @@ -The Air Temperature at 250 hPa (Monthly) layer is created from the M2IMNPASM (or instM_3d_asm_Np) data collection. M2IMNPASM is an instantaneous 3-dimensional monthly mean data collection in Modern-Era Retrospective analysis for Research and Applications version 2 (MERRA-2). This collection consists of assimilations of meteorological parameters at 42 pressure levels, such as temperature, wind components, vertical pressure velocity, water vapor, ozone mass mixing ratio, and layer height. The information on the pressure levels can be found in the section 4.2 of the MERRA-2 File Specification document. The collection also includes certain quadratic information (such as the variance and covariance of certain parameters). MERRA-2 is the latest version of global atmospheric reanalysis for the satellite era produced by NASA Global Modeling and Assimilation Office (GMAO) using the Goddard Earth Observing System Model (GEOS) version 5.12.4. +The Air Temperature at 250hPa (Monthly) layer is created from the M2IMNPASM (or instM_3d_asm_Np) data collection. M2IMNPASM is an instantaneous 3-dimensional monthly mean data collection in Modern-Era Retrospective analysis for Research and Applications version 2 (MERRA-2). This collection consists of assimilations of meteorological parameters at 42 pressure levels, such as temperature, wind components, vertical pressure velocity, water vapor, ozone mass mixing ratio, and layer height. The information on the pressure levels can be found in the section 4.2 of the MERRA-2 File Specification document. The collection also includes certain quadratic information (such as the variance and covariance of certain parameters). MERRA-2 is the latest version of global atmospheric reanalysis for the satellite era produced by NASA Global Modeling and Assimilation Office (GMAO) using the Goddard Earth Observing System Model (GEOS) version 5.12.4. References: M2IMNPASM [doi:10.5067/2E096JV59PK7](https://doi.org/10.5067/2E096JV59PK7) \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/merra/MERRA2_Ozone_Mixing_Ratio_50hPa_Monthly.md b/config/default/common/config/metadata/layers/merra/MERRA2_Ozone_Mixing_Ratio_50hPa_Monthly.md index e4233f4d6e..9bb8b18171 100644 --- a/config/default/common/config/metadata/layers/merra/MERRA2_Ozone_Mixing_Ratio_50hPa_Monthly.md +++ b/config/default/common/config/metadata/layers/merra/MERRA2_Ozone_Mixing_Ratio_50hPa_Monthly.md @@ -1,3 +1,3 @@ -The Ozone Mixing Ratio at 500hPa (Monthly) layer is created from the M2IMNPANA data collection. M2IMNPANA (or instM_3d_ana_Np) is an instantaneous 3-dimensional monthly mean data collection in Modern-Era Retrospective analysis for Research and Applications version 2 (MERRA-2). This collection consists of analyzed meteorological fields at 42 pressure levels, such as temperature, wind components, specific humidity, ozone mixing ratio, and geopotential height. The information on the pressure levels can be found in the section 4.2 of the MERRA-2 File Specification document. The collection also includes certain quadratic information (such as the variance and covariance of certain parameters). MERRA-2 is the latest version of global atmospheric reanalysis for the satellite era produced by NASA Global Modeling and Assimilation Office (GMAO) using the Goddard Earth Observing System Model (GEOS) version 5.12.4. +The Ozone Mixing Ratio at 50hPa (Monthly) layer is created from the M2IMNPANA data collection. M2IMNPANA (or instM_3d_ana_Np) is an instantaneous 3-dimensional monthly mean data collection in Modern-Era Retrospective analysis for Research and Applications version 2 (MERRA-2). This collection consists of analyzed meteorological fields at 42 pressure levels, such as temperature, wind components, specific humidity, ozone mixing ratio, and geopotential height. The information on the pressure levels can be found in the section 4.2 of the MERRA-2 File Specification document. The collection also includes certain quadratic information (such as the variance and covariance of certain parameters). MERRA-2 is the latest version of global atmospheric reanalysis for the satellite era produced by NASA Global Modeling and Assimilation Office (GMAO) using the Goddard Earth Observing System Model (GEOS) version 5.12.4. References: M2IMNPANA [doi:10.5067/V92O8XZ30XBI](https://doi.org/10.5067/V92O8XZ30XBI) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 5b6ec589e0..8b52d03b3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "worldview", - "version": "4.8.0", + "version": "4.9.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "worldview", - "version": "4.8.0", + "version": "4.9.0", "hasInstallScript": true, "license": "NASA-1.3", "dependencies": { @@ -53,11 +53,11 @@ "react-infinite-scroller": "^1.2.6", "react-joyride": "^2.5.4", "react-mobile-datepicker": "^4.0.2", - "react-redux": "^8.0.7", + "react-redux": "^8.1.1", "react-resizable": "^3.0.5", "react-swipe-to-delete-component": "1.0.5", "react-visibility-sensor": "^5.1.1", - "reactstrap": "^9.1.10", + "reactstrap": "^9.2.0", "redux": "^4.2.1", "redux-location-state": "^2.8.2", "redux-logger": "^3.0.6", @@ -73,12 +73,12 @@ "what-input": "^5.2.12" }, "devDependencies": { - "@babel/core": "^7.22.1", - "@babel/eslint-parser": "^7.21.8", + "@babel/core": "^7.22.5", + "@babel/eslint-parser": "^7.22.5", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/preset-env": "^7.22.5", "@babel/preset-react": "^7.22.5", - "@playwright/test": "^1.35.0", + "@playwright/test": "^1.35.1", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10", "@webpack-cli/serve": "^2.0.5", "ajv": "^8.12.0", @@ -89,17 +89,17 @@ "clean-webpack-plugin": "^4.0.0", "cross-env": "^7.0.3", "css-loader": "^6.8.1", - "css-minimizer-webpack-plugin": "^5.0.0", + "css-minimizer-webpack-plugin": "^5.0.1", "css-url-relative-plugin": "^1.1.0", "cssnano": "^6.0.1", - "eslint": "^8.42.0", + "eslint": "^8.43.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-standard": "^17.1.0", "eslint-import-resolver-webpack": "^0.13.2", "eslint-plugin-import": "^2.27.5", - "eslint-plugin-jest": "^27.2.1", + "eslint-plugin-jest": "^27.2.2", "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-n": "^15.7.0", + "eslint-plugin-n": "^16.0.0", "eslint-plugin-no-storage": "^1.0.2", "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^6.1.1", @@ -107,7 +107,7 @@ "eslint-plugin-standard": "^5.0.0", "express": "^4.18.2", "fetch-mock": "^9.11.0", - "glob": "^10.2.7", + "glob": "^10.3.0", "husky": "^8.0.3", "jest": "^29.5.0", "jest-canvas-mock": "^2.5.1", @@ -119,25 +119,25 @@ "npm-run-all": "^4.1.5", "patch-package": "^7.0.0", "postcss": "^8.4.24", - "postcss-loader": "^7.3.1", + "postcss-loader": "^7.3.3", "react-refresh": "^0.14.0", "react-test-renderer": "^17.0.2", "redux-mock-store": "^1.5.4", "run-script-os": "^1.1.6", - "sass": "^1.62.1", - "sass-loader": "^13.3.0", + "sass": "^1.63.6", + "sass-loader": "^13.3.2", "shelljs": "^0.8.5", "showdown": "^2.1.0", - "stylelint": "^15.7.0", + "stylelint": "^15.8.0", "stylelint-config-standard-scss": "^9.0.0", "stylelint-high-performance-animation": "^1.8.0", "tar": "^6.1.15", "terser-webpack-plugin": "^5.3.9", - "webpack": "^5.86.0", + "webpack": "^5.88.0", "webpack-bundle-analyzer": "^4.9.0", "webpack-cli": "^5.1.4", "webpack-dev-middleware": "^6.1.1", - "webpack-dev-server": "^4.15.0", + "webpack-dev-server": "^4.15.1", "xml-js": "^1.6.11", "xml2js": "^0.6.0", "yargs": "^17.7.2" @@ -177,20 +177,21 @@ } }, "node_modules/@babel/core": { - "version": "7.22.1", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", "dev": true, - "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.22.0", - "@babel/helper-compilation-targets": "^7.22.1", - "@babel/helper-module-transforms": "^7.22.1", - "@babel/helpers": "^7.22.0", - "@babel/parser": "^7.22.0", - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -206,9 +207,10 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.21.8", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.5.tgz", + "integrity": "sha512-C69RWYNYtrgIRE5CmTd77ZiLDXqgBipahJc/jHP3sLcAGj6AJzxNIuKNpVnICqbyK7X3pFUfEvL++rvtbQpZkQ==", "dev": true, - "license": "MIT", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", @@ -548,13 +550,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.22.3", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", + "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.3" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2140,8 +2143,9 @@ "license": "MIT" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.2.0", - "license": "MIT", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -2160,8 +2164,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.4.0", - "license": "MIT", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -2229,8 +2234,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.42.0", - "license": "MIT", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.43.0.tgz", + "integrity": "sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -3187,8 +3193,9 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "license": "MIT", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -3288,12 +3295,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.35.0", + "version": "1.35.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.35.1.tgz", + "integrity": "sha512-b5YoFe6J9exsMYg0pQAobNDR85T1nLumUYgUTtKm4d21iX2L7WqKq9dW8NGJ+2vX0etZd+Y7UeuqsxDXm9+5ZA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@types/node": "*", - "playwright-core": "1.35.0" + "playwright-core": "1.35.1" }, "bin": { "playwright": "cli.js" @@ -3793,9 +3801,10 @@ "license": "MIT" }, "node_modules/@types/ws": { - "version": "8.5.3", + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -5773,16 +5782,17 @@ } }, "node_modules/css-minimizer-webpack-plugin": { - "version": "5.0.0", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", "dev": true, - "license": "MIT", "dependencies": { - "cssnano": "^6.0.0", + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", "jest-worker": "^29.4.3", - "postcss": "^8.4.21", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.1", - "source-map": "^0.6.1" + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" }, "engines": { "node": ">= 14.15.0" @@ -5816,14 +5826,15 @@ } }, "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -5833,14 +5844,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/css-select": { "version": "5.1.0", "dev": true, @@ -6740,13 +6743,14 @@ } }, "node_modules/eslint": { - "version": "8.42.0", - "license": "MIT", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.43.0.tgz", + "integrity": "sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.42.0", + "@eslint/js": "8.43.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -6960,6 +6964,25 @@ "eslint": ">=4.19.1" } }, + "node_modules/eslint-plugin-es-x": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.1.0.tgz", + "integrity": "sha512-AhiaF31syh4CCQ+C5ccJA0VG6+kJK8+5mXKKE7Qs1xcPRg02CDPOj3mWlQxuWS/AYtg7kxrDNgW9YW3vc0Q+Mw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, "node_modules/eslint-plugin-import": { "version": "2.27.5", "dev": true, @@ -7008,9 +7031,10 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "27.2.1", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.2.tgz", + "integrity": "sha512-euzbp06F934Z7UDl5ZUaRPLAc9MKjh0rMPERrHT7UhlCEwgb25kBj37TvMgWeHZVkR5I9CayswrpoaqZU1RImw==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/utils": "^5.10.0" }, @@ -7019,7 +7043,8 @@ }, "peerDependencies": { "@typescript-eslint/eslint-plugin": "^5.0.0", - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0", + "jest": "*" }, "peerDependenciesMeta": { "@typescript-eslint/eslint-plugin": { @@ -7060,21 +7085,22 @@ } }, "node_modules/eslint-plugin-n": { - "version": "15.7.0", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.1.tgz", + "integrity": "sha512-CDmHegJN0OF3L5cz5tATH84RPQm9kG+Yx39wIqIwPR2C0uhBGMWfbbOtetR83PQjjidA5aXMu+LEFw1jaSwvTA==", "dev": true, - "license": "MIT", "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", + "eslint-plugin-es-x": "^7.1.0", + "ignore": "^5.2.4", + "is-core-module": "^2.12.1", "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" + "resolve": "^1.22.2", + "semver": "^7.5.3" }, "engines": { - "node": ">=12.22.0" + "node": ">=16.0.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" @@ -7083,67 +7109,11 @@ "eslint": ">=7.0.0" } }, - "node_modules/eslint-plugin-n/node_modules/eslint-plugin-es": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-n/node_modules/eslint-plugin-es/node_modules/eslint-utils": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-plugin-n/node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-n/node_modules/eslint-utils": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, "node_modules/eslint-plugin-n/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -8029,8 +7999,10 @@ }, "node_modules/fsevents": { "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, - "license": "MIT", + "hasInstallScript": true, "optional": true, "os": [ "darwin" @@ -8165,15 +8137,16 @@ } }, "node_modules/glob": { - "version": "10.2.7", + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.1.tgz", + "integrity": "sha512-9BKYcEeIs7QwlCYs+Y3GBvqAMISufUS0i2ELd11zpZjxI5V9iyRj0HgzB5/cLf2NY4vcYBTYzJ7GIui7j/4DOw==", "dev": true, - "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.7.0" + "path-scurry": "^1.10.0" }, "bin": { "glob": "dist/cjs/src/bin.js" @@ -8886,8 +8859,9 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "license": "MIT", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dependencies": { "has": "^1.0.3" }, @@ -11137,14 +11111,6 @@ "node": ">=6" } }, - "node_modules/klona": { - "version": "2.0.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/known-css-properties": { "version": "0.27.0", "dev": true, @@ -12584,12 +12550,13 @@ "license": "MIT" }, "node_modules/path-scurry": { - "version": "1.7.0", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.0.tgz", + "integrity": "sha512-tZFEaRQbMLjwrsmidsGJ6wDMv0iazJWk6SfIKnY4Xru8auXgmJkOBa5DUbYFcFD2Rzk2+KDlIiF0GVXNCbgC7g==", "dev": true, - "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^9.0.0", - "minipass": "^5.0.0" + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -12599,19 +12566,21 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "9.1.1", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", "dev": true, - "license": "ISC", "engines": { "node": "14 || >=16.14" } }, "node_modules/path-scurry/node_modules/minipass": { - "version": "5.0.0", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", + "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", "dev": true, - "license": "ISC", "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/path-to-regexp": { @@ -12758,9 +12727,10 @@ } }, "node_modules/playwright-core": { - "version": "1.35.0", + "version": "1.35.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.35.1.tgz", + "integrity": "sha512-pNXb6CQ7OqmGDRspEjlxE49w+4YtR6a3X6mT1hZXeJHWmsEz7SunmvZeiG/+y1yyMZdHnnn73WKYdtV1er0Xyg==", "dev": true, - "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, @@ -12895,13 +12865,13 @@ } }, "node_modules/postcss-loader": { - "version": "7.3.2", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", + "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", "dev": true, - "license": "MIT", "dependencies": { - "cosmiconfig": "^8.1.3", + "cosmiconfig": "^8.2.0", "jiti": "^1.18.2", - "klona": "^2.0.6", "semver": "^7.3.8" }, "engines": { @@ -12917,9 +12887,10 @@ } }, "node_modules/postcss-loader/node_modules/cosmiconfig": { - "version": "8.1.3", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", "dev": true, - "license": "MIT", "dependencies": { "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -12935,8 +12906,9 @@ }, "node_modules/postcss-loader/node_modules/parse-json": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -13791,8 +13763,9 @@ "license": "MIT" }, "node_modules/react-redux": { - "version": "8.0.7", - "license": "MIT", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.1.tgz", + "integrity": "sha512-5W0QaKtEhj+3bC0Nj0NkqkhIv8gLADH/2kYFMTHxCVqQILiWzLv6MaLuV5wJU3BQEdHKzTfcvPN0WMS6SC1oyA==", "dependencies": { "@babel/runtime": "^7.12.1", "@types/hoist-non-react-statics": "^3.3.1", @@ -13802,7 +13775,6 @@ "use-sync-external-store": "^1.0.0" }, "peerDependencies": { - "@reduxjs/toolkit": "^1 || ^2.0.0-beta.0", "@types/react": "^16.8 || ^17.0 || ^18.0", "@types/react-dom": "^16.8 || ^17.0 || ^18.0", "react": "^16.8 || ^17.0 || ^18.0", @@ -13811,9 +13783,6 @@ "redux": "^4 || ^5.0.0-beta.0" }, "peerDependenciesMeta": { - "@reduxjs/toolkit": { - "optional": true - }, "@types/react": { "optional": true }, @@ -13952,8 +13921,9 @@ } }, "node_modules/reactstrap": { - "version": "9.1.10", - "license": "MIT", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/reactstrap/-/reactstrap-9.2.0.tgz", + "integrity": "sha512-WWLTEG00qYav0E55PorWHReYTkz5IqkVmQNy0h6U81yqjSp9fOLFGV5pYSVeAUz+yRhU/RTE0oAWy22zr6sOIw==", "dependencies": { "@babel/runtime": "^7.12.5", "@popperjs/core": "^2.6.0", @@ -14365,10 +14335,11 @@ "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.1", - "license": "MIT", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -14527,9 +14498,10 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.62.1", + "version": "1.63.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.63.6.tgz", + "integrity": "sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw==", "dev": true, - "license": "MIT", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -14543,11 +14515,11 @@ } }, "node_modules/sass-loader": { - "version": "13.3.1", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", + "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", "dev": true, - "license": "MIT", "dependencies": { - "klona": "^2.0.6", "neo-async": "^2.6.2" }, "engines": { @@ -14612,8 +14584,9 @@ } }, "node_modules/schema-utils": { - "version": "3.1.2", - "license": "MIT", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -15454,9 +15427,10 @@ } }, "node_modules/stylelint": { - "version": "15.7.0", + "version": "15.9.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.9.0.tgz", + "integrity": "sha512-sXtAZi64CllWr6A+8ymDWnlIaYwuAa7XRmGnJxLQXFNnLjd3Izm4HAD+loKVaZ7cpK6SLxhAUX1lwPJKGCn0mg==", "dev": true, - "license": "MIT", "dependencies": { "@csstools/css-parser-algorithms": "^2.2.0", "@csstools/css-tokenizer": "^2.1.1", @@ -15498,7 +15472,6 @@ "supports-hyperlinks": "^3.0.0", "svg-tags": "^1.0.0", "table": "^6.8.1", - "v8-compile-cache": "^2.3.0", "write-file-atomic": "^5.0.1" }, "bin": { @@ -16381,11 +16354,6 @@ "node": "*" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "dev": true, - "license": "MIT" - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "dev": true, @@ -16473,8 +16441,9 @@ } }, "node_modules/webpack": { - "version": "5.86.0", - "license": "MIT", + "version": "5.88.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.0.tgz", + "integrity": "sha512-O3jDhG5e44qIBSi/P6KpcCcH7HD+nYIHVBhdWFxcLOcIGN8zGo5nqF3BjyNCxIh4p1vFdNnreZv2h2KkoAw3lw==", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -16485,7 +16454,7 @@ "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.14.1", + "enhanced-resolve": "^5.15.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -16495,7 +16464,7 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.2", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", @@ -16721,9 +16690,10 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.15.0", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dev": true, - "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -16731,7 +16701,7 @@ "@types/serve-index": "^1.9.1", "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", + "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", @@ -16882,8 +16852,9 @@ } }, "node_modules/webpack/node_modules/enhanced-resolve": { - "version": "5.14.1", - "license": "MIT", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -16894,7 +16865,8 @@ }, "node_modules/webpack/node_modules/tapable": { "version": "2.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "engines": { "node": ">=6" } @@ -17309,19 +17281,21 @@ "dev": true }, "@babel/core": { - "version": "7.22.1", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.22.0", - "@babel/helper-compilation-targets": "^7.22.1", - "@babel/helper-module-transforms": "^7.22.1", - "@babel/helpers": "^7.22.0", - "@babel/parser": "^7.22.0", - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -17330,7 +17304,9 @@ } }, "@babel/eslint-parser": { - "version": "7.21.8", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.5.tgz", + "integrity": "sha512-C69RWYNYtrgIRE5CmTd77ZiLDXqgBipahJc/jHP3sLcAGj6AJzxNIuKNpVnICqbyK7X3pFUfEvL++rvtbQpZkQ==", "dev": true, "requires": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -17554,12 +17530,14 @@ } }, "@babel/helpers": { - "version": "7.22.3", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", + "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", "dev": true, "requires": { - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.3" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/highlight": { @@ -18495,7 +18473,9 @@ "version": "0.3.0" }, "@eslint-community/eslint-utils": { - "version": "4.2.0", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "requires": { "eslint-visitor-keys": "^3.3.0" }, @@ -18506,7 +18486,9 @@ } }, "@eslint-community/regexpp": { - "version": "4.4.0" + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==" }, "@eslint/eslintrc": { "version": "2.0.3", @@ -18546,7 +18528,9 @@ } }, "@eslint/js": { - "version": "8.42.0" + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.43.0.tgz", + "integrity": "sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==" }, "@floating-ui/core": { "version": "1.2.6" @@ -19163,7 +19147,9 @@ "version": "1.4.14" }, "@jridgewell/trace-mapping": { - "version": "0.3.17", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "requires": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -19231,12 +19217,14 @@ "optional": true }, "@playwright/test": { - "version": "1.35.0", + "version": "1.35.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.35.1.tgz", + "integrity": "sha512-b5YoFe6J9exsMYg0pQAobNDR85T1nLumUYgUTtKm4d21iX2L7WqKq9dW8NGJ+2vX0etZd+Y7UeuqsxDXm9+5ZA==", "dev": true, "requires": { "@types/node": "*", "fsevents": "2.3.2", - "playwright-core": "1.35.0" + "playwright-core": "1.35.1" } }, "@pmmmwh/react-refresh-webpack-plugin": { @@ -19616,7 +19604,9 @@ "version": "0.0.3" }, "@types/ws": { - "version": "8.5.3", + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", "dev": true, "requires": { "@types/node": "*" @@ -20886,30 +20876,30 @@ } }, "css-minimizer-webpack-plugin": { - "version": "5.0.0", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", "dev": true, "requires": { - "cssnano": "^6.0.0", + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", "jest-worker": "^29.4.3", - "postcss": "^8.4.21", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.1", - "source-map": "^0.6.1" + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" }, "dependencies": { "schema-utils": { - "version": "4.0.0", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" } - }, - "source-map": { - "version": "0.6.1", - "dev": true } } }, @@ -21508,12 +21498,14 @@ } }, "eslint": { - "version": "8.42.0", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.43.0.tgz", + "integrity": "sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==", "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.42.0", + "@eslint/js": "8.43.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -21720,6 +21712,16 @@ "regexpp": "^3.0.0" } }, + "eslint-plugin-es-x": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.1.0.tgz", + "integrity": "sha512-AhiaF31syh4CCQ+C5ccJA0VG6+kJK8+5mXKKE7Qs1xcPRg02CDPOj3mWlQxuWS/AYtg7kxrDNgW9YW3vc0Q+Mw==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.5.0" + } + }, "eslint-plugin-import": { "version": "2.27.5", "dev": true, @@ -21758,7 +21760,9 @@ } }, "eslint-plugin-jest": { - "version": "27.2.1", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.2.tgz", + "integrity": "sha512-euzbp06F934Z7UDl5ZUaRPLAc9MKjh0rMPERrHT7UhlCEwgb25kBj37TvMgWeHZVkR5I9CayswrpoaqZU1RImw==", "dev": true, "requires": { "@typescript-eslint/utils": "^5.10.0" @@ -21787,49 +21791,25 @@ } }, "eslint-plugin-n": { - "version": "15.7.0", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.1.tgz", + "integrity": "sha512-CDmHegJN0OF3L5cz5tATH84RPQm9kG+Yx39wIqIwPR2C0uhBGMWfbbOtetR83PQjjidA5aXMu+LEFw1jaSwvTA==", "dev": true, "requires": { + "@eslint-community/eslint-utils": "^4.4.0", "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", + "eslint-plugin-es-x": "^7.1.0", + "ignore": "^5.2.4", + "is-core-module": "^2.12.1", "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" + "resolve": "^1.22.2", + "semver": "^7.5.3" }, "dependencies": { - "eslint-plugin-es": { - "version": "4.1.0", - "dev": true, - "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "dev": true - } - } - }, - "eslint-utils": { - "version": "3.0.0", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - }, "semver": { - "version": "7.3.8", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -22288,6 +22268,8 @@ }, "fsevents": { "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -22367,14 +22349,16 @@ } }, "glob": { - "version": "10.2.7", + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.1.tgz", + "integrity": "sha512-9BKYcEeIs7QwlCYs+Y3GBvqAMISufUS0i2ELd11zpZjxI5V9iyRj0HgzB5/cLf2NY4vcYBTYzJ7GIui7j/4DOw==", "dev": true, "requires": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.7.0" + "path-scurry": "^1.10.0" }, "dependencies": { "brace-expansion": { @@ -22789,7 +22773,9 @@ "dev": true }, "is-core-module": { - "version": "2.11.0", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "requires": { "has": "^1.0.3" } @@ -24198,10 +24184,6 @@ "version": "3.0.3", "dev": true }, - "klona": { - "version": "2.0.6", - "dev": true - }, "known-css-properties": { "version": "0.27.0", "dev": true @@ -25095,19 +25077,25 @@ "version": "1.0.7" }, "path-scurry": { - "version": "1.7.0", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.0.tgz", + "integrity": "sha512-tZFEaRQbMLjwrsmidsGJ6wDMv0iazJWk6SfIKnY4Xru8auXgmJkOBa5DUbYFcFD2Rzk2+KDlIiF0GVXNCbgC7g==", "dev": true, "requires": { - "lru-cache": "^9.0.0", - "minipass": "^5.0.0" + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2" }, "dependencies": { "lru-cache": { - "version": "9.1.1", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", "dev": true }, "minipass": { - "version": "5.0.0", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", + "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", "dev": true } } @@ -25195,7 +25183,9 @@ } }, "playwright-core": { - "version": "1.35.0", + "version": "1.35.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.35.1.tgz", + "integrity": "sha512-pNXb6CQ7OqmGDRspEjlxE49w+4YtR6a3X6mT1hZXeJHWmsEz7SunmvZeiG/+y1yyMZdHnnn73WKYdtV1er0Xyg==", "dev": true }, "popper.js": { @@ -25257,17 +25247,20 @@ "requires": {} }, "postcss-loader": { - "version": "7.3.2", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", + "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", "dev": true, "requires": { - "cosmiconfig": "^8.1.3", + "cosmiconfig": "^8.2.0", "jiti": "^1.18.2", - "klona": "^2.0.6", "semver": "^7.3.8" }, "dependencies": { "cosmiconfig": { - "version": "8.1.3", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", "dev": true, "requires": { "import-fresh": "^3.2.1", @@ -25278,6 +25271,8 @@ }, "parse-json": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -25769,7 +25764,9 @@ "version": "1.0.4" }, "react-redux": { - "version": "8.0.7", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.1.tgz", + "integrity": "sha512-5W0QaKtEhj+3bC0Nj0NkqkhIv8gLADH/2kYFMTHxCVqQILiWzLv6MaLuV5wJU3BQEdHKzTfcvPN0WMS6SC1oyA==", "requires": { "@babel/runtime": "^7.12.1", "@types/hoist-non-react-statics": "^3.3.1", @@ -25863,7 +25860,9 @@ } }, "reactstrap": { - "version": "9.1.10", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/reactstrap/-/reactstrap-9.2.0.tgz", + "integrity": "sha512-WWLTEG00qYav0E55PorWHReYTkz5IqkVmQNy0h6U81yqjSp9fOLFGV5pYSVeAUz+yRhU/RTE0oAWy22zr6sOIw==", "requires": { "@babel/runtime": "^7.12.5", "@popperjs/core": "^2.6.0", @@ -26149,9 +26148,11 @@ "version": "4.1.8" }, "resolve": { - "version": "1.22.1", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -26240,7 +26241,9 @@ "dev": true }, "sass": { - "version": "1.62.1", + "version": "1.63.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.63.6.tgz", + "integrity": "sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", @@ -26249,10 +26252,11 @@ } }, "sass-loader": { - "version": "13.3.1", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", + "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", "dev": true, "requires": { - "klona": "^2.0.6", "neo-async": "^2.6.2" } }, @@ -26279,7 +26283,9 @@ } }, "schema-utils": { - "version": "3.1.2", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "requires": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -26859,7 +26865,9 @@ } }, "stylelint": { - "version": "15.7.0", + "version": "15.9.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.9.0.tgz", + "integrity": "sha512-sXtAZi64CllWr6A+8ymDWnlIaYwuAa7XRmGnJxLQXFNnLjd3Izm4HAD+loKVaZ7cpK6SLxhAUX1lwPJKGCn0mg==", "dev": true, "requires": { "@csstools/css-parser-algorithms": "^2.2.0", @@ -26902,7 +26910,6 @@ "supports-hyperlinks": "^3.0.0", "svg-tags": "^1.0.0", "table": "^6.8.1", - "v8-compile-cache": "^2.3.0", "write-file-atomic": "^5.0.1" }, "dependencies": { @@ -27417,10 +27424,6 @@ "uuid-v4": { "version": "0.1.0" }, - "v8-compile-cache": { - "version": "2.3.0", - "dev": true - }, "v8-compile-cache-lib": { "version": "3.0.1", "dev": true, @@ -27485,7 +27488,9 @@ "dev": true }, "webpack": { - "version": "5.86.0", + "version": "5.88.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.0.tgz", + "integrity": "sha512-O3jDhG5e44qIBSi/P6KpcCcH7HD+nYIHVBhdWFxcLOcIGN8zGo5nqF3BjyNCxIh4p1vFdNnreZv2h2KkoAw3lw==", "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -27496,7 +27501,7 @@ "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.14.1", + "enhanced-resolve": "^5.15.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -27506,7 +27511,7 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.2", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", @@ -27514,14 +27519,18 @@ }, "dependencies": { "enhanced-resolve": { - "version": "5.14.1", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "tapable": { - "version": "2.2.1" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" } } }, @@ -27640,7 +27649,9 @@ } }, "webpack-dev-server": { - "version": "4.15.0", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", @@ -27649,7 +27660,7 @@ "@types/serve-index": "^1.9.1", "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", + "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", diff --git a/package.json b/package.json index b860ff0959..8815ee7b82 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "worldview", - "version": "4.8.0", + "version": "4.9.0", "description": "Interactive interface for browsing full-resolution, global satellite imagery", "keywords": [ "NASA", @@ -75,12 +75,12 @@ "upload": "node tasks/util/upload.js" }, "devDependencies": { - "@babel/core": "^7.22.1", - "@babel/eslint-parser": "^7.21.8", + "@babel/core": "^7.22.5", + "@babel/eslint-parser": "^7.22.5", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/preset-env": "^7.22.5", "@babel/preset-react": "^7.22.5", - "@playwright/test": "^1.35.0", + "@playwright/test": "^1.35.1", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10", "@webpack-cli/serve": "^2.0.5", "ajv": "^8.12.0", @@ -91,17 +91,17 @@ "clean-webpack-plugin": "^4.0.0", "cross-env": "^7.0.3", "css-loader": "^6.8.1", - "css-minimizer-webpack-plugin": "^5.0.0", + "css-minimizer-webpack-plugin": "^5.0.1", "css-url-relative-plugin": "^1.1.0", "cssnano": "^6.0.1", - "eslint": "^8.42.0", + "eslint": "^8.43.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-standard": "^17.1.0", "eslint-import-resolver-webpack": "^0.13.2", "eslint-plugin-import": "^2.27.5", - "eslint-plugin-jest": "^27.2.1", + "eslint-plugin-jest": "^27.2.2", "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-n": "^15.7.0", + "eslint-plugin-n": "^16.0.0", "eslint-plugin-no-storage": "^1.0.2", "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^6.1.1", @@ -109,7 +109,7 @@ "eslint-plugin-standard": "^5.0.0", "express": "^4.18.2", "fetch-mock": "^9.11.0", - "glob": "^10.2.7", + "glob": "^10.3.0", "husky": "^8.0.3", "jest": "^29.5.0", "jest-canvas-mock": "^2.5.1", @@ -121,25 +121,25 @@ "npm-run-all": "^4.1.5", "patch-package": "^7.0.0", "postcss": "^8.4.24", - "postcss-loader": "^7.3.1", + "postcss-loader": "^7.3.3", "react-refresh": "^0.14.0", "react-test-renderer": "^17.0.2", "redux-mock-store": "^1.5.4", "run-script-os": "^1.1.6", - "sass": "^1.62.1", - "sass-loader": "^13.3.0", + "sass": "^1.63.6", + "sass-loader": "^13.3.2", "shelljs": "^0.8.5", "showdown": "^2.1.0", - "stylelint": "^15.7.0", + "stylelint": "^15.8.0", "stylelint-config-standard-scss": "^9.0.0", "stylelint-high-performance-animation": "^1.8.0", "tar": "^6.1.15", "terser-webpack-plugin": "^5.3.9", - "webpack": "^5.86.0", + "webpack": "^5.88.0", "webpack-bundle-analyzer": "^4.9.0", "webpack-cli": "^5.1.4", "webpack-dev-middleware": "^6.1.1", - "webpack-dev-server": "^4.15.0", + "webpack-dev-server": "^4.15.1", "xml-js": "^1.6.11", "xml2js": "^0.6.0", "yargs": "^17.7.2" @@ -188,11 +188,11 @@ "react-infinite-scroller": "^1.2.6", "react-joyride": "^2.5.4", "react-mobile-datepicker": "^4.0.2", - "react-redux": "^8.0.7", + "react-redux": "^8.1.1", "react-resizable": "^3.0.5", "react-swipe-to-delete-component": "1.0.5", "react-visibility-sensor": "^5.1.1", - "reactstrap": "^9.1.10", + "reactstrap": "^9.2.0", "redux": "^4.2.1", "redux-location-state": "^2.8.2", "redux-logger": "^3.0.6", diff --git a/tasks/build-options/processTemporalLayer.js b/tasks/build-options/processTemporalLayer.js index ca049dc3b4..667f2c9ade 100644 --- a/tasks/build-options/processTemporalLayer.js +++ b/tasks/build-options/processTemporalLayer.js @@ -49,11 +49,18 @@ async function processTemporalLayer (wvLayer, value) { endDate = moment(end, dateFormat).format('YYYY-MM-DDTHH:mm:ss[Z]') } if (interval !== 'P1D') { - endDate = moment(endDate).add(moment.duration(interval)).format('YYYY-MM-DDTHH:mm:ss[Z]') + endDate = moment.utc(endDate).add(moment.duration(interval)).format('YYYY-MM-DDTHH:mm:ss[Z]') + // For monthly products subtract 1 day + if (wvLayer.period === 'monthly') { + endDate = moment.utc(endDate).subtract(1, 'day').format('YYYY-MM-DDTHH:mm:ss[Z]') + } } const regex = new RegExp(/\d+/g) const match = regex.exec(interval) rangeInterval.push(match) + if (endDate.endsWith('T00:00:00Z')) { + endDate = endDate.replace('T00:00:00Z', 'T23:59:59Z') + } dateRangeEnd.push(endDate) } else { // Subdaily Layers diff --git a/tasks/link-check/html-url-extract.js b/tasks/link-check/html-url-extract.js index 2f875891e8..1550902f1b 100644 --- a/tasks/link-check/html-url-extract.js +++ b/tasks/link-check/html-url-extract.js @@ -49,7 +49,7 @@ const getUrls = (htmlArray) => { // get URLS from HTML files // scraped URLs are saved in an array of objects with a key value pair of link text and href: -// 'Wildfire MB-CE042, Manitoba, Canada': 'https://eonet.gsfc.nasa.gov/api/v2.1/events/EONET_3518' +// 'Wildfire MB-CE042, Manitoba, Canada': 'https://eonet.gsfc.nasa.gov/api/v3/events/EONET_3518' const initExtractor = async () => { // any html file with a url will be scraped and added const htmlFiles = await walk('./build/options') diff --git a/tasks/link-check/natural-event-url-extract.js b/tasks/link-check/natural-event-url-extract.js index 7b72997f98..b2b5b88184 100644 --- a/tasks/link-check/natural-event-url-extract.js +++ b/tasks/link-check/natural-event-url-extract.js @@ -62,12 +62,12 @@ const scrapeLinks = async (htmlLinks) => { // get URLs from natural events EONET // scraped URLs are saved in an array of objects with a key value pair of link text and href: -// 'Wildfire MB-CE042, Manitoba, Canada': 'https://eonet.gsfc.nasa.gov/api/v2.1/events/EONET_3518' +// 'Wildfire MB-CE042, Manitoba, Canada': 'https://eonet.gsfc.nasa.gov/api/v3/events/EONET_3518' const initExtractor = async () => { // target EONET sources from natural events - const links = ['https://eonet.gsfc.nasa.gov/api/v2.1/sources', - 'https://eonet.gsfc.nasa.gov/api/v2.1/events', - 'https://eonet.gsfc.nasa.gov/api/v2.1/categories'] + const links = ['https://eonet.gsfc.nasa.gov/api/v3/sources', + 'https://eonet.gsfc.nasa.gov/api/v3/events', + 'https://eonet.gsfc.nasa.gov/api/v3/categories'] const results = await scrapeLinks(links) return results } diff --git a/web/js/components/layer/settings/layer-settings.js b/web/js/components/layer/settings/layer-settings.js index f1bb12df7c..b4f182ffb7 100644 --- a/web/js/components/layer/settings/layer-settings.js +++ b/web/js/components/layer/settings/layer-settings.js @@ -340,13 +340,16 @@ class LayerSettings extends React.Component { } = this.props; const hasAssociatedLayers = layer.associatedLayers && layer.associatedLayers.length; const hasTracks = layer.orbitTracks && layer.orbitTracks.length; + const layerGroup = layer.layergroup; if (layer.type !== 'vector') { renderCustomizations = customPalettesIsActive && palettedAllowed && layer.palette ? this.renderCustomPalettes() : ''; - } else { - renderCustomizations = ''; // this.renderVectorStyles(); for future + } else if (layerGroup !== 'Orbital Track' && layerGroup !== 'Reference') { + // Orbital Tracks palette swap looks bad at WMS zoom levels (white text stamps) + // Reference (MGRS/HLS Grid) has no need for palettes + renderCustomizations = this.renderCustomPalettes(); } if (!layer.id) return ''; diff --git a/web/js/components/timeline/timeline-controls/date-change-arrows.js b/web/js/components/timeline/timeline-controls/date-change-arrows.js index 32c2278ae4..71adbf00b6 100644 --- a/web/js/components/timeline/timeline-controls/date-change-arrows.js +++ b/web/js/components/timeline/timeline-controls/date-change-arrows.js @@ -27,11 +27,6 @@ class DateChangeArrows extends PureComponent { }; } - componentDidMount() { - document.addEventListener('keydown', this.handleKeyDown); - document.addEventListener('keyup', this.handleKeyUp); - } - componentDidUpdate (prevProps) { const { tilesPreloaded, arrowDown } = this.props; const notAnimating = !intervals.left && !intervals.right; @@ -45,8 +40,6 @@ class DateChangeArrows extends PureComponent { componentWillUnmount() { clearInterval(intervals.left); clearInterval(intervals.right); - document.removeEventListener('keydown', this.handleKeyDown); - document.removeEventListener('keyup', this.handleKeyUp); } clickAndHold = (direction) => { @@ -55,26 +48,6 @@ class DateChangeArrows extends PureComponent { arrowDownCheckTimer = null; }; - handleKeyDown = (e) => { - const { arrowDown } = this.props; - const direction = e.keyCode === 37 ? 'left' : e.keyCode === 39 ? 'right' : null; - if (e.target.tagName === 'INPUT' || e.target.className === 'form-range' || e.ctrlKey || e.metaKey) { - return; - } - if (direction) { - e.preventDefault(); - if (!arrowDown) this.onArrowDown(direction); - } - }; - - handleKeyUp = (e) => { - const direction = e.keyCode === 37 ? 'left' : e.keyCode === 39 ? 'right' : null; - if (direction) { - e.preventDefault(); - this.onArrowUp(direction); - } - }; - onArrowDown = (direction) => { this.arrowDownMap[direction](); arrowDownCheckTimer = setTimeout(() => { diff --git a/web/js/containers/timeline/timeline.js b/web/js/containers/timeline/timeline.js index 67cedd84f9..161e6a4121 100644 --- a/web/js/containers/timeline/timeline.js +++ b/web/js/containers/timeline/timeline.js @@ -515,17 +515,23 @@ class Timeline extends React.Component { if (e.target.tagName !== 'INPUT' && e.target.className !== 'form-range' && !e.ctrlKey && !e.metaKey && !isTimelineDragging) { const timeScaleNumber = Number(TIME_SCALE_TO_NUMBER[timeScale]); const maxTimeScaleNumber = hasSubdailyLayers ? 5 : 3; - if (e.keyCode === 38) { + if (e.key === 'ArrowUp') { e.preventDefault(); if (timeScaleNumber > 1) { this.changeTimeScale(timeScaleNumber - 1); } // down arrow - } else if (e.keyCode === 40) { + } else if (e.key === 'ArrowDown') { e.preventDefault(); if (timeScaleNumber < maxTimeScaleNumber) { this.changeTimeScale(timeScaleNumber + 1); } + } else if (e.key === 'ArrowLeft') { + e.preventDefault(); + this.handleArrowDateChange(-1); + } else if (e.key === 'ArrowRight') { + e.preventDefault(); + this.handleArrowDateChange(1); } } }; diff --git a/web/js/modules/palettes/actions.js b/web/js/modules/palettes/actions.js index bf4d10a977..931c2bb9e7 100644 --- a/web/js/modules/palettes/actions.js +++ b/web/js/modules/palettes/actions.js @@ -172,11 +172,14 @@ export function setToggledClassification(layerId, classIndex, index, groupName) state, ); let hasDisabled = false; + console.log('setToggledClassification'); + // if (Object.prototype.hasOwnProperty.call(newActivePalettesObj, layerId)) { newActivePalettesObj[layerId].maps.forEach((colorMap) => { if (colorMap.disabled && colorMap.disabled.length) { hasDisabled = true; } }); + // } // sometimes an active palette will be related to layers that we already removed during the // tour process. need to check if the layer is active to prevent errors when dispatching const getLayerIndex = () => { diff --git a/web/js/modules/vector-styles/reducers.js b/web/js/modules/vector-styles/reducers.js index 014a5c7a76..a3e1661274 100644 --- a/web/js/modules/vector-styles/reducers.js +++ b/web/js/modules/vector-styles/reducers.js @@ -1,4 +1,4 @@ -import { assign as lodashAssign, get as lodashGet } from 'lodash'; +import { assign as lodashAssign, get as lodashGet, cloneDeep as lodashCloneDeep } from 'lodash'; import { CLEAR_VECTORSTYLE, SET_VECTORSTYLE, @@ -14,9 +14,9 @@ export const defaultVectorStyleState = { }; export function getInitialVectorStyleState(config) { const custom = lodashGet(config, 'vectorStyles') || {}; - return lodashAssign({}, defaultVectorStyleState, { - custom, - }); + const customDefault = lodashCloneDeep(custom); + + return lodashAssign({}, defaultVectorStyleState, { custom, customDefault }); } export function vectorStyleReducer(state = defaultVectorStyleState, action) { diff --git a/web/js/modules/vector-styles/selectors.js b/web/js/modules/vector-styles/selectors.js index 43f073adc7..331f0eb4e3 100644 --- a/web/js/modules/vector-styles/selectors.js +++ b/web/js/modules/vector-styles/selectors.js @@ -3,6 +3,7 @@ import { isUndefined as lodashIsUndefined, each as lodashEach, find as lodashFind, + cloneDeep as lodashCloneDeep, } from 'lodash'; import update from 'immutability-helper'; @@ -11,13 +12,12 @@ import { stylefunction } from 'ol-mapbox-style'; import { getMinValue, getMaxValue, selectedStyleFunction, } from './util'; -import { - getActiveLayers, -} from '../layers/selectors'; +import util from '../../util/util'; + /** * Get OpenLayers layers from state that were created from WV vector - * layer definiteions. NOTE: This currently also will include the associate WMS + * layer definitions. NOTE: This currently also will include the associate WMS * breakpoint layers as well. * * @param {*} state @@ -96,7 +96,16 @@ export function setRange(layerId, props, index, palettes, state) { }; } -export function setStyleFunction(def, vectorStyleId, vectorStyles, layer, state) { +/** Sets the Style Function for the layer (this styles vector features) + * + * @param {Object} def | Layer definition + * @param {String} vectorStyleId | ID to lookup the vector style in the state + * @param {Object} vectorStyles | Contains styles of all vector products + * @param {Object} layer | OL layer object + * @param {Object} state | The entire state of the application + * @param {Boolean} styleSelection | Indicates if the request is triggered by user interaction with vector feature + */ +export function setStyleFunction(def, vectorStyleId, vectorStyles, layer, state, styleSelection = false) { const map = lodashGet(state, 'map.ui.selected'); if (!map) return; const { proj } = state; @@ -104,20 +113,39 @@ export function setStyleFunction(def, vectorStyleId, vectorStyles, layer, state) const { resolutions } = proj.selected; const layerId = def.id; const styleId = lodashGet(def, `vectorStyle.${proj.id}.id`) || vectorStyleId || lodashGet(def, 'vectorStyle.id') || layerId; - const glStyle = vectorStyles[styleId]; + const customPalette = def.custom; + + let glStyle = vectorStyles[styleId]; + if (customPalette && Object.prototype.hasOwnProperty.call(state, 'palettes')) { + const hexColor = state.palettes.custom[customPalette].colors[0]; + const rgbPalette = util.hexToRGBA(hexColor); + glStyle = updateGlStylePalette(glStyle, rgbPalette); + } else if (!styleSelection) { + const customDefaultStyle = state.vectorStyles.customDefault[def.vectorStyle.id]; + if (customDefaultStyle !== undefined) { + glStyle = customDefaultStyle; + } + } + + if (!layer || layer.isWMS || glStyle === undefined) { + return; + } - if (!layer || layer.isWMS) { - return; // WMS breakpoint tile + // This is required to bust the openlayers functionCache + if (Object.prototype.hasOwnProperty.call(glStyle, 'id')) { + delete glStyle.id; } layer = layer.getLayers ? lodashFind(layer.getLayers().getArray(), 'isVector') : layer; + // De-reference the glState object prior to applying the palette to the layer + glStyle = lodashCloneDeep(glStyle); const styleFunction = stylefunction(layer, glStyle, layerId, resolutions); const selectedFeatures = selected[layerId]; - // Handle selected feature style + // Process style of feature selected/clicked in UI if ((glStyle.name !== 'Orbit Tracks') && selectedFeatures) { const extentStartX = layer.getExtent()[0]; const acceptableExtent = extentStartX === 180 @@ -153,6 +181,25 @@ const shouldRenderFeature = (feature, acceptableExtent) => { return false; }; +const updateGlStylePalette = (glStyle, rgbPalette) => { + for (let i = 0; i < glStyle.layers.length; i += 1) { + const thisPaintObj = glStyle.layers[i].paint; + if (Object.prototype.hasOwnProperty.call(thisPaintObj, 'line-color')) { + thisPaintObj['line-color'] = rgbPalette; + } + if (Object.prototype.hasOwnProperty.call(thisPaintObj, 'circle-color')) { + thisPaintObj['circle-color'] = rgbPalette; + } + if (Object.prototype.hasOwnProperty.call(thisPaintObj, 'fill-color')) { + thisPaintObj['fill-color'] = rgbPalette; + } + if (Object.prototype.hasOwnProperty.call(thisPaintObj, 'line-width')) { + thisPaintObj['line-width'] = 2; + } + } + return glStyle; +}; + export function getKey(layerId, groupStr, state) { groupStr = groupStr || state.compare.activeString; if (!isActive(layerId, groupStr, state)) { @@ -216,18 +263,11 @@ export function clearStyleFunction(def, vectorStyleId, vectorStyles, layer, stat export const applyStyle = (def, olVectorLayer, state) => { const { config } = state; const { vectorStyles } = config; - const activeLayers = getActiveLayers(state) || []; - const layerName = def.layer || def.id; - let vectorStyleId = def.vectorStyle.id; + const vectorStyleId = def.vectorStyle.id; if (!vectorStyles || !vectorStyleId) { return; } - activeLayers.forEach((layer) => { - if (layer.id === layerName && layer.custom) { - vectorStyleId = layer.custom; - } - }); setStyleFunction(def, vectorStyleId, vectorStyles, olVectorLayer, state); }; diff --git a/web/js/modules/vector-styles/util.js b/web/js/modules/vector-styles/util.js index 3ce36470d4..46f77d08f6 100644 --- a/web/js/modules/vector-styles/util.js +++ b/web/js/modules/vector-styles/util.js @@ -319,13 +319,13 @@ export function updateVectorSelection(selectionObj, lastSelection, layers, type, const def = lodashFind(layers, { id: key }); if (!def) return; const olLayer = vectorLayers.find((layer) => layer.wv.id === key); - setStyleFunction(def, def.vectorStyle.id, vectorStyles, olLayer, state); + setStyleFunction(def, def.vectorStyle.id, vectorStyles, olLayer, state, true); if (lastSelection[key]) delete lastSelection[key]; } for (const [key] of Object.entries(lastSelection)) { const def = lodashFind(layers, { id: key }); if (!def) return; const olLayer = vectorLayers.find((layer) => layer.wv.id === key); - setStyleFunction(def, def.vectorStyle.id, vectorStyles, olLayer, state); + setStyleFunction(def, def.vectorStyle.id, vectorStyles, olLayer, state, true); } } diff --git a/web/js/ol/lookupimagetile.js b/web/js/ol/lookupimagetile.js index 8a3eeafb9f..aefece4f06 100644 --- a/web/js/ol/lookupimagetile.js +++ b/web/js/ol/lookupimagetile.js @@ -1,5 +1,6 @@ import OlImageTile from 'ol/ImageTile'; import OlTileState from 'ol/TileState'; +import { cloneDeep as lodashCloneDeep } from 'lodash'; class LookupImageTile extends OlImageTile { constructor(lookup, tileCoord, state, src, crossOrigin, tileLoadFunction, sourceOptions) { @@ -32,20 +33,49 @@ LookupImageTile.prototype.load = function() { that.canvas_.height, ); const pixels = imageData.data; + const colorLookupObj = lodashCloneDeep(that.lookup_); + const defaultColor = Object.keys(that.lookup_)[0]; + const paletteColor = that.lookup_[Object.keys(that.lookup_)[0]]; + + // Load black/transparent into the lookup + colorLookupObj['0,0,0,0'] = { + r: 0, + g: 0, + b: 0, + a: 0, + }; for (let i = 0; i < octets; i += 4) { - const source = `${pixels[i + 0]},${ + const pixelColor = `${pixels[i + 0]},${ pixels[i + 1]},${ pixels[i + 2]},${ pixels[i + 3]}`; - const target = that.lookup_[source]; - if (target) { - pixels[i + 0] = target.r; - pixels[i + 1] = target.g; - pixels[i + 2] = target.b; - pixels[i + 3] = target.a; + if (!colorLookupObj[pixelColor]) { + // Handle non-transparent pixels that do not match the palette exactly + const defaultColorArr = defaultColor.split(','); + const pixelColorArr = pixelColor.split(','); + + // Determine difference of pixel from default to replicate anti-aliasing + const rDifference = pixelColorArr[0] - defaultColorArr[0]; + const gDifference = pixelColorArr[1] - defaultColorArr[1]; + const bDifference = pixelColorArr[2] - defaultColorArr[2]; + const alphaValue = pixelColorArr[3]; + + // Store the resulting pair of pixel color & anti-aliased adjusted color + colorLookupObj[pixelColor] = { + r: paletteColor.r + rDifference, + g: paletteColor.g + gDifference, + b: paletteColor.b + bDifference, + a: alphaValue, + }; } + + // set the pixel color + pixels[i + 0] = colorLookupObj[pixelColor].r; + pixels[i + 1] = colorLookupObj[pixelColor].g; + pixels[i + 2] = colorLookupObj[pixelColor].b; + pixels[i + 3] = colorLookupObj[pixelColor].a; } g.putImageData(imageData, 0, 0); diff --git a/web/mock/events_data.json b/web/mock/events_data.json index e928bf0913..2bf7b03f78 100644 --- a/web/mock/events_data.json +++ b/web/mock/events_data.json @@ -2,13 +2,13 @@ { "title": "EONET Events", "description": "Natural events from EONET.", - "link": "https://eonet.gsfc.nasa.gov/api/v2/events", + "link": "https://eonet.gsfc.nasa.gov/api/v3/events", "events": [ { "id": "EONET_2793", "title": "Elm Fire, California", "description": "", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events/EONET_2793", + "link": "http://eonet.gsfc.nasa.gov/api/v3/events/EONET_2793", "categories": [ { "id": "wildfires", @@ -38,7 +38,7 @@ "id": "EONET_2792", "title": "Santiago, Chile Flooding", "description": "", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events/EONET_2792", + "link": "http://eonet.gsfc.nasa.gov/api/v3/events/EONET_2792", "categories": [ { "id": "floods", @@ -68,7 +68,7 @@ "id": "EONET_2781", "title": "Langila Volcano, Papua New Guinea", "description": "", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events/EONET_2781", + "link": "http://eonet.gsfc.nasa.gov/api/v3/events/EONET_2781", "categories": [ { "id": "volcanoes", @@ -98,7 +98,7 @@ "id": "EONET_2733", "title": "Iceberg B30", "description": "", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events/EONET_2733", + "link": "http://eonet.gsfc.nasa.gov/api/v3/events/EONET_2733", "categories": [ { "id": "seaLakeIce", @@ -239,7 +239,7 @@ "id": "EONET_2733", "title": "Iceberg B30-TEST", "description": "", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events/EONET_2733", + "link": "http://eonet.gsfc.nasa.gov/api/v3/events/EONET_2733", "categories": [ { "id": "seaLakeIce", @@ -385,7 +385,7 @@ "id": "EONET_0001", "title": "Example id 1", "description": "", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events/EONET_0001", + "link": "http://eonet.gsfc.nasa.gov/api/v3/events/EONET_0001", "categories": [ { "id": "seaLakeIce", diff --git a/web/mock/events_data.json-20170530 b/web/mock/events_data.json-20170530 index 639965e343..108ebc6715 100644 --- a/web/mock/events_data.json-20170530 +++ b/web/mock/events_data.json-20170530 @@ -2,7 +2,7 @@ { "title": "EONET Events", "description": "Natural events from EONET.", - "link": "https://eonet.gsfc.nasa.gov/api/v2/events", + "link": "https://eonet.gsfc.nasa.gov/api/v3/events", "events": [ { "id": "EONET_99999", @@ -78,7 +78,7 @@ "id": "EONET_2804", "title": "Tropical Storm Mora", "description": "", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events/EONET_2804", + "link": "http://eonet.gsfc.nasa.gov/api/v3/events/EONET_2804", "categories": [ { "id": "severeStorms", @@ -135,7 +135,7 @@ "id": "EONET_2777", "title": "Tropical Worldview Storm", "description": "", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events/EONET_2804", + "link": "http://eonet.gsfc.nasa.gov/api/v3/events/EONET_2804", "categories": [ { "id": "severeStorms", @@ -172,7 +172,7 @@ "id": "EONET_3931", "title": "Rattlesnake Fire", "description": "", - "link": "https://eonet.gsfc.nasa.gov/api/v2/events/EONET_3931", + "link": "https://eonet.gsfc.nasa.gov/api/v3/events/EONET_3931", "categories": [ { "id": "wildfires", @@ -197,7 +197,7 @@ "id": "EONET_2781", "title": "Langila Volcano, Papua New Guinea", "description": "", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events/EONET_2781", + "link": "http://eonet.gsfc.nasa.gov/api/v3/events/EONET_2781", "categories": [ { "id": "volcanoes", @@ -227,7 +227,7 @@ "id": "EONET_2703", "title": "Iceberg B30", "description": "", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events/EONET_2733", + "link": "http://eonet.gsfc.nasa.gov/api/v3/events/EONET_2733", "categories": [ { "id": "seaLakeIce", @@ -369,7 +369,7 @@ "id": "EONET_2733", "title": "Iceberg B30-TEST", "description": "", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events/EONET_2733", + "link": "http://eonet.gsfc.nasa.gov/api/v3/events/EONET_2733", "categories": [ { "id": "seaLakeIce", @@ -515,7 +515,7 @@ "id": "EONET_0001", "title": "Example id 1", "description": "", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events/EONET_0001", + "link": "http://eonet.gsfc.nasa.gov/api/v3/events/EONET_0001", "categories": [ { "id": "seaLakeIce", diff --git a/web/mock/sources_data.json-20170530 b/web/mock/sources_data.json-20170530 index 78ca62718b..0911dc7686 100644 --- a/web/mock/sources_data.json-20170530 +++ b/web/mock/sources_data.json-20170530 @@ -2,127 +2,127 @@ { "title": "EONET Event Sources", "description": "List of all the available event sources in the EONET system", - "link": "http://eonet.gsfc.nasa.gov/api/v2/sources", + "link": "http://eonet.gsfc.nasa.gov/api/v3/sources", "sources": [ { "id": "TEST", "title": "Test Source", "source": "http://www.example.com/", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events?source=TEST" + "link": "http://eonet.gsfc.nasa.gov/api/v3/events?source=TEST" }, { "id": "AU_BOM", "title": "Australia Bureau of Meteorology", "source": "http://www.bom.gov.au/", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events?source=AU_BOM" + "link": "http://eonet.gsfc.nasa.gov/api/v3/events?source=AU_BOM" }, { "id": "BCWILDFIRE", "title": "British Columbia Wildfire Service", "source": "http://bcwildfire.ca/", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events?source=BCWILDFIRE" + "link": "http://eonet.gsfc.nasa.gov/api/v3/events?source=BCWILDFIRE" }, { "id": "CALFIRE", "title": "California Department of Forestry and Fire Protection", "source": "http://www.calfire.ca.gov/", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events?source=CALFIRE" + "link": "http://eonet.gsfc.nasa.gov/api/v3/events?source=CALFIRE" }, { "id": "CEMS", "title": "Copernicus Emergency Management Service", "source": "http://emergency.copernicus.eu/", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events?source=CEMS" + "link": "http://eonet.gsfc.nasa.gov/api/v3/events?source=CEMS" }, { "id": "EO", "title": "Earth Observatory", "source": "http://earthobservatory.nasa.gov/", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events?source=EO" + "link": "http://eonet.gsfc.nasa.gov/api/v3/events?source=EO" }, { "id": "GDACS", "title": "Global Disaster Alert and Coordination System", "source": "http://www.gdacs.org/", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events?source=GDACS" + "link": "http://eonet.gsfc.nasa.gov/api/v3/events?source=GDACS" }, { "id": "GLIDE", "title": "GLobal IDEntifier Number (GLIDE)", "source": "http://www.glidenumber.net/", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events?source=GLIDE" + "link": "http://eonet.gsfc.nasa.gov/api/v3/events?source=GLIDE" }, { "id": "InciWeb", "title": "InciWeb", "source": "http://inciweb.nwcg.gov/", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events?source=InciWeb" + "link": "http://eonet.gsfc.nasa.gov/api/v3/events?source=InciWeb" }, { "id": "IDC", "title": "International Charter on Space and Major Disasters", "source": "https://www.disasterscharter.org/", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events?source=IDC" + "link": "http://eonet.gsfc.nasa.gov/api/v3/events?source=IDC" }, { "id": "MRR", "title": "LANCE Rapid Response", "source": "https://lance.modaps.eosdis.nasa.gov/cgi-bin/imagery/gallery.cgi", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events?source=MRR" + "link": "http://eonet.gsfc.nasa.gov/api/v3/events?source=MRR" }, { "id": "NASA_ESRS", "title": "NASA Earth Science and Remote Sensing Unit", "source": "https://eol.jsc.nasa.gov/ESRS/", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events?source=NASA_ESRS" + "link": "http://eonet.gsfc.nasa.gov/api/v3/events?source=NASA_ESRS" }, { "id": "PDC", "title": "Pacific Disaster Center", "source": "http://www.pdc.org/", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events?source=PDC" + "link": "http://eonet.gsfc.nasa.gov/api/v3/events?source=PDC" }, { "id": "ReliefWeb", "title": "ReliefWeb", "source": "http://reliefweb.int/", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events?source=ReliefWeb" + "link": "http://eonet.gsfc.nasa.gov/api/v3/events?source=ReliefWeb" }, { "id": "SIVolcano", "title": "Smithsonian Institution Global Volcanism Program", "source": "http://www.volcano.si.edu/", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events?source=SIVolcano" + "link": "http://eonet.gsfc.nasa.gov/api/v3/events?source=SIVolcano" }, { "id": "NATICE", "title": "U.S. National Ice Center", "source": "http://www.natice.noaa.gov/Main_Products.htm", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events?source=NATICE" + "link": "http://eonet.gsfc.nasa.gov/api/v3/events?source=NATICE" }, { "id": "UNISYS", "title": "Unisys Weather", "source": "http://weather.unisys.com/hurricane/", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events?source=UNISYS" + "link": "http://eonet.gsfc.nasa.gov/api/v3/events?source=UNISYS" }, { "id": "USGS_CMT", "title": "USGS Emergency Operations Collection Management Tool", "source": "https://cmt.usgs.gov/", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events?source=USGS_CMT" + "link": "http://eonet.gsfc.nasa.gov/api/v3/events?source=USGS_CMT" }, { "id": "HDDS", "title": "USGS Hazards Data Distribution System", "source": "https://hddsexplorer.usgs.gov/", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events?source=HDDS" + "link": "http://eonet.gsfc.nasa.gov/api/v3/events?source=HDDS" }, { "id": "DFES_WA", "title": "Western Australia Department of Fire and Emergency Services", "source": "https://www.dfes.wa.gov.au/", - "link": "http://eonet.gsfc.nasa.gov/api/v2/events?source=DFES_WA" + "link": "http://eonet.gsfc.nasa.gov/api/v3/events?source=DFES_WA" } ] }