diff --git a/package-lock.json b/package-lock.json index af4d51f68..4e0d63be4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,15 +18,15 @@ "@alcalzone/release-script-plugin-iobroker": "^3.7.2", "@alcalzone/release-script-plugin-lerna": "^3.7.0", "@alcalzone/release-script-plugin-license": "^3.7.0", - "@babel/core": "^7.25.2", + "@babel/core": "^7.25.7", "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-decorators": "^7.24.7", + "@babel/plugin-proposal-decorators": "^7.25.7", "@babel/plugin-proposal-private-property-in-object": "^7.21.11", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/plugin-transform-runtime": "^7.25.4", - "@babel/preset-env": "^7.25.4", - "@babel/preset-flow": "^7.24.7", - "@babel/preset-react": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.25.7", + "@babel/plugin-transform-runtime": "^7.25.7", + "@babel/preset-env": "^7.25.7", + "@babel/preset-flow": "^7.25.7", + "@babel/preset-react": "^7.25.7", "@craco/craco": "^7.1.0", "@devbookhq/splitter": "^1.4.2", "@dilesoft/vite-plugin-federation-dynamic": "^1.1.9", @@ -34,18 +34,18 @@ "@fnando/sparkline": "^0.3.10", "@foxriver76/iob-component-lib": "^0.1.6", "@honkhonk/vite-plugin-svgr": "^1.1.0", - "@iobroker/adapter-react-v5": "^7.2.1", + "@iobroker/adapter-react-v5": "^7.2.3", "@iobroker/admin-component-easy-access": "^1.0.1", - "@iobroker/build-tools": "^1.1.0", + "@iobroker/build-tools": "^2.0.5", "@iobroker/dm-utils": "^0.5.0", "@iobroker/eslint-config": "^0.1.6", "@iobroker/js-controller-common-db": "^6.0.12-alpha.0-20240913-9a3639aed", "@iobroker/legacy-testing": "^1.0.13", - "@iobroker/socket-client": "^3.1.0", + "@iobroker/socket-client": "^3.1.1", "@iobroker/testing": "^5.0.0", "@iobroker/types": "^7.0.0-alpha.1-20241001-61327866b", - "@mui/icons-material": "^6.1.1", - "@mui/material": "^6.1.1", + "@mui/icons-material": "^6.1.2", + "@mui/material": "^6.1.2", "@mui/x-data-grid": "^7.18.0", "@mui/x-date-pickers": "^7.18.0", "@originjs/vite-plugin-commonjs": "^1.0.3", @@ -66,12 +66,12 @@ "@types/express-session": "^1.18.0", "@types/leaflet": "^1.9.12", "@types/less": "^3.0.6", - "@types/lodash": "^4.17.9", + "@types/lodash": "^4.17.10", "@types/mocha": "^10.0.8", "@types/node": "^22.7.4", "@types/passport": "^1.0.16", "@types/passport-local": "^1.0.38", - "@types/react": "^18.3.10", + "@types/react": "^18.3.11", "@types/react-color": "^3.0.12", "@types/react-dom": "^18.3.0", "@types/validator": "^13.12.2", @@ -89,7 +89,7 @@ "date-fns": "^4.1.0", "echarts": "^5.5.1", "echarts-for-react": "^3.0.2", - "globals": "^15.9.0", + "globals": "^15.10.0", "i": "^0.3.7", "ipaddr.js": "^2.2.0", "json5": "^2.2.3", @@ -103,7 +103,7 @@ "ol": "^10.2.1", "prettier": "^3.3.3", "prop-types": "^15.8.1", - "puppeteer": "^23.4.1", + "puppeteer": "^23.5.0", "react": "^18.3.1", "react-ace": "^12.0.0", "react-color": "^2.19.3", @@ -114,7 +114,7 @@ "react-dnd-preview": "^8.0.3", "react-dnd-touch-backend": "^16.0.1", "react-dom": "^18.3.1", - "react-dropzone": "^14.2.3", + "react-dropzone": "^14.2.9", "react-icons": "^5.3.0", "react-inlinesvg": "^4.1.3", "react-leaflet": "^4.2.1", @@ -132,10 +132,10 @@ "typescript": "^5.6.2" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "19.8.2", - "@nx/nx-darwin-x64": "19.8.2", - "@nx/nx-linux-x64-gnu": "19.8.2", - "@nx/nx-win32-x64-msvc": "19.8.2" + "@nx/nx-darwin-arm64": "19.8.3", + "@nx/nx-darwin-x64": "19.8.3", + "@nx/nx-linux-x64-gnu": "19.8.3", + "@nx/nx-win32-x64-msvc": "19.8.3" } }, "node_modules/@adobe/css-tools": { @@ -368,10 +368,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/highlight": "^7.25.7", "picocolors": "^1.0.0" }, "engines": { @@ -379,7 +381,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.4", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz", + "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==", "dev": true, "license": "MIT", "engines": { @@ -387,20 +391,22 @@ } }, "node_modules/@babel/core": { - "version": "7.25.2", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", + "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -457,49 +463,57 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.5", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.4", + "@babel/types": "^7.25.7", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz", + "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz", + "integrity": "sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -516,16 +530,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.4", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz", + "integrity": "sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/traverse": "^7.25.4", + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/traverse": "^7.25.7", "semver": "^6.3.1" }, "engines": { @@ -544,12 +560,14 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.2", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.7.tgz", + "integrity": "sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "regexpu-core": "^5.3.1", + "@babel/helper-annotate-as-pure": "^7.25.7", + "regexpu-core": "^6.1.1", "semver": "^6.3.1" }, "engines": { @@ -583,37 +601,43 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.8", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz", + "integrity": "sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.8" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -623,18 +647,22 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz", + "integrity": "sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", + "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", "dev": true, "license": "MIT", "engines": { @@ -642,13 +670,15 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.0", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.7.tgz", + "integrity": "sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-wrap-function": "^7.25.0", - "@babel/traverse": "^7.25.0" + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-wrap-function": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -658,13 +688,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.0", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz", + "integrity": "sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -674,45 +706,55 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz", + "integrity": "sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", "dev": true, "license": "MIT", "engines": { @@ -720,35 +762,41 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.25.0", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz", + "integrity": "sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.25.0", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", + "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -758,10 +806,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.4", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", + "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.4" + "@babel/types": "^7.25.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -771,12 +821,14 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.3", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz", + "integrity": "sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.3" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -786,11 +838,13 @@ } }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.0", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz", + "integrity": "sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -800,11 +854,13 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.0", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.7.tgz", + "integrity": "sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -814,13 +870,15 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz", + "integrity": "sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/plugin-transform-optional-chaining": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -830,12 +888,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.0", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz", + "integrity": "sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.0" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -860,13 +920,15 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.7.tgz", + "integrity": "sha512-q1mqqqH0e1lhmsEQHV5U8OmdueBC2y0RFr2oUzZoFRtN3MvPmt2fsFRcNQAoGLTSNdHBFUYGnlgcRFhkBbKjPw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-decorators": "^7.24.7" + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-decorators": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -988,6 +1050,8 @@ }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "license": "MIT", "dependencies": { @@ -1001,11 +1065,13 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.7.tgz", + "integrity": "sha512-oXduHo642ZhstLVYTe2z2GSJIruU0c/W3/Ghr6A5yGMsVrvdnxO1z+3pbTcT7f3/Clnt+1z8D/w1r1f1SHaCHw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1016,6 +1082,8 @@ }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1027,6 +1095,8 @@ }, "node_modules/@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1037,11 +1107,13 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.25.7.tgz", + "integrity": "sha512-fyoj6/YdVtlv2ROig/J0fP7hh/wNO1MJGm1NR70Pg7jbkF+jOUL9joorqaCOQh06Y+LfgTagHzC8KqZ3MF782w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1051,11 +1123,13 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz", + "integrity": "sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1065,11 +1139,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz", + "integrity": "sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1101,11 +1177,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", + "integrity": "sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1238,11 +1316,13 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.7.tgz", + "integrity": "sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1252,14 +1332,16 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.4", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.7.tgz", + "integrity": "sha512-4B6OhTrwYKHYYgcwErvZjbmH9X5TxQBsaBHdzEIB4l71gR5jh/tuHGlb9in47udL2+wVUcOz5XXhhfhVJwEpEg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-remap-async-to-generator": "^7.25.0", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-remap-async-to-generator": "^7.25.7", "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/traverse": "^7.25.4" + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1269,13 +1351,15 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz", + "integrity": "sha512-ZUCjAavsh5CESCmi/xCpX1qcCaAglzs/7tmuvoFnJgA1dM7gQplsguljoTg+Ru8WENpX89cQyAtWoaE0I3X3Pg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-remap-async-to-generator": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1285,11 +1369,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz", + "integrity": "sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1299,11 +1385,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.0", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz", + "integrity": "sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1313,12 +1401,14 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.4", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz", + "integrity": "sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.4", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1328,12 +1418,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.7.tgz", + "integrity": "sha512-rvUUtoVlkDWtDWxGAiiQj0aNktTPn3eFynBcMC2IhsXweehwgdI9ODe+XjWw515kEmv22sSOTp/rxIRuTiB7zg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -1344,15 +1436,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.4", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz", + "integrity": "sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/traverse": "^7.25.4", + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7", + "@babel/traverse": "^7.25.7", "globals": "^11.1.0" }, "engines": { @@ -1364,6 +1458,8 @@ }, "node_modules/@babel/plugin-transform-classes/node_modules/globals": { "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, "license": "MIT", "engines": { @@ -1371,12 +1467,14 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz", + "integrity": "sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/template": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/template": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1386,11 +1484,13 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.8", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.7.tgz", + "integrity": "sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1400,12 +1500,14 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz", + "integrity": "sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1415,11 +1517,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz", + "integrity": "sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1429,12 +1533,14 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.0", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz", + "integrity": "sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1444,11 +1550,13 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.7.tgz", + "integrity": "sha512-UvcLuual4h7/GfylKm2IAA3aph9rwvAM2XBA0uPKU3lca+Maai4jBjjEVUS568ld6kJcgbouuumCBhMd/Yz17w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1459,12 +1567,14 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz", + "integrity": "sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1474,11 +1584,13 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.7.tgz", + "integrity": "sha512-h3MDAP5l34NQkkNulsTNyjdaR+OiB0Im67VU//sFupouP8Q6m9Spy7l66DcaAQxtmCqGdanPByLsnwFttxKISQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1489,12 +1601,14 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.7.tgz", + "integrity": "sha512-q8Td2PPc6/6I73g96SreSUCKEcwMXCwcXSIAVTyTTN6CpJe0dMj8coxu1fg1T9vfBLi6Rsi6a4ECcFBbKabS5w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-flow": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-flow": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1504,12 +1618,14 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz", + "integrity": "sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1519,13 +1635,15 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.1", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz", + "integrity": "sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.1" + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1535,11 +1653,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.7.tgz", + "integrity": "sha512-Ot43PrL9TEAiCe8C/2erAjXMeVSnE/BLEx6eyrKLNFCCw5jvhTHKyHxdI1pA0kz5njZRYAnMO2KObGqOCRDYSA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1550,11 +1670,13 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.2", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz", + "integrity": "sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1564,11 +1686,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.7.tgz", + "integrity": "sha512-iImzbA55BjiovLyG2bggWS+V+OLkaBorNvc/yJoeeDQGztknRnDdYfp2d/UPmunZYEnZi6Lg8QcTmNMHOB0lGA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1579,11 +1703,13 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz", + "integrity": "sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1593,12 +1719,14 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz", + "integrity": "sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1608,13 +1736,15 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.8", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz", + "integrity": "sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-simple-access": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1624,14 +1754,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.0", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz", + "integrity": "sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1641,12 +1773,14 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz", + "integrity": "sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1656,12 +1790,14 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz", + "integrity": "sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1671,11 +1807,13 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz", + "integrity": "sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1685,11 +1823,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.7.tgz", + "integrity": "sha512-FbuJ63/4LEL32mIxrxwYaqjJxpbzxPVQj5a+Ebrc8JICV6YX8nE53jY+K0RZT3um56GoNWgkS2BQ/uLGTjtwfw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1700,11 +1840,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.7.tgz", + "integrity": "sha512-8CbutzSSh4hmD+jJHIA8vdTNk15kAzOnFLVVgBSMGr28rt85ouT01/rezMecks9pkU939wDInImwCKv4ahU4IA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1715,14 +1857,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.7.tgz", + "integrity": "sha512-1JdVKPhD7Y5PvgfFy0Mv2brdrolzpzSoUq2pr6xsR+m+3viGGeHEokFKsCgOkbeFOQxfB1Vt2F0cPJLRpFI4Zg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.7" + "@babel/plugin-transform-parameters": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1732,12 +1876,14 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz", + "integrity": "sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1747,11 +1893,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.7.tgz", + "integrity": "sha512-m9obYBA39mDPN7lJzD5WkGGb0GO54PPLXsbcnj1Hyeu8mSRz7Gb4b1A6zxNX32ZuUySDK4G6it8SDFWD1nCnqg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1762,12 +1910,14 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.8", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.7.tgz", + "integrity": "sha512-h39agClImgPWg4H8mYVAbD1qP9vClFbEjqoJmt87Zen8pjqK8FTPUwrOXAvqu5soytwxrLMd2fx2KSCp2CHcNg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1778,11 +1928,13 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz", + "integrity": "sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1792,12 +1944,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.4", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz", + "integrity": "sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.4", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1807,13 +1961,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.7.tgz", + "integrity": "sha512-LzA5ESzBy7tqj00Yjey9yWfs3FKy4EmJyKOSWld144OxkTji81WWnUT8nkLUn+imN/zHL8ZQlOu/MTUAhHaX3g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1824,11 +1980,13 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz", + "integrity": "sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1852,11 +2010,13 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.7.tgz", + "integrity": "sha512-r0QY7NVU8OnrwE+w2IWiRom0wwsTbjx4+xH2RTd7AVdof3uurXOF+/mXHQDRk+2jIvWgSaCHKMgggfvM4dyUGA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1866,15 +2026,17 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.7.tgz", + "integrity": "sha512-vILAg5nwGlR9EXE8JIOX4NHXd49lrYbN8hnjffDtoULwpL9hUx/N55nqh2qd0q6FyNDfjl9V79ecKGvFbcSA0Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-jsx": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1884,11 +2046,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.7.tgz", + "integrity": "sha512-5yd3lH1PWxzW6IZj+p+Y4OLQzz0/LzlOG8vGqonHfVR3euf1vyzyMUJk9Ac+m97BH46mFc/98t9PmYLyvgL3qg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.24.7" + "@babel/plugin-transform-react-jsx": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1898,12 +2062,14 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.7.tgz", + "integrity": "sha512-6YTHJ7yjjgYqGc8S+CbEXhLICODk0Tn92j+vNJo07HFk9t3bjFgAKxPLFhHwF2NjmQVSI1zBRfBWUeVBa2osfA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1913,11 +2079,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz", + "integrity": "sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1928,11 +2096,13 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz", + "integrity": "sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1942,12 +2112,14 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.25.4", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.7.tgz", + "integrity": "sha512-Y9p487tyTzB0yDYQOtWnC+9HGOuogtP3/wNpun1xJXEEvI6vip59BSBTsHnekZLqxmPcgsrAKt46HAAb//xGhg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", @@ -1969,11 +2141,13 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz", + "integrity": "sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1983,12 +2157,14 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz", + "integrity": "sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1998,11 +2174,13 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz", + "integrity": "sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -2012,11 +2190,13 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz", + "integrity": "sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -2026,11 +2206,13 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.8", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz", + "integrity": "sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -2057,11 +2239,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz", + "integrity": "sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -2071,12 +2255,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz", + "integrity": "sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -2086,12 +2272,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz", + "integrity": "sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -2101,12 +2289,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.4", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz", + "integrity": "sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -2116,27 +2306,29 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.25.4", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.7.tgz", + "integrity": "sha512-Gibz4OUdyNqqLj+7OAvBZxOD7CklCtMA5/j0JgUEwOnaRULsPDXmic2iKxL2DX2vQduPR5wH2hjZas/Vr/Oc0g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.4", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-option": "^7.24.8", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", + "@babel/compat-data": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.7", - "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-assertions": "^7.25.7", + "@babel/plugin-syntax-import-attributes": "^7.25.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -2148,60 +2340,60 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.4", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.25.4", - "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.25.4", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-dotall-regex": "^7.24.7", - "@babel/plugin-transform-duplicate-keys": "^7.24.7", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", - "@babel/plugin-transform-dynamic-import": "^7.24.7", - "@babel/plugin-transform-exponentiation-operator": "^7.24.7", - "@babel/plugin-transform-export-namespace-from": "^7.24.7", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-member-expression-literals": "^7.24.7", - "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-modules-systemjs": "^7.25.0", - "@babel/plugin-transform-modules-umd": "^7.24.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-new-target": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-object-super": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.25.4", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-property-literals": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-reserved-words": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.8", - "@babel/plugin-transform-unicode-escapes": "^7.24.7", - "@babel/plugin-transform-unicode-property-regex": "^7.24.7", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.4", + "@babel/plugin-transform-arrow-functions": "^7.25.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.7", + "@babel/plugin-transform-async-to-generator": "^7.25.7", + "@babel/plugin-transform-block-scoped-functions": "^7.25.7", + "@babel/plugin-transform-block-scoping": "^7.25.7", + "@babel/plugin-transform-class-properties": "^7.25.7", + "@babel/plugin-transform-class-static-block": "^7.25.7", + "@babel/plugin-transform-classes": "^7.25.7", + "@babel/plugin-transform-computed-properties": "^7.25.7", + "@babel/plugin-transform-destructuring": "^7.25.7", + "@babel/plugin-transform-dotall-regex": "^7.25.7", + "@babel/plugin-transform-duplicate-keys": "^7.25.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.7", + "@babel/plugin-transform-dynamic-import": "^7.25.7", + "@babel/plugin-transform-exponentiation-operator": "^7.25.7", + "@babel/plugin-transform-export-namespace-from": "^7.25.7", + "@babel/plugin-transform-for-of": "^7.25.7", + "@babel/plugin-transform-function-name": "^7.25.7", + "@babel/plugin-transform-json-strings": "^7.25.7", + "@babel/plugin-transform-literals": "^7.25.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.7", + "@babel/plugin-transform-member-expression-literals": "^7.25.7", + "@babel/plugin-transform-modules-amd": "^7.25.7", + "@babel/plugin-transform-modules-commonjs": "^7.25.7", + "@babel/plugin-transform-modules-systemjs": "^7.25.7", + "@babel/plugin-transform-modules-umd": "^7.25.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.7", + "@babel/plugin-transform-new-target": "^7.25.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.7", + "@babel/plugin-transform-numeric-separator": "^7.25.7", + "@babel/plugin-transform-object-rest-spread": "^7.25.7", + "@babel/plugin-transform-object-super": "^7.25.7", + "@babel/plugin-transform-optional-catch-binding": "^7.25.7", + "@babel/plugin-transform-optional-chaining": "^7.25.7", + "@babel/plugin-transform-parameters": "^7.25.7", + "@babel/plugin-transform-private-methods": "^7.25.7", + "@babel/plugin-transform-private-property-in-object": "^7.25.7", + "@babel/plugin-transform-property-literals": "^7.25.7", + "@babel/plugin-transform-regenerator": "^7.25.7", + "@babel/plugin-transform-reserved-words": "^7.25.7", + "@babel/plugin-transform-shorthand-properties": "^7.25.7", + "@babel/plugin-transform-spread": "^7.25.7", + "@babel/plugin-transform-sticky-regex": "^7.25.7", + "@babel/plugin-transform-template-literals": "^7.25.7", + "@babel/plugin-transform-typeof-symbol": "^7.25.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.7", + "@babel/plugin-transform-unicode-property-regex": "^7.25.7", + "@babel/plugin-transform-unicode-regex": "^7.25.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.7", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.37.1", + "core-js-compat": "^3.38.1", "semver": "^6.3.1" }, "engines": { @@ -2231,13 +2423,15 @@ } }, "node_modules/@babel/preset-flow": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.25.7.tgz", + "integrity": "sha512-q2x3g0YHzo/Ohsr51KOYS/BtZMsvkzVd8qEyhZAyTatYdobfgXCuyppTqTuIhdq5kR/P3nyyVvZ6H5dMc4PnCQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-transform-flow-strip-types": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-transform-flow-strip-types": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -2260,16 +2454,18 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.25.7.tgz", + "integrity": "sha512-GjV0/mUEEXpi1U5ZgDprMRRgajGMRW3G5FjMr5KLKD8nT2fTG8+h/klV3+6Dm5739QE+K5+2e91qFKAYI3pmRg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-transform-react-display-name": "^7.24.7", - "@babel/plugin-transform-react-jsx": "^7.24.7", - "@babel/plugin-transform-react-jsx-development": "^7.24.7", - "@babel/plugin-transform-react-pure-annotations": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-transform-react-display-name": "^7.25.7", + "@babel/plugin-transform-react-jsx": "^7.25.7", + "@babel/plugin-transform-react-jsx-development": "^7.25.7", + "@babel/plugin-transform-react-pure-annotations": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -2296,11 +2492,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "dev": true, - "license": "MIT" - }, "node_modules/@babel/runtime": { "version": "7.25.6", "license": "MIT", @@ -2312,26 +2503,30 @@ } }, "node_modules/@babel/template": { - "version": "7.25.0", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.4", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.4", - "@babel/parser": "^7.25.4", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.4", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2347,11 +2542,13 @@ } }, "node_modules/@babel/types": { - "version": "7.25.4", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", + "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -3169,9 +3366,9 @@ } }, "node_modules/@iobroker/adapter-react-v5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@iobroker/adapter-react-v5/-/adapter-react-v5-7.2.1.tgz", - "integrity": "sha512-fVuWeg2IeBwW27amI88xqwM7FRXxL+xELp/KwythImPc0Q2rySj4umcqZmb1in0APDnKfOtiqz2LWkFEquOzUA==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@iobroker/adapter-react-v5/-/adapter-react-v5-7.2.3.tgz", + "integrity": "sha512-Pa9zFEVjpoDH9B0CRfxvzDfPRzN0F94KqsI0SVDDhW7QqCjtroi35QPZR/PuSeUmpTd/P43R6k/KUQBdxk7QEA==", "license": "MIT", "dependencies": { "@emotion/react": "^11.13.3", @@ -3264,14 +3461,100 @@ "license": "MIT" }, "node_modules/@iobroker/build-tools": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@iobroker/build-tools/-/build-tools-1.1.0.tgz", - "integrity": "sha512-DcGQr4nTD5htcRADGwo1jQXrdcCwKMiSgq4VIPC1EkTj5FHS6ZiyRrr3rF4ypzCUUeycXAqU+3l7WITnCZmhUQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@iobroker/build-tools/-/build-tools-2.0.5.tgz", + "integrity": "sha512-d5C82vtlLOQtA4YXIRMXQfCy9XHBzaHd4fcwZcQ6+d1KvXcyKAelb6aAzKw9R3awRHkAxNoAa2bMaThTQHC/RQ==", "dev": true, + "dependencies": { + "glob": "^11.0.0" + }, "engines": { "node": ">=16" } }, + "node_modules/@iobroker/build-tools/node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@iobroker/build-tools/node_modules/jackspeak": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@iobroker/build-tools/node_modules/lru-cache": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.1.tgz", + "integrity": "sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@iobroker/build-tools/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@iobroker/build-tools/node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@iobroker/db-base": { "version": "6.0.11", "license": "MIT", @@ -3691,9 +3974,9 @@ } }, "node_modules/@iobroker/socket-client": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@iobroker/socket-client/-/socket-client-3.1.0.tgz", - "integrity": "sha512-HXMqF7FAieWuzNQ1iKKXVt/8RpPMVc+QXuvUkN+qjsuYgbdV1t8cRHWt0fSuDNS123nrL94qMn1Y/xH2vTFx9g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@iobroker/socket-client/-/socket-client-3.1.1.tgz", + "integrity": "sha512-HiBONSkXMiwtOsHqpEF+CCnC2sqbYij1fSA10RBwxp7JA/CSeyGebsHnf+Aed95ZMK0YTuQ5GEMjA+UuKk7+/g==", "license": "MIT" }, "node_modules/@iobroker/testing": { @@ -3733,12 +4016,11 @@ "node": ">=12.0.0" } }, - "node_modules/@iobroker/ws-server": { - "version": "2.1.2", - "license": "MIT", - "dependencies": { - "ws": "^8.13.0" - } + "node_modules/@iobroker/ws": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iobroker/ws/-/ws-2.0.0.tgz", + "integrity": "sha512-UQ1OEwro9jN6bruRqF+uyMcCOSW713a4wGsB7X9J6nJi2V4igKW2JGHrPq8p2wbMSCYZBj4lU/KG4Ip/6GT+7Q==", + "license": "MIT" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -4536,9 +4818,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.1.tgz", - "integrity": "sha512-VdQC1tPIIcZAnf62L2M1eQif0x2vlKg3YK4kGYbtijSH4niEgI21GnstykW1vQIs+Bc6L+Hua2GATYVjilJ22A==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.2.tgz", + "integrity": "sha512-1oE4U38/TtzLWRYWEm/m70dUbpcvBx0QvDVg6NtpOmSNQC1Mbx0X/rNvYDdZnn8DIsAiVQ+SZ3am6doSswUQ4g==", "license": "MIT", "funding": { "type": "opencollective", @@ -4546,9 +4828,9 @@ } }, "node_modules/@mui/icons-material": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.1.1.tgz", - "integrity": "sha512-sy/YKwcLPW8VcacNP2uWMYR9xyWuwO9NN9FXuGEU90bRshBXj8pdKk+joe3TCW7oviVS3zXLHlc94wQ0jNsQRQ==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.1.2.tgz", + "integrity": "sha512-7NNcjW5JoT9jHagrVbARA1o41vQY2xezDamtke+mEKKZmsJyejfRBOacSrPDfjZQ//lyhIjNKyzAwisxYJR47w==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.6" @@ -4561,7 +4843,7 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@mui/material": "^6.1.1", + "@mui/material": "^6.1.2", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, @@ -4572,16 +4854,16 @@ } }, "node_modules/@mui/material": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.1.tgz", - "integrity": "sha512-b+eULldTqtqTCbN++2BtBWCir/1LwEYw+2mIlOt2GiEUh1EBBw4/wIukGKKNt3xrCZqRA80yLLkV6tF61Lq3cA==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.2.tgz", + "integrity": "sha512-5TtHeAVX9D5d2LYfB1GAUn29BcVETVsrQ76Dwb2SpAfQGW3JVy4deJCAd0RrIkI3eEUrsl0E4xuBdreszxdTTg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.6", - "@mui/core-downloads-tracker": "^6.1.1", - "@mui/system": "^6.1.1", + "@mui/core-downloads-tracker": "^6.1.2", + "@mui/system": "^6.1.2", "@mui/types": "^7.2.17", - "@mui/utils": "^6.1.1", + "@mui/utils": "^6.1.2", "@popperjs/core": "^2.11.8", "@types/react-transition-group": "^4.4.11", "clsx": "^2.1.1", @@ -4600,7 +4882,7 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@mui/material-pigment-css": "^6.1.1", + "@mui/material-pigment-css": "^6.1.2", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" @@ -4621,14 +4903,14 @@ } }, "node_modules/@mui/material/node_modules/@mui/utils": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.1.tgz", - "integrity": "sha512-HlRrgdJSPbYDXPpoVMWZV8AE7WcFtAk13rWNWAEVWKSanzBBkymjz3km+Th/Srowsh4pf1fTSP1B0L116wQBYw==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.2.tgz", + "integrity": "sha512-6+B1YZ8cCBWD1fc3RjqpclF9UA0MLUiuXhyCO+XowD/Z2ku5IlxeEhHHlgglyBWFGMu4kib4YU3CDsG5/zVjJQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.6", "@mui/types": "^7.2.17", - "@types/prop-types": "^15.7.12", + "@types/prop-types": "^15.7.13", "clsx": "^2.1.1", "prop-types": "^15.8.1", "react-is": "^18.3.1" @@ -4657,13 +4939,13 @@ "license": "MIT" }, "node_modules/@mui/private-theming": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.1.1.tgz", - "integrity": "sha512-JlrjIdhyZUtewtdAuUsvi3ZnO0YS49IW4Mfz19ZWTlQ0sDGga6LNPVwHClWr2/zJK2we2BQx9/i8M32rgKuzrg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.1.2.tgz", + "integrity": "sha512-S8WcjZdNdi++8UhrrY8Lton5h/suRiQexvdTfdcPAlbajlvgM+kx+uJstuVIEyTb3gMkxzIZep87knZ0tqcR0g==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.6", - "@mui/utils": "^6.1.1", + "@mui/utils": "^6.1.2", "prop-types": "^15.8.1" }, "engines": { @@ -4684,14 +4966,14 @@ } }, "node_modules/@mui/private-theming/node_modules/@mui/utils": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.1.tgz", - "integrity": "sha512-HlRrgdJSPbYDXPpoVMWZV8AE7WcFtAk13rWNWAEVWKSanzBBkymjz3km+Th/Srowsh4pf1fTSP1B0L116wQBYw==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.2.tgz", + "integrity": "sha512-6+B1YZ8cCBWD1fc3RjqpclF9UA0MLUiuXhyCO+XowD/Z2ku5IlxeEhHHlgglyBWFGMu4kib4YU3CDsG5/zVjJQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.6", "@mui/types": "^7.2.17", - "@types/prop-types": "^15.7.12", + "@types/prop-types": "^15.7.13", "clsx": "^2.1.1", "prop-types": "^15.8.1", "react-is": "^18.3.1" @@ -4720,9 +5002,9 @@ "license": "MIT" }, "node_modules/@mui/styled-engine": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.1.1.tgz", - "integrity": "sha512-HJyIoMpFb11fnHuRtUILOXgq6vj4LhIlE8maG4SwP/W+E5sa7HFexhnB3vOMT7bKys4UKNxhobC8jwWxYilGsA==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.1.2.tgz", + "integrity": "sha512-uKOfWkR23X39xj7th2nyTcCHqInTAXtUnqD3T5qRVdJcOPvu1rlgTleTwJC/FJvWZJBU6ieuTWDhbcx5SNViHQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.6", @@ -4753,16 +5035,16 @@ } }, "node_modules/@mui/system": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.1.1.tgz", - "integrity": "sha512-PaYsCz2tUOcpu3T0okDEsSuP/yCDIj9JZ4Tox1JovRSKIjltHpXPsXZSGr3RiWdtM1MTQMFMCZzu0+CKbyy+Kw==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.1.2.tgz", + "integrity": "sha512-mzW7F1ZMIYS1aLON48Nrk9c65OrVEVQ+R4lUcTWs1lCSul0VGK23eo4dmY0NX5PS7Oe4xz3P5B9tQZZ7SYgxcg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.6", - "@mui/private-theming": "^6.1.1", - "@mui/styled-engine": "^6.1.1", + "@mui/private-theming": "^6.1.2", + "@mui/styled-engine": "^6.1.2", "@mui/types": "^7.2.17", - "@mui/utils": "^6.1.1", + "@mui/utils": "^6.1.2", "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1" @@ -4793,14 +5075,14 @@ } }, "node_modules/@mui/system/node_modules/@mui/utils": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.1.tgz", - "integrity": "sha512-HlRrgdJSPbYDXPpoVMWZV8AE7WcFtAk13rWNWAEVWKSanzBBkymjz3km+Th/Srowsh4pf1fTSP1B0L116wQBYw==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.2.tgz", + "integrity": "sha512-6+B1YZ8cCBWD1fc3RjqpclF9UA0MLUiuXhyCO+XowD/Z2ku5IlxeEhHHlgglyBWFGMu4kib4YU3CDsG5/zVjJQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.6", "@mui/types": "^7.2.17", - "@types/prop-types": "^15.7.12", + "@types/prop-types": "^15.7.13", "clsx": "^2.1.1", "prop-types": "^15.8.1", "react-is": "^18.3.1" @@ -5490,9 +5772,9 @@ } }, "node_modules/@nx/nx-darwin-arm64": { - "version": "19.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.8.2.tgz", - "integrity": "sha512-O06sOObpaF3UQrx6R5s0kFOrhrk/N20rKhOMaD5Qxw6lmVr6TGGH1epGpD8ES7ZPS+p7FUtU9/FPHwY02BZfBg==", + "version": "19.8.3", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.8.3.tgz", + "integrity": "sha512-ORHFFWMZcvFi0xcpCaXccXVEhFwAevSHOIKfW359+12H9w7VW2O42B+2NcVMK1mrDTOjlXTd+0AmAu7P4NzWFA==", "cpu": [ "arm64" ], @@ -5506,9 +5788,9 @@ } }, "node_modules/@nx/nx-darwin-x64": { - "version": "19.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-19.8.2.tgz", - "integrity": "sha512-hRFA7xpnIeMUF5FiDh681fxSx/EzkFYZ+UE/XBfzbc+T1neRy7NB2vMEa/WMsN0+Y5+NXtibx1akEDD6VOqeJA==", + "version": "19.8.3", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-19.8.3.tgz", + "integrity": "sha512-Ji9DPA0tuzygMcypD/FHRDQSPipcRqMNmSaNKxVpcCbozVTWHvqXFk0rloDIUnxnE0+zvE9LN71H2sS4ZHdTQA==", "cpu": [ "x64" ], @@ -5586,9 +5868,9 @@ } }, "node_modules/@nx/nx-linux-x64-gnu": { - "version": "19.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.8.2.tgz", - "integrity": "sha512-3h4dmIi5Muym18dsiiXQBygPlSAHZNe3PaYo8mLsUsvuAt2ye0XUDcAlHWXOt/FeuVDG1NEGI05vZJvbIIGikQ==", + "version": "19.8.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.8.3.tgz", + "integrity": "sha512-W1RRCqsQvpur4BxP5g5cQwjZB6jhxYLSSXi3QQDaU5ITkaV5Pdj/L7D/G6YgRB8lzKZrXc57aLJ5UKY/Z+di7w==", "cpu": [ "x64" ], @@ -5636,9 +5918,9 @@ } }, "node_modules/@nx/nx-win32-x64-msvc": { - "version": "19.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.8.2.tgz", - "integrity": "sha512-rRt+XIZk+ctxhFORWvugqmS07xi52eRS4QpTq8b24ZJKk1Zw0L5opsXAdzughhBzfIpSx4rxnknFlI78DcRPxA==", + "version": "19.8.3", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.8.3.tgz", + "integrity": "sha512-RU11iXJzdrw5CmogT2AwsjxK7g8vWf6Oy23NlrvsQFODtavjqAWoD5qpUY/H16s9lVDwrpzCbGbAXph0lbgLKA==", "cpu": [ "x64" ], @@ -6080,6 +6362,7 @@ "version": "8.33.1", "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.33.1.tgz", "integrity": "sha512-TW6/r+Gl5jiXv54iK1xZ3mlVgTS/jaBp4vcQ0xGMdgiQ3WchEPcFSeYovL+YHT3tSud0GZqVtDQCz+5i76puqA==", + "license": "MIT", "dependencies": { "@sentry/core": "8.33.1", "@sentry/types": "8.33.1", @@ -6093,6 +6376,7 @@ "version": "8.33.1", "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.33.1.tgz", "integrity": "sha512-qauMRTm3qDaLqZ3ibI03cj4gLF40y0ij65nj+cns6iWxGCtPrO8tjvXFWuQsE7Aye9dGMnBgmv7uN+NTUtC3RA==", + "license": "MIT", "dependencies": { "@sentry/core": "8.33.1", "@sentry/types": "8.33.1", @@ -6106,6 +6390,7 @@ "version": "8.33.1", "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.33.1.tgz", "integrity": "sha512-fm4coIOjmanU29NOVN9MyaP4fUCOYytbtFqVSKRFNZQ/xAgNeySiBIbUd6IjujMmnOk9bY0WEUMcdm3Uotjdog==", + "license": "MIT", "dependencies": { "@sentry-internal/browser-utils": "8.33.1", "@sentry/core": "8.33.1", @@ -6120,6 +6405,7 @@ "version": "8.33.1", "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.33.1.tgz", "integrity": "sha512-nsxTFTPCT10Ty/v6+AiST3+yotGP1sUb8xqfKB9fPnS1hZHFryp0NnEls7xFjBsBbZPU1GpFkzrk/E6JFzixDQ==", + "license": "MIT", "dependencies": { "@sentry-internal/replay": "8.33.1", "@sentry/core": "8.33.1", @@ -6134,6 +6420,7 @@ "version": "8.33.1", "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.33.1.tgz", "integrity": "sha512-c6zI/igexkLwZuGk+u8Rj26ChjxGgkhe6ZbKFsXCYaKAp5ep5X7HQRkkqgbxApiqlC0LduHdd/ymzh139JLg8w==", + "license": "MIT", "dependencies": { "@sentry-internal/browser-utils": "8.33.1", "@sentry-internal/feedback": "8.33.1", @@ -6151,6 +6438,7 @@ "version": "8.33.1", "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.33.1.tgz", "integrity": "sha512-3SS41suXLFzxL3OQvTMZ6q92ZapELVq2l2SoWlZopcamWhog2Ru0dp2vkunq97kFHb2TzKRTlFH4+4gbT8SJug==", + "license": "MIT", "dependencies": { "@sentry/types": "8.33.1", "@sentry/utils": "8.33.1" @@ -6163,6 +6451,7 @@ "version": "8.33.1", "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.33.1.tgz", "integrity": "sha512-GjoAMvwtpIemoF/IiwZ7A60g4nQv3qwzR21GvJqDVUoKD0e8pv9OLX+HyXoUat4wEDGSuDUcUyUKD2G+od73QA==", + "license": "MIT", "engines": { "node": ">=14.18" } @@ -6171,6 +6460,7 @@ "version": "8.33.1", "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.33.1.tgz", "integrity": "sha512-uzuYpiiJuFY3N4WNHMBWUQX5oNv2t/TbG0OHRp3Rr7yeu+HSfD542TIp9/gMZ+G0Cxd8AmVO3wkKIFbk0TL4Qg==", + "license": "MIT", "dependencies": { "@sentry/types": "8.33.1" }, @@ -7116,9 +7406,9 @@ "license": "MIT" }, "node_modules/@types/lodash": { - "version": "4.17.9", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.9.tgz", - "integrity": "sha512-w9iWudx1XWOHW5lQRS9iKpK/XuRhnN+0T7HvdCCd802FYkT1AMTnxndJHGrNJwRoRHkslGr4S29tjm1cT7x/7w==", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-YpS0zzoduEhuOWjAotS6A5AVCva7X4lVlYLF0FYHAY9sdraBfnatttHItlWeZdGhuEkf+OzMNg2ZYAx8t+52uQ==", "dev": true, "license": "MIT" }, @@ -7215,7 +7505,9 @@ "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.12", + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", "license": "MIT" }, "node_modules/@types/q": { @@ -7241,9 +7533,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.10", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.10.tgz", - "integrity": "sha512-02sAAlBnP39JgXwkAq3PeU9DVaaGpZyF3MGcC0MKgQVkZor5IiiDAipVaxQHtDJAmO4GIy/rVBy/LzVj76Cyqg==", + "version": "18.3.11", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz", + "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -9386,7 +9678,9 @@ } }, "node_modules/axios": { - "version": "1.7.4", + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -10352,7 +10646,9 @@ "peer": true }, "node_modules/browserslist": { - "version": "4.23.3", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "dev": true, "funding": [ { @@ -10370,8 +10666,8 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", "node-releases": "^2.0.18", "update-browserslist-db": "^1.1.0" }, @@ -10673,7 +10969,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001653", + "version": "1.0.30001667", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz", + "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==", "dev": true, "funding": [ { @@ -10922,9 +11220,9 @@ } }, "node_modules/chromium-bidi": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.6.5.tgz", - "integrity": "sha512-RuLrmzYrxSb0s9SgpB+QN5jJucPduZQ/9SIe76MDxYJuecPW5mxMdacJ1f4EtgiV+R0p3sCkznTMvH0MPGFqjA==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.8.0.tgz", + "integrity": "sha512-uJydbGdTw0DEUjhoogGveneJVWX/9YuqkWePzMmkBYwtdAqo5d3J/ovNKFr+/2hWXYmYCr6it8mSSTIj6SS6Ug==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -21353,7 +21651,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.13", + "version": "1.5.32", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.32.tgz", + "integrity": "sha512-M+7ph0VGBQqqpTT2YrabjNKSQ2fEl9PVx6AK3N558gDH9NO8O6XN9SXXFWRo9u9PbEg/bWq+tjXQr+eXmxubCw==", "dev": true, "license": "ISC" }, @@ -22686,20 +22986,6 @@ "license": "ISC", "peer": true }, - "node_modules/eslint-plugin-unicorn/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/eslint-plugin-unicorn/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -25104,7 +25390,9 @@ } }, "node_modules/globals": { - "version": "15.9.0", + "version": "15.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.10.0.tgz", + "integrity": "sha512-tqFIbz83w4Y5TCbtgjZjApohbuh7K9BxGYFm7ifwDR240tvdb7P9x+/9VvUKlmkPoiknoJtanI8UOrqxS3a7lQ==", "dev": true, "license": "MIT", "engines": { @@ -28568,13 +28856,15 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { @@ -30989,7 +31279,9 @@ } }, "node_modules/minipass": { - "version": "7.1.0", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" @@ -33210,6 +33502,13 @@ "node": ">= 14" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/pacote": { "version": "18.0.6", "dev": true, @@ -35623,18 +35922,18 @@ } }, "node_modules/puppeteer": { - "version": "23.4.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-23.4.1.tgz", - "integrity": "sha512-+wWfWTkQ8L9IB/3OVGSUp37c0eQ5za/85KdX+LAq2wTZkMdocgYGMCs+/91e2f/RXIYzve4x/uGxN8zG2sj8+w==", + "version": "23.5.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-23.5.0.tgz", + "integrity": "sha512-jnUx5M0YtFva7vXr39qqsxgB46JiwXJavuM1Hgsqbd9WWiGTEUt9klGpTxyHi+ZQf3NUgleDhNsnI10IK8Ebsg==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.4.0", - "chromium-bidi": "0.6.5", + "chromium-bidi": "0.8.0", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1342118", - "puppeteer-core": "23.4.1", + "puppeteer-core": "23.5.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -35645,14 +35944,14 @@ } }, "node_modules/puppeteer-core": { - "version": "23.4.1", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.4.1.tgz", - "integrity": "sha512-uCxGtn8VE9PlKhdFJX/zZySi9K3Ufr3qUZe28jxJoZUqiMJOi+SFh2zhiFDSjWqZIDkc0FtnaCC+rewW3MYXmg==", + "version": "23.5.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.5.0.tgz", + "integrity": "sha512-+5ed+625GuQ2emRHqYec8khT9LP14FWzv8hYl0HiM6hnnlNzdVU9uDJIPHeCPLIWxq15ost9MeF8kBk4R3eiFw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.4.0", - "chromium-bidi": "0.6.5", + "chromium-bidi": "0.8.0", "debug": "^4.3.7", "devtools-protocol": "0.0.1342118", "typed-query-selector": "^2.12.0", @@ -36131,7 +36430,9 @@ } }, "node_modules/react-dropzone": { - "version": "14.2.3", + "version": "14.2.9", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.9.tgz", + "integrity": "sha512-jRZsMC7h48WONsOLHcmhyn3cRWJoIPQjPApvt/sJVfnYaB3Qltn025AoRTTJaj4WdmmgmLl6tUQg1s0wOhpodQ==", "license": "MIT", "dependencies": { "attr-accept": "^2.2.2", @@ -38102,11 +38403,15 @@ }, "node_modules/regenerate": { "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true, "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "dev": true, "license": "MIT", "dependencies": { @@ -38122,6 +38427,8 @@ }, "node_modules/regenerator-transform": { "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "license": "MIT", "dependencies": { @@ -38224,14 +38531,16 @@ } }, "node_modules/regexpu-core": { - "version": "5.3.2", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", + "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.11.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, @@ -38239,24 +38548,26 @@ "node": ">=4" } }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, "node_modules/regjsparser": { - "version": "0.9.1", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.0.tgz", + "integrity": "sha512-vTbzVAjQDzwQdKuvj7qEq6OlAprCjE656khuGQ4QaBLg7abQ9I9ISpmLuc6inWe7zP75AECjqUa4g4sdQvOXhg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, "node_modules/relateurl": { "version": "0.2.7", "dev": true, @@ -42750,7 +43061,9 @@ "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, "license": "MIT", "engines": { @@ -42759,6 +43072,8 @@ }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, "license": "MIT", "dependencies": { @@ -42770,7 +43085,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "dev": true, "license": "MIT", "engines": { @@ -42779,6 +43096,8 @@ }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, "license": "MIT", "engines": { @@ -45023,11 +45342,12 @@ "version": "7.2.0", "license": "MIT", "dependencies": { - "@iobroker/adapter-core": "^3.2.1", + "@iobroker/adapter-core": "^3.2.2", "@iobroker/i18n": "^0.2.2", - "@iobroker/socket-classes": "^1.5.6", + "@iobroker/socket-classes": "^1.6.1", "@iobroker/webserver": "^1.0.6", - "@iobroker/ws-server": "^2.1.2", + "@iobroker/ws": "^2.0.0", + "@iobroker/ws-server": "^3.0.0", "ajv": "^8.17.1", "archiver": "^7.0.1", "axios": "^1.7.7", @@ -45054,9 +45374,9 @@ } }, "packages/admin/node_modules/@iobroker/adapter-core": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@iobroker/adapter-core/-/adapter-core-3.2.1.tgz", - "integrity": "sha512-sUvNZV5sUvg8TcucJ+CLDYgZ0sSivQEmkIaJQHNPU8yUBzOU//ECCc55gz+B2BVvgeGIN3fnmlCS9hOu7yOulw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@iobroker/adapter-core/-/adapter-core-3.2.2.tgz", + "integrity": "sha512-Cuiga42WRkJ/NduyrIGgSVWpLgD6ihIflIvZiWVThwgWfDyI+Okgw3snVSlf/p4ki6BAr3MH6Dfa0qPySCGWvQ==", "license": "MIT", "engines": { "node": ">=16" @@ -45102,6 +45422,15 @@ "node": ">=14.18.0 < 15 || >= 16.0.0" } }, + "packages/admin/node_modules/@iobroker/ws-server": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@iobroker/ws-server/-/ws-server-3.0.0.tgz", + "integrity": "sha512-a36ohiSLYwFRdFVfR7bEY39J60OqZocatljEGFSrTWjxWTv4aCNHncax/FOiuhpyeWSZPvi4qShYojUiEnIyyA==", + "license": "MIT", + "dependencies": { + "ws": "^8.18.0" + } + }, "packages/admin/node_modules/ajv": { "version": "8.17.1", "license": "MIT", @@ -45116,15 +45445,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "packages/admin/node_modules/axios": { - "version": "1.7.7", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, "packages/admin/node_modules/body-parser": { "version": "1.20.3", "license": "MIT", @@ -45345,7 +45665,7 @@ "version": "7.2.0", "license": "MIT", "dependencies": { - "@iobroker/adapter-react-v5": "^7.2.1", + "@iobroker/adapter-react-v5": "^7.2.3", "@iobroker/json-config": "file:../jsonConfig" } }, @@ -45353,7 +45673,7 @@ "name": "@iobroker/json-config", "version": "7.2.0", "dependencies": { - "@iobroker/adapter-react-v5": "^7.2.1", + "@iobroker/adapter-react-v5": "^7.2.3", "crypto-js": "^4.2.0", "react-ace": "^12.0.0" } diff --git a/package.json b/package.json index 5d0b87115..3b00d4aea 100644 --- a/package.json +++ b/package.json @@ -14,15 +14,15 @@ "@alcalzone/release-script-plugin-iobroker": "^3.7.2", "@alcalzone/release-script-plugin-lerna": "^3.7.0", "@alcalzone/release-script-plugin-license": "^3.7.0", - "@babel/core": "^7.25.2", + "@babel/core": "^7.25.7", "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-decorators": "^7.24.7", + "@babel/plugin-proposal-decorators": "^7.25.7", "@babel/plugin-proposal-private-property-in-object": "^7.21.11", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/plugin-transform-runtime": "^7.25.4", - "@babel/preset-env": "^7.25.4", - "@babel/preset-flow": "^7.24.7", - "@babel/preset-react": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.25.7", + "@babel/plugin-transform-runtime": "^7.25.7", + "@babel/preset-env": "^7.25.7", + "@babel/preset-flow": "^7.25.7", + "@babel/preset-react": "^7.25.7", "@craco/craco": "^7.1.0", "@devbookhq/splitter": "^1.4.2", "@dilesoft/vite-plugin-federation-dynamic": "^1.1.9", @@ -30,18 +30,18 @@ "@fnando/sparkline": "^0.3.10", "@foxriver76/iob-component-lib": "^0.1.6", "@honkhonk/vite-plugin-svgr": "^1.1.0", - "@iobroker/adapter-react-v5": "^7.2.1", + "@iobroker/adapter-react-v5": "^7.2.3", "@iobroker/admin-component-easy-access": "^1.0.1", - "@iobroker/build-tools": "^1.1.0", + "@iobroker/build-tools": "^2.0.5", "@iobroker/dm-utils": "^0.5.0", "@iobroker/eslint-config": "^0.1.6", "@iobroker/js-controller-common-db": "^6.0.12-alpha.0-20240913-9a3639aed", "@iobroker/legacy-testing": "^1.0.13", - "@iobroker/socket-client": "^3.1.0", + "@iobroker/socket-client": "^3.1.1", "@iobroker/testing": "^5.0.0", "@iobroker/types": "^7.0.0-alpha.1-20241001-61327866b", - "@mui/icons-material": "^6.1.1", - "@mui/material": "^6.1.1", + "@mui/icons-material": "^6.1.2", + "@mui/material": "^6.1.2", "@mui/x-data-grid": "^7.18.0", "@mui/x-date-pickers": "^7.18.0", "@originjs/vite-plugin-commonjs": "^1.0.3", @@ -62,12 +62,12 @@ "@types/express-session": "^1.18.0", "@types/leaflet": "^1.9.12", "@types/less": "^3.0.6", - "@types/lodash": "^4.17.9", + "@types/lodash": "^4.17.10", "@types/mocha": "^10.0.8", "@types/node": "^22.7.4", "@types/passport": "^1.0.16", "@types/passport-local": "^1.0.38", - "@types/react": "^18.3.10", + "@types/react": "^18.3.11", "@types/react-color": "^3.0.12", "@types/react-dom": "^18.3.0", "@types/validator": "^13.12.2", @@ -85,7 +85,7 @@ "date-fns": "^4.1.0", "echarts": "^5.5.1", "echarts-for-react": "^3.0.2", - "globals": "^15.9.0", + "globals": "^15.10.0", "i": "^0.3.7", "ipaddr.js": "^2.2.0", "json5": "^2.2.3", @@ -99,7 +99,7 @@ "ol": "^10.2.1", "prettier": "^3.3.3", "prop-types": "^15.8.1", - "puppeteer": "^23.4.1", + "puppeteer": "^23.5.0", "react": "^18.3.1", "react-ace": "^12.0.0", "react-color": "^2.19.3", @@ -110,7 +110,7 @@ "react-dnd-preview": "^8.0.3", "react-dnd-touch-backend": "^16.0.1", "react-dom": "^18.3.1", - "react-dropzone": "^14.2.3", + "react-dropzone": "^14.2.9", "react-icons": "^5.3.0", "react-inlinesvg": "^4.1.3", "react-leaflet": "^4.2.1", @@ -128,10 +128,10 @@ "typescript": "^5.6.2" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "19.8.2", - "@nx/nx-darwin-x64": "19.8.2", - "@nx/nx-linux-x64-gnu": "19.8.2", - "@nx/nx-win32-x64-msvc": "19.8.2" + "@nx/nx-darwin-arm64": "19.8.3", + "@nx/nx-darwin-x64": "19.8.3", + "@nx/nx-linux-x64-gnu": "19.8.3", + "@nx/nx-win32-x64-msvc": "19.8.3" }, "overrides": { "react-sortable-hoc": { @@ -142,10 +142,10 @@ "string-width": "4.2.3", "strip-ansi": "6.0.1", "wrap-ansi": "7.0.0", - "@nx/nx-darwin-arm64": "19.8.2", - "@nx/nx-darwin-x64": "19.8.2", - "@nx/nx-linux-x64-gnu": "19.8.2", - "@nx/nx-win32-x64-msvc": "19.8.2" + "@nx/nx-darwin-arm64": "19.8.3", + "@nx/nx-darwin-x64": "19.8.3", + "@nx/nx-linux-x64-gnu": "19.8.3", + "@nx/nx-win32-x64-msvc": "19.8.3" } }, "scripts": { diff --git a/packages/admin/package.json b/packages/admin/package.json index ed82feccf..df4ff8f33 100644 --- a/packages/admin/package.json +++ b/packages/admin/package.json @@ -23,11 +23,12 @@ "setup" ], "dependencies": { - "@iobroker/adapter-core": "^3.2.1", + "@iobroker/adapter-core": "^3.2.2", "@iobroker/i18n": "^0.2.2", - "@iobroker/socket-classes": "^1.5.6", + "@iobroker/socket-classes": "^1.6.1", "@iobroker/webserver": "^1.0.6", - "@iobroker/ws-server": "^2.1.2", + "@iobroker/ws": "^2.0.0", + "@iobroker/ws-server": "^3.0.0", "ajv": "^8.17.1", "archiver": "^7.0.1", "axios": "^1.7.7", diff --git a/packages/admin/src-admin/package.json b/packages/admin/src-admin/package.json index 815f6c1ba..5c859cdee 100644 --- a/packages/admin/src-admin/package.json +++ b/packages/admin/src-admin/package.json @@ -40,5 +40,5 @@ } ] ], - "version": "7.1.5" -} + "version": "7.2.0" +} \ No newline at end of file diff --git a/packages/admin/src-admin/public/lib/js/socket.io.js b/packages/admin/src-admin/public/lib/js/socket.io.js index 4ddec5993..50b80ebd7 100644 --- a/packages/admin/src-admin/public/lib/js/socket.io.js +++ b/packages/admin/src-admin/public/lib/js/socket.io.js @@ -1,441 +1 @@ -/*! - * ioBroker WebSockets - * Copyright 2020-2022, bluefox - * Released under the MIT License. - * v 1.1.2 (2022_08_18) - */ -/* jshint -W097 */ -/* jshint strict: false */ -/* jslint node: true */ -/* jshint -W061 */ -'use strict'; - -const MESSAGE_TYPES = { - MESSAGE: 0, - PING: 1, - PONG: 2, - CALLBACK: 3 -}; - -const DEBUG = true; - -const ERRORS = { - 1000: 'CLOSE_NORMAL', // Successful operation / regular socket shutdown - 1001: 'CLOSE_GOING_AWAY', // Client is leaving (browser tab closing) - 1002: 'CLOSE_PROTOCOL_ERROR', // Endpoint received a malformed frame - 1003: 'CLOSE_UNSUPPORTED', // Endpoint received an unsupported frame (e.g. binary-only endpoint received text frame) - 1005: 'CLOSED_NO_STATUS', // Expected close status, received none - 1006: 'CLOSE_ABNORMAL', // No close code frame has been received - 1007: 'Unsupported payload', // Endpoint received inconsistent message (e.g. malformed UTF-8) - 1008: 'Policy violation', // Generic code used for situations other than 1003 and 1009 - 1009: 'CLOSE_TOO_LARGE', // Endpoint won't process large frame - 1010: 'Mandatory extension', // Client wanted an extension which server did not negotiate - 1011: 'Server error', // Internal server error while operating - 1012: 'Service restart', // Server/service is restarting - 1013: 'Try again later', // Temporary server condition forced blocking client's request - 1014: 'Bad gateway Server', // acting as gateway received an invalid response - 1015: 'TLS handshake fail' // Transport Layer Security handshake failure -}; - -// every time create a new socket -function connect(url, options) { - const socket = new SocketClient(); - socket.connect(url, options); - return socket; -} - -// possible events: connect, disconnect, reconnect, error, connect_error -function SocketClient () { - const handlers = {}; - let wasConnected = false; - let connectTimer = null; - let connectingTimer = null; - let connectionCount = 0; - let callbacks = []; - this.pending = []; // pending requests till connection established - let id = 0; - let lastPong; - let socket; - let url; - let options; - let pingInterval; - let sessionID; - let authTimeout = null; - - this.log = { - debug: text => DEBUG && console.log(`[${new Date().toISOString()}] ${text}`), - warn: text => console.warn(`[${new Date().toISOString()}] ${text}`), - error: text => console.error(`[${new Date().toISOString()}] ${text}`) - }; - - this.getQuery = _url => { - const query = _url.split('?')[1] || ''; - const parts = query.split('&'); - const result = {}; - for (let p = 0; p < parts.length; p++) { - const parts1 = parts[p].split('='); - result[parts1[0]] = parts1[1]; - } - return result; - }; - - this.connect = (_url, _options) => { - this.log.debug('Try to connect'); - - // remove hash - if (_url) { - _url = _url.split('#')[0]; - } - - id = 0; - connectTimer && clearInterval(connectTimer); - connectTimer = null; - - // eslint-disable-next-line no-undef - url = url || _url || window.location.href; - options = options || JSON.parse(JSON.stringify(_options || {})); - - options.pongTimeout = parseInt(options.pongTimeout, 10) || 60000; // Timeout for answer for ping (pong) - options.pingInterval = parseInt(options.pingInterval, 10) || 5000; // Ping interval - options.connectTimeout = parseInt(options.connectTimeout, 10) || 3000; // connection request timeout - options.authTimeout = parseInt(options.authTimeout, 10) || 3000; // Authentication timeout - options.connectInterval = parseInt(options.connectInterval, 10) || 1000; // Interval between connection attempts - options.connectMaxAttempt = parseInt(options.connectMaxAttempt, 10) || 5; // Every connection attempt the interval increasing at options.connectInterval till max this number - - sessionID = Date.now(); - try { - if (url === '/') { - let parts = window.location.pathname.split('/'); - // remove filename - if (window.location.pathname.endsWith('.html') || window.location.pathname.endsWith('.htm')) { - parts.pop(); - } - - // eslint-disable-next-line no-undef - url = window.location.protocol + '//' + window.location.host + '/' + parts.join('/'); - } - - // extract all query attributes - const query = this.getQuery(url); - if (query.sid) { - delete query.sid; - } - - if (query.hasOwnProperty('')) { - delete query['']; - } - - let u = url.replace(/^http/, 'ws').split('?')[0] + '?sid=' + sessionID; - - // Apply query to new url - if (Object.keys(query).length) { - u += '&' + Object.keys(query).map(attr => query[attr] === undefined ? attr : attr + '=' + query[attr]).join('&'); - } - - if (options && options.name && !query.name) { - u += '&name=' + encodeURIComponent(options.name); - } - // "ws://www.example.com/socketserver" - // eslint-disable-next-line no-undef - socket = new WebSocket(u); - } catch (error) { - handlers.error && handlers.error.forEach(cb => cb.call(this, error)); - return this.close(); - } - - connectingTimer = setTimeout(() => { - connectingTimer = null; - this.log.warn('No READY flag received in 3 seconds. Re-init'); - this.close(); // re-init connection, because no ___ready___ received in 2000 ms - }, options.connectTimeout); - - socket.onopen = ()/*event*/ => { - lastPong = Date.now(); - connectionCount = 0; - - pingInterval = setInterval(() => { - if (Date.now() - lastPong > options.pingInterval - 10) { - try { - socket.send(JSON.stringify([MESSAGE_TYPES.PING])); - } catch (e) { - this.log.warn('Cannot send ping. Close connection: ' + e); - this.close(); - return this._garbageCollect(); - } - } - if (Date.now() - lastPong > options.pongTimeout) { - this.close(); - } - this._garbageCollect(); - }, options.pingInterval); - }; - - socket.onclose = event => { - if (event.code === 3001) { - this.log.warn('ws closed'); - } else { - this.log.error('ws connection error: ' + ERRORS[event.code]); - } - this.close(); - }; - - socket.onerror = error => { - if (this.connected) { - if (socket.readyState === 1) { - this.log.error('ws normal error: ' + error.type); - } - handlers.error && handlers.error.forEach(cb => cb.call(this, ERRORS[error.code] || 'UNKNOWN')); - } - this.close(); - }; - - socket.onmessage = message => { - lastPong = Date.now(); - if (!message || !message.data || typeof message.data !== 'string') { - return console.error('Received invalid message: ' + JSON.stringify(message)); - } - let data; - try { - data = JSON.parse(message.data); - } catch (e) { - return console.error('Received invalid message: ' + JSON.stringify(message.data)); - } - - const [type, id, name, args] = data; - - if (authTimeout) { - clearTimeout(authTimeout); - authTimeout = null; - } - - if (type === MESSAGE_TYPES.CALLBACK) { - this.findAnswer(id, args); - } else - if (type === MESSAGE_TYPES.MESSAGE) { - if (name === '___ready___') { - this.connected = true; - - if (wasConnected) { - handlers.reconnect && handlers.reconnect.forEach(cb => cb.call(this, true)); - } else { - handlers.connect && handlers.connect.forEach(cb => cb.call(this, true)); - wasConnected = true; - } - - connectingTimer && clearTimeout(connectingTimer); - connectingTimer = null; - - // resend all pending requests - if (this.pending.length) { - this.pending.forEach(([name, arg1, arg2, arg3, arg4, arg5]) => - this.emit(name, arg1, arg2, arg3, arg4, arg5)); - - this.pending = []; - } - } else if (args) { - handlers[name] && handlers[name].forEach(cb => cb.call(this, args[0], args[1], args[2], args[3], args[4])); - } else { - handlers[name] && handlers[name].forEach(cb => cb.call(this)); - } - } else if (type === MESSAGE_TYPES.PING) { - if (socket) { - socket.send(JSON.stringify([MESSAGE_TYPES.PONG])); - } else { - this.log.warn('Cannot do pong: connection closed'); - } - } else if (type === MESSAGE_TYPES.PONG) { - // lastPong saved - } else { - this.log.warn('Received unknown message type: ' + type); - } - }; - - return this; - }; - - this._garbageCollect = () => { - const now = Date.now(); - let empty = 0; - if (!DEBUG) { - for (let i = 0; i < callbacks.length; i++) { - if (callbacks[i]) { - if (callbacks[i].ts > now) { - const cb = callbacks[i].cb; - setTimeout(cb, 0, 'timeout'); - callbacks[i] = null; - empty++; - } - } else { - empty++; - } - } - } - - // remove nulls - if (empty > callbacks.length / 2) { - const newCallback = []; - for (let i = 0; i < callbacks.length; i++) { - callbacks[i] && newCallback.push(callbacks[i]); - } - callbacks = newCallback; - } - }; - - this.withCallback = (name, id, args, cb) => { - if (name === 'authenticate') { - authTimeout = setTimeout(() => { - authTimeout = null; - if (this.connected) { - this.log.debug('Authenticate timeout'); - handlers.error && handlers.error.forEach(cb => cb.call(this, 'Authenticate timeout')); - } - this.close(); - }, options.authTimeout); - } - callbacks.push({id, cb, ts: DEBUG ? 0 : Date.now() + 30000}); - socket.send(JSON.stringify([MESSAGE_TYPES.CALLBACK, id, name, args])); - }; - - this.findAnswer = (id, args) => { - for (let i = 0; i < callbacks.length; i++) { - if (callbacks[i] && callbacks[i].id === id) { - const cb = callbacks[i].cb; - cb.apply(null, args); - callbacks[i] = null; - } - } - }; - - this.emit = (name, arg1, arg2, arg3, arg4, arg5) => { - if (!socket || !this.connected) { - if (!wasConnected) { - // cache all calls till connected - this.pending.push([name, arg1, arg2, arg3, arg4, arg5]); - } else { - this.log.warn('Not connected'); - } - return; - } - - id++; - - if (name === 'writeFile' && typeof arg3 !== 'string' && arg3) { - // Arguments: arg1, arg2, arg3, arg4 - // Arguments: _adapter, filename, data, callback - let binary = ''; - const bytes = new Uint8Array(arg3); - const len = bytes.byteLength; - for (let i = 0; i < len; i++) { - binary += String.fromCharCode(bytes[i]); - } - arg3 = window.btoa(binary); - } - - try { - if (typeof arg5 === 'function') { - this.withCallback(name, id, [arg1, arg2, arg3, arg4], arg5); - } else if (typeof arg4 === 'function') { - this.withCallback(name, id, [arg1, arg2, arg3], arg4); - } else if (typeof arg3 === 'function') { - this.withCallback(name, id, [arg1, arg2], arg3); - } else if (typeof arg2 === 'function') { - this.withCallback(name, id, [arg1], arg2); - } else if (typeof arg1 === 'function') { - this.withCallback(name, id, [], arg1); - } else - if (arg1 === undefined && arg2 === undefined && arg3 === undefined && arg4 === undefined && arg5 === undefined) { - socket.send(JSON.stringify([MESSAGE_TYPES.MESSAGE, id, name])); - } else if (arg2 === undefined && arg3 === undefined && arg4 === undefined && arg5 === undefined) { - socket.send(JSON.stringify([MESSAGE_TYPES.MESSAGE, id, name, [arg1]])); - } else if (arg3 === undefined && arg4 === undefined && arg5 === undefined) { - socket.send(JSON.stringify([MESSAGE_TYPES.MESSAGE, id, name, [arg1, arg2]])); - } else if (arg4 === undefined && arg5 === undefined) { - socket.send(JSON.stringify([MESSAGE_TYPES.MESSAGE, id, name, [arg1, arg2, arg3]])); - } else if (arg5 === undefined) { - socket.send(JSON.stringify([MESSAGE_TYPES.MESSAGE, id, name, [arg1, arg2, arg3, arg4]])); - } else { - socket.send(JSON.stringify([MESSAGE_TYPES.MESSAGE, id, name, [arg1, arg2, arg3, arg4, arg5]])); - } - } catch (e) { - console.error('Cannot send: ' + e); - this.close(); - } - }; - - this.on = (name, cb) => { - if (cb) { - handlers[name] = handlers[name] || []; - handlers[name].push(cb); - } - }; - - this.off = (name, cb) => { - if (handlers[name]) { - const pos = handlers[name].indexOf(cb); - if (pos !== -1) { - handlers[name].splice(pos, 1); - if (!handlers[name].length) { - delete handlers[name]; - } - } - } - }; - - this.close = function () { - pingInterval && clearInterval(pingInterval); - pingInterval = null; - - authTimeout && clearTimeout(authTimeout); - authTimeout = null; - - connectingTimer && clearTimeout(connectingTimer); - connectingTimer = null; - - if (socket) { - try { - socket.close(); - } catch (e) { - // ignore - } - socket = null; - } - - if (this.connected) { - handlers.disconnect && handlers.disconnect.forEach(cb => cb.call(this)); - this.connected = false; - } - - callbacks = []; - - this._reconnect(); - return this; - }; - - this.destroy = function () { - this.close(); - connectTimer && clearTimeout(connectTimer); - connectTimer = null; - }; - - this._reconnect = function () { - if (!connectTimer) { - this.log.debug('Start reconnect ' + connectionCount); - connectTimer = setTimeout(() => { - connectTimer = null; - if (connectionCount < options.connectMaxAttempt) { - connectionCount++; - } - this.connect(url, options); - }, connectionCount * options.connectInterval); - } else { - this.log.debug('Reconnect is already running ' + connectionCount); - } - }; - - this.connected = false; // simulate socket.io interface -} - -// eslint-disable-next-line no-undef -window.io = { - connect: connect -}; +"use strict";const MESSAGE_TYPES={MESSAGE:0,PING:1,PONG:2,CALLBACK:3},DEBUG=!0,ERRORS={1e3:"CLOSE_NORMAL",1001:"CLOSE_GOING_AWAY",1002:"CLOSE_PROTOCOL_ERROR",1003:"CLOSE_UNSUPPORTED",1005:"CLOSED_NO_STATUS",1006:"CLOSE_ABNORMAL",1007:"Unsupported payload",1008:"Policy violation",1009:"CLOSE_TOO_LARGE",1010:"Mandatory extension",1011:"Server error",1012:"Service restart",1013:"Try again later",1014:"Bad gateway\tServer",1015:"TLS handshake fail"};class SocketClient{connectHandlers=[];reconnectHandlers=[];disconnectHandlers=[];errorHandlers=[];handlers={};wasConnected=!1;connectTimer=null;connectingTimer=null;connectionCount=0;callbacks=[];pending=[];id=0;lastPong=0;socket=null;url="";options=null;pingInterval=null;sessionID=0;authTimeout=null;connected=!1;log;constructor(){this.log={debug:text=>console.log(`[${(new Date).toISOString()}] ${text}`),warn:text=>console.warn(`[${(new Date).toISOString()}] ${text}`),error:text=>console.error(`[${(new Date).toISOString()}] ${text}`)}}static getQuery(_url){const parts=(_url.split("?")[1]||"").split("&"),result={};for(let p=0;pvoid 0===query[attr]?attr:`${attr}=${query[attr]}`)).join("&")}`),this.options?.name&&!query.name&&(u+=`&name=${encodeURIComponent(this.options.name)}`),this.socket=new WebSocket(u)}catch(error){return this.handlers.error?.forEach((cb=>cb.call(this,error))),this.close(),this}return this.connectingTimer=setTimeout((()=>{this.connectingTimer=null,this.log.warn("No READY flag received in 3 seconds. Re-init"),this.close()}),this.options.connectTimeout),this.socket.onopen=()=>{this.lastPong=Date.now(),this.connectionCount=0,this.pingInterval=setInterval((()=>{if(!this.options)throw new Error("No options provided!");if(Date.now()-this.lastPong>(this.options?.pingInterval||5e3)-10)try{this.socket?.send(JSON.stringify([MESSAGE_TYPES.PING]))}catch(e){return this.log.warn(`Cannot send ping. Close connection: ${e}`),this.close(),void this._garbageCollect()}Date.now()-this.lastPong>(this.options?.pongTimeout||6e4)&&this.close(),this._garbageCollect()}),this.options?.pingInterval||5e3)},this.socket.onclose=event=>{3001===event.code?this.log.warn("ws closed"):this.log.error(`ws connection error: ${ERRORS[event.code]}`),this.close()},this.socket.onerror=error=>{this.connected&&this.socket&&(1===this.socket.readyState&&this.log.error(`ws normal error: ${error.type}`),this.errorHandlers.forEach((cb=>cb.call(this,ERRORS[error.code]||"UNKNOWN")))),this.close()},this.socket.onmessage=message=>{if(this.lastPong=Date.now(),!message?.data||"string"!=typeof message.data)return void console.error(`Received invalid message: ${JSON.stringify(message)}`);let data;try{data=JSON.parse(message.data)}catch(e){return void console.error(`Received invalid message: ${JSON.stringify(message.data)}`)}const type=data[0],id=data[1],name=data[2],args=data[3];this.authTimeout&&(clearTimeout(this.authTimeout),this.authTimeout=null),type===MESSAGE_TYPES.CALLBACK?this.findAnswer(id,args):type===MESSAGE_TYPES.MESSAGE?"___ready___"===name?(this.connected=!0,this.wasConnected?this.reconnectHandlers.forEach((cb=>cb.call(this,!0))):(this.connectHandlers.forEach((cb=>cb.call(this,!0))),this.wasConnected=!0),this.connectingTimer&&clearTimeout(this.connectingTimer),this.connectingTimer=null,this.pending.length&&(this.pending.forEach((({name:name,args:args})=>this.emit(name,...args))),this.pending=[])):args?this.handlers[name]?.forEach((cb=>cb.apply(this,args))):this.handlers[name]?.forEach((cb=>cb.call(this))):type===MESSAGE_TYPES.PING?this.socket?this.socket.send(JSON.stringify([MESSAGE_TYPES.PONG])):this.log.warn("Cannot do pong: connection closed"):type===MESSAGE_TYPES.PONG||this.log.warn(`Received unknown message type: ${type}`)},this}_garbageCollect(){Date.now();let empty=0;if(empty>this.callbacks.length/2){const newCallback=[];for(let i=0;i{this.authTimeout=null,this.connected&&(this.log.debug("Authenticate timeout"),this.handlers.error?.forEach((cb=>cb.call(this,"Authenticate timeout")))),this.close()}),this.options?.authTimeout||3e3)),this.callbacks.push({id:id,cb:cb,ts:0}),this.socket?.send(JSON.stringify([MESSAGE_TYPES.CALLBACK,id,name,args]))}findAnswer(id,args){for(let i=0;i{if(this.socket&&this.connected){if(this.id++,"writeFile"===name&&args&&"string"!=typeof args[2]&&args[2]){let binary="";const bytes=new Uint8Array(args[2]),len=bytes.byteLength;for(let i=0;icb.call(this))),this.connected=!1),this.callbacks=[],this._reconnect(),this}disconnect=this.close;destroy(){this.close(),this.connectTimer&&clearTimeout(this.connectTimer),this.connectTimer=null}_reconnect(){this.connectTimer?this.log.debug(`Reconnect is already running ${this.connectionCount}`):(this.log.debug(`Start reconnect ${this.connectionCount}`),this.connectTimer=setTimeout((()=>{if(!this.options)throw new Error("No options provided!");this.connectTimer=null,this.connectionCount<(this.options?.connectMaxAttempt||5)&&this.connectionCount++,this.connect(this.url,this.options)}),this.connectionCount*(this.options?.connectInterval||1e3)))}}function connect(url,options){const socketClient=new SocketClient;return socketClient.connect(url,options),socketClient}window.io={connect:connect}; \ No newline at end of file diff --git a/packages/admin/src-admin/public/lib/js/socket.io.js.map b/packages/admin/src-admin/public/lib/js/socket.io.js.map new file mode 100644 index 000000000..0268ca630 --- /dev/null +++ b/packages/admin/src-admin/public/lib/js/socket.io.js.map @@ -0,0 +1 @@ +{"version":3,"names":["MESSAGE_TYPES","MESSAGE","PING","PONG","CALLBACK","DEBUG","ERRORS","SocketClient","connectHandlers","reconnectHandlers","disconnectHandlers","errorHandlers","handlers","wasConnected","connectTimer","connectingTimer","connectionCount","callbacks","pending","id","lastPong","socket","url","options","pingInterval","sessionID","authTimeout","connected","log","constructor","this","debug","text","console","Date","toISOString","warn","error","getQuery","_url","parts","split","result","p","length","decodeURIComponent","connect","clearInterval","window","location","href","JSON","parse","stringify","Error","pongTimeout","parseInt","connectTimeout","connectInterval","connectMaxAttempt","now","pathname","endsWith","pop","protocol","host","join","query","sid","hasOwnProperty","u","replace","Object","keys","map","attr","undefined","name","encodeURIComponent","WebSocket","forEach","cb","call","close","setTimeout","onopen","setInterval","send","e","_garbageCollect","onclose","event","code","onerror","readyState","type","onmessage","message","data","args","clearTimeout","findAnswer","emit","apply","empty","newCallback","i","push","withCallback","ts","callback","binary","bytes","Uint8Array","len","byteLength","String","fromCharCode","btoa","_args","eventHandler","on","off","pos","indexOf","splice","_reconnect","disconnect","destroy","socketClient","io"],"sources":["../../socket.io.ts"],"sourcesContent":["/*!\n * ioBroker WebSockets\n * Copyright 2020-2024, bluefox \n * Released under the MIT License.\n * v 2.0.0 (2024_10_02)\n */\ninterface ConnectOptions {\n /** Connection name, so the backend knows who wants to connect. Optional */\n name?: string;\n /** Timeout for answer for ping (pong) */\n pongTimeout?: number;\n /** Ping interval */\n pingInterval?: number;\n /** connection request timeout */\n connectTimeout?: number;\n /** Authentication timeout */\n authTimeout?: number;\n /** Interval between connection attempts */\n connectInterval?: number;\n /** Every connection attempt the interval increasing at options.connectInterval till max this number */\n connectMaxAttempt?: number;\n}\n\nconst MESSAGE_TYPES: Record = {\n MESSAGE: 0,\n PING: 1,\n PONG: 2,\n CALLBACK: 3,\n};\n\nconst DEBUG = true;\n\nconst ERRORS: Record = {\n 1000: 'CLOSE_NORMAL', // Successful operation / regular socket shutdown\n 1001: 'CLOSE_GOING_AWAY', // Client is leaving (browser tab closing)\n 1002: 'CLOSE_PROTOCOL_ERROR', // Endpoint received a malformed frame\n 1003: 'CLOSE_UNSUPPORTED', // Endpoint received an unsupported frame (e.g., binary-only endpoint received text frame)\n 1005: 'CLOSED_NO_STATUS', // Expected close status, received none\n 1006: 'CLOSE_ABNORMAL', // No close code frame has been received\n 1007: 'Unsupported payload', // Endpoint received an inconsistent message (e.g., malformed UTF-8)\n 1008: 'Policy violation', // Generic code used for situations other than 1003 and 1009\n 1009: 'CLOSE_TOO_LARGE', // Endpoint won't process large frame\n 1010: 'Mandatory extension', // Client wanted an extension which server did not negotiate\n 1011: 'Server error', // Internal server error while operating\n 1012: 'Service restart', // Server/service is restarting\n 1013: 'Try again later', // Temporary server condition forced blocking client's request\n 1014: 'Bad gateway\tServer', // acting as gateway received an invalid response\n 1015: 'TLS handshake fail', // Transport Layer Security handshake failure\n};\n\ntype SocketEventHandler = (...args: any[]) => void;\ntype SocketConnectionHandler = (connected: boolean) => void;\ntype SocketDisconnectionHandler = () => void;\ntype SocketErrorHandler = (err: string) => void;\n\n// possible events: connect, disconnect, reconnect, error, connect_error\nclass SocketClient {\n private readonly connectHandlers: SocketConnectionHandler[] = [];\n private readonly reconnectHandlers: SocketConnectionHandler[] = [];\n private readonly disconnectHandlers: SocketDisconnectionHandler[] = [];\n private readonly errorHandlers: SocketErrorHandler[] = [];\n\n private readonly handlers: {\n [event: string]: SocketEventHandler[];\n } = {};\n private wasConnected = false;\n private connectTimer: ReturnType | null = null;\n private connectingTimer: ReturnType | null = null;\n private connectionCount = 0;\n private callbacks: ({ ts: number; cb: SocketEventHandler; id: number } | null)[] = [];\n private pending: { name: string; args: any[] }[] = []; // pending requests till connection established\n private id = 0;\n private lastPong: number = 0;\n private socket: WebSocket | null = null;\n private url: string = '';\n private options: ConnectOptions | null = null;\n private pingInterval: ReturnType | null = null;\n private sessionID = 0;\n private authTimeout: ReturnType | null = null;\n\n public connected = false;\n\n private readonly log: {\n debug: (text: string) => void;\n warn: (text: string) => void;\n error: (text: string) => void;\n };\n\n constructor() {\n this.log = {\n debug: (text: string) => DEBUG && console.log(`[${new Date().toISOString()}] ${text}`),\n warn: (text: string) => console.warn(`[${new Date().toISOString()}] ${text}`),\n error: (text: string) => console.error(`[${new Date().toISOString()}] ${text}`),\n };\n }\n\n private static getQuery(_url: string): Record {\n const query = _url.split('?')[1] || '';\n const parts = query.split('&');\n const result: Record = {};\n for (let p = 0; p < parts.length; p++) {\n const parts1 = parts[p].split('=');\n result[parts1[0]] = decodeURIComponent(parts[1]);\n }\n return result;\n }\n\n connect(url?: string, options?: ConnectOptions): SocketClient {\n this.log.debug('Try to connect');\n\n // remove hash\n if (url) {\n url = url.split('#')[0];\n }\n\n this.id = 0;\n this.connectTimer && clearInterval(this.connectTimer);\n this.connectTimer = null;\n\n // eslint-disable-next-line no-undef\n this.url = this.url || url || window.location.href;\n this.options = this.options || JSON.parse(JSON.stringify(options || {}));\n if (!this.options) {\n throw new Error('No options provided!');\n }\n\n this.options.pongTimeout = parseInt(this.options.pongTimeout as unknown as string, 10) || 60000; // Timeout for answer for ping (pong)\n this.options.pingInterval = parseInt(this.options.pingInterval as unknown as string, 10) || 5000; // Ping interval\n this.options.connectTimeout = parseInt(this.options.connectTimeout as unknown as string, 10) || 3000; // connection request timeout\n this.options.authTimeout = parseInt(this.options.authTimeout as unknown as string, 10) || 3000; // Authentication timeout\n this.options.connectInterval = parseInt(this.options.connectInterval as unknown as string, 10) || 1000; // Interval between connection attempts\n this.options.connectMaxAttempt = parseInt(this.options.connectMaxAttempt as unknown as string, 10) || 5; // Every connection attempt the interval increasing at options.connectInterval till max this number\n\n this.sessionID = Date.now();\n try {\n if (this.url === '/') {\n let parts = window.location.pathname.split('/');\n // remove filename\n if (window.location.pathname.endsWith('.html') || window.location.pathname.endsWith('.htm')) {\n parts.pop();\n }\n\n // eslint-disable-next-line no-undef\n this.url = `${window.location.protocol}//${window.location.host}/${parts.join('/')}`;\n }\n\n // extract all query attributes\n const query = SocketClient.getQuery(this.url);\n if (query.sid) {\n delete query.sid;\n }\n\n if (query.hasOwnProperty('')) {\n delete query[''];\n }\n\n let u: string = `${this.url.replace(/^http/, 'ws').split('?')[0]}?sid=${this.sessionID}`;\n\n // Apply a query to new url\n if (Object.keys(query).length) {\n u += `&${Object.keys(query)\n .map(attr => (query[attr] === undefined ? attr : `${attr}=${query[attr]}`))\n .join('&')}`;\n }\n\n if (this.options?.name && !query.name) {\n u += `&name=${encodeURIComponent(this.options.name)}`;\n }\n // \"ws://www.example.com/socketserver\"\n // eslint-disable-next-line no-undef\n this.socket = new WebSocket(u);\n } catch (error) {\n this.handlers.error?.forEach(cb => cb.call(this, error));\n this.close();\n return this;\n }\n\n this.connectingTimer = setTimeout(() => {\n this.connectingTimer = null;\n this.log.warn('No READY flag received in 3 seconds. Re-init');\n this.close(); // re-init connection, because no ___ready___ received in 2000 ms\n }, this.options.connectTimeout);\n\n this.socket.onopen = (): void /*event*/ => {\n this.lastPong = Date.now();\n this.connectionCount = 0;\n\n this.pingInterval = setInterval((): void => {\n if (!this.options) {\n throw new Error('No options provided!');\n }\n\n if (Date.now() - this.lastPong > (this.options?.pingInterval || 5000) - 10) {\n try {\n this.socket?.send(JSON.stringify([MESSAGE_TYPES.PING]));\n } catch (e) {\n this.log.warn(`Cannot send ping. Close connection: ${e}`);\n this.close();\n this._garbageCollect();\n return;\n }\n }\n if (Date.now() - this.lastPong > (this.options?.pongTimeout || 60000)) {\n this.close();\n }\n this._garbageCollect();\n }, this.options?.pingInterval || 5000);\n };\n\n this.socket.onclose = (event: CloseEvent): void => {\n if (event.code === 3001) {\n this.log.warn('ws closed');\n } else {\n this.log.error(`ws connection error: ${ERRORS[event.code]}`);\n }\n this.close();\n };\n\n // @ts-expect-error invalid typing\n this.socket.onerror = (error: CloseEvent): void => {\n if (this.connected && this.socket) {\n if (this.socket.readyState === 1) {\n this.log.error(`ws normal error: ${error.type}`);\n }\n this.errorHandlers.forEach(cb => cb.call(this, ERRORS[error.code] || 'UNKNOWN'));\n }\n this.close();\n };\n\n this.socket.onmessage = (message: MessageEvent): void => {\n this.lastPong = Date.now();\n if (!message?.data || typeof message.data !== 'string') {\n console.error(`Received invalid message: ${JSON.stringify(message)}`);\n return;\n }\n let data;\n try {\n data = JSON.parse(message.data);\n } catch (e) {\n console.error(`Received invalid message: ${JSON.stringify(message.data)}`);\n return;\n }\n\n const type: number = data[0];\n const id: number = data[1];\n const name: string = data[2];\n const args: any[] = data[3];\n\n if (this.authTimeout) {\n clearTimeout(this.authTimeout);\n this.authTimeout = null;\n }\n\n if (type === MESSAGE_TYPES.CALLBACK) {\n this.findAnswer(id, args);\n } else if (type === MESSAGE_TYPES.MESSAGE) {\n if (name === '___ready___') {\n this.connected = true;\n\n if (this.wasConnected) {\n this.reconnectHandlers.forEach(cb => cb.call(this, true));\n } else {\n this.connectHandlers.forEach(cb => cb.call(this, true));\n this.wasConnected = true;\n }\n\n this.connectingTimer && clearTimeout(this.connectingTimer);\n this.connectingTimer = null;\n\n // resend all pending requests\n if (this.pending.length) {\n this.pending.forEach(({ name, args }) => this.emit(name, ...args));\n\n this.pending = [];\n }\n } else if (args) {\n this.handlers[name]?.forEach(cb => cb.apply(this, args));\n } else {\n this.handlers[name]?.forEach(cb => cb.call(this));\n }\n } else if (type === MESSAGE_TYPES.PING) {\n if (this.socket) {\n this.socket.send(JSON.stringify([MESSAGE_TYPES.PONG]));\n } else {\n this.log.warn('Cannot do pong: connection closed');\n }\n } else if (type === MESSAGE_TYPES.PONG) {\n // lastPong saved\n } else {\n this.log.warn(`Received unknown message type: ${type}`);\n }\n };\n\n return this;\n }\n\n private _garbageCollect(): void {\n const now = Date.now();\n let empty = 0;\n if (!DEBUG) {\n for (let i = 0; i < this.callbacks.length; i++) {\n const callback: { ts: number; cb: SocketEventHandler; id: number } | null = this.callbacks[i];\n if (callback) {\n if (callback.ts > now) {\n const cb = callback.cb;\n setTimeout(cb, 0, 'timeout');\n this.callbacks[i] = null;\n empty++;\n } // else callback is still valid\n } else {\n empty++;\n }\n }\n }\n\n // remove nulls\n if (empty > this.callbacks.length / 2) {\n const newCallback = [];\n for (let i = 0; i < this.callbacks.length; i++) {\n this.callbacks[i] && newCallback.push(this.callbacks[i]);\n }\n this.callbacks = newCallback;\n }\n }\n\n private withCallback(name: string, id: number, args: any[], cb: SocketEventHandler): void {\n if (name === 'authenticate') {\n this.authTimeout = setTimeout(() => {\n this.authTimeout = null;\n if (this.connected) {\n this.log.debug('Authenticate timeout');\n this.handlers.error?.forEach(cb => cb.call(this, 'Authenticate timeout'));\n }\n this.close();\n }, this.options?.authTimeout || 3000);\n }\n this.callbacks.push({ id, cb, ts: DEBUG ? 0 : Date.now() + 30000 });\n this.socket?.send(JSON.stringify([MESSAGE_TYPES.CALLBACK, id, name, args]));\n }\n\n private findAnswer(id: number, args: any[]): void {\n for (let i = 0; i < this.callbacks.length; i++) {\n const callback = this.callbacks[i];\n if (callback?.id === id) {\n const cb = callback.cb;\n cb.apply(null, args);\n this.callbacks[i] = null;\n }\n }\n }\n\n emit = (name: string, ...args: any[]): void => {\n if (!this.socket || !this.connected) {\n if (!this.wasConnected) {\n // cache all calls till connected\n this.pending.push({ name, args });\n } else {\n this.log.warn('Not connected');\n }\n return;\n }\n\n this.id++;\n\n if (name === 'writeFile' && args && typeof args[2] !== 'string' && args[2]) {\n // Arguments: arg1, arg2, arg3, arg4\n // Arguments: _adapter, filename, data, callback\n let binary = '';\n const bytes = new Uint8Array(args[2]);\n const len = bytes.byteLength;\n for (let i = 0; i < len; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n args[2] = window.btoa(binary);\n }\n\n try {\n // if the last argument is a function\n if (args && typeof args[args.length - 1] === 'function') {\n const _args = [...args];\n const eventHandler: SocketEventHandler = _args.pop();\n this.withCallback(name, this.id, _args, eventHandler);\n } else if (!args?.length) {\n this.socket.send(JSON.stringify([MESSAGE_TYPES.MESSAGE, this.id, name]));\n } else {\n this.socket.send(JSON.stringify([MESSAGE_TYPES.MESSAGE, this.id, name, args]));\n }\n } catch (e) {\n console.error(`Cannot send: ${e}`);\n this.close();\n }\n };\n\n on(name: string, cb: SocketEventHandler | SocketErrorHandler | SocketDisconnectionHandler | SocketConnectionHandler): void {\n if (cb) {\n if (name === 'connect') {\n this.connectHandlers.push(cb as SocketConnectionHandler);\n } else if (name === 'disconnect') {\n this.disconnectHandlers.push(cb as SocketDisconnectionHandler);\n } else if (name === 'reconnect') {\n this.reconnectHandlers.push(cb as SocketConnectionHandler);\n } else if (name === 'error') {\n this.errorHandlers.push(cb as SocketErrorHandler);\n } else {\n this.handlers[name] = this.handlers[name] || [];\n this.handlers[name].push(cb as SocketEventHandler);\n }\n }\n }\n\n off(name: string, cb: SocketEventHandler | SocketErrorHandler | SocketDisconnectionHandler | SocketConnectionHandler): void {\n if (name === 'connect') {\n const pos = this.connectHandlers.indexOf(cb as SocketConnectionHandler);\n if (pos !== -1) {\n this.connectHandlers.splice(pos, 1);\n }\n } else if (name === 'disconnect') {\n const pos = this.disconnectHandlers.indexOf(cb as SocketDisconnectionHandler);\n if (pos !== -1) {\n this.disconnectHandlers.splice(pos, 1);\n }\n } else if (name === 'reconnect') {\n const pos = this.reconnectHandlers.indexOf(cb as SocketConnectionHandler);\n if (pos !== -1) {\n this.reconnectHandlers.splice(pos, 1);\n }\n } else if (name === 'error') {\n const pos = this.errorHandlers.indexOf(cb as SocketErrorHandler);\n if (pos !== -1) {\n this.errorHandlers.splice(pos, 1);\n }\n } else if (this.handlers[name]) {\n const pos = this.handlers[name].indexOf(cb as SocketEventHandler);\n if (pos !== -1) {\n this.handlers[name].splice(pos, 1);\n if (!this.handlers[name].length) {\n delete this.handlers[name];\n }\n }\n }\n }\n\n close(): SocketClient {\n this.pingInterval && clearInterval(this.pingInterval);\n this.pingInterval = null;\n\n this.authTimeout && clearTimeout(this.authTimeout);\n this.authTimeout = null;\n\n this.connectingTimer && clearTimeout(this.connectingTimer);\n this.connectingTimer = null;\n\n if (this.socket) {\n try {\n this.socket.close();\n } catch (e) {\n // ignore\n }\n this.socket = null;\n }\n\n if (this.connected) {\n this.disconnectHandlers.forEach(cb => cb.call(this));\n this.connected = false;\n }\n\n this.callbacks = [];\n\n this._reconnect();\n\n return this;\n }\n\n // alias for back compatibility\n disconnect = this.close;\n\n destroy(): void {\n this.close();\n this.connectTimer && clearTimeout(this.connectTimer);\n this.connectTimer = null;\n }\n\n private _reconnect(): void {\n if (!this.connectTimer) {\n this.log.debug(`Start reconnect ${this.connectionCount}`);\n this.connectTimer = setTimeout(() => {\n if (!this.options) {\n throw new Error('No options provided!');\n }\n this.connectTimer = null;\n if (this.connectionCount < (this.options?.connectMaxAttempt || 5)) {\n this.connectionCount++;\n }\n this.connect(this.url, this.options);\n }, this.connectionCount * (this.options?.connectInterval || 1000));\n } else {\n this.log.debug(`Reconnect is already running ${this.connectionCount}`);\n }\n }\n}\n\n// every time creates a new socket\nfunction connect(url?: string, options?: ConnectOptions): SocketClient {\n const socketClient = new SocketClient();\n socketClient.connect(url, options);\n return socketClient;\n}\n\nwindow.io = {\n connect,\n};\n"],"mappings":"aAuBA,MAAMA,cAAwC,CAC1CC,QAAS,EACTC,KAAM,EACNC,KAAM,EACNC,SAAU,GAGRC,OAAQ,EAERC,OAAiC,CACnC,IAAM,eACN,KAAM,mBACN,KAAM,uBACN,KAAM,oBACN,KAAM,mBACN,KAAM,iBACN,KAAM,sBACN,KAAM,mBACN,KAAM,kBACN,KAAM,sBACN,KAAM,eACN,KAAM,kBACN,KAAM,kBACN,KAAM,sBACN,KAAM,sBASV,MAAMC,aACeC,gBAA6C,GAC7CC,kBAA+C,GAC/CC,mBAAmD,GACnDC,cAAsC,GAEtCC,SAEb,GACIC,cAAe,EACfC,aAAqD,KACrDC,gBAAwD,KACxDC,gBAAkB,EAClBC,UAA2E,GAC3EC,QAA2C,GAC3CC,GAAK,EACLC,SAAmB,EACnBC,OAA2B,KAC3BC,IAAc,GACdC,QAAiC,KACjCC,aAAsD,KACtDC,UAAY,EACZC,YAAoD,KAErDC,WAAY,EAEFC,IAMjB,WAAAC,GACIC,KAAKF,IAAM,CACPG,MAAQC,MAA0BC,QAAQL,IAAI,KAAI,IAAIM,MAAOC,kBAAkBH,QAC/EI,KAAOJ,MAAiBC,QAAQG,KAAK,KAAI,IAAIF,MAAOC,kBAAkBH,QACtEK,MAAQL,MAAiBC,QAAQI,MAAM,KAAI,IAAIH,MAAOC,kBAAkBH,QAEhF,CAEQ,eAAOM,CAASC,MACpB,MACMC,OADQD,KAAKE,MAAM,KAAK,IAAM,IAChBA,MAAM,KACpBC,OAAiC,GACvC,IAAK,IAAIC,EAAI,EAAGA,EAAIH,MAAMI,OAAQD,IAAK,CAEnCD,OADeF,MAAMG,GAAGF,MAAM,KAChB,IAAMI,mBAAmBL,MAAM,GACjD,CACA,OAAOE,MACX,CAEA,OAAAI,CAAQxB,IAAcC,SAelB,GAdAO,KAAKF,IAAIG,MAAM,kBAGXT,MACAA,IAAMA,IAAImB,MAAM,KAAK,IAGzBX,KAAKX,GAAK,EACVW,KAAKhB,cAAgBiC,cAAcjB,KAAKhB,cACxCgB,KAAKhB,aAAe,KAGpBgB,KAAKR,IAAMQ,KAAKR,KAAOA,KAAO0B,OAAOC,SAASC,KAC9CpB,KAAKP,QAAUO,KAAKP,SAAW4B,KAAKC,MAAMD,KAAKE,UAAU9B,SAAW,MAC/DO,KAAKP,QACN,MAAM,IAAI+B,MAAM,wBAGpBxB,KAAKP,QAAQgC,YAAcC,SAAS1B,KAAKP,QAAQgC,YAAkC,KAAO,IAC1FzB,KAAKP,QAAQC,aAAegC,SAAS1B,KAAKP,QAAQC,aAAmC,KAAO,IAC5FM,KAAKP,QAAQkC,eAAiBD,SAAS1B,KAAKP,QAAQkC,eAAqC,KAAO,IAChG3B,KAAKP,QAAQG,YAAc8B,SAAS1B,KAAKP,QAAQG,YAAkC,KAAO,IAC1FI,KAAKP,QAAQmC,gBAAkBF,SAAS1B,KAAKP,QAAQmC,gBAAsC,KAAO,IAClG5B,KAAKP,QAAQoC,kBAAoBH,SAAS1B,KAAKP,QAAQoC,kBAAwC,KAAO,EAEtG7B,KAAKL,UAAYS,KAAK0B,MACtB,IACI,GAAiB,MAAb9B,KAAKR,IAAa,CAClB,IAAIkB,MAAQQ,OAAOC,SAASY,SAASpB,MAAM,MAEvCO,OAAOC,SAASY,SAASC,SAAS,UAAYd,OAAOC,SAASY,SAASC,SAAS,UAChFtB,MAAMuB,MAIVjC,KAAKR,IAAM,GAAG0B,OAAOC,SAASe,aAAahB,OAAOC,SAASgB,QAAQzB,MAAM0B,KAAK,MAClF,CAGA,MAAMC,MAAQ5D,aAAa+B,SAASR,KAAKR,KACrC6C,MAAMC,YACCD,MAAMC,IAGbD,MAAME,eAAe,YACdF,MAAM,IAGjB,IAAIG,EAAY,GAAGxC,KAAKR,IAAIiD,QAAQ,QAAS,MAAM9B,MAAM,KAAK,UAAUX,KAAKL,YAGzE+C,OAAOC,KAAKN,OAAOvB,SACnB0B,GAAK,IAAIE,OAAOC,KAAKN,OAChBO,KAAIC,WAAyBC,IAAhBT,MAAMQ,MAAsBA,KAAO,GAAGA,QAAQR,MAAMQ,UACjET,KAAK,QAGVpC,KAAKP,SAASsD,OAASV,MAAMU,OAC7BP,GAAK,SAASQ,mBAAmBhD,KAAKP,QAAQsD,SAIlD/C,KAAKT,OAAS,IAAI0D,UAAUT,EAChC,CAAE,MAAOjC,OAGL,OAFAP,KAAKlB,SAASyB,OAAO2C,SAAQC,IAAMA,GAAGC,KAAKpD,KAAMO,SACjDP,KAAKqD,QACErD,IACX,CAsHA,OApHAA,KAAKf,gBAAkBqE,YAAW,KAC9BtD,KAAKf,gBAAkB,KACvBe,KAAKF,IAAIQ,KAAK,gDACdN,KAAKqD,OAAO,GACbrD,KAAKP,QAAQkC,gBAEhB3B,KAAKT,OAAOgE,OAAS,KACjBvD,KAAKV,SAAWc,KAAK0B,MACrB9B,KAAKd,gBAAkB,EAEvBc,KAAKN,aAAe8D,aAAY,KAC5B,IAAKxD,KAAKP,QACN,MAAM,IAAI+B,MAAM,wBAGpB,GAAIpB,KAAK0B,MAAQ9B,KAAKV,UAAYU,KAAKP,SAASC,cAAgB,KAAQ,GACpE,IACIM,KAAKT,QAAQkE,KAAKpC,KAAKE,UAAU,CAACrD,cAAcE,OACpD,CAAE,MAAOsF,GAIL,OAHA1D,KAAKF,IAAIQ,KAAK,uCAAuCoD,KACrD1D,KAAKqD,aACLrD,KAAK2D,iBAET,CAEAvD,KAAK0B,MAAQ9B,KAAKV,UAAYU,KAAKP,SAASgC,aAAe,MAC3DzB,KAAKqD,QAETrD,KAAK2D,iBAAiB,GACvB3D,KAAKP,SAASC,cAAgB,IAAK,EAG1CM,KAAKT,OAAOqE,QAAWC,QACA,OAAfA,MAAMC,KACN9D,KAAKF,IAAIQ,KAAK,aAEdN,KAAKF,IAAIS,MAAM,wBAAwB/B,OAAOqF,MAAMC,SAExD9D,KAAKqD,OAAO,EAIhBrD,KAAKT,OAAOwE,QAAWxD,QACfP,KAAKH,WAAaG,KAAKT,SACQ,IAA3BS,KAAKT,OAAOyE,YACZhE,KAAKF,IAAIS,MAAM,oBAAoBA,MAAM0D,QAE7CjE,KAAKnB,cAAcqE,SAAQC,IAAMA,GAAGC,KAAKpD,KAAMxB,OAAO+B,MAAMuD,OAAS,cAEzE9D,KAAKqD,OAAO,EAGhBrD,KAAKT,OAAO2E,UAAaC,UAErB,GADAnE,KAAKV,SAAWc,KAAK0B,OAChBqC,SAASC,MAAgC,iBAAjBD,QAAQC,KAEjC,YADAjE,QAAQI,MAAM,6BAA6Bc,KAAKE,UAAU4C,YAG9D,IAAIC,KACJ,IACIA,KAAO/C,KAAKC,MAAM6C,QAAQC,KAC9B,CAAE,MAAOV,GAEL,YADAvD,QAAQI,MAAM,6BAA6Bc,KAAKE,UAAU4C,QAAQC,QAEtE,CAEA,MAAMH,KAAeG,KAAK,GACpB/E,GAAa+E,KAAK,GAClBrB,KAAeqB,KAAK,GACpBC,KAAcD,KAAK,GAErBpE,KAAKJ,cACL0E,aAAatE,KAAKJ,aAClBI,KAAKJ,YAAc,MAGnBqE,OAAS/F,cAAcI,SACvB0B,KAAKuE,WAAWlF,GAAIgF,MACbJ,OAAS/F,cAAcC,QACjB,gBAAT4E,MACA/C,KAAKH,WAAY,EAEbG,KAAKjB,aACLiB,KAAKrB,kBAAkBuE,SAAQC,IAAMA,GAAGC,KAAKpD,MAAM,MAEnDA,KAAKtB,gBAAgBwE,SAAQC,IAAMA,GAAGC,KAAKpD,MAAM,KACjDA,KAAKjB,cAAe,GAGxBiB,KAAKf,iBAAmBqF,aAAatE,KAAKf,iBAC1Ce,KAAKf,gBAAkB,KAGnBe,KAAKZ,QAAQ0B,SACbd,KAAKZ,QAAQ8D,SAAQ,EAAGH,UAAMsB,aAAWrE,KAAKwE,KAAKzB,QAASsB,QAE5DrE,KAAKZ,QAAU,KAEZiF,KACPrE,KAAKlB,SAASiE,OAAOG,SAAQC,IAAMA,GAAGsB,MAAMzE,KAAMqE,QAElDrE,KAAKlB,SAASiE,OAAOG,SAAQC,IAAMA,GAAGC,KAAKpD,QAExCiE,OAAS/F,cAAcE,KAC1B4B,KAAKT,OACLS,KAAKT,OAAOkE,KAAKpC,KAAKE,UAAU,CAACrD,cAAcG,QAE/C2B,KAAKF,IAAIQ,KAAK,qCAEX2D,OAAS/F,cAAcG,MAG9B2B,KAAKF,IAAIQ,KAAK,kCAAkC2D,OACpD,EAGGjE,IACX,CAEQ,eAAA2D,GACQvD,KAAK0B,MACjB,IAAI4C,MAAQ,EAkBZ,GAAIA,MAAQ1E,KAAKb,UAAU2B,OAAS,EAAG,CACnC,MAAM6D,YAAc,GACpB,IAAK,IAAIC,EAAI,EAAGA,EAAI5E,KAAKb,UAAU2B,OAAQ8D,IACvC5E,KAAKb,UAAUyF,IAAMD,YAAYE,KAAK7E,KAAKb,UAAUyF,IAEzD5E,KAAKb,UAAYwF,WACrB,CACJ,CAEQ,YAAAG,CAAa/B,KAAc1D,GAAYgF,KAAalB,IAC3C,iBAATJ,OACA/C,KAAKJ,YAAc0D,YAAW,KAC1BtD,KAAKJ,YAAc,KACfI,KAAKH,YACLG,KAAKF,IAAIG,MAAM,wBACfD,KAAKlB,SAASyB,OAAO2C,SAAQC,IAAMA,GAAGC,KAAKpD,KAAM,2BAErDA,KAAKqD,OAAO,GACbrD,KAAKP,SAASG,aAAe,MAEpCI,KAAKb,UAAU0F,KAAK,CAAExF,MAAI8D,MAAI4B,GAAY,IAC1C/E,KAAKT,QAAQkE,KAAKpC,KAAKE,UAAU,CAACrD,cAAcI,SAAUe,GAAI0D,KAAMsB,OACxE,CAEQ,UAAAE,CAAWlF,GAAYgF,MAC3B,IAAK,IAAIO,EAAI,EAAGA,EAAI5E,KAAKb,UAAU2B,OAAQ8D,IAAK,CAC5C,MAAMI,SAAWhF,KAAKb,UAAUyF,GAChC,GAAII,UAAU3F,KAAOA,GAAI,CACV2F,SAAS7B,GACjBsB,MAAM,KAAMJ,MACfrE,KAAKb,UAAUyF,GAAK,IACxB,CACJ,CACJ,CAEAJ,KAAO,CAACzB,QAAiBsB,QACrB,GAAKrE,KAAKT,QAAWS,KAAKH,UAA1B,CAYA,GAFAG,KAAKX,KAEQ,cAAT0D,MAAwBsB,MAA2B,iBAAZA,KAAK,IAAmBA,KAAK,GAAI,CAGxE,IAAIY,OAAS,GACb,MAAMC,MAAQ,IAAIC,WAAWd,KAAK,IAC5Be,IAAMF,MAAMG,WAClB,IAAK,IAAIT,EAAI,EAAGA,EAAIQ,IAAKR,IACrBK,QAAUK,OAAOC,aAAaL,MAAMN,IAExCP,KAAK,GAAKnD,OAAOsE,KAAKP,OAC1B,CAEA,IAEI,GAAIZ,MAAyC,mBAA1BA,KAAKA,KAAKvD,OAAS,GAAmB,CACrD,MAAM2E,MAAQ,IAAIpB,MACZqB,aAAmCD,MAAMxD,MAC/CjC,KAAK8E,aAAa/B,KAAM/C,KAAKX,GAAIoG,MAAOC,aAC5C,MAAYrB,MAAMvD,OAGdd,KAAKT,OAAOkE,KAAKpC,KAAKE,UAAU,CAACrD,cAAcC,QAAS6B,KAAKX,GAAI0D,KAAMsB,QAFvErE,KAAKT,OAAOkE,KAAKpC,KAAKE,UAAU,CAACrD,cAAcC,QAAS6B,KAAKX,GAAI0D,OAIzE,CAAE,MAAOW,GACLvD,QAAQI,MAAM,gBAAgBmD,KAC9B1D,KAAKqD,OACT,CA9BA,MAPSrD,KAAKjB,aAINiB,KAAKF,IAAIQ,KAAK,iBAFdN,KAAKZ,QAAQyF,KAAK,CAAE9B,UAAMsB,WAmClC,EAGJ,EAAAsB,CAAG5C,KAAcI,IACTA,KACa,YAATJ,KACA/C,KAAKtB,gBAAgBmG,KAAK1B,IACV,eAATJ,KACP/C,KAAKpB,mBAAmBiG,KAAK1B,IACb,cAATJ,KACP/C,KAAKrB,kBAAkBkG,KAAK1B,IACZ,UAATJ,KACH/C,KAAKnB,cAAcgG,KAAK1B,KAE5BnD,KAAKlB,SAASiE,MAAQ/C,KAAKlB,SAASiE,OAAS,GAC7C/C,KAAKlB,SAASiE,MAAM8B,KAAK1B,KAGrC,CAEA,GAAAyC,CAAI7C,KAAcI,IACd,GAAa,YAATJ,KAAoB,CACpB,MAAM8C,IAAM7F,KAAKtB,gBAAgBoH,QAAQ3C,KAC5B,IAAT0C,KACA7F,KAAKtB,gBAAgBqH,OAAOF,IAAK,EAEzC,MAAO,GAAa,eAAT9C,KAAuB,CAC9B,MAAM8C,IAAM7F,KAAKpB,mBAAmBkH,QAAQ3C,KAC/B,IAAT0C,KACA7F,KAAKpB,mBAAmBmH,OAAOF,IAAK,EAE5C,MAAO,GAAa,cAAT9C,KAAsB,CAC7B,MAAM8C,IAAM7F,KAAKrB,kBAAkBmH,QAAQ3C,KAC9B,IAAT0C,KACA7F,KAAKrB,kBAAkBoH,OAAOF,IAAK,EAE3C,MAAO,GAAa,UAAT9C,KAAkB,CACzB,MAAM8C,IAAM7F,KAAKnB,cAAciH,QAAQ3C,KAC1B,IAAT0C,KACA7F,KAAKnB,cAAckH,OAAOF,IAAK,EAEvC,MAAO,GAAI7F,KAAKlB,SAASiE,MAAO,CAC5B,MAAM8C,IAAM7F,KAAKlB,SAASiE,MAAM+C,QAAQ3C,KAC3B,IAAT0C,MACA7F,KAAKlB,SAASiE,MAAMgD,OAAOF,IAAK,GAC3B7F,KAAKlB,SAASiE,MAAMjC,eACdd,KAAKlB,SAASiE,MAGjC,CACJ,CAEA,KAAAM,GAUI,GATArD,KAAKN,cAAgBuB,cAAcjB,KAAKN,cACxCM,KAAKN,aAAe,KAEpBM,KAAKJ,aAAe0E,aAAatE,KAAKJ,aACtCI,KAAKJ,YAAc,KAEnBI,KAAKf,iBAAmBqF,aAAatE,KAAKf,iBAC1Ce,KAAKf,gBAAkB,KAEnBe,KAAKT,OAAQ,CACb,IACIS,KAAKT,OAAO8D,OAChB,CAAE,MAAOK,GAET,CACA1D,KAAKT,OAAS,IAClB,CAWA,OATIS,KAAKH,YACLG,KAAKpB,mBAAmBsE,SAAQC,IAAMA,GAAGC,KAAKpD,QAC9CA,KAAKH,WAAY,GAGrBG,KAAKb,UAAY,GAEjBa,KAAKgG,aAEEhG,IACX,CAGAiG,WAAajG,KAAKqD,MAElB,OAAA6C,GACIlG,KAAKqD,QACLrD,KAAKhB,cAAgBsF,aAAatE,KAAKhB,cACvCgB,KAAKhB,aAAe,IACxB,CAEQ,UAAAgH,GACChG,KAAKhB,aAaNgB,KAAKF,IAAIG,MAAM,gCAAgCD,KAAKd,oBAZpDc,KAAKF,IAAIG,MAAM,mBAAmBD,KAAKd,mBACvCc,KAAKhB,aAAesE,YAAW,KAC3B,IAAKtD,KAAKP,QACN,MAAM,IAAI+B,MAAM,wBAEpBxB,KAAKhB,aAAe,KAChBgB,KAAKd,iBAAmBc,KAAKP,SAASoC,mBAAqB,IAC3D7B,KAAKd,kBAETc,KAAKgB,QAAQhB,KAAKR,IAAKQ,KAAKP,QAAQ,GACrCO,KAAKd,iBAAmBc,KAAKP,SAASmC,iBAAmB,MAIpE,EAIJ,SAASZ,QAAQxB,IAAcC,SAC3B,MAAM0G,aAAe,IAAI1H,aAEzB,OADA0H,aAAanF,QAAQxB,IAAKC,SACnB0G,YACX,CAEAjF,OAAOkF,GAAK,CACRpF","ignoreList":[]} \ No newline at end of file diff --git a/packages/admin/src-admin/src/App.tsx b/packages/admin/src-admin/src/App.tsx index 03b536676..7867b3ce6 100644 --- a/packages/admin/src-admin/src/App.tsx +++ b/packages/admin/src-admin/src/App.tsx @@ -1564,7 +1564,7 @@ class App extends Router { } } - const instances = await this.instancesWorker.getInstances(); + const instances = await this.instancesWorker.getObjects(); this.setState({ noNotifications, notifications: { notifications, instances } }); }; @@ -1586,7 +1586,7 @@ class App extends Router { const result = notifications[host].result; if (result?.system && Object.keys(result.system.categories).length) { - await this.instancesWorker.getInstances().then(instances => + await this.instancesWorker.getObjects().then(instances => this.setState({ showHostWarning: { host, diff --git a/packages/admin/src-admin/src/Workers/AdaptersWorker.tsx b/packages/admin/src-admin/src/Workers/AdaptersWorker.tsx index 7d1d54e73..68deb3f03 100644 --- a/packages/admin/src-admin/src/Workers/AdaptersWorker.tsx +++ b/packages/admin/src-admin/src/Workers/AdaptersWorker.tsx @@ -1,166 +1,27 @@ import { type AdminConnection } from '@iobroker/adapter-react-v5'; -import AdminUtils from '../helpers/AdminUtils'; +import GenericWorker, { type EventType, type GenericEvent } from './GenericWorker'; -export type AdapterEventType = 'new' | 'changed' | 'deleted'; +export type AdapterEventType = EventType; -export interface AdapterEvent { - id: string; - obj?: ioBroker.AdapterObject; - type: AdapterEventType; - oldObj?: ioBroker.AdapterObject; -} - -export default class AdaptersWorker { - private readonly socket: AdminConnection; - - private readonly handlers: ((events: AdapterEvent[]) => void)[]; +export type AdapterEvent = GenericEvent<'adapter'>; +export default class AdaptersWorker extends GenericWorker<'adapter'> { private readonly repositoryHandlers: (() => void)[]; - private promise: Promise> | null; - - private forceUpdate: boolean; - - private connected: boolean; - - private objects: Record | null; - private repoTimer: ReturnType | null; constructor(socket: AdminConnection) { - this.socket = socket; - this.handlers = []; + super(socket, 'system.adapter', 'adapter'); this.repositoryHandlers = []; - this.promise = null; - this.forceUpdate = false; - - socket.registerConnectionHandler(this.connectionHandler); - this.connected = this.socket.isConnected(); - - this.objects = null; } - objectChangeHandler = (id: string, obj: ioBroker.AdapterObject): void => { - this.objects = this.objects || {}; - // if instance - if (id.match(/^system\.adapter\.[^.]+$/)) { - let type: AdapterEventType; - let oldObj: ioBroker.AdapterObject | undefined; - - if (obj) { - if (obj.type !== 'adapter') { - return; - } - - AdminUtils.fixAdminUI(obj); - - if (this.objects[id]) { - oldObj = this.objects[id]; - if (JSON.stringify(this.objects[id]) !== JSON.stringify(obj)) { - type = 'changed'; - this.objects[id] = obj; - } else { - // no changes - return; - } - } else { - type = 'new'; - this.objects[id] = obj; - } - } else if (this.objects[id]) { - oldObj = this.objects[id]; - type = 'deleted'; - delete this.objects[id]; - } else { - // deleted unknown instance - return; - } - - this.socket.getAdaptersResetCache(); - this.socket.getInstalledResetCache(''); - this.forceUpdate = true; - this.promise = null; - - this.handlers.forEach(cb => - cb([ - { - id, - obj, - type, - oldObj, - }, - ]), - ); - } - }; - - isForceUpdate(): boolean { - return this.forceUpdate; + protected checkObjectId(id: string, obj: ioBroker.AdapterObject | null | undefined): boolean { + return id.match(/^system\.adapter\.[^.]+$/) && (!obj || obj.type === this.objectType); } - // be careful with this object. Do not change them. - getAdapters(update?: boolean): Promise> { - if (!update && this.promise instanceof Promise) { - return this.promise; - } - - update = update || this.forceUpdate; - this.forceUpdate = false; - - this.promise = this.socket - .getAdapters(null, update) - .then(objects => { - this.objects = {}; - objects.forEach(obj => (this.objects[obj._id] = obj)); - return this.objects; - }) - .catch(e => window.alert(`Cannot get adapters: ${e}`)); - - return this.promise; - } - - connectionHandler = (isConnected: boolean): void => { - if (isConnected && !this.connected) { - this.connected = true; - - if (this.handlers.length) { - this.socket - .subscribeObject('system.adapter.*', this.objectChangeHandler) - .catch(e => window.alert(`Cannot subscribe on object: ${e}`)); - - void this.getAdapters(true).then( - adapters => - adapters && Object.keys(adapters).forEach(id => this.objectChangeHandler(id, adapters[id])), - ); - } - } else if (!isConnected && this.connected) { - this.connected = false; - } - }; - - registerHandler(cb: (events: AdapterEvent[]) => void): void { - if (!this.handlers.includes(cb)) { - this.handlers.push(cb); - - if (this.handlers.length === 1 && this.connected) { - this.socket - .subscribeObject('system.adapter.*', this.objectChangeHandler) - .catch(e => window.alert(`Cannot subscribe on object: ${e}`)); - } - } - } - - unregisterHandler(cb: (events: AdapterEvent[]) => void): void { - const pos = this.handlers.indexOf(cb); - if (pos !== -1) { - this.handlers.splice(pos, 1); - } - - if (!this.handlers.length && this.connected) { - this.socket - .unsubscribeObject('system.adapter.*', this.objectChangeHandler) - .catch(e => window.alert(`Cannot unsubscribe on object: ${e}`)); - } + protected postProcessing(_id: string, _obj: ioBroker.AdapterObject | null | undefined): void { + this.socket.getAdaptersResetCache(); + this.socket.getInstalledResetCache(''); } repoChangeHandler = (/* id, obj */): void => { diff --git a/packages/admin/src-admin/src/Workers/GenericWorker.tsx b/packages/admin/src-admin/src/Workers/GenericWorker.tsx new file mode 100644 index 000000000..e81e2454d --- /dev/null +++ b/packages/admin/src-admin/src/Workers/GenericWorker.tsx @@ -0,0 +1,250 @@ +import type { AdminConnection } from '@iobroker/adapter-react-v5'; +import AdminUtils from '@/helpers/AdminUtils'; + +export type EventType = 'new' | 'changed' | 'deleted'; + +export type GetObjectFromType = T extends 'host' + ? ioBroker.HostObject + : T extends 'adapter' + ? ioBroker.AdapterObject + : T extends 'instance' + ? ioBroker.InstanceObject + : T extends 'meta' + ? ioBroker.MetaObject + : T extends 'device' + ? ioBroker.DeviceObject + : T extends 'channel' + ? ioBroker.ChannelObject + : T extends 'state' + ? ioBroker.StateObject + : T extends 'folder' + ? ioBroker.FolderObject + : T extends 'enum' + ? ioBroker.EnumObject + : T extends 'script' + ? ioBroker.ScriptObject + : T extends 'group' + ? ioBroker.GroupObject + : T extends 'user' + ? ioBroker.UserObject + : T extends 'chart' + ? ioBroker.ChartObject + : T extends 'schedule' + ? ioBroker.ScheduleObject + : ioBroker.Object; + +type GetRootFromType = T extends 'host' + ? `system.host.${string}` + : T extends 'adapter' + ? `system.adapter.${string}` | `system.host.${string}.adapter.${string}` + : T extends 'instance' + ? `system.adapter.${string}.${number}` + : T extends 'enum' + ? `system.enum.${string}` + : T extends 'script' + ? `script.js.${string}` + : T extends 'group' + ? `system.group.${string}` + : T extends 'user' + ? `system.user.${string}` + : string; + +export type GenericEvent = { + id: GetRootFromType; + obj?: GetObjectFromType; + type: EventType; + oldObj?: GetObjectFromType; +}; + +export default class GenericWorker { + protected readonly socket: AdminConnection; + + protected readonly handlers: ((events: GenericEvent[]) => void)[] = []; + + private promise: Promise>> | null = null; + + protected connected: boolean; + + protected objects: Record> | null = null; + + private readonly root: string; + + protected readonly objectType: ioBroker.ObjectType; + + private forceUpdate: boolean = false; + + protected constructor(socket: AdminConnection, root: string, objectType: ioBroker.ObjectType) { + this.socket = socket; + this.root = root; + this.objectType = objectType; + + socket.registerConnectionHandler(this.connectionHandler); + + this.connected = this.socket.isConnected(); + if (this.connected) { + this.connectionHandler(true); + } + } + + protected checkObjectId(id: string, obj: GetObjectFromType | null | undefined): boolean { + return id.startsWith(`${this.root}.`) && (!obj || obj.type === this.objectType); + } + + // eslint-disable-next-line class-methods-use-this + protected postProcessing(_id: string, _obj: GetObjectFromType | null | undefined): void { + // can be overridden in the child class + } + + isForceUpdate(): boolean { + return this.forceUpdate; + } + + objectChangeHandler = (id: GetRootFromType, obj: GetObjectFromType | null | undefined): void => { + this.objects = this.objects || {}; + + // if our object + if (this.checkObjectId(id, obj)) { + let type: EventType; + let oldObj: GetObjectFromType | undefined; + if (obj) { + if (this.objectType === 'adapter' || this.objectType === 'instance') { + AdminUtils.fixAdminUI(obj); + } + if (this.objects[id]) { + if (JSON.stringify(this.objects[id]) !== JSON.stringify(obj)) { + type = 'changed'; + this.objects[id] = obj; + } else { + // no changes + return; + } + } else { + type = 'new'; + this.objects[id] = obj; + } + } else if (this.objects[id]) { + type = 'deleted'; + oldObj = this.objects[id]; + delete this.objects[id]; + } else { + // deleted unknown object + return; + } + + this.forceUpdate = true; + + this.postProcessing(id, obj); + + this.handlers.forEach(cb => + cb([ + { + id, + obj, + type, + oldObj, + }, + ]), + ); + } + }; + + getObjects(update?: boolean): Promise>> { + update = update || this.forceUpdate; + this.forceUpdate = false; + + if (!update && this.promise instanceof Promise) { + return this.promise; + } + + this.promise = this.socket + .getObjectViewSystem( + this.objectType, + this.root ? `${this.root}.` : '', + this.root ? `${this.root}.\u9999` : '\u9999', + ) + .then(objects => { + this.objects = objects as Record>; + if (this.objectType === 'adapter' || this.objectType === 'instance') { + Object.keys(this.objects).forEach(id => AdminUtils.fixAdminUI(this.objects[id])); + } + + return this.objects; + }) + .catch(e => { + window.alert(`Cannot get objects of type ${this.objectType}, with root "${this.root}": ${e}`); + return null; + }); + + return this.promise; + } + + // eslint-disable-next-line class-methods-use-this + protected connectionPostHandler(_isConnected: boolean): void {} + + connectionHandler = (isConnected: boolean): void => { + if (isConnected && !this.connected) { + this.connected = true; + + if (this.handlers.length) { + this.socket + .subscribeObject(this.root ? `${this.root}.*` : '*', this.objectChangeHandler) + .then(() => { + // read all hosts anew and inform about it + void this.getObjects(true).then(objects => { + if (objects) { + Object.keys(objects).forEach(id => + this.objectChangeHandler(id as GetRootFromType, objects[id]), + ); + } + }); + }) + .catch(e => window.alert(`Cannot subscribe on object "${this.root}": ${e}`)); + } + this.connectionPostHandler(true); + } else if (!isConnected && this.connected) { + this.connected = false; + this.connectionPostHandler(false); + } + }; + + registerHandler(cb: (events: GenericEvent[]) => void, doNotRequestObjects?: boolean): void { + if (!this.handlers.includes(cb)) { + this.handlers.push(cb); + + if (this.handlers.length === 1 && this.connected) { + this.socket + .subscribeObject(this.root ? `${this.root}.*` : '*', this.objectChangeHandler) + .then(() => { + if (!doNotRequestObjects) { + // read all hosts anew and inform about it + void this.getObjects(true).then(objects => { + if (objects) { + Object.keys(objects).forEach(id => + this.objectChangeHandler(id as GetRootFromType, objects[id]), + ); + } + }); + } + }) + .catch(e => window.alert(`Cannot subscribe on objects "${this.root}": ${e}`)); + } + } + } + + unregisterHandler(cb: (events: GenericEvent[]) => void): void { + const pos = this.handlers.indexOf(cb); + if (pos !== -1) { + this.handlers.splice(pos, 1); + if (!this.handlers.length && this.connected) { + this.socket + .unsubscribeObject(this.root ? `${this.root}.*` : '*', this.objectChangeHandler) + .catch(e => window.alert(`Cannot unsubscribe from objects "${this.root}": ${e}`)); + } + } + } + + destroy(): void { + this.handlers.forEach(cb => this.unregisterHandler(cb)); + this.socket.unregisterConnectionHandler(this.connectionHandler); + } +} diff --git a/packages/admin/src-admin/src/Workers/HostAdapterWorker.tsx b/packages/admin/src-admin/src/Workers/HostAdapterWorker.tsx new file mode 100644 index 000000000..4b3c2f51c --- /dev/null +++ b/packages/admin/src-admin/src/Workers/HostAdapterWorker.tsx @@ -0,0 +1,28 @@ +import { type AdminConnection } from '@iobroker/adapter-react-v5'; +import GenericWorker, { type EventType, type GenericEvent } from './GenericWorker'; + +export type HostAdapterEventType = EventType; + +export type HostAdapterEvent = GenericEvent<'adapter'>; + +export default class HostAdapterWorker extends GenericWorker<'adapter'> { + private readonly host: string; + private readonly prefix: string; + + constructor(socket: AdminConnection, host: string) { + super(socket, `${host}.adapter`, 'adapter'); + this.prefix = `${host}.adapter.`; + this.host = host; + } + + getObject(adapterName: string): ioBroker.AdapterObject | null { + if (!this.objects) { + return null; + } + return this.objects[this.prefix + adapterName] || null; + } + + getHost(): string { + return this.host; + } +} diff --git a/packages/admin/src-admin/src/Workers/HostsWorker.tsx b/packages/admin/src-admin/src/Workers/HostsWorker.tsx index ff4796ef2..69ebaf71e 100644 --- a/packages/admin/src-admin/src/Workers/HostsWorker.tsx +++ b/packages/admin/src-admin/src/Workers/HostsWorker.tsx @@ -1,16 +1,12 @@ import type { AdminConnection } from '@iobroker/adapter-react-v5'; import type { FilteredNotificationInformation } from '@iobroker/socket-client'; +import GenericWorker, { type EventType, type GenericEvent } from './GenericWorker'; -export type HostEventType = 'new' | 'changed' | 'deleted'; +export type HostEventType = EventType; export type NotificationAnswer = { result: FilteredNotificationInformation } | null; -export interface HostEvent { - id: `system.host.${string}`; - obj?: ioBroker.HostObject; - type: HostEventType; - oldObj?: ioBroker.HostObject; -} +export type HostEvent = GenericEvent<'host'>; export interface HostAliveEvent { id: `system.host.${string}`; @@ -18,92 +14,27 @@ export interface HostAliveEvent { type: HostEventType; } -export default class HostsWorker { - private readonly socket: AdminConnection; - - private readonly handlers: ((events: HostEvent[]) => void)[]; - - private readonly aliveHandlers: (((events: HostAliveEvent[]) => void) | false)[]; - - private readonly notificationsHandlers: ((notifications: Record) => void)[]; - - private promise: Promise> | null; +export default class HostsWorker extends GenericWorker<'host'> { + private readonly aliveHandlers: (((events: HostAliveEvent[]) => void) | false)[] = []; - private connected: boolean; + private readonly notificationsHandlers: ((notifications: Record) => void)[] = []; - private objects: Record | null; + private readonly aliveStates: Record = {}; - private readonly aliveStates: Record; + private readonly notificationPromises: Record>> = {}; - private readonly notificationPromises: Record>>; - - private notificationTimer: ReturnType | null; + private notificationTimer: ReturnType | null = null; private subscribeTs: number | undefined; constructor(socket: AdminConnection) { - this.socket = socket; - this.handlers = []; + super(socket, 'system.host', 'host'); this.aliveHandlers = []; this.notificationsHandlers = []; - this.promise = null; this.notificationPromises = {}; - - socket.registerConnectionHandler(this.connectionHandler); - - this.connected = this.socket.isConnected(); - console.log(`Connected: ${this.connected}`); - this.objects = {}; this.aliveStates = {}; - if (this.connected) { - this.connectionHandler(true); - } } - objectChangeHandler = (id: string, obj: ioBroker.HostObject): void => { - // if host - if (id.startsWith('system.host.')) { - let type: HostEventType; - let oldObj: ioBroker.HostObject | undefined; - if (obj) { - if (obj.type !== 'host') { - return; - } - - if (this.objects[id]) { - if (JSON.stringify(this.objects[id]) !== JSON.stringify(obj)) { - type = 'changed'; - this.objects[id] = obj; - } else { - // no changes - return; - } - } else { - type = 'new'; - this.objects[id] = obj; - } - } else if (this.objects[id]) { - type = 'deleted'; - oldObj = this.objects[id]; - delete this.objects[id]; - } else { - // deleted unknown instance - return; - } - - this.handlers.forEach(cb => - cb([ - { - id: id as `system.host.${string}`, - obj, - type, - oldObj, - }, - ]), - ); - } - }; - aliveChangeHandler = (id: string, state: ioBroker.State): void => { // if instance if (id.startsWith('system.host.') && id.endsWith('.alive')) { @@ -143,68 +74,14 @@ export default class HostsWorker { } }; - getHosts(update?: boolean): Promise> { - if (!update && this.promise instanceof Promise) { - return this.promise; - } - - this.promise = this.socket - .getHosts(update) - .then(objects => { - this.objects = {}; - objects.forEach(obj => (this.objects[obj._id] = obj)); - return this.objects; - }) - .catch(e => window.alert(`Cannot get hosts: ${e}`)); - - return this.promise; - } - - connectionHandler = (isConnected: boolean): void => { - if (isConnected && !this.connected) { - this.connected = true; - - if (this.handlers.length) { - this.socket - .subscribeObject('system.host.*', this.objectChangeHandler) - .catch(e => window.alert(`Cannot subscribe on object: ${e}`)); - - // read all hosts anew and inform about it - void this.getHosts(true).then( - hosts => hosts && Object.keys(hosts).forEach(id => this.objectChangeHandler(id, hosts[id])), - ); - } + connectionPostHandler(isConnected: boolean): void { + if (isConnected) { if (this.aliveHandlers.length) { void this.socket.subscribeState('system.host.*.alive', this.aliveChangeHandler); } - } else if (!isConnected && this.connected) { - this.connected = false; + } else { Object.keys(this.aliveStates).forEach((id: string) => (this.aliveStates[id] = false)); } - }; - - registerHandler(cb: (events: HostEvent[]) => void): void { - if (!this.handlers.includes(cb)) { - this.handlers.push(cb); - - if (this.handlers.length === 1 && this.connected) { - this.socket - .subscribeObject('system.host.*', this.objectChangeHandler) - .catch(e => window.alert(`Cannot subscribe on object: ${e}`)); - } - } - } - - unregisterHandler(cb: (events: HostEvent[]) => void): void { - const pos = this.handlers.indexOf(cb); - if (pos !== -1) { - this.handlers.splice(pos, 1); - if (!this.handlers.length && this.connected) { - this.socket - .unsubscribeObject('system.host.*', this.objectChangeHandler) - .catch(e => window.alert(`Cannot subscribe on object: ${e}`)); - } - } } registerAliveHandler(cb: (events: HostAliveEvent[]) => void): void { diff --git a/packages/admin/src-admin/src/Workers/InstancesWorker.tsx b/packages/admin/src-admin/src/Workers/InstancesWorker.tsx index 39df0abe9..1ea89b11e 100644 --- a/packages/admin/src-admin/src/Workers/InstancesWorker.tsx +++ b/packages/admin/src-admin/src/Workers/InstancesWorker.tsx @@ -1,160 +1,12 @@ import { type AdminConnection } from '@iobroker/adapter-react-v5'; -import AdminUtils from '../helpers/AdminUtils'; +import GenericWorker, { type EventType, type GenericEvent } from './GenericWorker'; -export type InstanceEventType = 'new' | 'changed' | 'deleted'; +export type InstanceEventType = EventType; -export interface InstanceEvent { - id: string; - obj?: ioBroker.InstanceObject; - type: InstanceEventType; - oldObj?: ioBroker.InstanceObject; -} - -export default class InstancesWorker { - private readonly socket: AdminConnection; - - private readonly handlers: ((events: InstanceEvent[]) => void)[]; - - private promise: Promise> | null; - - private forceUpdate: boolean; - - private connected: boolean; - - private objects: Record | null; +export type InstanceEvent = GenericEvent<'instance'>; +export default class InstancesWorker extends GenericWorker<'instance'> { constructor(socket: AdminConnection) { - this.socket = socket; - this.handlers = []; - this.promise = null; - this.forceUpdate = false; - - socket.registerConnectionHandler(this.connectionHandler); - - this.connected = this.socket.isConnected(); - - this.objects = null; - } - - objectChangeHandler = (id: string, obj?: ioBroker.InstanceObject): void => { - this.objects = this.objects || {}; - // if instance - if (id.match(/^system\.adapter\.[^.]+\.\d+$/)) { - let type: InstanceEventType; - let oldObj: ioBroker.InstanceObject | undefined; - if (obj) { - if (obj.type !== 'instance') { - return; - } - - AdminUtils.fixAdminUI(obj); - - if (this.objects[id]) { - oldObj = this.objects[id]; - if (JSON.stringify(this.objects[id]) !== JSON.stringify(obj)) { - type = 'changed'; - this.objects[id] = obj; - } else { - // no changes - return; - } - } else { - type = 'new'; - this.objects[id] = obj; - } - } else if (this.objects[id]) { - oldObj = this.objects[id]; - type = 'deleted'; - delete this.objects[id]; - } else { - // deleted unknown instance - return; - } - - this.promise = null; - this.socket.getAdapterInstancesResetCache(''); - this.forceUpdate = true; - - this.handlers.forEach(cb => - cb([ - { - id, - obj, - type, - oldObj, - }, - ]), - ); - } - }; - - isForceUpdate(): boolean { - return this.forceUpdate; - } - - // be careful with this object. Do not change them. - getInstances(update?: boolean): Promise> { - if (!update && this.promise instanceof Promise) { - return this.promise; - } - - update = update || this.forceUpdate; - this.forceUpdate = false; - - this.promise = this.socket - .getAdapterInstances('', update) - .then(objects => { - this.objects = {}; - objects.forEach(obj => (this.objects[obj._id] = obj)); - return this.objects; - }) - .catch(e => window.alert(`Cannot get adapter instances: ${e}`)); - - return this.promise; - } - - connectionHandler = (isConnected: boolean): void => { - if (isConnected && !this.connected) { - this.connected = true; - - if (this.handlers.length) { - this.socket - .subscribeObject('system.adapter.*', this.objectChangeHandler) - .catch(e => window.alert(`Cannot subscribe on object: ${e}`)); - - void this.getInstances(true).then( - instances => - instances && Object.keys(instances).forEach(id => this.objectChangeHandler(id, instances[id])), - ); - } - } else if (!isConnected && this.connected) { - this.connected = false; - } - }; - - registerHandler(cb: (events: InstanceEvent[]) => void, doNotRequestAdapters?: boolean): void { - if (!this.handlers.includes(cb)) { - this.handlers.push(cb); - - if (this.handlers.length === 1 && this.connected) { - this.socket - .subscribeObject('system.adapter.*', this.objectChangeHandler) - .then(() => !doNotRequestAdapters && this.getInstances()) - .catch(e => window.alert(`Cannot subscribe on object: ${e}`)); - } - } - } - - unregisterHandler(cb: (events: InstanceEvent[]) => void): void { - const pos = this.handlers.indexOf(cb); - if (pos !== -1) { - this.handlers.splice(pos, 1); - } - - if (!this.handlers.length && this.connected) { - this.socket - .unsubscribeObject('system.adapter.*', this.objectChangeHandler) - .catch(e => window.alert(`Cannot subscribe on object: ${e}`)); - } + super(socket, 'system.adapter', 'instance'); } } diff --git a/packages/admin/src-admin/src/Workers/ObjectsWorker.tsx b/packages/admin/src-admin/src/Workers/ObjectsWorker.tsx index 952e9b257..f72e91cc2 100644 --- a/packages/admin/src-admin/src/Workers/ObjectsWorker.tsx +++ b/packages/admin/src-admin/src/Workers/ObjectsWorker.tsx @@ -10,12 +10,6 @@ export interface ObjectEvent { oldObj?: ioBroker.Object; } -// export interface ObjectsWorker { -// getObjects(update?: boolean): Promise>; -// registerHandler(cb: (events: ObjectEvent[]) => void): void; -// unregisterHandler(cb: (events: ObjectEvent[]) => void, doNotUnsubscribe?: boolean): void; -// } - export default class ObjectsWorker { private readonly socket: AdminConnection; diff --git a/packages/admin/src-admin/src/components/Adapters/AdapterGeneric.tsx b/packages/admin/src-admin/src/components/Adapters/AdapterGeneric.tsx index c5ef3dd89..beb03af32 100644 --- a/packages/admin/src-admin/src/components/Adapters/AdapterGeneric.tsx +++ b/packages/admin/src-admin/src/components/Adapters/AdapterGeneric.tsx @@ -23,7 +23,7 @@ import { Refresh as RefreshIcon, Add as AddIcon, Help as HelpIcon, - KeyboardArrowUp as UpdateSettingsIcon, + KeyboardArrowUp, Cloud as CloudIcon, CloudOff as CloudOffIcon, ArrowUpward as ArrowUpwardIcon, @@ -52,7 +52,7 @@ import AdapterInstallDialog, { type AdapterRatingInfo, type AdaptersContext, } from '@/components/Adapters/AdapterInstallDialog'; -import AutoUpgradeConfigDialog from '@/dialogs/AutoUpgradeConfigDialog'; +import AutoUpgradeConfigDialog, { ICONS } from '@/dialogs/AutoUpgradeConfigDialog'; import IsVisible from '../IsVisible'; import { extractUrlLink } from './Utils'; @@ -258,19 +258,24 @@ export default abstract class AdapterGeneric< } renderAutoUpgradeButton(): JSX.Element | null { - if (!this.installedVersion) { - return null; + const adapterObj = this.props.context.hostAdapterWorker.getObject(this.props.adapterName); + if (!adapterObj) { + return
; } + + // 'none' | 'patch' | 'minor' | 'major' + const autoUpgrade: ioBroker.AutoUpgradePolicy = adapterObj.common?.automaticUpgrade; + return ( this.setState({ autoUpgradeDialogOpen: true, showDialog: true })} > - + {!autoUpgrade || autoUpgrade === 'none' ? : ICONS[autoUpgrade]} ); diff --git a/packages/admin/src-admin/src/components/Adapters/AdapterInstallDialog.tsx b/packages/admin/src-admin/src/components/Adapters/AdapterInstallDialog.tsx index d36aff22e..f882a520f 100644 --- a/packages/admin/src-admin/src/components/Adapters/AdapterInstallDialog.tsx +++ b/packages/admin/src-admin/src/components/Adapters/AdapterInstallDialog.tsx @@ -11,6 +11,7 @@ import type { AdapterInformation } from '@iobroker/js-controller-common-db/build import type InstancesWorker from '@/Workers/InstancesWorker'; import type HostsWorker from '@/Workers/HostsWorker'; import type { RatingDialogRepository } from '@/dialogs/RatingDialog'; +import type HostAdapterWorker from '@/Workers/HostAdapterWorker'; import { extractUrlLink, type RepoAdapterObject } from './Utils'; export type AdapterRating = { @@ -76,6 +77,7 @@ export type AdaptersContext = { isTileView: boolean; updateRating: (adapter: string, rating: RatingDialogRepository) => void; setAdminUpgradeTo: (version: string) => void; + hostAdapterWorker: HostAdapterWorker; }; export interface AdapterInstallDialogState { @@ -163,7 +165,7 @@ export default abstract class AdapterInstallDialog this.setState({ addInstanceHostName: hostName.replace(/^system\.host\./, '') }) } - onInstanceChange={event => this.setState({ addInstanceId: event.target.value })} + onInstanceChange={event => this.setState({ addInstanceId: event.target.value.toString() })} adapterObject={context.repository[this.state.addInstanceDialog]} instances={context.compactInstances} toggleTranslation={context.toggleTranslation} diff --git a/packages/admin/src-admin/src/components/HostSelectors.tsx b/packages/admin/src-admin/src/components/HostSelectors.tsx index 8be0ab85b..5b7e286ae 100644 --- a/packages/admin/src-admin/src/components/HostSelectors.tsx +++ b/packages/admin/src-admin/src/components/HostSelectors.tsx @@ -226,7 +226,7 @@ class HostSelectors extends Component { // new host detected changed = true; hosts.push({ - _id: event.id, + _id: event.id as `system.host.${string}`, common: { name: event.obj.common?.name || '', color: event.obj.common?.color || '', diff --git a/packages/admin/src-admin/src/components/ObjectBrowser.tsx b/packages/admin/src-admin/src/components/ObjectBrowser.tsx index 90a9c0407..6a98bb628 100644 --- a/packages/admin/src-admin/src/components/ObjectBrowser.tsx +++ b/packages/admin/src-admin/src/components/ObjectBrowser.tsx @@ -8507,7 +8507,6 @@ export class ObjectBrowserClass extends Component(object: Record, mapFunction: (item: T, key: string) => Result): Result[] => Object.values(object).map((value, index) => { const key = Object.keys(object)[index]; @@ -197,218 +197,227 @@ interface GroupEditDialogProps extends PermissionsTabProps { styles: Record; } -const GroupEditDialog: React.FC = props => { - const [tab, setTab] = useState(0); +interface GroupEditDialogState { + tab: 0; + originalId: string; +} - const [originalId, setOriginalId] = useState(null); +class GroupEditDialog extends Component { + constructor(props: GroupEditDialogProps) { + super(props); + this.state = { + tab: 0, + originalId: props.group._id, + }; + } - useEffect(() => { - setOriginalId(props.group._id); - if (props.isNew) { + componentDidMount(): void { + if (this.props.isNew) { const icon = GROUPS_ICONS[Math.round(Math.random() * (GROUPS_ICONS.length - 1))]; if (icon) { void Utils.getSvg(icon).then((fileBlob: string) => { - const newData: ioBroker.GroupObject = Utils.clone(props.group) as ioBroker.GroupObject; + const newData: ioBroker.GroupObject = Utils.clone(this.props.group) as ioBroker.GroupObject; newData.common.icon = fileBlob; - props.onChange(newData); + this.props.onChange(newData); }); } } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [props.onChange, props.group, props.isNew]); + } - const idExists = props.groups.find(group => group._id === props.group._id); - const idChanged = props.group._id !== originalId; + render(): React.JSX.Element { + const idExists = this.props.groups.find(group => group._id === this.props.group._id); + const idChanged = this.props.group._id !== this.state.originalId; - let canSave = - props.group._id !== 'system.group.' && - (props.group.common as any).password === (props.group.common as any).passwordRepeat; + let canSave = + this.props.group._id !== 'system.group.' && + (this.props.group.common as any).password === (this.props.group.common as any).passwordRepeat; - const getShortId = (_id: string): string => _id.split('.').pop(); + const getShortId = (_id: string): string => _id.split('.').pop(); - const name2Id = (name: string): string => - name.replace(Utils.FORBIDDEN_CHARS, '_').replace(/\s/g, '_').replace(/\./g, '_').toLowerCase(); + const name2Id = (name: string): string => + name.replace(Utils.FORBIDDEN_CHARS, '_').replace(/\s/g, '_').replace(/\./g, '_').toLowerCase(); - const changeShortId = (_id: string, short: string): string => { - const idArray = _id.split('.'); - idArray[idArray.length - 1] = short; - return idArray.join('.'); - }; + const changeShortId = (_id: string, short: string): string => { + const idArray = _id.split('.'); + idArray[idArray.length - 1] = short; + return idArray.join('.'); + }; - if (props.isNew) { - if (idExists) { + if (this.props.isNew) { + if (idExists) { + canSave = false; + } + } else if (idExists && idChanged) { canSave = false; } - } else if (idExists && idChanged) { - canSave = false; - } - const description = props.getText(props.group.common.desc); - const name = props.getText(props.group.common.name); + const description = this.props.getText(this.props.group.common.desc); + const name = this.props.getText(this.props.group.common.name); - const mainTab = ( - - - { - const newData: ioBroker.GroupObject = Utils.clone(props.group) as ioBroker.GroupObject; - if ( - !props.group.common.dontDelete && - name2Id(newData.common.name) === getShortId(newData._id) - ) { + const mainTab = ( + + + { + const newData: ioBroker.GroupObject = Utils.clone(this.props.group) as ioBroker.GroupObject; + if ( + !this.props.group.common.dontDelete && + name2Id(newData.common.name) === getShortId(newData._id) + ) { + newData._id = changeShortId(newData._id, name2Id(value)) as ioBroker.ObjectIDs.Group; + } + newData.common.name = value; + this.props.onChange(newData); + }} + autoComplete="off" + icon={TextFieldsIcon} + styles={this.props.styles} + /> + + + { + const newData: ioBroker.GroupObject = Utils.clone(this.props.group) as ioBroker.GroupObject; newData._id = changeShortId(newData._id, name2Id(value)) as ioBroker.ObjectIDs.Group; - } - newData.common.name = value; - props.onChange(newData); - }} - autoComplete="off" - icon={TextFieldsIcon} - styles={props.styles} - /> - - - { - const newData: ioBroker.GroupObject = Utils.clone(props.group) as ioBroker.GroupObject; - newData._id = changeShortId(newData._id, name2Id(value)) as ioBroker.ObjectIDs.Group; - props.onChange(newData); - }} - icon={LocalOfferIcon} - styles={props.styles} - /> - - - - - - { - const newData: ioBroker.GroupObject = Utils.clone(props.group) as ioBroker.GroupObject; - newData.common.desc = value; - props.onChange(newData); - }} - icon={DescriptionIcon} - styles={props.styles} - /> - - - { - const newData: ioBroker.GroupObject = Utils.clone(props.group) as ioBroker.GroupObject; - newData.common.icon = fileBlob; - props.onChange(newData); - }} - previewStyle={props.styles.iconPreview} - icon={ImageIcon} - // classes={props.classes} - /> - - - { - const newData: ioBroker.GroupObject = Utils.clone(props.group) as ioBroker.GroupObject; - newData.common.color = color; - props.onChange(newData); - }} - icon={ColorLensIcon} - style={props.styles.colorPicker} - styles={props.styles} - /> + this.props.onChange(newData); + }} + icon={LocalOfferIcon} + styles={this.props.styles} + /> + + + + + + { + const newData: ioBroker.GroupObject = Utils.clone(this.props.group) as ioBroker.GroupObject; + newData.common.desc = value; + this.props.onChange(newData); + }} + icon={DescriptionIcon} + styles={this.props.styles} + /> + + + { + const newData: ioBroker.GroupObject = Utils.clone(this.props.group) as ioBroker.GroupObject; + newData.common.icon = fileBlob; + this.props.onChange(newData); + }} + previewStyle={this.props.styles.iconPreview} + icon={ImageIcon} + // classes={this.props.classes} + /> + + + { + const newData: ioBroker.GroupObject = Utils.clone(this.props.group) as ioBroker.GroupObject; + newData.common.color = color; + this.props.onChange(newData); + }} + icon={ColorLensIcon} + style={this.props.styles.colorPicker} + styles={this.props.styles} + /> + - - ); + ); - const selectedTab = [mainTab, PermissionsTab(props)][tab]; + const selectedTab = [mainTab, PermissionsTab(this.props)][this.state.tab]; - return ( - { - if (reason !== 'backdropClick' && reason !== 'escapeKeyDown') { - props.onClose(); - } - }} - fullWidth={props.innerWidth < 500} - > - - setTab(newTab)} - > - - - - - { + if (reason !== 'backdropClick' && reason !== 'escapeKeyDown') { + this.props.onClose(); + } }} + fullWidth={this.props.innerWidth < 500} > - {selectedTab} - - - - - - - ); -}; + {selectedTab} + + + + + + + ); + } +} export default GroupEditDialog; diff --git a/packages/admin/src-admin/src/components/Users/UserEditDialog.tsx b/packages/admin/src-admin/src/components/Users/UserEditDialog.tsx index f2e4cf100..517dffb84 100644 --- a/packages/admin/src-admin/src/components/Users/UserEditDialog.tsx +++ b/packages/admin/src-admin/src/components/Users/UserEditDialog.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from 'react'; +import React, { Component } from 'react'; import { Dialog, DialogTitle, DialogContent, DialogActions, Grid2, Button } from '@mui/material'; @@ -52,233 +52,262 @@ interface UserEditDialogProps { getText: (text: ioBroker.StringOrTranslated) => string; styles: Record; } +interface UserEditDialogState { + originalId: string | null; + passwordRepeat: string; +} -const UserEditDialog: React.FC = props => { - const [originalId, setOriginalId] = useState(null); - const [passwordRepeat, setPasswordRepeat] = useState(props.user.common.password); +class UserEditDialog extends Component { + constructor(props: UserEditDialogProps) { + super(props); + this.state = { + originalId: props.user._id, + passwordRepeat: props.user.common.password, + }; + } - useEffect(() => { - setOriginalId(props.user._id); - if (props.isNew) { + componentDidMount(): void { + if (this.props.isNew) { const icon = USER_ICONS[Math.round(Math.random() * (USER_ICONS.length - 1))]; if (icon) { void Utils.getSvg(icon).then((fileBlob: string) => { - const newData: ioBroker.UserObject = Utils.clone(props.user) as ioBroker.UserObject; + const newData: ioBroker.UserObject = Utils.clone(this.props.user) as ioBroker.UserObject; newData.common.icon = fileBlob; - props.onChange(newData); + this.props.onChange(newData); }); } } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [props.user, props.isNew]); + } - const idExists = props.users.find(user => user._id === props.user._id); - const idChanged = props.user._id !== originalId; + render(): React.JSX.Element { + const idExists = this.props.users.find(user => user._id === this.props.user._id); + const idChanged = this.props.user._id !== this.state.originalId; - const getShortId = (_id: string): string => _id.split('.').pop(); + const getShortId = (_id: string): string => _id.split('.').pop(); - const name2Id = (name: string): string => - name - .replace(Utils.FORBIDDEN_CHARS, '_') - .replace(/\s/g, '_') - .replace(/\./g, '_') - .replace(/,/g, '_') - .replace(/__/g, '_') - .replace(/__/g, '_') - .toLowerCase(); + const name2Id = (name: string): string => + name + .replace(Utils.FORBIDDEN_CHARS, '_') + .replace(/\s/g, '_') + .replace(/\./g, '_') + .replace(/,/g, '_') + .replace(/__/g, '_') + .replace(/__/g, '_') + .toLowerCase(); - const changeShortId = (_id: string, short: string): string => { - const idArray = _id.split('.'); - idArray[idArray.length - 1] = short; - return idArray.join('.'); - }; + const changeShortId = (_id: string, short: string): string => { + const idArray = _id.split('.'); + idArray[idArray.length - 1] = short; + return idArray.join('.'); + }; - const description = props.getText(props.user.common.desc); - const name = props.getText(props.user.common.name); + const description = this.props.getText(this.props.user.common.desc); + const name = this.props.getText(this.props.user.common.name); - const errorPassword = AdminUtils.checkPassword((props.user.common as any).password); - const errorPasswordRepeat = AdminUtils.checkPassword((props.user.common as any).password, passwordRepeat); + const errorPassword = AdminUtils.checkPassword((this.props.user.common as any).password); + const errorPasswordRepeat = AdminUtils.checkPassword( + (this.props.user.common as any).password, + this.state.passwordRepeat, + ); - let canSave = props.user._id !== 'system.user.' && !errorPassword && !errorPasswordRepeat; + let canSave = this.props.user._id !== 'system.user.' && !errorPassword && !errorPasswordRepeat; - if (props.isNew && idExists) { - canSave = false; - } else if (idExists && idChanged) { - canSave = false; - } + if (this.props.isNew && idExists) { + canSave = false; + } else if (idExists && idChanged) { + canSave = false; + } - return ( - { - if (reason !== 'backdropClick' && reason !== 'escapeKeyDown') { - props.onClose(); - } - }} - > - {props.t('User parameters')} - { + if (reason !== 'backdropClick' && reason !== 'escapeKeyDown') { + this.props.onClose(); + } }} > - + {this.props.t('User parameters')} + + - - { - const newData: ioBroker.UserObject = Utils.clone(props.user) as ioBroker.UserObject; - if ( - !props.user.common.dontDelete && - name2Id(newData.common.name) === getShortId(newData._id) - ) { + + + { + const newData: ioBroker.UserObject = Utils.clone( + this.props.user, + ) as ioBroker.UserObject; + if ( + !this.props.user.common.dontDelete && + name2Id(newData.common.name) === getShortId(newData._id) + ) { + newData._id = changeShortId( + newData._id, + name2Id(value), + ) as ioBroker.ObjectIDs.User; + } + newData.common.name = value; + this.props.onChange(newData); + }} + autoComplete="new-password" + icon={TextFieldsIcon} + styles={this.props.styles} + /> + + + { + const newData: ioBroker.UserObject = Utils.clone( + this.props.user, + ) as ioBroker.UserObject; newData._id = changeShortId(newData._id, name2Id(value)) as ioBroker.ObjectIDs.User; - } - newData.common.name = value; - props.onChange(newData); - }} - autoComplete="new-password" - icon={TextFieldsIcon} - styles={props.styles} - /> - - - { - const newData: ioBroker.UserObject = Utils.clone(props.user) as ioBroker.UserObject; - newData._id = changeShortId(newData._id, name2Id(value)) as ioBroker.ObjectIDs.User; - props.onChange(newData); - }} - icon={LocalOfferIcon} - styles={props.styles} - /> - - - - - - { - const newData: ioBroker.UserObject = Utils.clone(props.user) as ioBroker.UserObject; - newData.common.desc = value; - props.onChange(newData); - }} - icon={DescriptionIcon} - styles={props.styles} - /> - - - { - const newData: ioBroker.UserObject = Utils.clone(props.user) as ioBroker.UserObject; - newData.common.password = value; - props.onChange(newData); - }} - type="password" - autoComplete="new-password" - icon={VpnKeyIcon} - styles={props.styles} - /> + this.props.onChange(newData); + }} + icon={LocalOfferIcon} + styles={this.props.styles} + /> + + + + + + { + const newData: ioBroker.UserObject = Utils.clone( + this.props.user, + ) as ioBroker.UserObject; + newData.common.desc = value; + this.props.onChange(newData); + }} + icon={DescriptionIcon} + styles={this.props.styles} + /> + + + { + const newData: ioBroker.UserObject = Utils.clone( + this.props.user, + ) as ioBroker.UserObject; + newData.common.password = value; + this.props.onChange(newData); + }} + type="password" + autoComplete="new-password" + icon={VpnKeyIcon} + styles={this.props.styles} + /> + + + this.setState({ passwordRepeat: value })} + type="password" + autoComplete="new-password" + icon={VpnKeyIcon} + styles={this.props.styles} + /> + + + { + const newData: ioBroker.UserObject = Utils.clone( + this.props.user, + ) as ioBroker.UserObject; + newData.common.icon = fileBlob; + this.props.onChange(newData); + }} + previewStyle={this.props.styles.iconPreview} + icon={ImageIcon} + // classes={this.props.classes} + /> + + + { + const newData: ioBroker.UserObject = Utils.clone( + this.props.user, + ) as ioBroker.UserObject; + newData.common.color = color; + this.props.onChange(newData); + }} + icon={ColorLensIcon} + style={this.props.styles.colorPicker} + styles={this.props.styles} + /> + - - setPasswordRepeat(value)} - type="password" - autoComplete="new-password" - icon={VpnKeyIcon} - styles={props.styles} - /> - - - { - const newData: ioBroker.UserObject = Utils.clone(props.user) as ioBroker.UserObject; - newData.common.icon = fileBlob; - props.onChange(newData); - }} - previewStyle={props.styles.iconPreview} - icon={ImageIcon} - // classes={props.classes} - /> - - - { - const newData: ioBroker.UserObject = Utils.clone(props.user) as ioBroker.UserObject; - newData.common.color = color; - props.onChange(newData); - }} - icon={ColorLensIcon} - style={props.styles.colorPicker} - styles={props.styles} - /> - - - - - - - - - ); -}; + + + + + + + ); + } +} export default UserEditDialog; diff --git a/packages/admin/src-admin/src/dialogs/AddInstanceDialog.tsx b/packages/admin/src-admin/src/dialogs/AddInstanceDialog.tsx index 3dc595394..db76aed4f 100644 --- a/packages/admin/src-admin/src/dialogs/AddInstanceDialog.tsx +++ b/packages/admin/src-admin/src/dialogs/AddInstanceDialog.tsx @@ -144,7 +144,7 @@ class AddInstanceDialog extends Component) => { + void this.props.instancesWorker.getObjects().then((instances: Record) => { const instanceNumbers = Object.keys(instances) .filter(id => instances[id]?.common?.name === this.props.adapter) .map(id => id.substring(id.lastIndexOf('.') + 1)); @@ -164,17 +164,20 @@ class AddInstanceDialog extends Component, ); - for (let i = 0; i <= 10; i++) { + for (let i = 0; i <= 100; i++) { if (!this.state.instanceNumbers.includes(i.toString())) { result.push( {i} , ); } + if (result.length > 11) { + break; + } } return result; diff --git a/packages/admin/src-admin/src/dialogs/AutoUpgradeConfigDialog.tsx b/packages/admin/src-admin/src/dialogs/AutoUpgradeConfigDialog.tsx index f2476c770..3111782fb 100644 --- a/packages/admin/src-admin/src/dialogs/AutoUpgradeConfigDialog.tsx +++ b/packages/admin/src-admin/src/dialogs/AutoUpgradeConfigDialog.tsx @@ -1,13 +1,27 @@ import React from 'react'; import { Button, Dialog, DialogActions, DialogContent, DialogTitle, MenuItem, Select, Typography } from '@mui/material'; -import { Close as CloseIcon } from '@mui/icons-material'; - -import { type AdminConnection, I18n, IconCopy as SaveIcon } from '@iobroker/adapter-react-v5'; +import { + Close as CloseIcon, + HorizontalRule, + KeyboardDoubleArrowUp, + North, + VerticalAlignTop, + Save +} from '@mui/icons-material'; + +import { type AdminConnection, I18n } from '@iobroker/adapter-react-v5'; import { InfoBox } from '@foxriver76/iob-component-lib'; import IsVisible from '@/components/IsVisible'; import { AUTO_UPGRADE_OPTIONS_MAPPING, AUTO_UPGRADE_SETTINGS } from '@/helpers/utils'; +export const ICONS: Record = { + none: , + patch: , + minor: , + major: , +}; + interface AutoUpgradeConfigDialogProps { /** Called when user closes dialog */ onClose: () => void; @@ -24,7 +38,7 @@ interface AutoUpgradeConfigDialogState { currentSavedPolicy: ioBroker.AutoUpgradePolicy; /** The current configured auto upgrade policy */ policy: ioBroker.AutoUpgradePolicy; - /** The repositories the config applies for */ + /** The repositories the config apply for */ repositories: string[]; /** If the feature is supported */ supported: boolean; @@ -106,7 +120,7 @@ export default class AutoUpgradeConfigDialog extends React.Component< obj.common.automaticUpgrade = this.state.policy; await this.props.socket.setObject(this.getAdapterId(), obj); - this.setState({ currentSavedPolicy: this.state.policy }); + this.setState({ currentSavedPolicy: this.state.policy }, () => this.props.onClose()); } /** @@ -145,7 +159,10 @@ export default class AutoUpgradeConfigDialog extends React.Component< key={option} value={option} > - {AUTO_UPGRADE_OPTIONS_MAPPING[option]} +
+ {ICONS[option]} + {AUTO_UPGRADE_OPTIONS_MAPPING[option]} +
))} @@ -166,16 +183,14 @@ export default class AutoUpgradeConfigDialog extends React.Component< disabled={this.state.currentSavedPolicy === this.state.policy} color="primary" variant="contained" - startIcon={} + startIcon={} onClick={() => this.save()} > {I18n.t('Save')}
-
{this.state.details?.data?.name || this.props.title}
+ ({ color: theme.palette.secondary.contrastText })} + > + {this.state.details?.data?.name || this.props.title} + {this.props.device.hasDetails ? ( { // This is necessary because: @@ -1079,7 +1081,7 @@ export default class ConfigGeneric< const item = (