diff --git a/package-lock.json b/package-lock.json index 554d8410..396da715 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,6 @@ "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^15.0.7", "@types/jest-image-snapshot": "^6.1.0", - "@types/lodash": "^4.17.16", "@types/node": "^18.19.4", "@types/react": "^18.0.26", "@types/react-dom": "^18.0.10", @@ -55,7 +54,6 @@ "jest-image-snapshot": "^6.1.0", "jsdom": "^20.0.3", "lint-staged": "^15.5.0", - "lodash": "^4.17.21", "npm-run-all": "^4.1.5", "prettier": "^3.2.5", "puppeteer-core": "^24.10.2", @@ -783,7 +781,6 @@ "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", @@ -1093,7 +1090,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -1117,7 +1113,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -1188,7 +1183,6 @@ "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@dnd-kit/accessibility": "^3.1.1", "@dnd-kit/utilities": "^3.2.2", @@ -3904,13 +3898,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/lodash": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.17.tgz", - "integrity": "sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", @@ -3968,7 +3955,6 @@ "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -4096,7 +4082,6 @@ "integrity": "sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.33.1", "@typescript-eslint/types": "8.33.1", @@ -4561,7 +4546,6 @@ "integrity": "sha512-4bEnqoHr676x4hyq7yOp+V+wVgclisNeOwMyLPEIJOv+cAAxESzIOdFyiQcbAu7gq+HUIuoWMZGlV9UgDnXh1w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18.20.0" }, @@ -4576,7 +4560,6 @@ "integrity": "sha512-3IkaissyOsUQwg8IinkVm1svsvRMGJpFyaSiEhQ0oQXD7mnWrNVFSU9kmeFvbKAtoc4j60FRjU6XqtH94xRceg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^5.1.2", "loglevel": "^1.6.0", @@ -4761,7 +4744,6 @@ "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -5471,7 +5453,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001718", "electron-to-chromium": "^1.5.160", @@ -6768,8 +6749,7 @@ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1452169.tgz", "integrity": "sha512-FOFDVMGrAUNp0dDKsAU1TorWJUx2JOU1k9xdgBKKJF3IBh/Uhl2yswG5r3TEAOrCiGY2QRp1e6LVDQrCsTKO4g==", "dev": true, - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/diff-sequences": { "version": "29.6.3", @@ -7456,7 +7436,6 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -7513,7 +7492,6 @@ "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "license": "MIT", - "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -9194,8 +9172,7 @@ "version": "12.2.0", "resolved": "https://registry.npmjs.org/highcharts/-/highcharts-12.2.0.tgz", "integrity": "sha512-UUN+osTP3aeGc4KmoMuWAjzpKif8GYHFozzYI4O8h1ILGof25M/ZGBpXLvgqf1z0LVh7N9eG7i0HnzMfjcR4nA==", - "license": "https://www.highcharts.com/license", - "peer": true + "license": "https://www.highcharts.com/license" }, "node_modules/highcharts-react-official": { "version": "3.2.2", @@ -10505,7 +10482,6 @@ "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "abab": "^2.0.6", "acorn": "^8.8.1", @@ -12644,7 +12620,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -12840,7 +12815,6 @@ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -12872,7 +12846,6 @@ "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -13085,7 +13058,6 @@ "integrity": "sha512-CnzhOgrZj8DvkDqI+Yx+9or33i3Y9uUYbKyYpP4C13jWwXx/keQ38RMTMmxuLCWQlxjZrOH0Foq7P2fGP7adDQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@puppeteer/browsers": "2.10.5", "chromium-bidi": "5.1.0", @@ -13151,7 +13123,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -13165,7 +13136,6 @@ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -14873,7 +14843,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", @@ -15455,7 +15424,6 @@ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -15710,7 +15678,6 @@ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -15891,7 +15858,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -16012,7 +15978,6 @@ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -16026,7 +15991,6 @@ "integrity": "sha512-VZ40MBnlE1/V5uTgdqY3DmjUgZtIzsYq758JGlyQrv5syIsaYcabkfPkEuWML49Ph0D/SoqpVFd0dyVTr551oA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.1", @@ -16247,7 +16211,6 @@ "integrity": "sha512-910g6ktwXdAKGyhgCPGw9BzIKOEBBYMFN1bLwC3bW/3mFlxGHO/n70c7Sg9hrsu9VWTzv6m+1Clf27B9uz4a/Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/node": "^20.11.30", "@types/sinonjs__fake-timers": "^8.1.5", @@ -17516,7 +17479,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", "dev": true, - "peer": true, "requires": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", @@ -17714,15 +17676,13 @@ "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "dev": true, - "peer": true, "requires": {} }, "@csstools/css-tokenizer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", - "dev": true, - "peer": true + "dev": true }, "@csstools/media-query-list-parser": { "version": "4.0.3", @@ -17752,7 +17712,6 @@ "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", "dev": true, - "peer": true, "requires": { "@dnd-kit/accessibility": "^3.1.1", "@dnd-kit/utilities": "^3.2.2", @@ -19428,12 +19387,6 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, - "@types/lodash": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.17.tgz", - "integrity": "sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ==", - "dev": true - }, "@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", @@ -19484,7 +19437,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", "dev": true, - "peer": true, "requires": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -19586,7 +19538,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.33.1.tgz", "integrity": "sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==", "dev": true, - "peer": true, "requires": { "@typescript-eslint/scope-manager": "8.33.1", "@typescript-eslint/types": "8.33.1", @@ -19865,7 +19816,6 @@ "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-9.15.0.tgz", "integrity": "sha512-4bEnqoHr676x4hyq7yOp+V+wVgclisNeOwMyLPEIJOv+cAAxESzIOdFyiQcbAu7gq+HUIuoWMZGlV9UgDnXh1w==", "dev": true, - "peer": true, "requires": { "expect-webdriverio": "^5.1.0", "webdriverio": "9.15.0" @@ -19876,7 +19826,6 @@ "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-9.15.0.tgz", "integrity": "sha512-3IkaissyOsUQwg8IinkVm1svsvRMGJpFyaSiEhQ0oQXD7mnWrNVFSU9kmeFvbKAtoc4j60FRjU6XqtH94xRceg==", "dev": true, - "peer": true, "requires": { "chalk": "^5.1.2", "loglevel": "^1.6.0", @@ -20016,8 +19965,7 @@ "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", - "dev": true, - "peer": true + "dev": true }, "acorn-globals": { "version": "7.0.1", @@ -20472,7 +20420,6 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", "dev": true, - "peer": true, "requires": { "caniuse-lite": "^1.0.30001718", "electron-to-chromium": "^1.5.160", @@ -21342,8 +21289,7 @@ "version": "0.0.1452169", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1452169.tgz", "integrity": "sha512-FOFDVMGrAUNp0dDKsAU1TorWJUx2JOU1k9xdgBKKJF3IBh/Uhl2yswG5r3TEAOrCiGY2QRp1e6LVDQrCsTKO4g==", - "dev": true, - "peer": true + "dev": true }, "diff-sequences": { "version": "29.6.3", @@ -21827,7 +21773,6 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "dev": true, - "peer": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -21944,7 +21889,6 @@ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, - "peer": true, "requires": {} }, "eslint-import-resolver-node": { @@ -22970,8 +22914,7 @@ "highcharts": { "version": "12.2.0", "resolved": "https://registry.npmjs.org/highcharts/-/highcharts-12.2.0.tgz", - "integrity": "sha512-UUN+osTP3aeGc4KmoMuWAjzpKif8GYHFozzYI4O8h1ILGof25M/ZGBpXLvgqf1z0LVh7N9eG7i0HnzMfjcR4nA==", - "peer": true + "integrity": "sha512-UUN+osTP3aeGc4KmoMuWAjzpKif8GYHFozzYI4O8h1ILGof25M/ZGBpXLvgqf1z0LVh7N9eG7i0HnzMfjcR4nA==" }, "highcharts-react-official": { "version": "3.2.2", @@ -23824,7 +23767,6 @@ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", "dev": true, - "peer": true, "requires": { "abab": "^2.0.6", "acorn": "^8.8.1", @@ -25278,7 +25220,6 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz", "integrity": "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==", "dev": true, - "peer": true, "requires": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -25387,7 +25328,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dev": true, - "peer": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -25409,8 +25349,7 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", - "dev": true, - "peer": true + "dev": true }, "prettier-linter-helpers": { "version": "1.0.0", @@ -25563,7 +25502,6 @@ "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.10.2.tgz", "integrity": "sha512-CnzhOgrZj8DvkDqI+Yx+9or33i3Y9uUYbKyYpP4C13jWwXx/keQ38RMTMmxuLCWQlxjZrOH0Foq7P2fGP7adDQ==", "dev": true, - "peer": true, "requires": { "@puppeteer/browsers": "2.10.5", "chromium-bidi": "5.1.0", @@ -25601,7 +25539,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "peer": true, "requires": { "loose-envify": "^1.1.0" } @@ -25611,7 +25548,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dev": true, - "peer": true, "requires": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -26765,7 +26701,6 @@ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.20.0.tgz", "integrity": "sha512-B5Myu9WRxrgKuLs3YyUXLP2H0mrbejwNxPmyADlACWwFsrL8Bmor/nTSh4OMae5sHjOz6gkSeccQH34gM4/nAw==", "dev": true, - "peer": true, "requires": { "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", @@ -27173,8 +27108,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "peer": true + "dev": true } } }, @@ -27345,8 +27279,7 @@ "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "peer": true + "dev": true }, "unbox-primitive": { "version": "1.1.0", @@ -27464,7 +27397,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, - "peer": true, "requires": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -27486,8 +27418,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "peer": true + "dev": true } } }, @@ -27517,7 +27448,6 @@ "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.1.tgz", "integrity": "sha512-VZ40MBnlE1/V5uTgdqY3DmjUgZtIzsYq758JGlyQrv5syIsaYcabkfPkEuWML49Ph0D/SoqpVFd0dyVTr551oA==", "dev": true, - "peer": true, "requires": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.1", @@ -27655,7 +27585,6 @@ "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-9.15.0.tgz", "integrity": "sha512-910g6ktwXdAKGyhgCPGw9BzIKOEBBYMFN1bLwC3bW/3mFlxGHO/n70c7Sg9hrsu9VWTzv6m+1Clf27B9uz4a/Q==", "dev": true, - "peer": true, "requires": { "@types/node": "^20.11.30", "@types/sinonjs__fake-timers": "^8.1.5", diff --git a/package.json b/package.json index d1ffaadb..1cc91b3f 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,6 @@ "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^15.0.7", "@types/jest-image-snapshot": "^6.1.0", - "@types/lodash": "^4.17.16", "@types/node": "^18.19.4", "@types/react": "^18.0.26", "@types/react-dom": "^18.0.10", @@ -104,7 +103,6 @@ "jest-image-snapshot": "^6.1.0", "jsdom": "^20.0.3", "lint-staged": "^15.5.0", - "lodash": "^4.17.21", "npm-run-all": "^4.1.5", "prettier": "^3.2.5", "puppeteer-core": "^24.10.2", diff --git a/pages/01-cartesian-chart/axes-and-thresholds.page.tsx b/pages/01-cartesian-chart/axes-and-thresholds.page.tsx index b0950209..f4e2eea7 100644 --- a/pages/01-cartesian-chart/axes-and-thresholds.page.tsx +++ b/pages/01-cartesian-chart/axes-and-thresholds.page.tsx @@ -2,11 +2,11 @@ // SPDX-License-Identifier: Apache-2.0 import { addDays, subYears } from "date-fns"; -import { range } from "lodash"; import ColumnLayout from "@cloudscape-design/components/column-layout"; import { CartesianChart } from "../../lib/components"; +import range from "../../lib/components/internal/utils/range"; import { dateFormatter } from "../common/formatters"; import { useChartSettings } from "../common/page-settings"; import { Page, PageSection } from "../common/templates"; diff --git a/pages/01-cartesian-chart/chart-size.page.tsx b/pages/01-cartesian-chart/chart-size.page.tsx index bed6924a..bff20945 100644 --- a/pages/01-cartesian-chart/chart-size.page.tsx +++ b/pages/01-cartesian-chart/chart-size.page.tsx @@ -1,9 +1,8 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { range } from "lodash"; - import { CartesianChart, CartesianChartProps } from "../../lib/components"; +import range from "../../lib/components/internal/utils/range"; import { PageSettingsForm, useChartSettings } from "../common/page-settings"; import { FitSizeDemo, Page, PageSection } from "../common/templates"; import pseudoRandom from "../utils/pseudo-random"; diff --git a/pages/01-cartesian-chart/line-dash-styles.page.tsx b/pages/01-cartesian-chart/line-dash-styles.page.tsx index 7c1552da..351ff081 100644 --- a/pages/01-cartesian-chart/line-dash-styles.page.tsx +++ b/pages/01-cartesian-chart/line-dash-styles.page.tsx @@ -1,9 +1,8 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { range } from "lodash"; - import { CartesianChart, CartesianChartProps } from "../../lib/components"; +import range from "../../lib/components/internal/utils/range"; import { dateFormatter } from "../common/formatters"; import { useChartSettings } from "../common/page-settings"; import { Page } from "../common/templates"; diff --git a/pages/02-pie-chart/controlled-visibility.page.tsx b/pages/02-pie-chart/controlled-visibility.page.tsx index 1b2c4de3..6c42bed2 100644 --- a/pages/02-pie-chart/controlled-visibility.page.tsx +++ b/pages/02-pie-chart/controlled-visibility.page.tsx @@ -1,8 +1,6 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { sum } from "lodash"; - import { PieChart, PieChartProps } from "../../lib/components"; import { PageSettings, PageSettingsForm, SeriesFilter, useChartSettings } from "../common/page-settings"; import { Page, PageSection } from "../common/templates"; @@ -11,6 +9,10 @@ interface ThisPageSettings extends PageSettings { visibleItems: string; } +function sum(array: number[]): number { + return array.reduce((acc, val) => acc + val, 0); +} + const pieChartSeries: PieChartProps.SeriesOptions = { name: "Value", type: "pie", diff --git a/pages/02-pie-chart/segment-titles-and-descriptions.page.tsx b/pages/02-pie-chart/segment-titles-and-descriptions.page.tsx index 5fbc4546..7283b86f 100644 --- a/pages/02-pie-chart/segment-titles-and-descriptions.page.tsx +++ b/pages/02-pie-chart/segment-titles-and-descriptions.page.tsx @@ -1,14 +1,13 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { range } from "lodash"; - import Checkbox from "@cloudscape-design/components/checkbox"; import ColumnLayout from "@cloudscape-design/components/column-layout"; import FormField from "@cloudscape-design/components/form-field"; import Select from "@cloudscape-design/components/select"; import { PieChart, PieChartProps } from "../../lib/components"; +import range from "../../lib/components/internal/utils/range"; import { PageSettings, PageSettingsForm, useChartSettings } from "../common/page-settings"; import { Page } from "../common/templates"; diff --git a/pages/03-core/core-dual-axis-chart.page.tsx b/pages/03-core/core-dual-axis-chart.page.tsx index 4143ea95..756a8830 100644 --- a/pages/03-core/core-dual-axis-chart.page.tsx +++ b/pages/03-core/core-dual-axis-chart.page.tsx @@ -1,14 +1,13 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { omit } from "lodash"; - import Link from "@cloudscape-design/components/link"; import CoreChart from "../../lib/components/internal-do-not-use/core-chart"; import { dateFormatter } from "../common/formatters"; import { PageSettingsForm, useChartSettings } from "../common/page-settings"; import { Page } from "../common/templates"; +import omit from "../utils/omit"; import pseudoRandom from "../utils/pseudo-random"; function randomInt(min: number, max: number) { diff --git a/pages/03-core/core-legend-horizontal-alignment.page.tsx b/pages/03-core/core-legend-horizontal-alignment.page.tsx index 19367574..2d73d6ae 100644 --- a/pages/03-core/core-legend-horizontal-alignment.page.tsx +++ b/pages/03-core/core-legend-horizontal-alignment.page.tsx @@ -1,8 +1,6 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { omit } from "lodash"; - import ColumnLayout from "@cloudscape-design/components/column-layout"; import SpaceBetween from "@cloudscape-design/components/space-between"; @@ -10,6 +8,7 @@ import { CoreChartProps } from "../../lib/components/core/interfaces"; import CoreChart from "../../lib/components/internal-do-not-use/core-chart"; import { PageSettingsForm, useChartSettings } from "../common/page-settings"; import { Page } from "../common/templates"; +import omit from "../utils/omit"; import pseudoRandom from "../utils/pseudo-random"; function randomInt(min: number, max: number) { diff --git a/pages/03-core/core-legend.page.tsx b/pages/03-core/core-legend.page.tsx index fcae7387..18e210bc 100644 --- a/pages/03-core/core-legend.page.tsx +++ b/pages/03-core/core-legend.page.tsx @@ -3,7 +3,6 @@ import { useRef, useState } from "react"; import Highcharts from "highcharts"; -import { omit } from "lodash"; import Link from "@cloudscape-design/components/link"; import SpaceBetween from "@cloudscape-design/components/space-between"; @@ -17,6 +16,7 @@ import { CoreLegend } from "../../lib/components/internal-do-not-use/core-legend import { dateFormatter } from "../common/formatters"; import { PageSettingsForm, useChartSettings } from "../common/page-settings"; import { Page } from "../common/templates"; +import omit from "../utils/omit"; import pseudoRandom from "../utils/pseudo-random"; function randomInt(min: number, max: number) { diff --git a/pages/03-core/dynamic-chart-type.page.tsx b/pages/03-core/dynamic-chart-type.page.tsx index 732ce370..e8ccbe92 100644 --- a/pages/03-core/dynamic-chart-type.page.tsx +++ b/pages/03-core/dynamic-chart-type.page.tsx @@ -3,7 +3,6 @@ import { useState } from "react"; import Highcharts from "highcharts"; -import { omit } from "lodash"; import SpaceBetween from "@cloudscape-design/components/space-between"; import Toggle from "@cloudscape-design/components/toggle"; @@ -12,6 +11,7 @@ import CoreChart, { CoreChartProps } from "../../lib/components/internal-do-not- import { dateFormatter } from "../common/formatters"; import { useChartSettings } from "../common/page-settings"; import { Page } from "../common/templates"; +import omit from "../utils/omit"; import pseudoRandom from "../utils/pseudo-random"; function randomInt(min: number, max: number) { diff --git a/pages/03-core/events-sync-demo.page.tsx b/pages/03-core/events-sync-demo.page.tsx index 15f4f762..22df264a 100644 --- a/pages/03-core/events-sync-demo.page.tsx +++ b/pages/03-core/events-sync-demo.page.tsx @@ -3,7 +3,6 @@ import { useRef, useState } from "react"; import Highcharts from "highcharts"; -import { omit } from "lodash"; import ColumnLayout from "@cloudscape-design/components/column-layout"; import { @@ -12,14 +11,15 @@ import { colorChartsPaletteCategorical3, } from "@cloudscape-design/design-tokens"; +import { LegendItem } from "../../lib/components/internal/components/interfaces"; import { ChartSeriesMarker } from "../../lib/components/internal/components/series-marker"; import CoreChart from "../../lib/components/internal-do-not-use/core-chart"; import { CoreLegend } from "../../lib/components/internal-do-not-use/core-legend"; import { CoreChartProps } from "../../src/core/interfaces"; -import { LegendItem } from "../../src/internal/components/interfaces"; import { dateFormatter } from "../common/formatters"; import { useChartSettings } from "../common/page-settings"; import { Page } from "../common/templates"; +import omit from "../utils/omit"; import pseudoRandom from "../utils/pseudo-random"; function randomInt(min: number, max: number) { diff --git a/pages/03-core/in-iframe.page.tsx b/pages/03-core/in-iframe.page.tsx index 6dc19fbc..71f287f3 100644 --- a/pages/03-core/in-iframe.page.tsx +++ b/pages/03-core/in-iframe.page.tsx @@ -1,14 +1,13 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { omit } from "lodash"; - import ColumnLayout from "@cloudscape-design/components/column-layout"; import CoreChart from "../../lib/components/internal-do-not-use/core-chart"; import { dateFormatter } from "../common/formatters"; import { useChartSettings } from "../common/page-settings"; import { Page } from "../common/templates"; +import omit from "../utils/omit"; export default function () { const { chartProps } = useChartSettings(); diff --git a/pages/03-core/no-data-states.page.tsx b/pages/03-core/no-data-states.page.tsx index db3b5155..63e87746 100644 --- a/pages/03-core/no-data-states.page.tsx +++ b/pages/03-core/no-data-states.page.tsx @@ -2,13 +2,13 @@ // SPDX-License-Identifier: Apache-2.0 import Highcharts from "highcharts"; -import { omit } from "lodash"; import Box from "@cloudscape-design/components/box"; import CoreChart from "../../lib/components/internal-do-not-use/core-chart"; import { PageSettingsForm, useChartSettings } from "../common/page-settings"; import { FramedDemo, Page, PageSection } from "../common/templates"; +import omit from "../utils/omit"; export default function () { const { chartProps } = useChartSettings(); diff --git a/pages/03-core/simple-zooming.page.tsx b/pages/03-core/simple-zooming.page.tsx index 5310b0c3..b92e4ff9 100644 --- a/pages/03-core/simple-zooming.page.tsx +++ b/pages/03-core/simple-zooming.page.tsx @@ -3,7 +3,6 @@ import { useCallback, useEffect, useRef, useState } from "react"; import Highcharts from "highcharts"; -import { omit } from "lodash"; import { KeyCode } from "@cloudscape-design/component-toolkit/internal"; import BreadcrumbGroup from "@cloudscape-design/components/breadcrumb-group"; @@ -16,6 +15,7 @@ import CoreChart from "../../lib/components/internal-do-not-use/core-chart"; import { dateFormatter } from "../common/formatters"; import { PageSettings, PageSettingsForm, useChartSettings } from "../common/page-settings"; import { Page } from "../common/templates"; +import omit from "../utils/omit"; import pseudoRandom from "../utils/pseudo-random"; interface ThisPageSettings extends PageSettings { @@ -134,7 +134,7 @@ function Charts() { settings: { keepZoomingFrame = true }, chartProps, } = useChartSettings({ more: true }); - const commonProps = omit(chartProps.cartesian, ["ref"]); + const commonProps = omit(chartProps.cartesian, "ref"); const scatterChartRef = useRef(null) as React.MutableRefObject; const getScatterChart = () => scatterChartRef.current!; const navigatorChartRef = useRef(null) as React.MutableRefObject; diff --git a/pages/03-core/solidgauge.page.tsx b/pages/03-core/solidgauge.page.tsx index a34963f6..19dfe312 100644 --- a/pages/03-core/solidgauge.page.tsx +++ b/pages/03-core/solidgauge.page.tsx @@ -1,11 +1,10 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { omit } from "lodash"; - import CoreChart from "../../lib/components/internal-do-not-use/core-chart"; import { PageSettingsForm, useChartSettings } from "../common/page-settings"; import { Page } from "../common/templates"; +import omit from "../utils/omit"; import pseudoRandom from "../utils/pseudo-random"; function randomInt(min: number, max: number) { diff --git a/pages/06-visual-tests/cartesian-tooltip.page.tsx b/pages/06-visual-tests/cartesian-tooltip.page.tsx index 90cbe370..c16c9112 100644 --- a/pages/06-visual-tests/cartesian-tooltip.page.tsx +++ b/pages/06-visual-tests/cartesian-tooltip.page.tsx @@ -1,14 +1,13 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { omit } from "lodash"; - import Button from "@cloudscape-design/components/button"; import CoreChart from "../../lib/components/internal-do-not-use/core-chart"; import { dateFormatter } from "../common/formatters"; import { useChartSettings } from "../common/page-settings"; import { Page } from "../common/templates"; +import omit from "../utils/omit"; const baseline = [ { x: 1600984800000, y: 58020 }, diff --git a/pages/06-visual-tests/in-iframe.page.tsx b/pages/06-visual-tests/in-iframe.page.tsx index 653073a0..56239eff 100644 --- a/pages/06-visual-tests/in-iframe.page.tsx +++ b/pages/06-visual-tests/in-iframe.page.tsx @@ -1,11 +1,10 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { omit } from "lodash"; - import CoreChart from "../../lib/components/internal-do-not-use/core-chart"; import { useChartSettings } from "../common/page-settings"; import { Page } from "../common/templates"; +import omit from "../utils/omit"; export default function () { const { chartProps } = useChartSettings(); diff --git a/pages/06-visual-tests/pie-tooltip.page.tsx b/pages/06-visual-tests/pie-tooltip.page.tsx index 43a1cad5..23e77312 100644 --- a/pages/06-visual-tests/pie-tooltip.page.tsx +++ b/pages/06-visual-tests/pie-tooltip.page.tsx @@ -1,13 +1,12 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { omit } from "lodash"; - import Button from "@cloudscape-design/components/button"; import CoreChart from "../../lib/components/internal-do-not-use/core-chart"; import { useChartSettings } from "../common/page-settings"; import { Page } from "../common/templates"; +import omit from "../utils/omit"; const series: Highcharts.SeriesOptionsType[] = [ { diff --git a/pages/app/app-context.tsx b/pages/app/app-context.tsx index 1c0f2d52..83c5a877 100644 --- a/pages/app/app-context.tsx +++ b/pages/app/app-context.tsx @@ -3,7 +3,6 @@ import { createContext, useEffect } from "react"; import { useSearchParams } from "react-router-dom"; -import mapValues from "lodash/mapValues"; import { applyDensity, applyMode, Density, disableMotion, Mode } from "@cloudscape-design/global-styles"; @@ -39,16 +38,17 @@ const AppContext = createContext(appContextDefaults); export default AppContext; -function parseQuery(urlParams: URLSearchParams) { - const queryParams: Record = { ...appContextDefaults.urlParams }; - urlParams.forEach((value, key) => (queryParams[key] = value)); +function castToBoolean(s: string) { + if (s === "true" || s === "false") { + return s === "true"; + } + return s; +} - return mapValues(queryParams, (value) => { - if (value === "true" || value === "false") { - return value === "true"; - } - return value; - }); +export function parseQuery(urlParams: URLSearchParams) { + const queryParams: Record = { ...appContextDefaults }; + urlParams.forEach((value, key) => (queryParams[key] = castToBoolean(value))); + return queryParams as AppUrlParams; } function formatQuery(params: AppUrlParams) { diff --git a/pages/common/permutations.tsx b/pages/common/permutations.tsx index 57572525..e9b96ef6 100644 --- a/pages/common/permutations.tsx +++ b/pages/common/permutations.tsx @@ -1,8 +1,6 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import flatten from "lodash/flatten"; - import SpaceBetween from "@cloudscape-design/components/space-between"; export type ComponentPermutations = { @@ -10,7 +8,7 @@ export type ComponentPermutations = { }; export function createPermutations(permutations: Array>) { - return flatten(permutations.map((set) => doCreatePermutations(set))); + return permutations.map((set) => doCreatePermutations(set)).flat(); } function doCreatePermutations(permutations: ComponentPermutations) { diff --git a/pages/utils/omit.ts b/pages/utils/omit.ts new file mode 100644 index 00000000..c62a3f6f --- /dev/null +++ b/pages/utils/omit.ts @@ -0,0 +1,18 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +/** + * Creates an object composed of the own and inherited enumerable property paths + * of object that are not omitted + */ +export default function omit, K extends keyof T>(object: T, keyToOmit: K) { + const result = {} as Partial; + + for (const key in object) { + if ((key as string as K) !== keyToOmit && Object.prototype.hasOwnProperty.call(object, key)) { + result[key] = object[key]; + } + } + + return result as Omit; +} diff --git a/scripts/utils.js b/scripts/utils.js index 3b4132c3..3481f529 100644 --- a/scripts/utils.js +++ b/scripts/utils.js @@ -1,22 +1,42 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import lodash from "lodash"; import fs from "node:fs"; import path from "node:path"; -export function pascalCase(text) { - return capitalize(lodash.camelCase(text)); +/** + * Converts string to camelCase + */ +function camelCase(str) { + return str + .replace(/(?:^\w|[A-Z]|\b\w)/g, (word, index) => { + return index === 0 ? word.toLowerCase() : word.toUpperCase(); + }) + .replace(/\s+/g, ""); } -export function dashCase(text) { - return lodash.kebabCase(text); +/** + * Converts string to kebab-case + */ +function kebabCase(str) { + return str + .replace(/([a-z])([A-Z])/g, "$1-$2") + .replace(/[\s_]+/g, "-") + .toLowerCase(); } function capitalize(text) { return text[0].toUpperCase() + text.slice(1); } +export function pascalCase(text) { + return capitalize(camelCase(text)); +} + +export function dashCase(text) { + return kebabCase(text); +} + export function listPublicDirs(baseDir) { return fs .readdirSync(baseDir) diff --git a/src/core/__tests__/chart-core-navigation-cartesian.test.tsx b/src/core/__tests__/chart-core-navigation-cartesian.test.tsx index 92eb4292..0e30a13d 100644 --- a/src/core/__tests__/chart-core-navigation-cartesian.test.tsx +++ b/src/core/__tests__/chart-core-navigation-cartesian.test.tsx @@ -2,12 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 import highcharts from "highcharts"; -import { range } from "lodash"; import { vi } from "vitest"; import { KeyCode } from "@cloudscape-design/component-toolkit/internal"; import "highcharts/modules/accessibility"; +import range from "../../internal/utils/range"; import { CoreChartTestProps, createChartWrapper, renderChart } from "./common"; const seriesShort2: Highcharts.SeriesOptionsType[] = [ diff --git a/src/internal/utils/range.ts b/src/internal/utils/range.ts new file mode 100644 index 00000000..38d7255f --- /dev/null +++ b/src/internal/utils/range.ts @@ -0,0 +1,25 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +/** + * Creates an array of numbers progressing from start up to, but not including, end + */ +export default function range(start: number, end?: number, step = 1): number[] { + if (end === undefined) { + end = start; + start = 0; + } + + const result: number[] = []; + if (step > 0) { + for (let i = start; i < end; i += step) { + result.push(i); + } + } else { + for (let i = start; i > end; i += step) { + result.push(i); + } + } + + return result; +}