diff --git a/package-lock.json b/package-lock.json index c8f76e73..8638befd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,7 @@ "express": "4.21.1", "luxon": "3.5.0", "md5": "2.3.0", - "nanoid": "5.0.7", + "nanoid": "5.0.9", "ora": "8.1.0", "polished": "4.3.1", "qs": "6.10.1", @@ -32,7 +32,7 @@ "socket.io": "4.4.1", "socket.io-client": "4.4.1", "styled-components": "6.1.13", - "systeminformation": "5.23.5", + "systeminformation": "5.23.13", "uuid": "10.0.0", "zod": "3.23.8" }, @@ -44,8 +44,8 @@ "@swc-node/register": "1.10.9", "@tago-io/tcore-sdk": "0.7.2", "@testing-library/dom": "10.4.0", - "@testing-library/jest-dom": "6.6.2", - "@testing-library/react": "16.0.1", + "@testing-library/jest-dom": "6.6.3", + "@testing-library/react": "16.1.0", "@testing-library/user-event": "14.5.2", "@types/async": "3.2.24", "@types/axios": "0.14.0", @@ -54,20 +54,20 @@ "@types/luxon": "3.4.2", "@types/md5": "2.3.5", "@types/ms": "0.7.34", - "@types/node": "20.14.8", - "@types/react": "18.3.12", - "@types/react-dom": "18.3.1", + "@types/node": "22.10.2", + "@types/react": "18.3.17", + "@types/react-dom": "18.3.5", "@types/semver": "7.5.8", "@types/uuid": "10.0.0", - "@vitejs/plugin-react-swc": "3.7.1", - "concurrently": "9.0.1", + "@vitejs/plugin-react-swc": "3.7.2", + "concurrently": "9.1.0", "esbuild": "0.24.0", "jsdom": "25.0.1", "ts-node": "10.9.2", - "typescript": "5.6.3", - "vite": "5.4.10", - "vite-plugin-svgr": "4.2.0", - "vitest": "2.1.3" + "typescript": "5.7.2", + "vite": "6.0.3", + "vite-plugin-svgr": "4.3.0", + "vitest": "2.1.8" }, "engines": { "node": ">=20.0.0" @@ -2220,9 +2220,9 @@ ] }, "node_modules/@remix-run/router": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.20.0.tgz", - "integrity": "sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.21.0.tgz", + "integrity": "sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -3912,9 +3912,9 @@ } }, "node_modules/@testing-library/jest-dom": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.2.tgz", - "integrity": "sha512-P6GJD4yqc9jZLbe98j/EkyQDTPgqftohZF5FBkHY5BUERZmcf4HeO2k0XaefEg329ux2p21i1A1DmyQ1kKw2Jw==", + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz", + "integrity": "sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==", "dev": true, "license": "MIT", "dependencies": { @@ -3983,9 +3983,9 @@ } }, "node_modules/@testing-library/react": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.1.tgz", - "integrity": "sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.1.0.tgz", + "integrity": "sha512-Q2ToPvg0KsVL0ohND9A3zLJWcOXXcO8IDu3fj11KhNt0UlCWyFyvnCIBkd12tidB2lkiVRG8VFqdhcqhqnAQtg==", "dev": true, "license": "MIT", "dependencies": { @@ -3996,10 +3996,10 @@ }, "peerDependencies": { "@testing-library/dom": "^10.0.0", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -4330,12 +4330,12 @@ } }, "node_modules/@types/node": { - "version": "20.14.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.8.tgz", - "integrity": "sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==", + "version": "22.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", + "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.20.0" } }, "node_modules/@types/pg": { @@ -4371,9 +4371,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.12", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", - "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", + "version": "18.3.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.17.tgz", + "integrity": "sha512-opAQ5no6LqJNo9TqnxBKsgnkIYHozW9KSTlFVoSUJYh1Fl/sswkEoqIugRSm7tbh6pABtYjGAjW+GOS23j8qbw==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -4381,13 +4381,13 @@ } }, "node_modules/@types/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", + "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", "dev": true, "license": "MIT", - "dependencies": { - "@types/react": "*" + "peerDependencies": { + "@types/react": "^18.0.0" } }, "node_modules/@types/semver": { @@ -4456,76 +4456,38 @@ "license": "ISC" }, "node_modules/@vitejs/plugin-react-swc": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.1.tgz", - "integrity": "sha512-vgWOY0i1EROUK0Ctg1hwhtC3SdcDjZcdit4Ups4aPkDcB1jYhmo+RMYWY87cmXMhvtD5uf8lV89j2w16vkdSVg==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.2.tgz", + "integrity": "sha512-y0byko2b2tSVVf5Gpng1eEhX1OvPC7x8yns1Fx8jDzlJp4LS6CMkCPfLw47cjyoMrshQDoQw4qcgjsU9VvlCew==", "dev": true, "license": "MIT", "dependencies": { "@swc/core": "^1.7.26" }, "peerDependencies": { - "vite": "^4 || ^5" + "vite": "^4 || ^5 || ^6" } }, "node_modules/@vitest/expect": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.3.tgz", - "integrity": "sha512-SNBoPubeCJhZ48agjXruCI57DvxcsivVDdWz+SSsmjTT4QN/DfHk3zB/xKsJqMs26bLZ/pNRLnCf0j679i0uWQ==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.8.tgz", + "integrity": "sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.3", - "@vitest/utils": "2.1.3", - "chai": "^5.1.1", + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", + "chai": "^5.1.2", "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/mocker": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.3.tgz", - "integrity": "sha512-eSpdY/eJDuOvuTA3ASzCjdithHa+GIF1L4PqtEELl6Qa3XafdMLBpBlZCIUCX2J+Q6sNmjmxtosAG62fK4BlqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "2.1.3", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.11" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@vitest/spy": "2.1.3", - "msw": "^2.3.5", - "vite": "^5.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/mocker/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/@vitest/pretty-format": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.4.tgz", - "integrity": "sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz", + "integrity": "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4536,13 +4498,13 @@ } }, "node_modules/@vitest/runner": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.3.tgz", - "integrity": "sha512-JGzpWqmFJ4fq5ZKHtVO3Xuy1iF2rHGV4d/pdzgkYHm1+gOzNZtqjvyiaDGJytRyMU54qkxpNzCx+PErzJ1/JqQ==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.8.tgz", + "integrity": "sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "2.1.3", + "@vitest/utils": "2.1.8", "pathe": "^1.1.2" }, "funding": { @@ -4550,68 +4512,42 @@ } }, "node_modules/@vitest/snapshot": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.3.tgz", - "integrity": "sha512-qWC2mWc7VAXmjAkEKxrScWHWFyCQx/cmiZtuGqMi+WwqQJ2iURsVY4ZfAK6dVo6K2smKRU6l3BPwqEBvhnpQGg==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.8.tgz", + "integrity": "sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.3", - "magic-string": "^0.30.11", + "@vitest/pretty-format": "2.1.8", + "magic-string": "^0.30.12", "pathe": "^1.1.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/snapshot/node_modules/@vitest/pretty-format": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.3.tgz", - "integrity": "sha512-XH1XdtoLZCpqV59KRbPrIhFCOO0hErxrQCMcvnQete3Vibb9UeIOX02uFPfVn3Z9ZXsq78etlfyhnkmIZSzIwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/@vitest/spy": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.3.tgz", - "integrity": "sha512-Nb2UzbcUswzeSP7JksMDaqsI43Sj5+Kry6ry6jQJT4b5gAK+NS9NED6mDb8FlMRCX8m5guaHCDZmqYMMWRy5nQ==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.8.tgz", + "integrity": "sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==", "dev": true, "license": "MIT", "dependencies": { - "tinyspy": "^3.0.0" + "tinyspy": "^3.0.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.3.tgz", - "integrity": "sha512-xpiVfDSg1RrYT0tX6czgerkpcKFmFOF/gCr30+Mve5V2kewCy4Prn1/NDMSRwaSmT7PRaOF83wu+bEtsY1wrvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.1.3", - "loupe": "^3.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils/node_modules/@vitest/pretty-format": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.3.tgz", - "integrity": "sha512-XH1XdtoLZCpqV59KRbPrIhFCOO0hErxrQCMcvnQete3Vibb9UeIOX02uFPfVn3Z9ZXsq78etlfyhnkmIZSzIwQ==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz", + "integrity": "sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==", "dev": true, "license": "MIT", "dependencies": { + "@vitest/pretty-format": "2.1.8", + "loupe": "^3.1.2", "tinyrainbow": "^1.2.0" }, "funding": { @@ -5869,9 +5805,9 @@ } }, "node_modules/concurrently": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.0.1.tgz", - "integrity": "sha512-wYKvCd/f54sTXJMSfV6Ln/B8UrfLBKOYa+lzc6CHay3Qek+LorVSBdMVfyewFhRbH0Rbabsk4D+3PL/VjQ5gzg==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.1.0.tgz", + "integrity": "sha512-VxkzwMAn4LP7WyMnJNbHN5mKV9L2IbyDjpzemKr99sXNR3GqRNMMHdm7prV1ws9wg7ETj6WUkNOigZVsptwbgg==", "dev": true, "license": "MIT", "dependencies": { @@ -6666,6 +6602,13 @@ "node": ">= 0.4" } }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true, + "license": "MIT" + }, "node_modules/esbuild": { "version": "0.24.0", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", @@ -6783,6 +6726,16 @@ "node": ">=6" } }, + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/express": { "version": "4.21.1", "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", @@ -8367,9 +8320,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "license": "MIT", "dependencies": { @@ -9373,12 +9326,12 @@ } }, "node_modules/mobx-react": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-9.1.1.tgz", - "integrity": "sha512-gVV7AdSrAAxqXOJ2bAbGa5TkPqvITSzaPiiEkzpW4rRsMhSec7C2NBCJYILADHKp2tzOAIETGRsIY0UaCV5aEw==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-9.2.0.tgz", + "integrity": "sha512-dkGWCx+S0/1mfiuFfHRH8D9cplmwhxOV5CkXMp38u6rQGG2Pv3FWYztS0M7ncR6TyPRQKaTG/pnitInoYE9Vrw==", "license": "MIT", "dependencies": { - "mobx-react-lite": "^4.0.7" + "mobx-react-lite": "^4.1.0" }, "funding": { "type": "opencollective", @@ -9386,7 +9339,7 @@ }, "peerDependencies": { "mobx": "^6.9.0", - "react": "^16.8.0 || ^17 || ^18" + "react": "^16.8.0 || ^17 || ^18 || ^19" }, "peerDependenciesMeta": { "react-dom": { @@ -9398,12 +9351,12 @@ } }, "node_modules/mobx-react-lite": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-4.0.7.tgz", - "integrity": "sha512-RjwdseshK9Mg8On5tyJZHtGD+J78ZnCnRaxeQDSiciKVQDUbfZcXhmld0VMxAwvcTnPEHZySGGewm467Fcpreg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-4.1.0.tgz", + "integrity": "sha512-QEP10dpHHBeQNv1pks3WnHRCem2Zp636lq54M2nKO2Sarr13pL4u6diQXf65yzXUn0mkk18SyIDCm9UOJYTi1w==", "license": "MIT", "dependencies": { - "use-sync-external-store": "^1.2.0" + "use-sync-external-store": "^1.4.0" }, "funding": { "type": "opencollective", @@ -9411,7 +9364,7 @@ }, "peerDependencies": { "mobx": "^6.9.0", - "react": "^16.8.0 || ^17 || ^18" + "react": "^16.8.0 || ^17 || ^18 || ^19" }, "peerDependenciesMeta": { "react-dom": { @@ -9531,9 +9484,9 @@ "optional": true }, "node_modules/nanoid": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.7.tgz", - "integrity": "sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz", + "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==", "funding": [ { "type": "github", @@ -10548,12 +10501,12 @@ } }, "node_modules/react-router": { - "version": "6.27.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.27.0.tgz", - "integrity": "sha512-YA+HGZXz4jaAkVoYBE98VQl+nVzI+cVI2Oj/06F5ZM+0u3TgedN9Y9kmMRo2mnkSK2nCpNQn0DVob4HCsY/WLw==", + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.28.0.tgz", + "integrity": "sha512-HrYdIFqdrnhDw0PqG/AKjAqEqM7AvxCz0DQ4h2W8k6nqmc5uRBYDag0SBxx9iYz5G8gnuNVLzUe13wl9eAsXXg==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.20.0" + "@remix-run/router": "1.21.0" }, "engines": { "node": ">=14.0.0" @@ -10563,13 +10516,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.27.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.27.0.tgz", - "integrity": "sha512-+bvtFWMC0DgAFrfKXKG9Fc+BcXWRUO1aJIihbB79xaeq0v5UzfvnM5houGUm1Y461WVRcgAQ+Clh5rdb1eCx4g==", + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.28.0.tgz", + "integrity": "sha512-kQ7Unsl5YdyOltsPGl31zOjLrDv+m2VcIEcIHqYYD3Lp0UppLjrzcfJqDJwXxFw3TH/yvapbnUvPlAj7Kx5nbg==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.20.0", - "react-router": "6.27.0" + "@remix-run/router": "1.21.0", + "react-router": "6.28.0" }, "engines": { "node": ">=14.0.0" @@ -11331,9 +11284,9 @@ } }, "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", "dev": true, "license": "MIT" }, @@ -11560,9 +11513,9 @@ "license": "MIT" }, "node_modules/systeminformation": { - "version": "5.23.5", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.23.5.tgz", - "integrity": "sha512-PEpJwhRYxZgBCAlWZhWIgfMTjXLqfcaZ1pJsJn9snWNfBW/Z1YQg1mbIUSWrEV3ErAHF7l/OoVLQeaZDlPzkpA==", + "version": "5.23.13", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.23.13.tgz", + "integrity": "sha512-4Cn39sTXp7eN9rV/60aNdCXgpQ5xPcUUPIbwJjqTKj4/bNcSYtgZvFdXvZj6pRHP4h17uk6MfdMP5Fm6AK/b0Q==", "license": "MIT", "os": [ "darwin", @@ -11967,9 +11920,9 @@ "license": "MIT" }, "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -11981,9 +11934,9 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "license": "MIT" }, "node_modules/unified": { @@ -12160,12 +12113,12 @@ "license": "MIT" }, "node_modules/use-sync-external-store": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", + "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", "license": "MIT", "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/util": { @@ -12254,21 +12207,21 @@ } }, "node_modules/vite": { - "version": "5.4.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz", - "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.3.tgz", + "integrity": "sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.24.0", + "postcss": "^8.4.49", + "rollup": "^4.23.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -12277,19 +12230,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -12310,18 +12269,25 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, "node_modules/vite-node": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.3.tgz", - "integrity": "sha512-I1JadzO+xYX887S39Do+paRePCKoiDrWRRjp9kkG5he0t7RXNvPAJPCQSJqbGN4uCrFFeS3Kj3sLqY8NMYBEdA==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.8.tgz", + "integrity": "sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.3.6", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", "pathe": "^1.1.2", "vite": "^5.0.0" }, @@ -12335,22 +12301,7 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/vite-plugin-svgr": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.2.0.tgz", - "integrity": "sha512-SC7+FfVtNQk7So0XMjrrtLAbEC8qjFPifyD7+fs/E6aaNdVde6umlVVh0QuwDLdOMu7vp5RiGFsB70nj5yo0XA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.5", - "@svgr/core": "^8.1.0", - "@svgr/plugin-jsx": "^8.1.0" - }, - "peerDependencies": { - "vite": "^2.6.0 || 3 || 4 || 5" - } - }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "node_modules/vite-node/node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", @@ -12367,7 +12318,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/android-arm": { + "node_modules/vite-node/node_modules/@esbuild/android-arm": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", @@ -12384,7 +12335,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { + "node_modules/vite-node/node_modules/@esbuild/android-arm64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", @@ -12401,7 +12352,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/android-x64": { + "node_modules/vite-node/node_modules/@esbuild/android-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", @@ -12418,7 +12369,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "node_modules/vite-node/node_modules/@esbuild/darwin-arm64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", @@ -12435,7 +12386,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "node_modules/vite-node/node_modules/@esbuild/darwin-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", @@ -12452,7 +12403,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "node_modules/vite-node/node_modules/@esbuild/freebsd-arm64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", @@ -12469,7 +12420,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "node_modules/vite-node/node_modules/@esbuild/freebsd-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", @@ -12486,7 +12437,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { + "node_modules/vite-node/node_modules/@esbuild/linux-arm": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", @@ -12503,7 +12454,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "node_modules/vite-node/node_modules/@esbuild/linux-arm64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", @@ -12520,7 +12471,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "node_modules/vite-node/node_modules/@esbuild/linux-ia32": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", @@ -12537,7 +12488,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "node_modules/vite-node/node_modules/@esbuild/linux-loong64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", @@ -12554,7 +12505,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "node_modules/vite-node/node_modules/@esbuild/linux-mips64el": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", @@ -12571,7 +12522,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "node_modules/vite-node/node_modules/@esbuild/linux-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", @@ -12588,7 +12539,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "node_modules/vite-node/node_modules/@esbuild/linux-riscv64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", @@ -12605,7 +12556,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "node_modules/vite-node/node_modules/@esbuild/linux-s390x": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", @@ -12622,7 +12573,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { + "node_modules/vite-node/node_modules/@esbuild/linux-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", @@ -12639,7 +12590,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "node_modules/vite-node/node_modules/@esbuild/netbsd-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", @@ -12656,7 +12607,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "node_modules/vite-node/node_modules/@esbuild/openbsd-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", @@ -12673,7 +12624,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "node_modules/vite-node/node_modules/@esbuild/sunos-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", @@ -12690,7 +12641,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "node_modules/vite-node/node_modules/@esbuild/win32-arm64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", @@ -12707,7 +12658,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "node_modules/vite-node/node_modules/@esbuild/win32-ia32": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", @@ -12724,7 +12675,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { + "node_modules/vite-node/node_modules/@esbuild/win32-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", @@ -12741,7 +12692,7 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/esbuild": { + "node_modules/vite-node/node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", @@ -12780,10 +12731,10 @@ "@esbuild/win32-x64": "0.21.5" } }, - "node_modules/vite/node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "node_modules/vite-node/node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, "funding": [ { @@ -12799,10 +12750,10 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/vite/node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "node_modules/vite-node/node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "funding": [ { @@ -12821,38 +12772,162 @@ "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" } }, - "node_modules/vitest": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.3.tgz", - "integrity": "sha512-Zrxbg/WiIvUP2uEzelDNTXmEMJXuzJ1kCpbDvaKByFA9MNeO95V+7r/3ti0qzJzrxdyuUw5VduN7k+D3VmVOSA==", + "node_modules/vite-node/node_modules/vite": { + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", + "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-svgr": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.3.0.tgz", + "integrity": "sha512-Jy9qLB2/PyWklpYy0xk0UU3TlU0t2UMpJXZvf+hWII1lAmRHrOUKi11Uw8N3rxoNk7atZNYO3pR3vI1f7oi+6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.3", + "@svgr/core": "^8.1.0", + "@svgr/plugin-jsx": "^8.1.0" + }, + "peerDependencies": { + "vite": ">=2.6.0" + } + }, + "node_modules/vite/node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/vite/node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "@vitest/expect": "2.1.3", - "@vitest/mocker": "2.1.3", - "@vitest/pretty-format": "^2.1.3", - "@vitest/runner": "2.1.3", - "@vitest/snapshot": "2.1.3", - "@vitest/spy": "2.1.3", - "@vitest/utils": "2.1.3", - "chai": "^5.1.1", - "debug": "^4.3.6", - "magic-string": "^0.30.11", + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/vitest": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.8.tgz", + "integrity": "sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "2.1.8", + "@vitest/mocker": "2.1.8", + "@vitest/pretty-format": "^2.1.8", + "@vitest/runner": "2.1.8", + "@vitest/snapshot": "2.1.8", + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", "pathe": "^1.1.2", - "std-env": "^3.7.0", + "std-env": "^3.8.0", "tinybench": "^2.9.0", - "tinyexec": "^0.3.0", - "tinypool": "^1.0.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "2.1.3", + "vite-node": "2.1.8", "why-is-node-running": "^2.3.0" }, "bin": { @@ -12867,8 +12942,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.1.3", - "@vitest/ui": "2.1.3", + "@vitest/browser": "2.1.8", + "@vitest/ui": "2.1.8", "happy-dom": "*", "jsdom": "*" }, @@ -12893,6 +12968,581 @@ } } }, + "node_modules/vitest/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@vitest/mocker": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.8.tgz", + "integrity": "sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.8", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vitest/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/vitest/node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/vitest/node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/vitest/node_modules/vite": { + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", + "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", @@ -13389,11 +14039,11 @@ "cronstrue": "2.5.0", "lodash.clonedeep": "4.5.0", "mobx": "6.13.5", - "mobx-react": "9.1.1", + "mobx-react": "9.2.0", "react-helmet-async": "2.0.5", "react-markdown": "9.0.1", - "react-router": "6.27.0", - "react-router-dom": "6.27.0", + "react-router": "6.28.0", + "react-router-dom": "6.28.0", "swr": "2.2.5" }, "devDependencies": { diff --git a/package.json b/package.json index 65085116..3ebb0c04 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "cors": "2.8.5", "express": "4.21.1", "luxon": "3.5.0", - "nanoid": "5.0.7", + "nanoid": "5.0.9", "md5": "2.3.0", "polished": "4.3.1", "ora": "8.1.0", @@ -39,7 +39,7 @@ "socket.io": "4.4.1", "socket.io-client": "4.4.1", "styled-components": "6.1.13", - "systeminformation": "5.23.5", + "systeminformation": "5.23.13", "uuid": "10.0.0", "zod": "3.23.8" }, @@ -48,29 +48,29 @@ "@swc-node/register": "1.10.9", "@tago-io/tcore-sdk": "0.7.2", "@testing-library/dom": "10.4.0", - "@testing-library/jest-dom": "6.6.2", - "@testing-library/react": "16.0.1", + "@testing-library/jest-dom": "6.6.3", + "@testing-library/react": "16.1.0", "@testing-library/user-event": "14.5.2", "@types/async": "3.2.24", "@types/axios": "0.14.0", "@types/express": "5.0.0", "@types/luxon": "3.4.2", "@types/ms": "0.7.34", - "@types/node": "20.14.8", + "@types/node": "22.10.2", "@types/semver": "7.5.8", "@types/cors": "2.8.17", "@types/uuid": "10.0.0", "@types/md5": "2.3.5", - "@types/react": "18.3.12", - "@types/react-dom": "18.3.1", - "@vitejs/plugin-react-swc": "3.7.1", - "concurrently": "9.0.1", + "@types/react": "18.3.17", + "@types/react-dom": "18.3.5", + "@vitejs/plugin-react-swc": "3.7.2", + "concurrently": "9.1.0", "esbuild": "0.24.0", "jsdom": "25.0.1", "ts-node": "10.9.2", - "typescript": "5.6.3", - "vitest": "2.1.3", - "vite": "5.4.10", - "vite-plugin-svgr": "4.2.0" + "typescript": "5.7.2", + "vitest": "2.1.8", + "vite": "6.0.3", + "vite-plugin-svgr": "4.3.0" } } diff --git a/packages/console/package.json b/packages/console/package.json index c3aad1c0..2ca3a244 100644 --- a/packages/console/package.json +++ b/packages/console/package.json @@ -20,11 +20,11 @@ "cronstrue": "2.5.0", "lodash.clonedeep": "4.5.0", "mobx": "6.13.5", - "mobx-react": "9.1.1", + "mobx-react": "9.2.0", "react-helmet-async": "2.0.5", "react-markdown": "9.0.1", - "react-router": "6.27.0", - "react-router-dom": "6.27.0", + "react-router": "6.28.0", + "react-router-dom": "6.28.0", "swr": "2.2.5" }, "devDependencies": { diff --git a/packages/console/src/App.tsx b/packages/console/src/App.tsx index ca2105ec..b441c437 100644 --- a/packages/console/src/App.tsx +++ b/packages/console/src/App.tsx @@ -13,7 +13,6 @@ import ActionList from "./Components/Action/List/ActionList.tsx"; import AnalysisEdit from "./Components/Analysis/Edit/AnalysisEdit.tsx"; import AnalysisList from "./Components/Analysis/List/AnalysisList.tsx"; import BucketEdit from "./Components/Bucket/Edit/BucketEdit.tsx"; -import BucketList from "./Components/Bucket/List/BucketList.tsx"; import DeviceEdit from "./Components/Device/Edit/DeviceEdit.tsx"; import DeviceList from "./Components/Device/List/DeviceList.tsx"; import Home from "./Components/Home/Home.tsx"; @@ -171,7 +170,6 @@ function MainScreenWrapper() { } /> } /> } /> - } /> } /> } /> } /> diff --git a/packages/console/src/Components/Bucket/List/BucketList.tsx b/packages/console/src/Components/Bucket/List/BucketList.tsx deleted file mode 100644 index 5eb2bef8..00000000 --- a/packages/console/src/Components/Bucket/List/BucketList.tsx +++ /dev/null @@ -1,98 +0,0 @@ -import type { IDevice } from "@tago-io/tcore-sdk/types"; -import { useTheme } from "styled-components"; -import getDeviceTypeName from "../../../Helpers/getDeviceTypeName.ts"; -import getDeviceList from "../../../Requests/getDeviceList.ts"; -import Capitalize from "../../Capitalize/Capitalize.tsx"; -import { EIcon } from "../../Icon/Icon.types"; -import ListPage from "../../ListPage/ListPage.tsx"; -import RelativeDate from "../../RelativeDate/RelativeDate.tsx"; -import ButtonDataAmount from "./ButtonDataAmount/ButtonDataAmount.tsx"; - -/** - * The bucket list page. - */ -function BucketList() { - const theme = useTheme(); - - /** - * Renders the data retention field. - */ - const renderDataRetention = (data: IDevice) => { - let value = ""; - if (data.type === "mutable") { - value = "n/a"; - } else if (data.type === "immutable") { - if (data.chunk_period) { - value = `${data.chunk_retention} ${data.chunk_period}`; - } else { - value = "forever"; - } - } else { - value = "forever"; - } - - return {value}; - }; - - /** - * Renders the storage type. - */ - function renderStorageType(data: IDevice) { - const { type } = data; - const name = getDeviceTypeName(type); - const color = - type === "immutable" - ? theme.dataStorageImmutable - : theme.dataStorageMutable; - return {name}; - } - - return ( - - color={theme.bucket} - description="Buckets are where data from your devices is stored and accessed." - documentTitle="Buckets" - icon={EIcon.bucket} - innerNavTitle="Buckets" - onGetData={getDeviceList} - path="buckets" - summaryKey="device" - columns={[ - { - id: "name", - label: "Name", - onRender: (item) => item.name, - type: "text", - }, - { - flex: "none", - id: "data_amount", - label: "Data amount", - onRender: (item) => , - width: 180, - }, - { - id: "data_retention", - label: "Retain data for", - onRender: (item) => renderDataRetention(item), - }, - { - id: "type", - label: "Type", - onRender: (item) => renderStorageType(item), - filterDisabled: true, - flex: "none", - width: 250, - }, - { - id: "created_at", - label: "Created at", - onRender: (item) => , - type: "date", - }, - ]} - /> - ); -} - -export default BucketList; diff --git a/packages/console/src/Components/Device/Common/ModalEditGroup/ModalEditGroup.style.tsx b/packages/console/src/Components/Device/Common/ModalEditGroup/ModalEditGroup.style.tsx new file mode 100644 index 00000000..51876222 --- /dev/null +++ b/packages/console/src/Components/Device/Common/ModalEditGroup/ModalEditGroup.style.tsx @@ -0,0 +1,13 @@ +import styled from "styled-components"; + +export const Characters = styled.div` + color: rgba(0, 0, 0, 0.6); + display: inline-block; + text-align: right; + font-size: 0.73rem; + position: absolute; + right: 10px; + top: 50%; + transform: translate(0%, -50%); + z-index: 12; +`; diff --git a/packages/console/src/Components/Device/Common/ModalEditGroup/ModalEditGroup.tsx b/packages/console/src/Components/Device/Common/ModalEditGroup/ModalEditGroup.tsx new file mode 100644 index 00000000..e6ef338a --- /dev/null +++ b/packages/console/src/Components/Device/Common/ModalEditGroup/ModalEditGroup.tsx @@ -0,0 +1,50 @@ +import type { IDevice, IDeviceData } from "@tago-io/tcore-sdk/types"; +import { useCallback, useState } from "react"; +import editDeviceData from "../../../../Requests/editDeviceData.ts"; +import { FormGroup, Input, Modal } from "../../../../index.ts"; +import { EIcon } from "../../../Icon/Icon.types"; +import * as Style from "./ModalEditGroup.style"; + +interface ModalEditGroupProps { + device: IDevice; + data: IDeviceData; + onClose: () => void; +} + +export function ModalEditGroup(props: ModalEditGroupProps) { + const { data, device, onClose } = props; + const [value, setValue] = useState(() => String(data.group || "")); + + const confirm = useCallback(async () => { + data.group = String(value); + await editDeviceData(device.id, data); + }, [value, device?.id, data]); + + return ( + + +
+ setValue(e.target.value.substring(0, 24))} + value={value} + placeholder="Enter the group for the data item" + spellCheck="false" + /> + {String(value).length} / 24 +
+
+
+ ); +} diff --git a/packages/console/src/Components/Device/Common/ModalEditLocation/ModalEditLocation.tsx b/packages/console/src/Components/Device/Common/ModalEditLocation/ModalEditLocation.tsx new file mode 100644 index 00000000..6a934d14 --- /dev/null +++ b/packages/console/src/Components/Device/Common/ModalEditLocation/ModalEditLocation.tsx @@ -0,0 +1,71 @@ +import type { IDevice, IDeviceData } from "@tago-io/tcore-sdk/types"; +import { useCallback, useState } from "react"; +import editDeviceData from "../../../../Requests/editDeviceData.ts"; +import { Col, FormGroup, Input, Modal, Row } from "../../../../index.ts"; +import { EIcon } from "../../../Icon/Icon.types"; + +interface ModalEditLocationProps { + device: IDevice; + data: IDeviceData; + onClose: () => void; +} + +export function ModalEditLocation(props: ModalEditLocationProps) { + const { data, device, onClose } = props; + + const [lat, setLat] = useState(() => data.location?.coordinates?.[1] || ""); + const [lng, setLng] = useState(() => data.location?.coordinates?.[0] || ""); + + const confirm = useCallback(async () => { + data.location = { + type: "Point", + coordinates: [Number(lng), Number(lat)], + }; + await editDeviceData(device.id, data); + }, [lat, lng, device?.id, data]); + + return ( + + + + + setLat(e.target.value)} + value={lat} + placeholder="Enter the latitude for the data item" + /> + + + + + + setLng(e.target.value)} + value={lng} + placeholder="Enter the longitude for the data item" + /> + + + + + ); +} diff --git a/packages/console/src/Components/Device/Common/ModalEditMetadata/ModalEditMetadata.style.tsx b/packages/console/src/Components/Device/Common/ModalEditMetadata/ModalEditMetadata.style.tsx new file mode 100644 index 00000000..8e04411c --- /dev/null +++ b/packages/console/src/Components/Device/Common/ModalEditMetadata/ModalEditMetadata.style.tsx @@ -0,0 +1,9 @@ +import styled from "styled-components"; +import FormControlStyles from "../../../Styles/FormControlStyles.ts"; + +export const TextArea = styled.textarea` + ${FormControlStyles} + resize: none; + height: 300px; + font-family: Monospace; +`; diff --git a/packages/console/src/Components/Device/Common/ModalEditMetadata/ModalEditMetadata.tsx b/packages/console/src/Components/Device/Common/ModalEditMetadata/ModalEditMetadata.tsx new file mode 100644 index 00000000..cb90ebc9 --- /dev/null +++ b/packages/console/src/Components/Device/Common/ModalEditMetadata/ModalEditMetadata.tsx @@ -0,0 +1,57 @@ +import type { IDevice, IDeviceData } from "@tago-io/tcore-sdk/types"; +import { useCallback, useState } from "react"; +import editDeviceData from "../../../../Requests/editDeviceData.ts"; +import { FormGroup, Modal } from "../../../../index.ts"; +import { EIcon } from "../../../Icon/Icon.types"; +import * as Style from "./ModalEditMetadata.style"; + +interface ModalEditMetadataProps { + device: IDevice; + data: IDeviceData; + onClose: () => void; +} + +export function ModalEditMetadata(props: ModalEditMetadataProps) { + const { data, device, onClose } = props; + const [value, setValue] = useState(() => + data.metadata ? JSON.stringify(data.metadata, null, 2) : "", + ); + + const confirm = useCallback(async () => { + data.metadata = JSON.parse(value); + await editDeviceData(device.id, data); + }, [value, device?.id, data]); + + let validJSON = true; + try { + JSON.parse(value); + validJSON = true; + } catch (ex) { + validJSON = false; + } + + return ( + + + setValue(e.target.value)} + placeholder="Insert a valid JSON" + value={value} + /> + + + ); +} diff --git a/packages/console/src/Components/Device/Common/ModalEditValue/ModalEditValue.tsx b/packages/console/src/Components/Device/Common/ModalEditValue/ModalEditValue.tsx new file mode 100644 index 00000000..da355254 --- /dev/null +++ b/packages/console/src/Components/Device/Common/ModalEditValue/ModalEditValue.tsx @@ -0,0 +1,89 @@ +import type { IDevice, IDeviceData } from "@tago-io/tcore-sdk/types"; +import { useCallback, useState } from "react"; +import editDeviceData from "../../../../Requests/editDeviceData.ts"; +import { Col, FormGroup, Input, Modal, Row } from "../../../../index.ts"; +import { EIcon } from "../../../Icon/Icon.types"; +import Select from "../../../Select/Select.tsx"; + +interface ModalEditValueProps { + device: IDevice; + data: IDeviceData; + onClose: () => void; +} + +export function ModalEditValue(props: ModalEditValueProps) { + const { data, device, onClose } = props; + const [value, setValue] = useState(() => { + const v = data.value; + const t = typeof data.value; + if (t !== "string" && t !== "number" && t !== "boolean") { + return ""; + } + return String(v); + }); + const [type, setType] = useState(() => { + const t = typeof data.value; + if (t !== "string" && t !== "number" && t !== "boolean") { + return "string"; + } + return t; + }); + + const confirm = useCallback(async () => { + if (type === "string") { + data.value = String(value); + } else if (type === "number") { + data.value = Number(value); + } else if (type === "boolean") { + data.value = value.trim() === "true" || value.trim() === "1"; + } + await editDeviceData(device.id, data); + }, [data, device?.id, type, value]); + + return ( + + + + + setValue(e.target.value)} + value={value} + placeholder="Enter the value for the data item" + /> + + + + + + + + + + + + + + + + + ); +} diff --git a/packages/console/src/Components/Device/Edit/DataTab/DataOptionsButton/DataOptionsButton.style.ts b/packages/console/src/Components/Device/Edit/DataTab/DataOptionsButton/DataOptionsButton.style.ts new file mode 100644 index 00000000..f9a9d797 --- /dev/null +++ b/packages/console/src/Components/Device/Edit/DataTab/DataOptionsButton/DataOptionsButton.style.ts @@ -0,0 +1,66 @@ +import styled, { css } from "styled-components"; + +export const Options = styled.button` + padding: 5px; + border-radius: 5px; + margin-left: 10px; + display: flex; + align-items: center; + + &:hover { + background: rgba(0, 0, 0, 0.1); + } + &:active { + background: rgba(0, 0, 0, 0.15); + } + + i * { + fill: rgba(0, 0, 0, 0.5) !important; + } +`; + +export const Dropdown = styled.div<{ visible: boolean }>` + position: absolute; + right: 0px; + top: 40px; + padding: 5px 0px; + border: 1px solid rgba(0, 0, 0, 0.1); + box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.1); + border-radius: 5px; + background: white; + z-index: 100; + opacity: 0; + pointer-events: none; + transition: opacity 0.1s; + + > .item { + padding: 7px 15px; + display: flex; + align-items: center; + + span { + display: inline-block; + margin-left: 5px; + } + + * { + color: black !important; + fill: black !important; + } + + &:hover { + * { + color: white !important; + fill: white !important; + } + background: black; + } + } + + ${(props) => + props.visible && + css` + pointer-events: initial; + opacity: 1; + `} +`; diff --git a/packages/console/src/Components/Device/Edit/DataTab/DataOptionsButton/DataOptionsButton.tsx b/packages/console/src/Components/Device/Edit/DataTab/DataOptionsButton/DataOptionsButton.tsx new file mode 100644 index 00000000..54ebcc88 --- /dev/null +++ b/packages/console/src/Components/Device/Edit/DataTab/DataOptionsButton/DataOptionsButton.tsx @@ -0,0 +1,69 @@ +import { useCallback, useEffect, useState } from "react"; +import { useLocation } from "react-router"; +import Button from "../../../../Button/Button.tsx"; +import Icon from "../../../../Icon/Icon.tsx"; +import { EIcon } from "../../../../Icon/Icon.types"; +import * as Style from "./DataOptionsButton.style"; + +interface DataOptionsButtonProps { + disabled?: boolean; +} + +export function DataOptionsButton(props: DataOptionsButtonProps) { + const { disabled } = props; + + const [dropdown, setDropdown] = useState(false); + const [modalUninstall, setModalUninstall] = useState(false); + const loc = useLocation(); + + const onClickOptions = useCallback( + (e: React.MouseEvent) => { + e.preventDefault(); + setDropdown(true); + }, + [], + ); + + const enable = useCallback((e: React.MouseEvent) => { + setDropdown(false); + e.preventDefault(); + }, []); + + const disable = useCallback((e: React.MouseEvent) => { + setDropdown(false); + e.preventDefault(); + }, []); + + useEffect(() => { + function closeDropdown() { + setDropdown(false); + } + + window.addEventListener("mousedown", closeDropdown); + return () => window.removeEventListener("mousedown", closeDropdown); + }); + + return ( + <> + + + e.stopPropagation()} + > +
+ Restore from file +
+
+ Backup to file +
+
+ Empty Device data +
+
+ + ); +} diff --git a/packages/console/src/Components/Device/Edit/DataTab/DataTab.style.ts b/packages/console/src/Components/Device/Edit/DataTab/DataTab.style.ts new file mode 100644 index 00000000..56e7d00e --- /dev/null +++ b/packages/console/src/Components/Device/Edit/DataTab/DataTab.style.ts @@ -0,0 +1,11 @@ +import styled from "styled-components"; + +export const Buttons = styled.div` + display: flex; + justify-content: flex-end; + margin-bottom: 1rem; + + button { + white-space: nowrap; + } +`; diff --git a/packages/console/src/Components/Device/Edit/DataTab/DataTab.tsx b/packages/console/src/Components/Device/Edit/DataTab/DataTab.tsx new file mode 100644 index 00000000..240abe22 --- /dev/null +++ b/packages/console/src/Components/Device/Edit/DataTab/DataTab.tsx @@ -0,0 +1,76 @@ +import type { IDevice, IDeviceData } from "@tago-io/tcore-sdk/types"; +import { memo, useCallback, useState } from "react"; +import Button from "../../../Button/Button.tsx"; +import { EButton } from "../../../Button/Button.types"; +import Col from "../../../Col/Col.tsx"; +import FormDivision from "../../../FormDivision/FormDivision.tsx"; +import Icon from "../../../Icon/Icon.tsx"; +import { EIcon } from "../../../Icon/Icon.types"; +import Row from "../../../Row/Row.tsx"; +import { VariablesTable } from "../../Common/VariablesTable/VariablesTable.tsx"; +import { DataOptionsButton } from "./DataOptionsButton/DataOptionsButton.tsx"; +import * as Style from "./DataTab.style"; + +interface DataTabProps { + data: IDevice; + onDeleteData: (ids: string[]) => Promise; + onReloadDataAmount: () => void; + dataAmount: number; +} + +function DataTab(props: DataTabProps) { + const [selectedVariables, setSelectedVariables] = useState([]); + const [refetchID, setRefetchID] = useState(0); + const { data, dataAmount, onDeleteData } = props; + + const deleteSelectedData = useCallback(async () => { + const ids = selectedVariables.map((x) => x.id); + setSelectedVariables([]); + await onDeleteData(ids); + setRefetchID(Date.now()); + }, [onDeleteData, selectedVariables]); + + return ( + <> + + + + + + + + {data.type === "mutable" && ( + + )} + + + + + + + setRefetchID(Date.now())} + refetchID={refetchID} + /> + + ); +} + +export default memo(DataTab); diff --git a/packages/console/src/Components/Device/Edit/DeviceEdit.tsx b/packages/console/src/Components/Device/Edit/DeviceEdit.tsx index 176f2bb3..f9661804 100644 --- a/packages/console/src/Components/Device/Edit/DeviceEdit.tsx +++ b/packages/console/src/Components/Device/Edit/DeviceEdit.tsx @@ -19,6 +19,7 @@ import normalizeTags from "../../../Helpers/normalizeTags.ts"; import useApiRequest from "../../../Helpers/useApiRequest.ts"; import createDeviceToken from "../../../Requests/createDeviceToken.ts"; import deleteDevice from "../../../Requests/deleteDevice.ts"; +import deleteDeviceData from "../../../Requests/deleteDeviceData.ts"; import deleteDeviceToken from "../../../Requests/deleteDeviceToken.ts"; import editDevice from "../../../Requests/editDevice.ts"; import setDeviceParams from "../../../Requests/setDeviceParams.ts"; @@ -32,14 +33,13 @@ import TagsTab from "../../Tags/TagsTab.tsx"; import DeviceInputOutput from "../Common/DeviceInputOutput.tsx"; import type { IInspectorData } from "../Common/LiveInspector/LiveInspector.types"; import normalizeConfigParameters from "../Helpers/normalizeConfigParameters.ts"; +import { ChunksTab } from "./ChunksTab/ChunksTab.tsx"; import ConfigParametersTab from "./ConfigParametersTab/ConfigParametersTab.tsx"; +import DataTab from "./DataTab/DataTab.tsx"; import GeneralInformationTab from "./GeneralInformationTab/GeneralInformationTab.tsx"; import LiveInspectorTab from "./LiveInspectorTab/LiveInspectorTab.tsx"; import MoreTab from "./MoreTab/MoreTab.tsx"; -/** - * The device's edit page. - */ function DeviceEdit() { const match = useMatch("/console/devices/:id"); const id = match?.params?.id; @@ -69,6 +69,10 @@ function DeviceEdit() { const loading = !encoderModules || !data.id || !tokens || !params; + const { data: dataAmount, mutate: mutateDataAmount } = useApiRequest( + `/device/${id}/data_amount`, + ); + /** * Called when the record was fetched by the edit page. * We use this to set the data state to manipulate the object. @@ -213,6 +217,18 @@ function DeviceEdit() { [data], ); + const deleteMultipleData = useCallback( + async (ids: string[]) => { + if (!id) { + return; + } + + await deleteDeviceData(id, { ids }); + mutateDataAmount(Math.max(dataAmount - ids.length, 0)); + }, + [mutateDataAmount, dataAmount, id], + ); + /** * Renders the `Live Inspector` tab's title. */ @@ -302,22 +318,32 @@ function DeviceEdit() { Last Input  |  - Last Output - -  |  - Bucket - {data.name} -  |  Type {getDeviceTypeName(data.type)} +  |  + + Data amount  + {dataAmount} ); }; - /** - * Renders the `More` tab. - */ + const renderDataTab = useCallback(() => { + return ( + mutateDataAmount(dataAmount, true)} + /> + ); + }, [data, deleteMultipleData, dataAmount, mutateDataAmount]); + + const renderChunksTab = useCallback(() => { + return ; + }, [data]); + const renderMoreTab = useCallback(() => { return ; }, [data, deleteData]); @@ -427,6 +453,15 @@ function DeviceEdit() { label: "General Information", content: renderGeneralInformationTab(), }, + { + label: "Data", + content: renderDataTab(), + }, + { + label: "Chunks", + content: renderChunksTab(), + hidden: !data || data.type !== "immutable", + }, { label: renderLiveInspectorTitle(), content: renderLiveInspectorTab(), diff --git a/packages/console/src/Components/Sidebar/Sidebar.tsx b/packages/console/src/Components/Sidebar/Sidebar.tsx index 6eb51c6e..2f21ff71 100644 --- a/packages/console/src/Components/Sidebar/Sidebar.tsx +++ b/packages/console/src/Components/Sidebar/Sidebar.tsx @@ -13,17 +13,11 @@ import Item from "./Item.tsx"; import PluginButton from "./PluginButton/PluginButton.tsx"; import * as Style from "./Sidebar.style"; -interface ISidebarProps { - /** - * Indicates if the sidebar is open or closed. - */ +interface SidebarProps { open: boolean; } -/** - * This component shows a sidebar on the left side of the page. - */ -function Sidebar(props: ISidebarProps) { +function Sidebar(props: SidebarProps) { const theme = useTheme(); const buttons: Array = [ @@ -104,9 +98,6 @@ function Sidebar(props: ISidebarProps) { } } - /** - * Renders a single plugin. - */ const renderPlugin = (item: IPluginListItem) => { if (item.hidden) { return null; @@ -114,8 +105,6 @@ function Sidebar(props: ISidebarProps) { return ; }; - /** - */ const renderButton = (item: any, index: number) => { if (!item) { return
; @@ -133,8 +122,6 @@ function Sidebar(props: ISidebarProps) { ); }; - /** - */ useEffect(() => { function onStatus(params: any) { if (params.deleted) { diff --git a/packages/console/src/Components/Store/Details/Banner/Banner.tsx b/packages/console/src/Components/Store/Details/Banner/Banner.tsx index 88d2e2cb..01468f7b 100644 --- a/packages/console/src/Components/Store/Details/Banner/Banner.tsx +++ b/packages/console/src/Components/Store/Details/Banner/Banner.tsx @@ -13,23 +13,17 @@ import Publisher from "../../../Plugins/Common/Publisher/Publisher.tsx"; import Tooltip from "../../../Tooltip/Tooltip.tsx"; import * as Style from "./Banner.style"; -/** - * Props. - */ interface IBannerProps { installURL: string; - onChangeSelectedVersion(version: string): void; plugin: any; selectedVersion: string; systemPlatform?: string; + onChangeSelectedVersion(version: string): void; } -/** - * The banner at the top of the plugin details page. - */ -function Banner(props: IBannerProps) { +function PluginBanner(props: IBannerProps) { const { data: status } = useApiRequest("/status"); - const { data: installedPlugins } = + const { data: installedPlugins, mutate: mutateTest } = useApiRequest>("/plugins/installed"); const { plugin } = props; const { @@ -61,35 +55,24 @@ function Banner(props: IBannerProps) { [token, masterPassword], ); - /** - * Called when the activate button is pressed. - */ - const activate = useCallback(() => { + const activatePlugin = useCallback(() => { axios.post(`/plugins/activate/${id}`, {}, { headers }).then(() => { setIsInstalled(true); + mutateTest(); }); - }, [id, headers]); + }, [id, headers, mutateTest]); - /** - * Edits the configuration of the plugin. - */ - const editConfiguration = useCallback(() => { + const editPluginSettings = useCallback(() => { navigate(`/console/plugin/${id}`); }, [id, navigate]); - /** - * Called when the deactivate button is pressed. - */ - const deactivate = useCallback(() => { + const deactivatePlugin = useCallback(() => { axios.post(`/plugins/deactivate/${id}`, {}, { headers }).then(() => { setIsInstalled(false); }); }, [id, headers]); - /** - * Renders the information part of the banner. - */ - const renderInfo = () => { + const renderPluginInfoSection = () => { return (
@@ -114,24 +97,21 @@ function Banner(props: IBannerProps) { ); }; - /** - * Renders the install section. - */ - const renderInstall = () => { + const renderPluginInstallSection = () => { const disabled = isIncompatible || isInstalled; const defaultPlugin = types?.includes("default"); if (isInstalled) { return ( - @@ -173,10 +153,10 @@ function Banner(props: IBannerProps) { - {renderInfo()} - {renderInstall()} + {renderPluginInfoSection()} + {renderPluginInstallSection()} ); } -export default Banner; +export default PluginBanner; diff --git a/packages/console/src/Components/Tabs/Tabs.tsx b/packages/console/src/Components/Tabs/Tabs.tsx index 23315ae5..90ba8205 100644 --- a/packages/console/src/Components/Tabs/Tabs.tsx +++ b/packages/console/src/Components/Tabs/Tabs.tsx @@ -46,6 +46,10 @@ function Tabs(props: ITabsProps) { * Renders a single tab's title. */ const renderTabTitle = (tab: ITab, index: number) => { + if (tab.hidden) { + return null; + } + const selected = index === props.index; return (