diff --git a/package-lock.json b/package-lock.json index 87d1be1e..d6a64a4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,6 @@ "win-ca": "^3.5.1" }, "devDependencies": { - "@date-fns/utc": "^2.0.0", "@electron-toolkit/eslint-config-prettier": "^3.0.0", "@electron-toolkit/eslint-config-ts": "^3.1.0", "@electron-toolkit/preload": "^3.0.0", @@ -28,8 +27,6 @@ "@fortawesome/react-fontawesome": "^0.2.0", "@headlessui/react": "^2.2.8", "@hookform/resolvers": "^3.3.4", - "@nethesis/nethesis-brands-svg-icons": "github:nethesis/Font-Awesome#ns-brands", - "@nethesis/nethesis-light-svg-icons": "github:nethesis/Font-Awesome#ns-light", "@nethesis/nethesis-solid-svg-icons": "github:nethesis/Font-Awesome#ns-solid", "@nethesis/phone-island": "^1.0.15", "@tailwindcss/forms": "^0.5.7", @@ -38,12 +35,10 @@ "@types/react": "^18.2.48", "@types/react-dom": "^18.2.18", "@vitejs/plugin-react": "^4.2.1", - "auto-launch": "^5.0.6", "autoprefixer": "^10.4.17", "axios": "^1.6.7", "classnames": "^2.5.1", "clsx": "^2.1.0", - "crypto-browserify": "^3.12.0", "crypto-js": "^4.2.0", "date-fns": "^2.30.0", "date-fns-tz": "^1.3.8", @@ -56,13 +51,10 @@ "eslint-plugin-react-hooks": "^5.2.0", "framer-motion": "^11.11.8", "i18next": "^22.4.9", - "i18next-browser-languagedetector": "^7.0.1", "i18next-electron-fs-backend": "^3.0.1", "i18next-fs-backend": "^2.3.2", - "i18next-http-backend": "^2.1.1", "lodash": "^4.17.21", "moment": "^2.30.1", - "motion": "^11.13.1", "path-browserify": "^1.0.1", "postcss": "^8.4.35", "prettier": "^3.2.4", @@ -72,13 +64,11 @@ "react-hook-form": "^7.50.1", "react-i18next": "^12.1.5", "react-router-dom": "^6.21.3", - "rollup": "^4.12.1", + "react-tooltip": "^5.28.0", "tailwind-merge": "^2.2.1", - "tailwind-scrollbar": "^3.1.0", "tailwindcss": "^3.4.1", "typescript": "^5.3.3", "vite": "^5.0.12", - "vite-plugin-copy": "^0.1.6", "zod": "^3.22.4", "zustand": "^4.5.0" }, @@ -107,13 +97,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -122,9 +112,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.29.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", - "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", "engines": { @@ -132,21 +122,21 @@ } }, "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -173,14 +163,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -203,14 +193,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -230,9 +220,9 @@ } }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", "engines": { @@ -240,29 +230,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -282,9 +272,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", "engines": { @@ -292,9 +282,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", "engines": { @@ -302,9 +292,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", "engines": { @@ -312,27 +302,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", - "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.10.tgz", + "integrity": "sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "version": "7.29.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz", + "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.29.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -416,33 +406,33 @@ } }, "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.10.tgz", + "integrity": "sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.9", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", "debug": "^4.3.1" }, "engines": { @@ -450,26 +440,19 @@ } }, "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@date-fns/utc": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@date-fns/utc/-/utc-2.1.1.tgz", - "integrity": "sha512-SlJDfG6RPeEX8wEVv6ZB3kak4MmbtyiI2qX/5zuKdordbrhB/iaJ58GVMZgJ6P1sJaM1gMgENFYYeg1JWrCFrA==", - "dev": true, - "license": "MIT" - }, "node_modules/@electron-toolkit/eslint-config-prettier": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@electron-toolkit/eslint-config-prettier/-/eslint-config-prettier-3.0.1.tgz", @@ -1907,48 +1890,99 @@ "node": ">=18.0.0" } }, + "node_modules/@jest/diff-sequences": { + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.5.0.tgz", + "integrity": "sha512-OsqBjHXCn8cadasoAZBP6nWYvMsRhpMzGXTpxJ5aO04NlbdhIz+FVe3q49l0AwVhsz/cEmIpBes6gAFl1/dWQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.5.2.tgz", + "integrity": "sha512-d/HOLSrJUlBIl6n3LzOa7cjW3xdePm5H5gQw2lixZ/0h157l9sw3mLblzFqnPcTbhDzhRQdBOX3A3KcG73nm5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.5.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/get-type": { + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.5.0.tgz", + "integrity": "sha512-9/2VUPitAjmBzbvDvqrxmvB7BzWsBW0WmkkojX1ODuxX1NLGxx9gfaZpHB0z8DtJ9uhGNmZG/VXBhf8uO0OV8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern": { + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.5.0.tgz", + "integrity": "sha512-HdNQYSdRTEBNrginaqzQtTjG0HRMfrra/z6Ok7uL3S87vSlarIVohEsJsSj5edu3MiHoHjAkvPROz5ZjoKai+w==", "dev": true, "license": "MIT", "dependencies": { - "jest-get-type": "^29.6.3" + "@types/node": "*", + "jest-regex-util": "30.5.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/@jest/react-is-18": { + "name": "react-is", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/react-is-19": { + "name": "react-is", + "version": "19.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.3.1.tgz", + "integrity": "sha512-RRieF6IyxQBkcK6pP8xOHprLTPW6QjRkbGdImtqNme+/hYVwCZkLQLdlZGOhUqXwkS9IEynaGvPJtv6XB/cz0Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.5.0.tgz", + "integrity": "sha512-/hunigyNpc4RCjC0VaW3f5RCUZVM2+WQ65qP7z083Gmvac7or2LI50XVNOtE4YPgBpV0yxYiAgorAPGniCoJmg==", "dev": true, "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.27.8" + "@sinclair/typebox": "^0.34.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.5.1.tgz", + "integrity": "sha512-LvVYn83nnXPl+Rg98nvcFgjx6nRMTArhSn6RAX/w3ELn54S8A42TYZvsCMdGUqTM8S0wyXbtlQdU6Hi6dykj9g==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", + "@jest/pattern": "30.5.0", + "@jest/schemas": "30.5.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jimp/bmp": { @@ -2524,54 +2558,6 @@ "node": "^22.20 || ^24.12 || >=25" } }, - "node_modules/@nethesis/nethesis-brands-svg-icons": { - "version": "6.2.1", - "resolved": "git+ssh://git@github.com/nethesis/Font-Awesome.git#dbcf431acf0e504145486c9ac70f14946279e2e7", - "dev": true, - "hasInstallScript": true, - "license": "UNLICENSED", - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.2.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@nethesis/nethesis-brands-svg-icons/node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.1.tgz", - "integrity": "sha512-Sz07mnQrTekFWLz5BMjOzHl/+NooTdW8F8kDQxjWwbpOJcnoSg4vUDng8d/WR1wOxM0O+CY9Zw0nR054riNYtQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@nethesis/nethesis-light-svg-icons": { - "version": "6.2.1", - "resolved": "git+ssh://git@github.com/nethesis/Font-Awesome.git#3e110fb0ae63495fb8b7ca9811e5f07eed1ac962", - "dev": true, - "hasInstallScript": true, - "license": "UNLICENSED", - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.2.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@nethesis/nethesis-light-svg-icons/node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.1.tgz", - "integrity": "sha512-Sz07mnQrTekFWLz5BMjOzHl/+NooTdW8F8kDQxjWwbpOJcnoSg4vUDng8d/WR1wOxM0O+CY9Zw0nR054riNYtQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@nethesis/nethesis-solid-svg-icons": { "version": "6.2.1", "resolved": "git+ssh://git@github.com/nethesis/Font-Awesome.git#1a6b58a7581627785d4a4cbc0314ed3d185a1288", @@ -3576,9 +3562,9 @@ ] }, "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.34.52", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.52.tgz", + "integrity": "sha512-XiMQh7qqVlxZzcVD+kkGMNGMzcTrDMLWI7S4x7z1MkCkbDPrekpZXEUK0eZqZFMuHQg2a2DZOcDIh9o5v3Gonw==", "dev": true, "license": "MIT" }, @@ -3877,14 +3863,14 @@ } }, "node_modules/@types/jest": { - "version": "29.5.14", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", - "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "version": "30.0.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", + "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", "dev": true, "license": "MIT", "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" + "expect": "^30.0.0", + "pretty-format": "^30.0.0" } }, "node_modules/@types/jest/node_modules/ansi-styles": { @@ -3901,18 +3887,19 @@ } }, "node_modules/@types/jest/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.5.1.tgz", + "integrity": "sha512-byhRAPguVKMQIj4kjJwJ5lAskVhfuiSdiYl/aLTWpgkGEmic2jYhJh1yE9ih8Ox44Xg9ccCT11/S6QrzSJuNrg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "@jest/react-is-18": "npm:react-is@^18.3.1", + "@jest/react-is-19": "npm:react-is@^19.2.5", + "@jest/schemas": "30.5.0", + "ansi-styles": "^5.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@types/json-schema": { @@ -4044,9 +4031,9 @@ "optional": true }, "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "dev": true, "license": "MIT", "dependencies": { @@ -4447,9 +4434,9 @@ } }, "node_modules/@xmldom/xmldom": { - "version": "0.8.12", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.12.tgz", - "integrity": "sha512-9k/gHF6n/pAi/9tqr3m3aqkuiNosYTurLLUtc7xQ9sxB/wm7WPygCv8GYa6mS0fLJEHhqMC1ATYhz++U/lRHqg==", + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.15.tgz", + "integrity": "sha512-/5NV/vDALVFDXgLmfsy9TRCBlKwO2LNBFzpzvb9iIj+jR+eSc6DLYYvVOdivT/jm7MtU6TebYuRmzEOI7w40UA==", "devOptional": true, "license": "MIT", "engines": { @@ -4867,12 +4854,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/applescript": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/applescript/-/applescript-1.0.0.tgz", - "integrity": "sha512-yvtNHdWvtbYEiIazXAdp/NY+BBb65/DAseqlNiJQjOx9DynuzOYDbVLBJvuc0ve0VL9x6B3OHF6eH52y9hCBtQ==", - "dev": true - }, "node_modules/arch": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", @@ -5053,25 +5034,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", - "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", - "dev": true, - "license": "MIT" - }, "node_modules/asn1js": { "version": "3.0.10", "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", @@ -5151,23 +5113,6 @@ "node": ">= 4.0.0" } }, - "node_modules/auto-launch": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/auto-launch/-/auto-launch-5.0.6.tgz", - "integrity": "sha512-OgxiAm4q9EBf9EeXdPBiVNENaWE3jUZofwrhAkWjHDYGezu1k3FRZHU8V2FBxGuSJOHzKmTJEd0G7L7/0xDGFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "applescript": "^1.0.0", - "mkdirp": "^0.5.1", - "path-is-absolute": "^1.0.0", - "untildify": "^3.0.2", - "winreg": "1.2.4" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/autoprefixer": { "version": "10.6.1", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.6.1.tgz", @@ -5333,13 +5278,6 @@ "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==", "license": "MIT" }, - "node_modules/bn.js": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", - "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", - "dev": true, - "license": "MIT" - }, "node_modules/boolean": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", @@ -5357,9 +5295,9 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", - "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", "dev": true, "license": "MIT", "dependencies": { @@ -5379,89 +5317,6 @@ "node": ">=8" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true, - "license": "MIT" - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", - "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^5.2.1", - "randombytes": "^2.1.0", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.5.tgz", - "integrity": "sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==", - "dev": true, - "license": "ISC", - "dependencies": { - "bn.js": "^5.2.2", - "browserify-rsa": "^4.1.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.6.1", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.9", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/browserslist": { "version": "4.29.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.3.tgz", @@ -5537,13 +5392,6 @@ "dev": true, "license": "MIT" }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true, - "license": "MIT" - }, "node_modules/builder-util": { "version": "26.16.0", "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.16.0.tgz", @@ -5878,9 +5726,9 @@ "license": "MIT" }, "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, "funding": [ { @@ -5893,20 +5741,6 @@ "node": ">=8" } }, - "node_modules/cipher-base": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", - "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/classnames": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", @@ -6185,53 +6019,6 @@ "buffer": "^5.1.0" } }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", - "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", - "dev": true, - "license": "MIT" - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "node_modules/cross-dirname": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", @@ -6241,16 +6028,6 @@ "optional": true, "peer": true }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -6266,33 +6043,6 @@ "node": ">= 8" } }, - "node_modules/crypto-browserify": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", - "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserify-cipher": "^1.0.1", - "browserify-sign": "^4.2.3", - "create-ecdh": "^4.0.4", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "diffie-hellman": "^5.0.3", - "hash-base": "~3.0.4", - "inherits": "^2.0.4", - "pbkdf2": "^3.1.2", - "public-encrypt": "^4.0.3", - "randombytes": "^2.1.0", - "randomfill": "^1.0.4" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/crypto-js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", @@ -6550,17 +6300,6 @@ "node": ">=6" } }, - "node_modules/des.js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", - "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -6576,35 +6315,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", - "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", - "dev": true, - "license": "MIT" - }, "node_modules/dir-compare": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", @@ -6897,9 +6607,9 @@ } }, "node_modules/electron-builder-notarize/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.2.tgz", + "integrity": "sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==", "dev": true, "license": "MIT", "dependencies": { @@ -6930,22 +6640,6 @@ "electron-winstaller": "5.4.0" } }, - "node_modules/electron-builder/node_modules/ci-info": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", - "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/electron-builder/node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -7115,29 +6809,6 @@ "node": ">=6 <7 || >=8" } }, - "node_modules/elliptic": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", - "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", - "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", - "dev": true, - "license": "MIT" - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -7155,31 +6826,49 @@ } }, "node_modules/engine.io-client": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.2.tgz", - "integrity": "sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw==", + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.7.tgz", + "integrity": "sha512-GyAvmPA7gnRCpDQbYACAy79Lg4ewevrmaPzySZz0OVvgyZc3gEfLLqPTYk8wVBScjOEpM9ZO4KryyFpVItjGEA==", "dev": true, "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", + "debug": "~4.4.1", "engine.io-parser": "~5.2.1", - "ws": "~8.17.1", + "ws": "~8.21.0", "xmlhttprequest-ssl": "~2.1.1" } }, - "node_modules/engine.io-parser": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "node_modules/engine.io-client/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, @@ -7801,37 +7490,27 @@ "node": ">=0.8.x" } }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, "node_modules/exif-parser": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==" }, "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.5.2.tgz", + "integrity": "sha512-0LNuMvs8/5mRYhnCR4k+lGV7fqPMs6Bnksda4S3zsCUmdxBpAn4zU4NNzXdq1pMKe/H4W5t/zVIDSJ/H3e0vDA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" + "@jest/expect-utils": "30.5.2", + "@jest/get-type": "30.5.0", + "jest-matcher-utils": "30.5.2", + "jest-message-util": "30.5.1", + "jest-mock": "30.5.2", + "jest-util": "30.5.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/exponential-backoff": { @@ -8429,9 +8108,9 @@ } }, "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, "license": "MIT", "dependencies": { @@ -8635,31 +8314,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash-base": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz", - "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "node_modules/hasown": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", @@ -8673,18 +8327,6 @@ "node": ">= 0.4" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -8746,9 +8388,9 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.3.0.tgz", + "integrity": "sha512-M5t5LlJpS1UHMjvwRQVdFHvPISGeLAxNcrWuJkeGh0KxsqCHZ1O3NXZU/8x7cD0BDcGW8kapxMKTvwlqrNkHkA==", "dev": true, "license": "BSD-2-Clause" }, @@ -8856,16 +8498,6 @@ "dev": true, "license": "MIT" }, - "node_modules/i18next-http-backend": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.7.3.tgz", - "integrity": "sha512-FgZxrXdRA5u44xfYsJlEBL4/KH3f2IluBpgV/7riW0YW2VEyM8FzVt2XHAOi6id0Ppj7vZvCZVpp5LrGXnc8Ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-fetch": "4.0.0" - } - }, "node_modules/iconv-corefoundation": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", @@ -9561,19 +9193,19 @@ } }, "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.5.2.tgz", + "integrity": "sha512-rBtHnI6BWTiWj3lM7fOLVfChx7R9B0u9VV3PRHawKs79x6ZjW1QoSrKenaigNGWlvhtoi2BqvDbABDie+Os3xQ==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "@jest/diff-sequences": "30.5.0", + "@jest/get-type": "30.5.0", + "chalk": "^4.1.2", + "pretty-format": "30.5.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-diff/node_modules/ansi-styles": { @@ -9590,44 +9222,35 @@ } }, "node_modules/jest-diff/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.5.1.tgz", + "integrity": "sha512-byhRAPguVKMQIj4kjJwJ5lAskVhfuiSdiYl/aLTWpgkGEmic2jYhJh1yE9ih8Ox44Xg9ccCT11/S6QrzSJuNrg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "@jest/react-is-18": "npm:react-is@^18.3.1", + "@jest/react-is-19": "npm:react-is@^19.2.5", + "@jest/schemas": "30.5.0", + "ansi-styles": "^5.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.5.2.tgz", + "integrity": "sha512-lFkB365PTIHOhPzwrb9T6gvlDnPpOZ7/c3ewOKKB7bzztqjVrtlyRL2MkyfJXpyY2u2SKw001JKrTx14fBUFcQ==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "@jest/get-type": "30.5.0", + "chalk": "^4.1.2", + "jest-diff": "30.5.2", + "pretty-format": "30.5.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-matcher-utils/node_modules/ansi-styles": { @@ -9644,39 +9267,41 @@ } }, "node_modules/jest-matcher-utils/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.5.1.tgz", + "integrity": "sha512-byhRAPguVKMQIj4kjJwJ5lAskVhfuiSdiYl/aLTWpgkGEmic2jYhJh1yE9ih8Ox44Xg9ccCT11/S6QrzSJuNrg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "@jest/react-is-18": "npm:react-is@^18.3.1", + "@jest/react-is-19": "npm:react-is@^19.2.5", + "@jest/schemas": "30.5.0", + "ansi-styles": "^5.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.5.1.tgz", + "integrity": "sha512-UdQlLdd9wL/Ys7xRErckqwD6wPlSZYueosSWuHc1r2ztGLwlgPvtSJq2+BPEgaEY13WLvfFbmhTj8pba0Sd1jg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.5.1", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-util": "30.5.1", + "picomatch": "^4.0.3", + "pretty-format": "30.5.1", "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "stack-utils": "^2.0.6" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-message-util/node_modules/ansi-styles": { @@ -9692,37 +9317,90 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/jest-message-util/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.5.1.tgz", + "integrity": "sha512-byhRAPguVKMQIj4kjJwJ5lAskVhfuiSdiYl/aLTWpgkGEmic2jYhJh1yE9ih8Ox44Xg9ccCT11/S6QrzSJuNrg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "@jest/react-is-18": "npm:react-is@^18.3.1", + "@jest/react-is-19": "npm:react-is@^19.2.5", + "@jest/schemas": "30.5.0", + "ansi-styles": "^5.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock": { + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.5.2.tgz", + "integrity": "sha512-KTHb37Fhj8xY8qPFvTFaFJHcdsumQp+ExsUlgoX232Agmc706gagBs53+CYvulV7MVQo9AgXOUxsqzzVBoJlrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.5.2", + "@jest/types": "30.5.1", + "@types/node": "*", + "jest-util": "30.5.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-regex-util": { + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.5.0.tgz", + "integrity": "sha512-Mg0WK7A6xRHLSA1udJ8y9f3lM0uUhFTBnLKzwPmqB9AylvpleJ6BLemR8K9dK27DY+cesDryoA7yLZCAHsPG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "version": "30.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.5.1.tgz", + "integrity": "sha512-yKuxmNy2rSbTXw+3SIPanJo+nV4/BS1p26v44IYBFMsswSQySfMMcPHErnOncda7i9HEz0q605rIhSTBVgrZTg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", + "@jest/types": "30.5.1", "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/jimp": { @@ -10084,18 +9762,6 @@ "node": ">= 0.4" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -10129,27 +9795,6 @@ "node": ">=8.6" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", - "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", - "dev": true, - "license": "MIT" - }, "node_modules/mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", @@ -10225,28 +9870,14 @@ "mini-svg-data-uri": "cli.js" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true, - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "dev": true, - "license": "MIT" - }, "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -10294,6 +9925,7 @@ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "minimist": "^1.2.6" }, @@ -10311,33 +9943,6 @@ "node": "*" } }, - "node_modules/motion": { - "version": "11.18.2", - "resolved": "https://registry.npmjs.org/motion/-/motion-11.18.2.tgz", - "integrity": "sha512-JLjvFDuFr42NFtcVoMAyC2sEjnpA8xpy6qWPyzQvCloznAyQ8FIXioxWfHiLtgYhoVpfUqSWpn1h9++skj9+Wg==", - "dev": true, - "license": "MIT", - "dependencies": { - "framer-motion": "^11.18.2", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, "node_modules/motion-dom": { "version": "11.18.1", "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.18.1.tgz", @@ -10893,23 +10498,6 @@ "node": ">=6" } }, - "node_modules/parse-asn1": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.9.tgz", - "integrity": "sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "asn1.js": "^4.10.1", - "browserify-aes": "^1.2.0", - "evp_bytestokey": "^1.0.3", - "pbkdf2": "^3.1.5", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/parse-bmfont-ascii": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", @@ -11025,24 +10613,6 @@ "dev": true, "license": "ISC" }, - "node_modules/pbkdf2": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz", - "integrity": "sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "ripemd160": "^2.0.3", - "safe-buffer": "^5.2.1", - "sha.js": "^2.4.12", - "to-buffer": "^1.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/pe-library": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", @@ -11377,9 +10947,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", + "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11595,28 +11165,6 @@ "node": ">=10" } }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", - "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", - "dev": true, - "license": "MIT" - }, "node_modules/pump": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", @@ -11698,27 +11246,6 @@ "dev": true, "license": "MIT" }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -12329,36 +11856,6 @@ "rimraf": "bin.js" } }, - "node_modules/ripemd160": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", - "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.1.2", - "inherits": "^2.0.4" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ripemd160/node_modules/hash-base": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", - "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/roarr": { "version": "2.15.4", "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", @@ -12674,27 +12171,6 @@ "node": ">= 0.4" } }, - "node_modules/sha.js": { - "version": "2.4.12", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", - "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", - "dev": true, - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" - }, - "bin": { - "sha.js": "bin.js" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", @@ -13372,22 +12848,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/sumchecker": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", @@ -13461,19 +12921,6 @@ "url": "https://github.com/sponsors/dcastil" } }, - "node_modules/tailwind-scrollbar": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tailwind-scrollbar/-/tailwind-scrollbar-3.1.0.tgz", - "integrity": "sha512-pmrtDIZeHyu2idTejfV59SbaJyvp1VRjYxAjZBH0jnyrPRo6HL1kD5Glz8VPagasqr6oAx6M05+Tuw429Z8jxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "tailwindcss": "3.x" - } - }, "node_modules/tailwindcss": { "version": "3.4.19", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", @@ -13766,28 +13213,6 @@ "tmp": "^0.2.0" } }, - "node_modules/to-buffer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", - "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/to-buffer/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -14059,16 +13484,6 @@ "node": ">= 4.0.0" } }, - "node_modules/untildify": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", - "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/unzipper": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.5.tgz", @@ -14288,19 +13703,6 @@ } } }, - "node_modules/vite-plugin-copy": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/vite-plugin-copy/-/vite-plugin-copy-0.1.6.tgz", - "integrity": "sha512-bqIaefZOE2Jx8P5wJuHKL5GzCERa/pcwdUQWaocyTNXgalN2xkxXH7LmqRJ34V2OlKF2F9E/zj0zITS7U6PpUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-glob": "^3.2.7" - }, - "engines": { - "node": ">=14.8.0" - } - }, "node_modules/void-elements": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", @@ -14507,13 +13909,6 @@ "node": ">=4" } }, - "node_modules/winreg": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/winreg/-/winreg-1.2.4.tgz", - "integrity": "sha512-IHpzORub7kYlb8A43Iig3reOvlcBJGX9gZ0WycHhghHtA65X0LYnMRuJs+aH1abVnMJztQkvQNlltnbPi5aGIA==", - "dev": true, - "license": "BSD-2-Clause" - }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -14568,9 +13963,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index b2445dbf..cc85c4e0 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,6 @@ "build:linux": "npm run build && electron-builder --linux" }, "devDependencies": { - "@date-fns/utc": "^2.0.0", "@electron-toolkit/eslint-config-prettier": "^3.0.0", "@electron-toolkit/eslint-config-ts": "^3.1.0", "@electron-toolkit/preload": "^3.0.0", @@ -46,8 +45,6 @@ "@fortawesome/react-fontawesome": "^0.2.0", "@headlessui/react": "^2.2.8", "@hookform/resolvers": "^3.3.4", - "@nethesis/nethesis-brands-svg-icons": "github:nethesis/Font-Awesome#ns-brands", - "@nethesis/nethesis-light-svg-icons": "github:nethesis/Font-Awesome#ns-light", "@nethesis/nethesis-solid-svg-icons": "github:nethesis/Font-Awesome#ns-solid", "@nethesis/phone-island": "^1.0.15", "@tailwindcss/forms": "^0.5.7", @@ -56,12 +53,10 @@ "@types/react": "^18.2.48", "@types/react-dom": "^18.2.18", "@vitejs/plugin-react": "^4.2.1", - "auto-launch": "^5.0.6", "autoprefixer": "^10.4.17", "axios": "^1.6.7", "classnames": "^2.5.1", "clsx": "^2.1.0", - "crypto-browserify": "^3.12.0", "crypto-js": "^4.2.0", "date-fns": "^2.30.0", "date-fns-tz": "^1.3.8", @@ -74,13 +69,10 @@ "eslint-plugin-react-hooks": "^5.2.0", "framer-motion": "^11.11.8", "i18next": "^22.4.9", - "i18next-browser-languagedetector": "^7.0.1", "i18next-electron-fs-backend": "^3.0.1", "i18next-fs-backend": "^2.3.2", - "i18next-http-backend": "^2.1.1", "lodash": "^4.17.21", "moment": "^2.30.1", - "motion": "^11.13.1", "path-browserify": "^1.0.1", "postcss": "^8.4.35", "prettier": "^3.2.4", @@ -90,13 +82,11 @@ "react-hook-form": "^7.50.1", "react-i18next": "^12.1.5", "react-router-dom": "^6.21.3", - "rollup": "^4.12.1", + "react-tooltip": "^5.28.0", "tailwind-merge": "^2.2.1", - "tailwind-scrollbar": "^3.1.0", "tailwindcss": "^3.4.1", "typescript": "^5.3.3", "vite": "^5.0.12", - "vite-plugin-copy": "^0.1.6", "zod": "^3.22.4", "zustand": "^4.5.0" }, diff --git a/src/main/classes/controllers/AccountController.ts b/src/main/classes/controllers/AccountController.ts index ff18a1cb..ffdc7ba4 100644 --- a/src/main/classes/controllers/AccountController.ts +++ b/src/main/classes/controllers/AccountController.ts @@ -1,8 +1,6 @@ import { Account, - AuthAppData, AvailableDevices, - ConfigFile, PhoneIslandPosition, isSsoMethod, } from '@shared/types' @@ -15,21 +13,6 @@ import { NetworkController } from './NetworkController' import { getAccountUID } from '@shared/utils/utils' import { requires2FA, isJWTExpired } from '@shared/utils/jwt' -const defaultConfig: ConfigFile = { - lastUser: undefined, - accounts: {}, -} - -type EventCallback = (...args: any[]) => void | Promise -type EventListenerCallback = { - event: keyof typeof AccountEvents - callback: EventCallback -} -export enum AccountEvents { - LOGIN = 'LOGIN', - LOGOUT = 'LOGOUT', -} - export class AccountController { _app: Electron.App | undefined static instance: AccountController @@ -61,12 +44,6 @@ export class AccountController { return safeStorage.isEncryptionAvailable() } - listAvailableAccounts(): Account[] { - const authAppData = store.store.auth - if (authAppData) return Object.values(authAppData.availableAccounts) - return [] - } - async logout() { // Call API logout before clearing local data const account = store.store.account diff --git a/src/main/classes/controllers/NetworkController.ts b/src/main/classes/controllers/NetworkController.ts index 81487ae7..d12faf6d 100644 --- a/src/main/classes/controllers/NetworkController.ts +++ b/src/main/classes/controllers/NetworkController.ts @@ -6,39 +6,6 @@ export class NetworkController { NetworkController.instance = this } - async post( - path: string, - data: object | undefined, - config: - | { - headers: { - Authorization?: string | undefined - 'Content-Type': string - } - } - | undefined = { headers: { 'Content-Type': 'application/json' } }, - ): Promise { - try { - const response = await axios.post(path, data, { - timeout: 5000, - ...config, - }) - - return response.data - } catch (e: any) { - const err: AxiosError = e - Log.error( - 'during fetch POST', - err.name, - err.code, - err.message, - path, - config, - data, - ) - throw e - } - } async get( path: string, config: diff --git a/src/main/classes/controllers/PhoneIslandController.ts b/src/main/classes/controllers/PhoneIslandController.ts index fd7e819d..23332124 100644 --- a/src/main/classes/controllers/PhoneIslandController.ts +++ b/src/main/classes/controllers/PhoneIslandController.ts @@ -2,7 +2,6 @@ import { PhoneIslandWindow } from '../windows' import { IPC_EVENTS } from '@shared/constants' import { Log } from '@shared/utils/logger' import { AccountController } from './AccountController' -import { debouncer } from '@shared/utils/utils' import { once } from '@/lib/ipcEvents' import { screen } from 'electron' import { Extension, PhoneIslandPosition, Size } from '@shared/types' @@ -10,7 +9,6 @@ import { Extension, PhoneIslandPosition, Size } from '@shared/types' export class PhoneIslandController { static instance: PhoneIslandController window: PhoneIslandWindow - private isWarmingUp: boolean = false private lastVisibleBounds: Electron.Rectangle | undefined private isValidVisibleBounds( @@ -280,8 +278,7 @@ export class PhoneIslandController { `PhoneIsland resize to 0x0 -> hidden from (${hiddenFrom.x}, ${hiddenFrom.y})`, ) } else { - // Don't show window during warm-up - if (!window.isVisible() && !this.isWarmingUp) { + if (!window.isVisible()) { if (process.platform === 'win32') { const restoredBounds = this.resolveWindowsBounds(size) window.setBounds(restoredBounds, false) @@ -302,91 +299,6 @@ export class PhoneIslandController { } } - showPhoneIsland(size: Size) { - try { - const window = this.window.getWindow() - if (window) { - Log.info( - `PhoneIsland showPhoneIsland called with size ${size.w}x${size.h}`, - ) - this.resize(size) - if (process.platform === 'win32') { - const restoredBounds = this.resolveWindowsBounds(size) - window.setBounds(restoredBounds, false) - this.rememberVisibleBounds(restoredBounds) - if (!window.isVisible() && !this.isWarmingUp) { - window.show() - window.setAlwaysOnTop(true, 'screen-saver') - } - } else if (process.platform !== 'linux') { - const phoneIslandPosition = - AccountController.instance.getAccountPhoneIslandPosition() - Log.info( - `PhoneIsland saved position: ${phoneIslandPosition ? `(${phoneIslandPosition.x}, ${phoneIslandPosition.y})` : 'none'}`, - ) - if (phoneIslandPosition) { - const displays = screen.getAllDisplays() - const isPhoneIslandOnDisplay = displays.reduce( - (result, display) => { - const area = display.workArea - return ( - result || - (phoneIslandPosition.x >= area.x && - phoneIslandPosition.y >= area.y && - phoneIslandPosition.x + size.w < area.x + area.width && - phoneIslandPosition.y + size.h < area.y + area.height) - ) - }, - false, - ) - if (isPhoneIslandOnDisplay) { - window?.setBounds( - { x: phoneIslandPosition.x, y: phoneIslandPosition.y }, - false, - ) - Log.info( - `PhoneIsland positioned at saved location (${phoneIslandPosition.x}, ${phoneIslandPosition.y})`, - ) - } else { - window?.center() - Log.info( - `PhoneIsland saved position is off-screen, centered instead. Displays: ${JSON.stringify(displays.map((d) => d.workArea))}`, - ) - } - } else { - window?.center() - Log.info('PhoneIsland no saved position, centered') - } - } else { - window?.center() - } - const finalBounds = window.getBounds() - Log.info( - `PhoneIsland final bounds after showPhoneIsland: (${finalBounds.x}, ${finalBounds.y}) ${finalBounds.width}x${finalBounds.height}`, - ) - } - } catch (e) { - Log.warning('error during showing PhoneIslandWindow:', e) - } - } - - hidePhoneIsland() { - try { - const window = this.window.getWindow() - const phoneIslandBounds = window?.getBounds() - const persistableBounds = this.getPersistableBounds(phoneIslandBounds) - if (persistableBounds) { - Log.info( - `PhoneIsland hiding, saving position (${persistableBounds.x}, ${persistableBounds.y}) size ${persistableBounds.width}x${persistableBounds.height}`, - ) - this.savePhoneIslandPosition(persistableBounds) - } - debouncer('hide', () => window?.hide(), 250) - } catch (e) { - Log.warning('error during hiding PhoneIslandWindow:', e) - } - } - logout() { return new Promise((resolve, reject) => { try { @@ -427,10 +339,7 @@ export class PhoneIslandController { updateDefaultDevice(ext: Extension, force: boolean) { try { - // const { NethVoiceAPI } = useNethVoiceAPI(store.store.account) - // NethVoiceAPI.User.me().then((me) => { this.window.emit(IPC_EVENTS.CHANGE_DEFAULT_DEVICE, ext, force) - // }) } catch (e) { Log.warning( 'error during emitting updateDefaultDevice event to the PhoneIslandWindow:', @@ -439,74 +348,6 @@ export class PhoneIslandController { } } - muteAudio() { - try { - const window = this.window.getWindow() - if (window && window.webContents) { - window.webContents.setAudioMuted(true) - Log.info('PhoneIsland audio muted') - } - } catch (e) { - Log.warning('error during muting PhoneIsland audio:', e) - } - } - - unmuteAudio() { - try { - const window = this.window.getWindow() - if (window && window.webContents) { - window.webContents.setAudioMuted(false) - Log.info('PhoneIsland audio unmuted') - } - } catch (e) { - Log.warning('error during unmuting PhoneIsland audio:', e) - } - } - - forceHide() { - try { - const window = this.window.getWindow() - if (window) { - this.isWarmingUp = true - const persistableBounds = this.getPersistableBounds(window.getBounds()) - if (persistableBounds) { - this.savePhoneIslandPosition(persistableBounds) - } - window.hide() - Log.info('PhoneIsland window hidden') - } - } catch (e) { - Log.warning('error during force hiding PhoneIsland:', e) - } - } - - forceShow() { - try { - const window = this.window.getWindow() - if (window) { - this.isWarmingUp = false - // Only show if there's actually content (size > 0) - const bounds = window.getBounds() - if (bounds.width > 0 && bounds.height > 0) { - if (process.platform === 'win32') { - const restoredBounds = this.resolveWindowsBounds({ - w: bounds.width, - h: bounds.height, - }) - window.setBounds(restoredBounds, false) - this.rememberVisibleBounds(restoredBounds) - } - window.show() - window.setAlwaysOnTop(true, 'screen-saver') - this.rememberVisibleBounds(window.getBounds()) - Log.info('PhoneIsland window shown') - } - } - } catch (e) { - Log.warning('error during force showing PhoneIsland:', e) - } - } - async safeQuit() { await this.logout() } diff --git a/src/main/lib/commandBarShortcut.ts b/src/main/lib/commandBarShortcut.ts index e8213b0e..a4001b81 100644 --- a/src/main/lib/commandBarShortcut.ts +++ b/src/main/lib/commandBarShortcut.ts @@ -36,10 +36,6 @@ export function getDefaultCommandBarModifier(): CommandBarDoubleTapModifier { return process.platform === 'darwin' ? 'Cmd' : 'Ctrl' } -export function isCommandBarDoubleTapShortcutStarted(): boolean { - return uiohookStarted -} - export function stopCommandBarDoubleTapShortcut() { if (!uiohookStarted) return diff --git a/src/main/lib/ipcEvents.ts b/src/main/lib/ipcEvents.ts index c8874946..ac720809 100644 --- a/src/main/lib/ipcEvents.ts +++ b/src/main/lib/ipcEvents.ts @@ -1,4 +1,4 @@ -import { AccountController, DevToolsController } from '@/classes/controllers' +import { AccountController } from '@/classes/controllers' import { LoginController } from '@/classes/controllers/LoginController' import { PhoneIslandController } from '@/classes/controllers/PhoneIslandController' import { CommandBarController } from '@/classes/controllers/CommandBarController' @@ -20,12 +20,7 @@ import { Log } from '@shared/utils/logger' import { NethLinkController } from '@/classes/controllers/NethLinkController' import { AppController } from '@/classes/controllers/AppController' import { store } from './mainStore' -import { - debouncer, - getAccountUID, - getPageFromQuery, - isDev, -} from '@shared/utils/utils' +import { debouncer, getAccountUID, getPageFromQuery } from '@shared/utils/utils' import { NetworkController } from '@/classes/controllers/NetworkController' import { useLogin } from '@shared/useLogin' import { PhoneIslandWindow } from '@/classes/windows' @@ -353,12 +348,6 @@ export function registerIpcEvents() { ipcMain.on(IPC_EVENTS.PHONE_ISLAND_RESIZE, (_, size) => { PhoneIslandController.instance.resize(size) }) - ipcMain.on(IPC_EVENTS.SHOW_PHONE_ISLAND, (_, size) => { - PhoneIslandController.instance.showPhoneIsland(size) - }) - ipcMain.on(IPC_EVENTS.HIDE_PHONE_ISLAND, (_) => { - PhoneIslandController.instance.hidePhoneIsland() - }) ipcMain.on(IPC_EVENTS.LOGIN_WINDOW_RESIZE, (_, h) => { LoginController.instance.resize(h) }) @@ -376,28 +365,9 @@ export function registerIpcEvents() { store.updateStore(newStore, 'delete account') store.saveToDisk(true) }) - ipcMain.on(IPC_EVENTS.HIDE_LOGIN_WINDOW, () => { - LoginController.instance.hide() - }) ipcMain.on(IPC_EVENTS.CHANGE_THEME, (_, theme) => { AccountController.instance.updateTheme(theme) - try { - NethLinkController.instance?.window?.emit( - IPC_EVENTS.ON_CHANGE_THEME, - theme, - ) - } catch (e) { - Log.error(e) - } - try { - DevToolsController.instance?.window?.emit( - IPC_EVENTS.ON_CHANGE_THEME, - theme, - ) - } catch (e) { - Log.error(e) - } }) ipcMain.on(IPC_EVENTS.PHONE_ISLAND_READY, () => { @@ -784,24 +754,6 @@ export function registerIpcEvents() { } }) - ipcMain.on(IPC_EVENTS.TOGGLE_COMMAND_BAR, () => { - try { - if (!isUserLoggedIn()) return - CommandBarController.instance?.toggle() - } catch (e) { - Log.error('TOGGLE_COMMAND_BAR error', e) - } - }) - - ipcMain.on(IPC_EVENTS.SHOW_COMMAND_BAR, () => { - try { - if (!isUserLoggedIn()) return - CommandBarController.instance?.show() - } catch (e) { - Log.error('SHOW_COMMAND_BAR error', e) - } - }) - ipcMain.on(IPC_EVENTS.HIDE_COMMAND_BAR, () => { try { CommandBarController.instance?.hide() diff --git a/src/main/main.ts b/src/main/main.ts index c2482344..602595ec 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -49,7 +49,6 @@ import Backend from 'i18next-fs-backend/cjs' import { uniq } from 'lodash' import { Registry } from 'rage-edit' import { useNethVoiceAPI } from '@shared/useNethVoiceAPI' -import { URL } from 'url' // get app parameter const params = process.argv @@ -59,9 +58,6 @@ for (const arg of params) { if (['DEV', 'DEVTOOLS', 'DEBUG'].includes(kv[0])) { kv[1] = kv[1] === 'true' } - // } else { - // kv[1] = undefined - // } if (kv[1]) process.env[kv[0]] = kv[1] } } @@ -272,7 +268,6 @@ function attachOnReadyProcess() { let retryAppStart: NodeJS.Timeout | undefined = undefined app.whenReady().then(async () => { - const isGone = false Log.info('APP READY') await startLocalization() @@ -796,7 +791,6 @@ async function onAppResume() { const data = store.getFromDisk() store.updateStore(data, 'onAppResume') Log.info('APP POWER RESUME') - const showNethlink = true if (store.store.account && NethLinkController.instance) { const autoLoginResult = await AccountController.instance.autoLogin() if (autoLoginResult) { diff --git a/src/preload/index.ts b/src/preload/index.ts index 692e1aa2..c6b66b9a 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -6,7 +6,7 @@ import { import os from 'os' import { electronAPI } from '@electron-toolkit/preload' import { IPC_EVENTS } from '@shared/constants' -import { Account, ContactType, Size } from '@shared/types' +import { Size } from '@shared/types' import { preloadBindings } from 'i18next-electron-fs-backend' export interface IElectronAPI { @@ -23,15 +23,7 @@ export interface IElectronAPI { i18nextElectronBackend: any // SYNC EMITTERS - expect response - login: ( - host: string, - username: string, - password: string, - ) => Promise - deleteSpeedDial(contact: ContactType): Promise getLocale(): Promise - onStartCall(callback: (number: string | number) => void): void - onUpdateAppNotification(showUpdateAppNotification: () => void): void // EMITTER - only emit, no response openDevTool(hash: string): unknown @@ -41,16 +33,11 @@ export interface IElectronAPI { openUrl?: string, ): void logout: () => void - startCall(phoneNumber: string): void - hideLoginWindow(): void resizeLoginWindow(height: number): void resizePhoneIsland(size: Size): void - sendInitializationCompleted(id: string): void openHostPage(path: string): void openExternalPage(url: string): void exitNethLink(): void - hidePhoneIsland(): void - showPhoneIsland(size: Size): void copyToClipboard(text: string): void } @@ -62,14 +49,6 @@ const customElectronAPI = { removeAllListeners: (channel) => ipcRenderer.removeAllListeners(channel), } -function addListener(channel) { - return (callback) => { - ipcRenderer.on(channel, (e: Electron.IpcRendererEvent, ...args) => { - callback(...args) - }) - } -} - function setEmitterSync(event): () => Promise { return async (...args): Promise => { return await new Promise((resolve, reject) => { @@ -101,26 +80,18 @@ const api: IElectronAPI = { arch: process.arch, i18nextElectronBackend: preloadBindings(ipcRenderer, process), // SYNC EMITTERS - expect response - login: setEmitterSync(IPC_EVENTS.LOGIN), getLocale: setEmitterSync(IPC_EVENTS.GET_LOCALE), // EMITTER - only emit, no response - sendInitializationCompleted: setEmitter(IPC_EVENTS.INITIALIZATION_COMPELTED), openDevTool: setEmitter(IPC_EVENTS.OPEN_DEV_TOOLS), - hideLoginWindow: setEmitter(IPC_EVENTS.HIDE_LOGIN_WINDOW), logout: setEmitter(IPC_EVENTS.LOGOUT), resizePhoneIsland: setEmitter(IPC_EVENTS.PHONE_ISLAND_RESIZE), resizeLoginWindow: setEmitter(IPC_EVENTS.LOGIN_WINDOW_RESIZE), openHostPage: setEmitter(IPC_EVENTS.OPEN_HOST_PAGE), openExternalPage: setEmitter(IPC_EVENTS.OPEN_EXTERNAL_PAGE), exitNethLink: setEmitter(IPC_EVENTS.CLOSE_NETH_LINK), - hidePhoneIsland: setEmitter(IPC_EVENTS.HIDE_PHONE_ISLAND), - showPhoneIsland: setEmitter(IPC_EVENTS.SHOW_PHONE_ISLAND), copyToClipboard: setEmitter(IPC_EVENTS.COPY_TO_CLIPBOARD), sendNotification: setEmitter(IPC_EVENTS.SEND_NOTIFICATION), - - // LISTENERS - receive data async - onUpdateAppNotification: addListener(IPC_EVENTS.UPDATE_APP_NOTIFICATION), } // Use `contextBridge` APIs to expose Electron APIs to diff --git a/src/renderer/src/assets/AvatarPlaceholderLoginPage.svg b/src/renderer/src/assets/AvatarPlaceholderLoginPage.svg deleted file mode 100644 index e95ee8b2..00000000 --- a/src/renderer/src/assets/AvatarPlaceholderLoginPage.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/renderer/src/assets/AvatarProvaLoginPage.jpeg b/src/renderer/src/assets/AvatarProvaLoginPage.jpeg deleted file mode 100644 index de1c3546..00000000 Binary files a/src/renderer/src/assets/AvatarProvaLoginPage.jpeg and /dev/null differ diff --git a/src/renderer/src/assets/TrayNotificationIcon.svg b/src/renderer/src/assets/TrayNotificationIcon.svg deleted file mode 100644 index 50e0cc8d..00000000 --- a/src/renderer/src/assets/TrayNotificationIcon.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/renderer/src/assets/icons.svg b/src/renderer/src/assets/icons.svg deleted file mode 100644 index 8ef80447..00000000 --- a/src/renderer/src/assets/icons.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/renderer/src/assets/missed.svg b/src/renderer/src/assets/missed.svg deleted file mode 100644 index 3089bee0..00000000 --- a/src/renderer/src/assets/missed.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/renderer/src/components/Modal/index.tsx b/src/renderer/src/components/Modal/index.tsx index 2175c3be..8e405f32 100644 --- a/src/renderer/src/components/Modal/index.tsx +++ b/src/renderer/src/components/Modal/index.tsx @@ -76,7 +76,6 @@ const ModalComponent: FC = ({ className=' fixed inset-0 z-50 overflow-y-auto - scrollbar-thin scrollbar-thumb-gray-400 dark:scrollbar-thumb-gray-400 scrollbar-thumb-rounded-full scrollbar-thumb-opacity-50 scrollbar-track-gray-200 dark:scrollbar-track-gray-900 scrollbar-track-rounded-full scrollbar-track-opacity-25 ' >
diff --git a/src/renderer/src/components/Modules/NethVoice/BaseModule/ProfileDialog.tsx b/src/renderer/src/components/Modules/NethVoice/BaseModule/ProfileDialog.tsx index a2675f9e..fd88bce0 100644 --- a/src/renderer/src/components/Modules/NethVoice/BaseModule/ProfileDialog.tsx +++ b/src/renderer/src/components/Modules/NethVoice/BaseModule/ProfileDialog.tsx @@ -4,7 +4,7 @@ import { faArrowRightFromBracket as LogoutIcon, faGear as SettingsIcon, } from '@fortawesome/free-solid-svg-icons' -import { motion } from 'motion/react' +import { motion } from 'framer-motion' import { ProfileData } from './ProfileDialog/ProfileData' import { MenuAction } from './ProfileDialog/MenuAction' import { t } from 'i18next' diff --git a/src/renderer/src/components/Modules/NethVoice/BaseModule/ProfileDialog/NethVoiceLink.tsx b/src/renderer/src/components/Modules/NethVoice/BaseModule/ProfileDialog/NethVoiceLink.tsx deleted file mode 100644 index 86e5f07b..00000000 --- a/src/renderer/src/components/Modules/NethVoice/BaseModule/ProfileDialog/NethVoiceLink.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' -import { faArrowUpRightFromSquare as GoToNethVoiceIcon } from '@fortawesome/free-solid-svg-icons' -import { t } from 'i18next' -export const NethVoiceLink = () => { - function handleGoToNethVoicePage() { - window.api.openHostPage('/') - } - - return ( -
- -

{t('TopBar.Go to NethVoice CTI')}

-
- ) -} diff --git a/src/renderer/src/components/Modules/NethVoice/BaseModule/ProfileDialog/PresenceSettings/PresenceBadge.tsx b/src/renderer/src/components/Modules/NethVoice/BaseModule/ProfileDialog/PresenceSettings/PresenceBadge.tsx index 018b9428..d1ae2163 100644 --- a/src/renderer/src/components/Modules/NethVoice/BaseModule/ProfileDialog/PresenceSettings/PresenceBadge.tsx +++ b/src/renderer/src/components/Modules/NethVoice/BaseModule/ProfileDialog/PresenceSettings/PresenceBadge.tsx @@ -6,7 +6,6 @@ import { } from '@fortawesome/free-solid-svg-icons' import { Badge } from '@renderer/components/Nethesis/Badge' import { useNethlinkData, useSharedState } from '@renderer/store' -import { StatusTypes } from '@shared/types' import { t } from 'i18next' import { useTheme } from '@renderer/theme/Context' import classNames from 'classnames' diff --git a/src/renderer/src/components/Modules/NethVoice/BaseModule/ProfileDialog/SettingsSettings/SettingsDevicesDialog.tsx b/src/renderer/src/components/Modules/NethVoice/BaseModule/ProfileDialog/SettingsSettings/SettingsDevicesDialog.tsx index 35d7dc2e..b43390c0 100644 --- a/src/renderer/src/components/Modules/NethVoice/BaseModule/ProfileDialog/SettingsSettings/SettingsDevicesDialog.tsx +++ b/src/renderer/src/components/Modules/NethVoice/BaseModule/ProfileDialog/SettingsSettings/SettingsDevicesDialog.tsx @@ -18,7 +18,6 @@ import { DropdownItem } from '@renderer/components/Nethesis/dropdown/DropdownIte import { DropdownHeader } from '@renderer/components/Nethesis/dropdown/DropdownHeader' import { Log } from '@shared/utils/logger' import { delay } from '@shared/utils/utils' -import { InlineNotification } from '@renderer/components/Nethesis/InlineNotification' type DeviceType = 'audioInput' | 'audioOutput' | 'videoInput' const LOCALSTORAGE_KEYS = { diff --git a/src/renderer/src/components/Modules/NethVoice/BaseModule/ProfileDialog/SettingsSettings/SettingsIncomingCallsDialog.tsx b/src/renderer/src/components/Modules/NethVoice/BaseModule/ProfileDialog/SettingsSettings/SettingsIncomingCallsDialog.tsx index 92e9eec8..796a1eb8 100644 --- a/src/renderer/src/components/Modules/NethVoice/BaseModule/ProfileDialog/SettingsSettings/SettingsIncomingCallsDialog.tsx +++ b/src/renderer/src/components/Modules/NethVoice/BaseModule/ProfileDialog/SettingsSettings/SettingsIncomingCallsDialog.tsx @@ -17,7 +17,7 @@ import { Dropdown } from '@renderer/components/Nethesis/dropdown' import { DropdownItem } from '@renderer/components/Nethesis/dropdown/DropdownItem' import { DropdownHeader } from '@renderer/components/Nethesis/dropdown/DropdownHeader' import { Log } from '@shared/utils/logger' -import { IPC_EVENTS, PHONE_ISLAND_EVENTS } from '@shared/constants' +import { IPC_EVENTS } from '@shared/constants' interface Ringtone { name: string diff --git a/src/renderer/src/components/Modules/NethVoice/SearchResults/SearchNumber.tsx b/src/renderer/src/components/Modules/NethVoice/SearchResults/SearchNumber.tsx index 8134049a..6f5dab7f 100644 --- a/src/renderer/src/components/Modules/NethVoice/SearchResults/SearchNumber.tsx +++ b/src/renderer/src/components/Modules/NethVoice/SearchResults/SearchNumber.tsx @@ -1,7 +1,7 @@ import { ReactNode } from 'react' import { t } from 'i18next' import { SearchData } from '@shared/types' -import { useNethlinkData, useSharedState } from '@renderer/store' +import { useNethlinkData } from '@renderer/store' import { Button } from '@renderer/components/Nethesis' import { usePhonebookSearchModule } from './hook/usePhoneBookSearchModule' import { ContactNameAndActions } from '@renderer/components/Modules/NethVoice/BaseModule/ContactNameAndAction' @@ -91,7 +91,6 @@ export function SearchNumber({ user, className, onClick }: SearchNumberProps) { ).filter((n) => n !== phoneNumber).length const username = getUsernameFromPhoneNumber(phoneNumber) - const avatarSrc = username ? operators?.avatars?.[username] : '' return (
diff --git a/src/renderer/src/components/Modules/NethVoice/Speeddials/Favourites/FavouriteFilter.tsx b/src/renderer/src/components/Modules/NethVoice/Speeddials/Favourites/FavouriteFilter.tsx index d3253ddf..534f2f15 100644 --- a/src/renderer/src/components/Modules/NethVoice/Speeddials/Favourites/FavouriteFilter.tsx +++ b/src/renderer/src/components/Modules/NethVoice/Speeddials/Favourites/FavouriteFilter.tsx @@ -9,7 +9,6 @@ import { import { t } from 'i18next' import { useNethlinkData } from '@renderer/store' import { FilterTypes } from '@shared/constants' -import { NethLinkPageData } from '@shared/types' export const FavouriteFilter = () => { const { theme: nethTheme } = useTheme() diff --git a/src/renderer/src/components/Modules/NethVoice/Speeddials/SpeedDials/SpeeddialsModule.tsx b/src/renderer/src/components/Modules/NethVoice/Speeddials/SpeedDials/SpeeddialsModule.tsx index f33692fc..e5b323a3 100644 --- a/src/renderer/src/components/Modules/NethVoice/Speeddials/SpeedDials/SpeeddialsModule.tsx +++ b/src/renderer/src/components/Modules/NethVoice/Speeddials/SpeedDials/SpeeddialsModule.tsx @@ -1,5 +1,5 @@ import { SpeedDialsBox } from './SpeedDialsBox' -import { useEffect, useState } from 'react' +import { useState } from 'react' import { SpeedDialFormBox } from './SpeedDialFormBox' import { SpeedDialDeleteDialog } from './SpeedDialDeleteDialog' import { useSpeedDialsModule } from '../hook/useSpeedDialsModule' diff --git a/src/renderer/src/components/Modules/NethVoice/Speeddials/hook/useFavouriteModule.ts b/src/renderer/src/components/Modules/NethVoice/Speeddials/hook/useFavouriteModule.ts index ebdd7ff5..ffe2672b 100644 --- a/src/renderer/src/components/Modules/NethVoice/Speeddials/hook/useFavouriteModule.ts +++ b/src/renderer/src/components/Modules/NethVoice/Speeddials/hook/useFavouriteModule.ts @@ -4,7 +4,6 @@ import { useEffect, useState } from 'react' import { debouncer } from '@shared/utils/utils' import { useLoggedNethVoiceAPI } from '@renderer/hooks/useLoggedNethVoiceAPI' import { FilterTypes, SpeeddialTypes } from '@shared/constants' -import { Log } from '@shared/utils/logger' export const useFavouriteModule = () => { const [speeddialsModule] = useNethlinkData('speeddialsModule') const [rawSpeedDials, setRawSpeedDials] = useNethlinkData('speeddials') diff --git a/src/renderer/src/components/Modules/NethVoice/Speeddials/hook/useSpeedDialsModule.ts b/src/renderer/src/components/Modules/NethVoice/Speeddials/hook/useSpeedDialsModule.ts index cb94f1b4..4ce3645c 100644 --- a/src/renderer/src/components/Modules/NethVoice/Speeddials/hook/useSpeedDialsModule.ts +++ b/src/renderer/src/components/Modules/NethVoice/Speeddials/hook/useSpeedDialsModule.ts @@ -1,5 +1,5 @@ import { useLoggedNethVoiceAPI } from '@renderer/hooks/useLoggedNethVoiceAPI' -import { useNethlinkData, useSharedState } from '@renderer/store' +import { useNethlinkData } from '@renderer/store' import { SpeeddialTypes } from '@shared/constants' import { ContactType, @@ -13,7 +13,6 @@ import { useEffect, useState } from 'react' export const useSpeedDialsModule = (): { speedDials: ContactType[] | undefined speedDialsState: StateType - favouriteState: StateType deleteSpeedDial: (speedDial: ContactType) => Promise upsertSpeedDial(data: ContactType): Promise } => { @@ -78,8 +77,7 @@ export const useSpeedDialsModule = (): { setRawSpeedDials(() => newSpeedDials) } } else { - const newSpeedDial = - await NethVoiceAPI.Phonebook.createSpeeddial(speedDial) + await NethVoiceAPI.Phonebook.createSpeeddial(speedDial) const newRawSpeedDials = await NethVoiceAPI.Phonebook.getSpeeddials() setRawSpeedDials((p) => newRawSpeedDials) } @@ -94,10 +92,6 @@ export const useSpeedDialsModule = (): { speeddialsModule?.selectedSpeedDial, update('selectedSpeedDial'), ] as StateType, - favouriteState: [ - speeddialsModule?.selectedFavourite, - update('selectedFavourite'), - ] as StateType, deleteSpeedDial, upsertSpeedDial, } diff --git a/src/renderer/src/components/Modules/NethlinkModules.tsx b/src/renderer/src/components/Modules/NethlinkModules.tsx index 9e6fb8df..7e17cce6 100644 --- a/src/renderer/src/components/Modules/NethlinkModules.tsx +++ b/src/renderer/src/components/Modules/NethlinkModules.tsx @@ -1,4 +1,4 @@ -import { useNethlinkData, useSharedState } from '@renderer/store' +import { useNethlinkData } from '@renderer/store' import { MENU_ELEMENT } from '@shared/constants' import { useCallback, useEffect } from 'react' import { PhonebookModule, SpeeddialsModule, LastCallsModule } from '.' diff --git a/src/renderer/src/components/Nethesis/CallsDate.tsx b/src/renderer/src/components/Nethesis/CallsDate.tsx index b82c6ec8..18d7ba9e 100644 --- a/src/renderer/src/components/Nethesis/CallsDate.tsx +++ b/src/renderer/src/components/Nethesis/CallsDate.tsx @@ -8,7 +8,6 @@ import { getTimeDifference, } from '../../lib/dateTime' import i18next from 'i18next' -import { UTCDate } from '@date-fns/utc' import { Account } from '@shared/types' import { useSharedState } from '@renderer/store' @@ -130,7 +129,7 @@ export const CallsDate: FC = ({ const minute = parseInt(timeParts[1], 10) const second = parseInt(timeParts[2], 10) - const utcDate = new UTCDate(year, month, day, hour, minute, second) + const utcDate = new Date(Date.UTC(year, month, day, hour, minute, second)) const callDate = utcToZonedTime(utcDate, differenceBetweenTimezone) return formatDistanceToNowStrict(callDate, { diff --git a/src/renderer/src/components/Nethesis/CustomThemedTooltip.tsx b/src/renderer/src/components/Nethesis/CustomThemedTooltip.tsx index 4f78354d..46a55e77 100644 --- a/src/renderer/src/components/Nethesis/CustomThemedTooltip.tsx +++ b/src/renderer/src/components/Nethesis/CustomThemedTooltip.tsx @@ -1,5 +1,5 @@ // src/components/CustomThemedTooltip.tsx -import React, { FC, useEffect, useState } from 'react' +import { FC, useEffect, useState } from 'react' import { Tooltip } from 'react-tooltip' import { useSharedState } from '@renderer/store' import { getSystemTheme, parseThemeToClassName } from '@renderer/utils' diff --git a/src/renderer/src/components/Nethesis/MultiSelectCombobox.tsx b/src/renderer/src/components/Nethesis/MultiSelectCombobox.tsx index 2b590c60..d6554341 100644 --- a/src/renderer/src/components/Nethesis/MultiSelectCombobox.tsx +++ b/src/renderer/src/components/Nethesis/MultiSelectCombobox.tsx @@ -29,7 +29,7 @@ import { faChevronDown, faXmark, } from '@fortawesome/free-solid-svg-icons' -import { IconDefinition } from '@fortawesome/fontawesome-common-types' +import { IconDefinition } from '@fortawesome/fontawesome-svg-core' export interface MultiSelectComboboxProps { options: string[] diff --git a/src/renderer/src/components/Nethesis/TextInput.tsx b/src/renderer/src/components/Nethesis/TextInput.tsx index d4406f8c..1e54bc17 100644 --- a/src/renderer/src/components/Nethesis/TextInput.tsx +++ b/src/renderer/src/components/Nethesis/TextInput.tsx @@ -22,7 +22,7 @@ import { cleanClassName } from '../../lib/utils' import { useTheme } from '../../theme/Context' import classNames from 'classnames' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' -import { IconDefinition } from '@fortawesome/fontawesome-common-types' +import { IconDefinition } from '@fortawesome/fontawesome-svg-core' export interface TextInputProps extends Omit< ComponentProps<'input'>, diff --git a/src/renderer/src/components/Nethesis/dropdown/DropdownItem.tsx b/src/renderer/src/components/Nethesis/dropdown/DropdownItem.tsx index 3bbb2a34..1430fdd2 100644 --- a/src/renderer/src/components/Nethesis/dropdown/DropdownItem.tsx +++ b/src/renderer/src/components/Nethesis/dropdown/DropdownItem.tsx @@ -2,12 +2,12 @@ // SPDX-License-Identifier: AGPL-3.0-or-later import { FC, ComponentProps } from 'react' -import { Menu, MenuItem } from '@headlessui/react' +import { MenuItem } from '@headlessui/react' import classNames from 'classnames' import { useTheme } from '@renderer/theme/Context' import { cleanClassName } from '@renderer/lib/utils' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' -import { IconDefinition } from '@fortawesome/fontawesome-common-types' +import { IconDefinition } from '@fortawesome/fontawesome-svg-core' export interface DropdownItemProps extends Omit< ComponentProps<'div'>, diff --git a/src/renderer/src/components/pageComponents/login/DisplayedAccountLogin.tsx b/src/renderer/src/components/pageComponents/login/DisplayedAccountLogin.tsx index 1fe9b018..f61bc072 100644 --- a/src/renderer/src/components/pageComponents/login/DisplayedAccountLogin.tsx +++ b/src/renderer/src/components/pageComponents/login/DisplayedAccountLogin.tsx @@ -4,7 +4,6 @@ import { t } from 'i18next' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faRemove as DeleteIcon } from '@fortawesome/free-solid-svg-icons' import { Avatar } from '../../Nethesis' -import { isDev } from '@shared/utils/utils' type DisplayedAccountLoginProps = { account?: Account diff --git a/src/renderer/src/components/pageComponents/login/LoginForm.tsx b/src/renderer/src/components/pageComponents/login/LoginForm.tsx index 8f7abe04..efc54d2a 100644 --- a/src/renderer/src/components/pageComponents/login/LoginForm.tsx +++ b/src/renderer/src/components/pageComponents/login/LoginForm.tsx @@ -337,7 +337,6 @@ export const LoginForm = ({ onError, handleRefreshConnection }) => { try { Log.info('LOGIN verifying 2FA code') - // const { NethVoiceAPI: TempAPI } = useNethVoiceAPI(tempAccount) const verifiedAccount = await NethVoiceAPI.Authentication.verify2FA( otpCode, tempAccount, @@ -368,16 +367,6 @@ export const LoginForm = ({ onError, handleRefreshConnection }) => { } } - function handleBack2FA() { - setShowTwoFactor(false) - setTempAccount(undefined) - setOnOTPError(false) - setIsLoading(false) - setOtpDisabled(false) - setOtpCode('') - setError(undefined) - } - const onSubmitForm: SubmitHandler = (data) => { const isSavedAccount = !!( selectedAccount && selectedAccount !== NEW_ACCOUNT diff --git a/src/renderer/src/hooks/useAccount.ts b/src/renderer/src/hooks/useAccount.ts index 2b9c7c78..ea753af9 100644 --- a/src/renderer/src/hooks/useAccount.ts +++ b/src/renderer/src/hooks/useAccount.ts @@ -1,10 +1,4 @@ -import { - AvailableDevices, - Device, - Extension, - ExtensionsType, - StatusTypes, -} from '@shared/types' +import { AvailableDevices, Device, StatusTypes } from '@shared/types' import { useEffect, useRef, useState } from 'react' import { useSharedState } from '@renderer/store' import { PERMISSION } from '@shared/constants' diff --git a/src/renderer/src/hooks/useIsomorphicLayoutEffect.ts b/src/renderer/src/hooks/useIsomorphicLayoutEffect.ts deleted file mode 100644 index 49ca31f3..00000000 --- a/src/renderer/src/hooks/useIsomorphicLayoutEffect.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { useEffect, useLayoutEffect } from 'react' - -export const useIsomorphicLayoutEffect = - typeof window !== 'undefined' ? useLayoutEffect : useEffect diff --git a/src/renderer/src/hooks/useLoggedNethVoiceAPI.ts b/src/renderer/src/hooks/useLoggedNethVoiceAPI.ts index 139e6886..d2be720e 100644 --- a/src/renderer/src/hooks/useLoggedNethVoiceAPI.ts +++ b/src/renderer/src/hooks/useLoggedNethVoiceAPI.ts @@ -1,5 +1,4 @@ import { useSharedState } from '@renderer/store' -import { Account } from '@shared/types' import { useNethVoiceAPI } from '@shared/useNethVoiceAPI' export const useLoggedNethVoiceAPI = () => { diff --git a/src/renderer/src/hooks/usePhoneIslandEventListeners.ts b/src/renderer/src/hooks/usePhoneIslandEventListeners.ts index e4761df2..c2daafa2 100644 --- a/src/renderer/src/hooks/usePhoneIslandEventListeners.ts +++ b/src/renderer/src/hooks/usePhoneIslandEventListeners.ts @@ -1,7 +1,7 @@ import { IPC_EVENTS, PHONE_ISLAND_EVENTS } from '@shared/constants' import { PhoneIslandData, PhoneIslandSizes } from '@shared/types' import { Log } from '@shared/utils/logger' -import { useState, useRef, useCallback, useEffect } from 'react' +import { useState, useRef, useEffect } from 'react' import { t } from 'i18next' import { sendNotification, sendSystemNotification } from '@renderer/utils' import { useSharedState } from '@renderer/store' diff --git a/src/renderer/src/hooks/useRefState.ts b/src/renderer/src/hooks/useRefState.ts index e59a5c82..8724d694 100644 --- a/src/renderer/src/hooks/useRefState.ts +++ b/src/renderer/src/hooks/useRefState.ts @@ -4,7 +4,6 @@ import { SetStateAction, useEffect, useRef, - useState, } from 'react' export const useRefState = ( diff --git a/src/renderer/src/index.css b/src/renderer/src/index.css index 69e08cae..9a9d9f59 100644 --- a/src/renderer/src/index.css +++ b/src/renderer/src/index.css @@ -18,10 +18,6 @@ @apply h-full; } -#__next { - @apply h-full; -} - #app-container { #phone-island-container { @@ -46,14 +42,6 @@ margin-top: calc(20px - 100%); right: 100%; } - - - - #openDevToolButton { - pointer-events: all; - border: 0 solid transparent; - border-radius: 0 8px 0 0; - } } .light ::-webkit-scrollbar { diff --git a/src/renderer/src/index.tsx b/src/renderer/src/index.tsx index afe82ee7..710f1f81 100644 --- a/src/renderer/src/index.tsx +++ b/src/renderer/src/index.tsx @@ -1,4 +1,3 @@ -import React from 'react' import ReactDOM from 'react-dom/client' import App from './App' diff --git a/src/renderer/src/lib/dateTime.ts b/src/renderer/src/lib/dateTime.ts index d7b540b7..90fda76f 100644 --- a/src/renderer/src/lib/dateTime.ts +++ b/src/renderer/src/lib/dateTime.ts @@ -1,31 +1,12 @@ // Copyright (C) 2024 Nethesis S.r.l. // SPDX-License-Identifier: AGPL-3.0-or-later -import { - differenceInHours, - formatDistanceToNowStrict, - formatDuration, - intervalToDuration, -} from 'date-fns' -import { padStart } from 'lodash' +import { differenceInHours } from 'date-fns' import { enGB, it } from 'date-fns/locale' import { format, utcToZonedTime, zonedTimeToUtc } from 'date-fns-tz' import { getNumericTimezone, getTimezone } from './utils' -import { UTCDate } from '@date-fns/utc' import { Account } from '@shared/types' -/** - * Format a date expressed in milliseconds to current locale - * - */ -export function formatDateLoc(date: any, fmt: string) { - return format(date, fmt, { locale: getLocale() }) -} - -export const getCallTimeToDisplay = (date: any) => { - return formatInTimeZoneLoc(new Date(date), 'HH:mm', 'UTC') -} - export const formatInTimeZoneLoc = (date: any, fmt: string, tz: any) => { return format(utcToZonedTime(date, tz), fmt, { timeZone: tz, @@ -33,19 +14,6 @@ export const formatInTimeZoneLoc = (date: any, fmt: string, tz: any) => { }) } -export function formatDateLocIsDifferentTimezone(date: any, fmt: string) { - const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone - return format(utcToZonedTime(date, timeZone), fmt, { locale: getLocale() }) -} - -export const getCallTimeToDisplayIsDifferentTimezone = (date: any) => { - const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone - return format(utcToZonedTime(date, timeZone), 'HH:mm', { - timeZone, - locale: getLocale(), - }) -} - export function formatDateLocIsAnnouncement(date: any) { const dateParts = date?.date_creation.split('/') const year = parseInt(dateParts[2], 10) @@ -66,52 +34,11 @@ export const getCallTimeToDisplayIsAnnouncement = ( const minute = parseInt(timeParts[1], 10) const second = parseInt(timeParts[2], 10) - const formattedTime = new UTCDate(0, 0, 0, hour, minute, second) + const formattedTime = new Date(Date.UTC(0, 0, 0, hour, minute, second)) return formatInTimeZoneLoc(formattedTime, 'HH:mm', differenceInHours) } -/** - * Format a call duration expressed in seconds to HH:MM:SS. E.g. 189 -> 03:09 - * - * @param seconds - duration to format - * - */ -export const formatCallDuration = (durationSeconds: number) => { - const duration: any = intervalToDuration({ - start: 0, - end: durationSeconds * 1000, - }) - const hours = duration.hours ? `${padStart(duration.hours, 2, '0')}:` : '' - const minutes = padStart(duration.minutes, 2, '0') - const seconds = padStart(duration.seconds, 2, '0') - const formatted = `${hours}${minutes}:${seconds}` - return formatted -} - -/** - * Format a duration expressed in seconds to HH:MM:SS. E.g. 189 -> 3 minutes 9 seconds - * - * @param seconds - duration to format - * - */ -export const formatDurationLoc = ( - durationSeconds: number, - options: any = {}, -) => { - if (!durationSeconds) { - return null - } - - return formatDuration( - intervalToDuration({ - start: 0, - end: durationSeconds * 1000, - }), - { ...options, locale: getLocale() }, - ) -} - /** * Get browser locale (english fallback) */ @@ -129,38 +56,6 @@ export const getLocale = () => { return loc } -/** - * Return the approximate distance from a date to now. Example output: 6 months - */ -export const humanDistanceToNowLoc = (date: any, options: any = {}) => { - if (!date) { - return null - } - - return formatDistanceToNowStrict(date, { ...options, locale: getLocale() }) -} - -/** - * Return the exact distance from a date to now. Example output: 13 minutes 5 seconds - */ -export const exactDistanceToNowLoc = (date: any, options: any = {}) => { - if (!date) { - return null - } - - const duration = intervalToDuration({ - start: date, - end: new Date(), - }) - - // custom option hideSeconds (not supported by date-fns) - if (options.hideSeconds) { - delete duration.seconds - } - - return formatDuration(duration, { ...options, locale: getLocale() }) -} - export const getTimeDifference = (account: Account, isInQueue: boolean) => { let serverTimeZone: any = getTimezone(account) const numericTimezone: any = getNumericTimezone(account) diff --git a/src/renderer/src/lib/utils.ts b/src/renderer/src/lib/utils.ts index 4c62c06a..023743ed 100644 --- a/src/renderer/src/lib/utils.ts +++ b/src/renderer/src/lib/utils.ts @@ -2,8 +2,6 @@ // SPDX-License-Identifier: AGPL-3.0-or-later import { PropsWithChildren } from 'react' -import axios from 'axios' -import { eventDispatch } from '../hooks/eventDispatch' import { Account } from '@shared/types' export interface ClearProps { @@ -36,17 +34,6 @@ export const getIsPhoneNumber = (text: string) => { return isPhoneNumber } -export function handleNetworkError(error: any) { - if (axios.isAxiosError(error)) { - console.error('error: ', error.message) - - return null - } else { - console.error('unexpected error: ', error) - return null - } -} - /** * Sort function to order array elements by a specific property (for array of objects) or by a specific index (for arrays of arrays) */ @@ -62,48 +49,6 @@ export const sortByProperty = (property: string | number) => { } } -/** - * Sort function to order array elements by a boolean property (for arrays of objects) or by a specific index - * - */ -export const sortByBooleanProperty = (property: string | number) => { - return function (a: any, b: any) { - // set 1 if true, 0 otherwise - const valueA = a[property] ? 1 : 0 - // set 1 if true, 0 otherwise - const valueB = b[property] ? 1 : 0 - - if (valueA < valueB) { - return -1 - } - if (valueA > valueB) { - return 1 - } - return 0 - } -} - -/** - * Sort function to order array elements by "favorite" boolean attribute - */ -export const sortByFavorite = (a: any, b: any) => { - if (a.favorite && !b.favorite) { - return -1 - } - if (!a.favorite && b.favorite) { - return 1 - } - return 0 -} - -export function getProductName() { - if (typeof window === 'undefined') { - return '' - } - // @ts-ignore - return `${window.CONFIG.PRODUCT_NAME}` -} - export function getTimezone(account: Account) { if (typeof account === 'undefined') { return '' @@ -119,190 +64,3 @@ export function getNumericTimezone(account: Account) { // @ts-ignore return `${account.numeric_timezone || '+0100'}` } - -export function getApiEndpoint() { - if (typeof window === 'undefined') { - return '' - } - // @ts-ignore - return `${window.CONFIG.API_ENDPOINT}` -} - -export function getApiScheme() { - if (typeof window === 'undefined') { - return '' - } - // @ts-ignore - return `${window.CONFIG.API_SCHEME}` -} - -/** - * Returns true if the device used by the user is using a mobile device. Useful to check if the user is using a touch screen, for example to disable hover features - */ -export function isMobileDevice() { - if (!navigator) { - return true - } - return /Android|iPhone|iPad|iPod|Windows Phone/i.test(navigator.userAgent) -} - -/** - * Returns the input string after removing all spaces and special characters - */ -export function cleanString(s: string) { - return s.replace(/[^a-zA-Z0-9]/g, '') -} - -/** - * Returns the converted size of the input file - */ -export function formatFileSize(sizeInBytes: any) { - const units = ['B', 'KB', 'MB', 'GB', 'TB'] - let size = sizeInBytes - let unitIndex = 0 - - while (size >= 1024 && unitIndex < units.length - 1) { - size /= 1024 - unitIndex++ - } - - const sizeFormatted = size.toFixed(2) - const unit = units[unitIndex] - - return `${sizeFormatted} ${unit}` -} - -/** - * Checks if the input string contains only valid characters for a phone number. - */ -function validatePhoneNumber(phoneNumber: any) { - const regex = /^[0-9*#+]*$/ - return regex.test(phoneNumber) -} - -// The event to show the audio player view and play an audio file. -export function playFileAudio(audioFileId: any, typeFile: string) { - const objectPlayAudioFile = { - type: typeFile === 'announcement' ? 'announcement' : 'call_recording', - id: audioFileId.toString(), - } - eventDispatch('phone-island-audio-player-start', { ...objectPlayAudioFile }) -} - -// Get favicon element -export function getHtmlFaviconElement() { - if (typeof window === 'undefined') { - return '' - } - - const faviconHtmlElement = document.querySelector( - "link[rel*='icon']", - ) as HTMLLinkElement - return faviconHtmlElement -} - -export function convertToCSV(objArray: any) { - const array = typeof objArray !== 'object' ? JSON.parse(objArray) : objArray - let str = '' - - for (let i = 0; i < array.length; i++) { - let line = '' - for (const index in array[i]) { - if (line !== '') { - line += ',' - } - line += array[i][index] === null ? '' : array[i][index] - } - str += line + '\r\n' - } - return str -} - -export function getNMonthsAgoDate(monthsAgo: number = 0): Date { - const currentDate = new Date() - const targetDate = new Date( - currentDate.getFullYear(), - currentDate.getMonth() - monthsAgo, - currentDate.getDate(), - ) - return targetDate -} - -// Inverts an object by swapping its keys and values -export function invertObject(obj: any) { - const invertedObj: any = {} - - // Iterate over each key-value pair in the original object. - for (const key in obj) { - const value = obj[key] - // Swap the key and value in the inverted object. - invertedObj[value.name] = key - } - return invertedObj -} - -// Open selected email manager -export const openEmailClient = (emailAddress: any) => { - const mailtoLink = `mailto:${emailAddress}` - window.location.href = mailtoLink -} - -export async function transferCall(operatorBadgeInformations: any) { - if (operatorBadgeInformations?.endpoints?.mainextension[0]?.id) { - const destinationNumber = - operatorBadgeInformations?.endpoints?.mainextension[0]?.id - - if (destinationNumber) { - eventDispatch('phone-island-call-transfer', { to: destinationNumber }) - } - } -} - -// Function to transfer call from every page -export async function transferCallToExtension(extensionToTransfer: any) { - if (extensionToTransfer) { - eventDispatch('phone-island-call-transfer', { to: extensionToTransfer }) - } -} - -export const clearLocalStorageAndCache = () => { - // Delete credentials and caches element from local storage - localStorage.removeItem('credentials') - - for (let i = 0; i < localStorage.length; i++) { - const key: any = localStorage.key(i) - - if (key.includes('caches')) { - localStorage.removeItem(key) - } - } - // Delete browser caches - if (caches && caches.keys) { - caches.keys().then(function (names) { - for (const name of names) { - caches.delete(name) - } - }) - } -} - -export const reloadPage = () => { - window.location.reload() -} - -export function saveQueryParams(query: any) { - sessionStorage.setItem('queryParams', query) -} - -export function getSavedQueryParams() { - const savedQueryParams = sessionStorage.getItem('queryParams') - return savedQueryParams ? savedQueryParams : null -} - -export function getProductSubname() { - if (typeof window === 'undefined') { - return '' - } - // @ts-ignore - return `${window.CONFIG.COMPANY_SUBNAME}` -} diff --git a/src/renderer/src/pages/PhoneIslandPage.tsx b/src/renderer/src/pages/PhoneIslandPage.tsx index 527f0525..01dd4ccb 100644 --- a/src/renderer/src/pages/PhoneIslandPage.tsx +++ b/src/renderer/src/pages/PhoneIslandPage.tsx @@ -2,15 +2,10 @@ import { eventDispatch } from '@renderer/hooks/eventDispatch' import { getI18nLoadPath } from '@renderer/lib/i18n' import { useSharedState } from '@renderer/store' import { IPC_EVENTS, PHONE_ISLAND_EVENTS } from '@shared/constants' -import { - Extension, - PhoneIslandSizes, - PreferredDevices, - sizeInformationType, -} from '@shared/types' +import { Extension, PhoneIslandSizes, PreferredDevices } from '@shared/types' import { Log } from '@shared/utils/logger' import { delay, isDev } from '@shared/utils/utils' -import { useState, useRef, useEffect, useMemo, useCallback } from 'react' +import { useState, useRef, useEffect } from 'react' import { ElectronDraggableWindow } from '@renderer/components/ElectronDraggableWindow' import { usePhoneIsland } from '@renderer/hooks/usePhoneIsland' import { PhoneIslandContainer } from '@renderer/components/pageComponents/phoneIsland/phoneIslandContainer' diff --git a/src/renderer/src/store.ts b/src/renderer/src/store.ts index e30b10eb..807622ca 100644 --- a/src/renderer/src/store.ts +++ b/src/renderer/src/store.ts @@ -66,7 +66,6 @@ export function createGlobalStateHook( function useGlobalState( key: Key, ): [T[Key], (setter: ((previous: T[Key]) => T[Key]) | T[Key]) => void] { - // const global = useSharedStore((state: SharedState) => state.data); const value = useSharedStore((state: SharedState) => state.data[key]) const setData = useSharedStore((state: SharedState) => state.setData) const pageData = usePageCtx() @@ -99,7 +98,6 @@ export function createGlobalStateHook( const useRegisterStoreHook = () => { const pageData = usePageCtx() const setData = useSharedStore((state: SharedState) => state.setData) - // const global = useSharedStore((state: SharedState) => state.data); const isRegistered = useRef(false) useEffect(() => { diff --git a/src/renderer/src/utils/utils.ts b/src/renderer/src/utils/utils.ts index 88ffdf60..707e25b4 100644 --- a/src/renderer/src/utils/utils.ts +++ b/src/renderer/src/utils/utils.ts @@ -27,7 +27,6 @@ export async function sendNotification( const notificationoption: NotificationOptions = { body, icon: './icons/Nethlink-logo.svg', - // image: "./icons/TrayNotificationIcon.svg", silent: false, } const notification = new window.Notification(title, notificationoption) diff --git a/src/shared/constants.ts b/src/shared/constants.ts index fe56c7bf..d864c871 100644 --- a/src/shared/constants.ts +++ b/src/shared/constants.ts @@ -1,5 +1,3 @@ -import { PhoneIslandData, PhoneIslandSizes } from './types' - export const NethLinkPageSize = { w: 440, h: 440, @@ -46,15 +44,10 @@ export enum IPC_EVENTS { LOGOUT = 'LOGOUT', START_CALL = 'START_CALL', EMIT_START_CALL = 'EMIT_START_CALL', - INITIALIZATION_COMPELTED = 'INITIALIZATION_COMPELTED', PHONE_ISLAND_RESIZE = 'PHONE_ISLAND_RESIZE', LOGIN_WINDOW_RESIZE = 'LOGIN_WINDOW_RESIZE', - HIDE_LOGIN_WINDOW = 'HIDE_LOGIN_WINDOW', CHANGE_THEME = 'CHANGE_THEME', - ON_CHANGE_THEME = 'ON_CHANGE_THEME', OPEN_DEV_TOOLS = 'OPEN_DEV_TOOLS', - SHOW_PHONE_ISLAND = 'SHOW_PHONE_ISLAND', - HIDE_PHONE_ISLAND = 'HIDE_PHONE_ISLAND', GET_LOCALE = 'GET_LOCALE', OPEN_HOST_PAGE = 'OPEN_HOST_PAGE', CLOSE_NETH_LINK = 'CLOSE_NETH_LINK', @@ -69,7 +62,6 @@ export enum IPC_EVENTS { SET_HOST_CONFIG = 'SET_HOST_CONFIG', SSO_LOGIN = 'SSO_LOGIN', SSO_LOGIN_RESULT = 'SSO_LOGIN_RESULT', - RECONNECT_PHONE_ISLAND = 'RECONNECT_PHONE_ISLAND', RECONNECT_SOCKET = 'RECONNECT_SOCKET', CHECK_SERVER_CONFIG = 'CHECK_SERVER_CONFIG', LOGOUT_COMPLETED = 'LOGOUT_COMPLETED', @@ -77,7 +69,6 @@ export enum IPC_EVENTS { HIDE_NO_CONNECTION = 'HIDE_NO_CONNECTION', RETRY_CONNECTION = 'RETRY_CONNECTION', UPDATE_CONNECTION_STATE = 'UPDATE_CONNECTION_STATE', - DEV_TOOL_TOGGLE_CONNECTION = 'DEV_TOOL_TOGGLE_CONNECTION', START_DRAG = 'START_DRAG', STOP_DRAG = 'STOP_DRAG', ENABLE_CLICK = 'ENABLE_CLICK', @@ -103,13 +94,11 @@ export enum IPC_EVENTS { CHANGE_PREFERRED_DEVICES = 'CHANGE_PREFERRED_DEVICES', PHONE_ISLAND_READY = 'PHONE_ISLAND_READY', URL_OPEN = 'URL_OPEN', - EMIT_RINGTONE_LIST = 'EMIT_RINGTONE_LIST', CHANGE_RINGTONE_SETTINGS = 'CHANGE_RINGTONE_SETTINGS', PLAY_RINGTONE_PREVIEW = 'PLAY_RINGTONE_PREVIEW', STOP_RINGTONE_PREVIEW = 'STOP_RINGTONE_PREVIEW', AUDIO_PLAYER_CLOSED = 'AUDIO_PLAYER_CLOSED', SEND_NOTIFICATION = 'SEND_NOTIFICATION', - TOGGLE_COMMAND_BAR = 'TOGGLE_COMMAND_BAR', SHOW_COMMAND_BAR = 'SHOW_COMMAND_BAR', HIDE_COMMAND_BAR = 'HIDE_COMMAND_BAR', CHANGE_COMMAND_BAR_SHORTCUT = 'CHANGE_COMMAND_BAR_SHORTCUT', diff --git a/src/shared/types.ts b/src/shared/types.ts index f9737481..50298a61 100644 --- a/src/shared/types.ts +++ b/src/shared/types.ts @@ -77,13 +77,6 @@ export type LoginData = { password?: string } -export type ConfigFile = { - lastUser: string | undefined - accounts: { - [username: string]: Account - } -} - export type PhoneIslandConfig = { hostname: string username: string @@ -172,7 +165,6 @@ export type MultipleResponse = { count: number rows: T[] } -export type HistorySpeedDialType = MultipleResponse export type HistoryCallData = MultipleResponse export type SearchCallData = MultipleResponse @@ -487,15 +479,6 @@ export type AuthAppData = { [accountUID: string]: Account } } -export type FeatureCodes = { - pickup?: string - dnd_toggle?: string - audio_test?: string - confbridge_conf?: string - incall_audio?: string - que_toggle?: string -} - export type RingtoneType = { name: string base64: string diff --git a/src/shared/useNethVoiceAPI.ts b/src/shared/useNethVoiceAPI.ts index dab3aabb..43c33b8c 100644 --- a/src/shared/useNethVoiceAPI.ts +++ b/src/shared/useNethVoiceAPI.ts @@ -136,8 +136,6 @@ export const useNethVoiceAPI = ( } async function _GETWithFallback(path: string, hasAuth = true): Promise { - const originalPath = path - // Switch to fallback path and rebuild the correct path currentApiBasePath = FALLBACK_API_BASE_PATH if (account) { @@ -180,17 +178,6 @@ export const useNethVoiceAPI = ( } } - async function _DELETE(path: string, hasAuth = true): Promise { - try { - return await DELETE(_joinUrl(path), _getHeaders(hasAuth)) - } catch (e) { - if (!path.includes('login') && !path.includes('2fa/verify-otp')) { - console.error(e) - } - throw e - } - } - function shouldTryFallback(path: string, error: any): boolean { // Only try fallback if we're using primary path if (currentApiBasePath !== PRIMARY_API_BASE_PATH) { @@ -546,10 +533,6 @@ export const useNethVoiceAPI = ( }, } - const CustCard = {} - - const HisCallSwitch = {} - const HistoryCall = { interval: async () => { const now = moment() @@ -573,8 +556,6 @@ export const useNethVoiceAPI = ( }, } - const OffHour = {} - const Phonebook = { search: async ( search: string, @@ -632,21 +613,6 @@ export const useNethVoiceAPI = ( Log.warning('error during createFavourite', e) } }, - updateSpeeddialBy: async (updatedContact: ContactType) => { - if (updatedContact.name && updatedContact.speeddial_num) { - const editedSpeedDial = Object.assign({}, updatedContact) - editedSpeedDial.id = editedSpeedDial.id?.toString() - try { - await _POST( - buildApiPath('/phonebook/modify_cticontact'), - editedSpeedDial, - ) - return editedSpeedDial - } catch (e) { - Log.warning('error during updateSpeeddialBy', e) - } - } - }, updateSpeeddial: async (edit: NewSpeedDialType, current: ContactType) => { if (current.name && current.speeddial_num) { const editedSpeedDial = Object.assign({}, current) @@ -716,32 +682,8 @@ export const useNethVoiceAPI = ( await _POST(`${currentApiBasePath}/phonebook/create`, newContact) return newContact }, - updateContact: async (edit: NewContactType, current: ContactType) => { - if (current.name && current.speeddial_num) { - const newSpeedDial = Object.assign({}, current) - newSpeedDial.speeddial_num = edit.speeddial_num - newSpeedDial.name = edit.name - newSpeedDial.id = newSpeedDial.id?.toString() - await _POST( - `${currentApiBasePath}/phonebook/modify_cticontact`, - newSpeedDial, - ) - return current - } - }, - deleteContact: async (obj: { id: string }) => { - await _POST(buildApiPath('/phonebook/delete_cticontact'), obj) - }, } - const Profiling = { - all: async () => { - return await _GET(buildApiPath('/profiling/all')) - }, - } - - const Streaming = {} - const User = { me: async (): Promise => { const data: AccountData = await _GET(buildApiPath('/user/me')) @@ -759,7 +701,6 @@ export const useNethVoiceAPI = ( } return data }, - all: async () => await _GET(buildApiPath('/user/all')), all_avatars: async () => await _GET(buildApiPath('/user/all_avatars')), all_endpoints: async () => await _GET(buildApiPath('/user/endpoints/all')), heartbeat: async (extension: string, username: string) => @@ -793,8 +734,6 @@ export const useNethVoiceAPI = ( }), } - const Voicemail = {} - const fetchOperators = async (): Promise => { const endpoints: OperatorsType = await User.all_endpoints() // all devices const groups = await AstProxy.groups() @@ -812,15 +751,9 @@ export const useNethVoiceAPI = ( const NethVoiceAPI = { AstProxy, Authentication, - CustCard, - HisCallSwitch, HistoryCall, - OffHour, Phonebook, - Profiling, - Streaming, User, - Voicemail, fetchOperators, } diff --git a/src/shared/utils/logger.ts b/src/shared/utils/logger.ts index 7b21a060..416a0ae5 100644 --- a/src/shared/utils/logger.ts +++ b/src/shared/utils/logger.ts @@ -10,9 +10,6 @@ export class Log { if (isDev()) { const now = moment() const callerLine = '' - const error = new Error() - const stack = error.stack - const stackLines = stack?.split('\n') let formattedMessage = `${now.format('HH:mm:ss.SSSZ')} ##PAGE## ${callerLine}${ typeof message === 'object' ? JSON.stringify(message) : message @@ -62,19 +59,4 @@ export class Log { static error(message?: any, ...optionalParams: any[]) { Log.log(console.error, 'ERROR', message, ...optionalParams) } - - static startTime(id: string) { - const label = 'TIMER ' + id - console.time(label) - } - - static logTime(id: string, message?: any, ...optionalParams: any[]) { - const label = 'TIMER ' + id - console.timeLog(label, message, ...optionalParams) - } - - static endTime(id: string) { - const label = 'TIMER ' + id - console.timeEnd(label) - } } diff --git a/src/shared/utils/utils.ts b/src/shared/utils/utils.ts index 9e3ca4e5..d22875b5 100644 --- a/src/shared/utils/utils.ts +++ b/src/shared/utils/utils.ts @@ -57,32 +57,6 @@ function getBoolEnvParam(paramName: string) { export const isDev = getBoolEnvParam('DEV') export const isDevTools = getBoolEnvParam('DEVTOOLS') -export const isDeepEqual = (obj1: object, obj2: object) => { - const objKeys1 = Object.keys(obj1) - const objKeys2 = Object.keys(obj2) - - if (objKeys1.length !== objKeys2.length) return false - - for (const key of objKeys1) { - const value1 = obj1[key] - const value2 = obj2[key] - - const isObjects = isObject(value1) && isObject(value2) - - if ( - (isObjects && !isDeepEqual(value1, value2)) || - (!isObjects && value1 !== value2) - ) { - return false - } - } - return true -} - -const isObject = (object) => { - return object != null && typeof object === 'object' -} - export const getAccountUID = (a: Account) => { return `${a.host}@${a.username}` }