diff --git a/.gitignore b/.gitignore index aec9e312e..da3c96fa1 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,5 @@ lerna-debug.log packages/admin/build-backend /packages/admin/admin/custom/ packages/admin/README.md +/packages/jsonConfig/test/testSchema.js +/packages/jsonConfig/test/testSchema.js.map diff --git a/README.md b/README.md index a8459be74..5ab07c815 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,10 @@ The icons may not be reused in other projects without the proper flaticon licens +### **WORK IN PROGRESS** + +- (@GermanBluefox) Added new JsonConfig control: staticInfo + ### 7.3.2 (2024-11-15) - (@GermanBluefox) Some GUI packages were updated. diff --git a/package-lock.json b/package-lock.json index 6fc206981..5ebae8894 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "@alcalzone/release-script-plugin-iobroker": "^3.7.2", "@alcalzone/release-script-plugin-lerna": "^3.7.0", "@alcalzone/release-script-plugin-license": "^3.7.0", - "lerna": "^8.1.8" + "lerna": "^8.1.9" } }, "node_modules/@alcalzone/jsonl-db": { @@ -279,12 +279,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", - "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "license": "MIT", "dependencies": { - "@babel/highlight": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -292,9 +293,9 @@ } }, "node_modules/@babel/compat-data": { - "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==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", + "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", "dev": true, "license": "MIT", "engines": { @@ -302,22 +303,22 @@ } }, "node_modules/@babel/core": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", - "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@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", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -389,12 +390,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", - "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7", + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -404,41 +406,41 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz", + "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", - "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.7", - "@babel/helper-validator-option": "^7.25.7", + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -458,18 +460,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", "dev": true, "license": "MIT", "dependencies": { - "@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", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", "semver": "^6.3.1" }, "engines": { @@ -490,13 +492,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz", + "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-annotate-as-pure": "^7.25.9", "regexpu-core": "^6.1.1", "semver": "^6.3.1" }, @@ -535,43 +537,42 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, "license": "MIT", "dependencies": { - "@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" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -581,22 +582,22 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", - "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", "dev": true, "license": "MIT", "engines": { @@ -604,15 +605,15 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-wrap-function": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -622,15 +623,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz", - "integrity": "sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.7", - "@babel/helper-optimise-call-expression": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -640,55 +641,55 @@ } }, "node_modules/@babel/helper-simple-access": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", + "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", - "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, "license": "MIT", "engines": { @@ -696,29 +697,29 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz", - "integrity": "sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.7", - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", - "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" @@ -728,7 +729,9 @@ "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==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-validator-identifier": "^7.25.7", "chalk": "^2.4.2", @@ -740,12 +743,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", - "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7" + "@babel/types": "^7.26.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -755,14 +758,14 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -772,13 +775,13 @@ } }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -788,13 +791,13 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "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==", + "version": "7.25.9", + "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.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -804,15 +807,15 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", - "@babel/plugin-transform-optional-chaining": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -822,14 +825,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1031,40 +1034,14 @@ "@babel/core": "^7.0.0-0" } }, - "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": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-flow": { - "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz", + "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1074,13 +1051,13 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1090,13 +1067,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1132,13 +1109,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1291,13 +1268,13 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1307,16 +1284,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", "dev": true, "license": "MIT", "dependencies": { - "@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.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1326,15 +1302,15 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-remap-async-to-generator": "^7.25.7" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1344,13 +1320,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", + "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1360,13 +1336,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1376,14 +1352,14 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1393,15 +1369,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", "dev": true, "license": "MIT", "dependencies": { - "@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" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1411,17 +1386,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", "dev": true, "license": "MIT", "dependencies": { - "@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", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", "globals": "^11.1.0" }, "engines": { @@ -1442,14 +1417,14 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/template": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1459,13 +1434,13 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1475,14 +1450,14 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1492,13 +1467,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1508,14 +1483,14 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1525,14 +1500,13 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1542,14 +1516,14 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz", + "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1559,14 +1533,13 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1576,14 +1549,14 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz", + "integrity": "sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-flow": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-flow": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1593,14 +1566,14 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1610,15 +1583,15 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1628,14 +1601,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1645,13 +1617,13 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1661,14 +1633,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1678,13 +1649,13 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1694,14 +1665,14 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1711,15 +1682,15 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz", + "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-simple-access": "^7.25.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-simple-access": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1729,16 +1700,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", "dev": true, "license": "MIT", "dependencies": { - "@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" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1748,14 +1719,14 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1765,14 +1736,14 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1782,13 +1753,13 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1798,14 +1769,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", + "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1815,14 +1785,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1832,16 +1801,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", "dev": true, "license": "MIT", "dependencies": { - "@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.25.7" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1851,14 +1819,14 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-replace-supers": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1868,14 +1836,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1885,15 +1852,14 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1903,13 +1869,13 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1919,14 +1885,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1936,16 +1902,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", "dev": true, "license": "MIT", "dependencies": { - "@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" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1955,13 +1920,13 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1987,13 +1952,13 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", + "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2003,17 +1968,17 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", + "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", "dev": true, "license": "MIT", "dependencies": { - "@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" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2023,13 +1988,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", + "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.25.7" + "@babel/plugin-transform-react-jsx": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2039,14 +2004,14 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", + "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2056,13 +2021,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz", - "integrity": "sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.9", "regenerator-transform": "^0.15.2" }, "engines": { @@ -2072,14 +2037,31 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-reserved-words": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2089,14 +2071,14 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", + "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", @@ -2120,13 +2102,13 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2136,14 +2118,14 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz", - "integrity": "sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2153,13 +2135,13 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2169,13 +2151,13 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2185,13 +2167,13 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2221,13 +2203,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2237,14 +2219,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2254,14 +2236,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2271,14 +2253,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2288,89 +2270,75 @@ } }, "node_modules/@babel/preset-env": { - "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", "dev": true, "license": "MIT", "dependencies": { - "@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/compat-data": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", "@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.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", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@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/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.6", @@ -2396,15 +2364,15 @@ } }, "node_modules/@babel/preset-flow": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.25.7.tgz", - "integrity": "sha512-q2x3g0YHzo/Ohsr51KOYS/BtZMsvkzVd8qEyhZAyTatYdobfgXCuyppTqTuIhdq5kR/P3nyyVvZ6H5dMc4PnCQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.25.9.tgz", + "integrity": "sha512-EASHsAhE+SSlEzJ4bzfusnXSHiU+JfAYzj+jbw2vgQKgq5HrUr8qs+vgtiEL5dOH6sEweI+PNt2D7AqrDSHyqQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-validator-option": "^7.25.7", - "@babel/plugin-transform-flow-strip-types": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-transform-flow-strip-types": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2429,18 +2397,18 @@ } }, "node_modules/@babel/preset-react": { - "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==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.25.9.tgz", + "integrity": "sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==", "dev": true, "license": "MIT", "dependencies": { - "@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" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-transform-react-display-name": "^7.25.9", + "@babel/plugin-transform-react-jsx": "^7.25.9", + "@babel/plugin-transform-react-jsx-development": "^7.25.9", + "@babel/plugin-transform-react-pure-annotations": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2470,9 +2438,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", - "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2482,30 +2450,30 @@ } }, "node_modules/@babel/template": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", - "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", - "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", "license": "MIT", "dependencies": { - "@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", + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2523,14 +2491,13 @@ } }, "node_modules/@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2982,9 +2949,9 @@ } }, "node_modules/@emnapi/core": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.3.0.tgz", - "integrity": "sha512-9hRqVlhwqBqCoToZ3hFcNVqL+uyHV06Y47ax4UB8L6XgVRqYz7MFnfessojo6+5TK89pKwJnpophwjTMOeKI9Q==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.3.1.tgz", + "integrity": "sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==", "dev": true, "license": "MIT", "dependencies": { @@ -2993,16 +2960,16 @@ } }, "node_modules/@emnapi/core/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, "license": "0BSD" }, "node_modules/@emnapi/runtime": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.0.tgz", - "integrity": "sha512-XMBySMuNZs3DM96xcJmLW4EfGnf+uGmFNjzpehMjuX5PLB5j87ar2Zc4e3PVeZ3I5g3tYtAqskB28manlF69Zw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", + "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", "dev": true, "license": "MIT", "dependencies": { @@ -3010,9 +2977,9 @@ } }, "node_modules/@emnapi/runtime/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, "license": "0BSD" }, @@ -3027,9 +2994,9 @@ } }, "node_modules/@emnapi/wasi-threads/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, "license": "0BSD" }, @@ -4155,9 +4122,9 @@ } }, "node_modules/@iobroker/eslint-config": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@iobroker/eslint-config/-/eslint-config-0.1.6.tgz", - "integrity": "sha512-7t3bllV/pD64flqUE96ndPmb3GRlc+gLkLTRT9UEUmHRDFjgalMVbPXNoB+ka129NieMo5HcD23XGuRJQ5VCQg==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@iobroker/eslint-config/-/eslint-config-0.1.7.tgz", + "integrity": "sha512-3/WJV/m7hntUYrTUijcNtG+U5GosVcQiHh3B1j93FxEVD6fq0BbleZ5viWp2dcKbDCTbrt+hXLVP422jLl+ODA==", "dev": true, "peerDependencies": { "@eslint/eslintrc": "^3.1.0", @@ -4392,9 +4359,9 @@ "license": "MIT" }, "node_modules/@iobroker/ws-server": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@iobroker/ws-server/-/ws-server-4.0.1.tgz", - "integrity": "sha512-o9DPX0jM9/KEgXKzXMjY2+D13hBNz1SVTT3RXjcyenHRAY6DNS/hNVEhxSBl29Ed/K7s/GgbnbKlPdzeGQVZyQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@iobroker/ws-server/-/ws-server-4.1.0.tgz", + "integrity": "sha512-m9naIoQtfF2tSfLjodHCgllPDFf0tXnsSt+z4y5AVKLRTsiTYmNM61epEVmbg337lzyFzeI5pgHmi1kogNA15w==", "license": "MIT", "dependencies": { "ws": "^8.18.0" @@ -5400,16 +5367,16 @@ "license": "MIT" }, "node_modules/@lerna/create": { - "version": "8.1.8", - "resolved": "https://registry.npmjs.org/@lerna/create/-/create-8.1.8.tgz", - "integrity": "sha512-wi72R01tgjBjzG2kjRyTHl4yCTKDfDMIXRyKz9E/FBa9SkFvUOAE4bdyY9MhEsRZmSWL7+CYE8Flv/HScRpBbA==", + "version": "8.1.9", + "resolved": "https://registry.npmjs.org/@lerna/create/-/create-8.1.9.tgz", + "integrity": "sha512-DPnl5lPX4v49eVxEbJnAizrpMdMTBz1qykZrAbBul9rfgk531v8oAt+Pm6O/rpAleRombNM7FJb5rYGzBJatOQ==", "dev": true, "license": "MIT", "dependencies": { "@npmcli/arborist": "7.5.4", "@npmcli/package-json": "5.2.0", "@npmcli/run-script": "8.1.0", - "@nx/devkit": ">=17.1.2 < 20", + "@nx/devkit": ">=17.1.2 < 21", "@octokit/plugin-enterprise-rest": "6.0.1", "@octokit/rest": "19.0.11", "aproba": "2.0.0", @@ -5422,7 +5389,7 @@ "console-control-strings": "^1.1.0", "conventional-changelog-core": "5.0.1", "conventional-recommended-bump": "7.0.1", - "cosmiconfig": "^8.2.0", + "cosmiconfig": "9.0.0", "dedent": "1.5.3", "execa": "5.0.0", "fs-extra": "^11.2.0", @@ -5448,7 +5415,7 @@ "npm-package-arg": "11.0.2", "npm-packlist": "8.0.2", "npm-registry-fetch": "^17.1.0", - "nx": ">=17.1.2 < 20", + "nx": ">=17.1.2 < 21", "p-map": "4.0.0", "p-map-series": "2.1.0", "p-queue": "6.6.2", @@ -5536,16 +5503,16 @@ "license": "MIT" }, "node_modules/@lerna/create/node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "license": "MIT", "dependencies": { + "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "parse-json": "^5.2.0" }, "engines": { "node": ">=14" @@ -5709,9 +5676,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.5.tgz", - "integrity": "sha512-3J96098GrC95XsLw/TpGNMxhUOnoG9NZ/17Pfk1CrJj+4rcuolsF2RdF3XAFTu/3a/A+5ouxlSIykzYz6Ee87g==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.7.tgz", + "integrity": "sha512-POuIBi80BZBogQkG4PQKIGwy4QFwB+kOr+OI4k7Znh7LqMAIhwB9OC00l6M+w1GrZJYj3T8R5WX8G6QAIvoVEw==", "license": "MIT", "funding": { "type": "opencollective", @@ -5719,12 +5686,12 @@ } }, "node_modules/@mui/icons-material": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.1.5.tgz", - "integrity": "sha512-SbxFtO5I4cXfvhjAMgGib/t2lQUzcEzcDFYiRHRufZUeMMeXuoKaGsptfwAHTepYkv0VqcCwvxtvtWbpZLAbjQ==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.1.7.tgz", + "integrity": "sha512-RGzkeHNArIVy5ZQ12bq/8VYNeICEyngngsFskTJ/2hYKhIeIII3iRGtaZaSvLpXh7h3Fg3VKTulT+QU0w5K4XQ==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.7" + "@babel/runtime": "^7.26.0" }, "engines": { "node": ">=14.0.0" @@ -5734,7 +5701,7 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@mui/material": "^6.1.5", + "@mui/material": "^6.1.7", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, @@ -5745,16 +5712,16 @@ } }, "node_modules/@mui/material": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.5.tgz", - "integrity": "sha512-rhaxC7LnlOG8zIVYv7BycNbWkC5dlm9A/tcDUp0CuwA7Zf9B9JP6M3rr50cNKxI7Z0GIUesAT86ceVm44quwnQ==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.7.tgz", + "integrity": "sha512-KsjujQL/A2hLd1PV3QboF+W6SSL5QqH6ZlSuQoeYz9r69+TnyBFIevbYLxdjJcJmGBjigL5pfpn7hTGop+vhSg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/core-downloads-tracker": "^6.1.5", - "@mui/system": "^6.1.5", - "@mui/types": "^7.2.18", - "@mui/utils": "^6.1.5", + "@babel/runtime": "^7.26.0", + "@mui/core-downloads-tracker": "^6.1.7", + "@mui/system": "^6.1.7", + "@mui/types": "^7.2.19", + "@mui/utils": "^6.1.7", "@popperjs/core": "^2.11.8", "@types/react-transition-group": "^4.4.11", "clsx": "^2.1.1", @@ -5773,7 +5740,7 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@mui/material-pigment-css": "^6.1.5", + "@mui/material-pigment-css": "^6.1.7", "@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" @@ -5800,13 +5767,13 @@ "license": "MIT" }, "node_modules/@mui/private-theming": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.1.5.tgz", - "integrity": "sha512-FJqweqEXk0KdtTho9C2h6JEKXsOT7MAVH2Uj3N5oIqs6YKxnwBn2/zL2QuYYEtj5OJ87rEUnCfFic6ldClvzJw==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.1.7.tgz", + "integrity": "sha512-uLbfUSsug5K0LVkv0PI6Flste3le8+6WSL2omdTiYde93P89Qr7pKr8TA6d2yXfr+Bm+SvD8/fGnkaRwFkryuQ==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/utils": "^6.1.5", + "@babel/runtime": "^7.26.0", + "@mui/utils": "^6.1.7", "prop-types": "^15.8.1" }, "engines": { @@ -5827,12 +5794,12 @@ } }, "node_modules/@mui/styled-engine": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.1.5.tgz", - "integrity": "sha512-tiyWzMkHeWlOoE6AqomWvYvdml8Nv5k5T+LDwOiwHEawx8P9Lyja6ZwWPU6xljwPXYYPT2KBp1XvMly7dsK46A==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.1.7.tgz", + "integrity": "sha512-Ou4CxN7MQmwrfG1Pu6EYjPgPChQXxPDJrwgizLXlRPOad5qAq4gYXRuzrGQ2DfGjjwmJhjI8T6A0SeapAZPGig==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.7", + "@babel/runtime": "^7.26.0", "@emotion/cache": "^11.13.1", "@emotion/serialize": "^1.3.2", "@emotion/sheet": "^1.4.0", @@ -5861,16 +5828,16 @@ } }, "node_modules/@mui/system": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.1.5.tgz", - "integrity": "sha512-vPM9ocQ8qquRDByTG3XF/wfYTL7IWL/20EiiKqByLDps8wOmbrDG9rVznSE3ZbcjFCFfMRMhtxvN92bwe/63SA==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.1.7.tgz", + "integrity": "sha512-qbMGgcC/FodpuRSfjXlEDdbNQaW++eATh0vNBcPUv2/YXSpReoOpoT9FhogxEBNks+aQViDXBRZKh6HX2fVmwg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/private-theming": "^6.1.5", - "@mui/styled-engine": "^6.1.5", - "@mui/types": "^7.2.18", - "@mui/utils": "^6.1.5", + "@babel/runtime": "^7.26.0", + "@mui/private-theming": "^6.1.7", + "@mui/styled-engine": "^6.1.7", + "@mui/types": "^7.2.19", + "@mui/utils": "^6.1.7", "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1" @@ -5901,9 +5868,9 @@ } }, "node_modules/@mui/types": { - "version": "7.2.18", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.18.tgz", - "integrity": "sha512-uvK9dWeyCJl/3ocVnTOS6nlji/Knj8/tVqVX03UVTpdmTJYu/s4jtDd9Kvv0nRGE0CUSNW1UYAci7PYypjealg==", + "version": "7.2.19", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.19.tgz", + "integrity": "sha512-6XpZEM/Q3epK9RN8ENoXuygnqUQxE+siN/6rGRi2iwJPgBUR25mphYQ9ZI87plGh58YoZ5pp40bFvKYOCDJ3tA==", "license": "MIT", "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" @@ -5915,13 +5882,13 @@ } }, "node_modules/@mui/utils": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.5.tgz", - "integrity": "sha512-vp2WfNDY+IbKUIGg+eqX1Ry4t/BilMjzp6p9xO1rfqpYjH1mj8coQxxDfKxcQLzBQkmBJjymjoGOak5VUYwXug==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.7.tgz", + "integrity": "sha512-Gr7cRZxBoZ0BIa3Xqf/2YaUrBLyNPJvXPQH3OsD9WMZukI/TutibbQBVqLYpgqJn8pKSjbD50Yq2auG0wI1xOw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/types": "^7.2.18", + "@babel/runtime": "^7.26.0", + "@mui/types": "^7.2.19", "@types/prop-types": "^15.7.13", "clsx": "^2.1.1", "prop-types": "^15.8.1", @@ -6744,38 +6711,13 @@ "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/@nrwl/devkit": { - "version": "19.8.4", - "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-19.8.4.tgz", - "integrity": "sha512-OoIqDjj2mWzLs3aSF6w5OiC2xywYi/jBxHc7t7Lyi56Vc4dQq8vJMELa9WtG6qH0k05fF7N+jAoKlfvLgbbEFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nx/devkit": "19.8.4" - } - }, - "node_modules/@nrwl/tao": { - "version": "19.8.4", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-19.8.4.tgz", - "integrity": "sha512-03/+QZ4/6HmKbEmvzCutLI1XIclBspNYtiVHmGPRWuwhnZViqYfnyl8J7RWVdFEoKKA5fhJqpg7e28aGuoMBvQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "nx": "19.8.4", - "tslib": "^2.3.0" - }, - "bin": { - "tao": "index.js" - } - }, "node_modules/@nx/devkit": { - "version": "19.8.4", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-19.8.4.tgz", - "integrity": "sha512-FPFT8gVDFRSEmU0n7nRkT4Rnqy7OMznfPXLfDZtVuzEi5Cl6ftG3UBUvCgJcJFCYJVAZAUuv6vRSRarHd51XFQ==", + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.1.2.tgz", + "integrity": "sha512-MTEWiEST7DhzZ2QmrixLnHfYVDZk7QN9omLL8m+5Etcn/3ZKa1aAo9Amd2MkUM+0MPoTKnxoGdw0fQUpAy21Mg==", "dev": true, "license": "MIT", "dependencies": { - "@nrwl/devkit": "19.8.4", "ejs": "^3.1.7", "enquirer": "~2.3.6", "ignore": "^5.0.4", @@ -6786,7 +6728,7 @@ "yargs-parser": "21.1.1" }, "peerDependencies": { - "nx": ">= 17 <= 20" + "nx": ">= 19 <= 21" } }, "node_modules/@nx/devkit/node_modules/brace-expansion": { @@ -6829,9 +6771,9 @@ } }, "node_modules/@nx/nx-darwin-arm64": { - "version": "19.8.4", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.8.4.tgz", - "integrity": "sha512-mbSGt63hYcVCSQ54kpHl0lFqr5CsbkGJ4L3liWE30Da7vXZJwUBr9f+b9DnQ64IZzlu6vAhNcaiYQXa9lAk0yQ==", + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.1.2.tgz", + "integrity": "sha512-PJ91TQhd28kitDBubKUOXMYvrtSDrG+rr8MsIe9cHo1CvU9smcGVBwuHBxniq0DXsyOX/5GL6ngq7hjN2nQ3XQ==", "cpu": [ "arm64" ], @@ -6846,9 +6788,9 @@ } }, "node_modules/@nx/nx-darwin-x64": { - "version": "19.8.4", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-19.8.4.tgz", - "integrity": "sha512-lTcXUCXNvqHdLmrNCOyDF+u6pDx209Ew7nSR47sQPvkycIHYi0gvgk0yndFn1Swah0lP4OxWg7rzAfmOlZd6ew==", + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.1.2.tgz", + "integrity": "sha512-1fopau7nxIhTF26vDTIzMxl15AtW4FvUSdy+r1mNRKrKyjjpqnlu00SQBW7JzGV0agDD1B/61yYei5Q2aMOt7Q==", "cpu": [ "x64" ], @@ -6863,9 +6805,9 @@ } }, "node_modules/@nx/nx-freebsd-x64": { - "version": "19.8.4", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.8.4.tgz", - "integrity": "sha512-4BUplOxPZeUwlUNfzHHMmebNVgDFW/jNX6TWRS+jINwOHnpWLkLFAXu27G80/S3OaniVCzEQklXO9b+1UsdgXw==", + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.1.2.tgz", + "integrity": "sha512-55YgIp3v4zz7xMzJO93dtglbOTER2XdS6jrCt8GbKaWGFl5drRrBoNGONtiGNU7C3hLx1VsorbynCkJT18PjKQ==", "cpu": [ "x64" ], @@ -6880,9 +6822,9 @@ } }, "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "19.8.4", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.8.4.tgz", - "integrity": "sha512-Wahul8oz9huEm/Jv3wud5IGWdZxkGG4tdJm9i5TV5wxfUMAWbKU9v2nzZZins452UYESWvwvDkiuBPZqSto3qw==", + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.1.2.tgz", + "integrity": "sha512-sMhNA8uAV43UYVEXEa8TZ8Fjpom4CGq1umTptEGOF4TTtdNn2AUBreg+0bVODM8MMSzRWGI1VbkZzHESnAPwqw==", "cpu": [ "arm" ], @@ -6897,9 +6839,9 @@ } }, "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "19.8.4", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.8.4.tgz", - "integrity": "sha512-L0RVCZkNAtZDplLT7uJV7M9cXxq2Fxw+8ex3eb9XSp7eyLeFO21T0R6vTouJ42E/PEvGApCAcyGqtnyPNMZFfw==", + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.1.2.tgz", + "integrity": "sha512-bsevarNHglaYLmIvPNQOdHrBnBgaW3EOUM0flwaXdWuZbL1bWx8GoVwHp9yJpZOAOfIF/Nhq5iTpaZB2nYFrAA==", "cpu": [ "arm64" ], @@ -6914,9 +6856,9 @@ } }, "node_modules/@nx/nx-linux-arm64-musl": { - "version": "19.8.4", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.8.4.tgz", - "integrity": "sha512-0q8r8I8WCsY3xowDI2j109SCUSkFns/BJ40aCfRh9hhrtaIIc5qXUw2YFTjxUZNcRJXx9j9+hTe9jBkUSIGvCw==", + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.1.2.tgz", + "integrity": "sha512-GFZTptkhZPL/iZ3tYDmspIcPEaXyy/L/o59gyp33GoFAAyDhiXIF7J1Lz81Xn8VKrX6TvEY8/9qSh86pb7qzDQ==", "cpu": [ "arm64" ], @@ -6931,9 +6873,9 @@ } }, "node_modules/@nx/nx-linux-x64-gnu": { - "version": "19.8.4", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.8.4.tgz", - "integrity": "sha512-XcRBNe0ws7KB0PMcUlpQqzzjjxMP8VdqirBz7CfB2XQ8xKmP3370p0cDvqs/4oKDHK4PCkmvVFX60tzakutylA==", + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.1.2.tgz", + "integrity": "sha512-yqEW/iglKT4d9lgfnwSNhmDzPxCkRhtdmZqOYpGDM0eZFwYwJF+WRGjW8xIqMj8PA1yrGItzXZOmyFjJqHAF2w==", "cpu": [ "x64" ], @@ -6948,9 +6890,9 @@ } }, "node_modules/@nx/nx-linux-x64-musl": { - "version": "19.8.4", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.8.4.tgz", - "integrity": "sha512-JB4tAuZBCF0yqSnKF3pHXa0b7LA3ebi3Bw08QmMr//ON4aU+eXURGBuj9XvULD2prY+gpBrvf+MsG1XJAHL6Zg==", + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.1.2.tgz", + "integrity": "sha512-SP6PpWT4cQVrC4WJQdpfADrYJQzkbhgmcGleWbpr7II1HJgOsAcvoDwQGpPQX+3Wo+VBiNecvUAOzacMQkXPGw==", "cpu": [ "x64" ], @@ -6965,9 +6907,9 @@ } }, "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "19.8.4", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.8.4.tgz", - "integrity": "sha512-WvQag/pN9ofRWRDvOZxj3jvJoTetlvV1uyirnDrhupRgi+Fj67OlGGt2zVUHaXFGEa1MfCEG6Vhk6152m4KyaQ==", + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.1.2.tgz", + "integrity": "sha512-JZQx9gr39LY3D7uleiXlpxUsavuOrOQNBocwKHkAMnykaT/e1VCxTnm/hk+2b4foWwfURTqoRiFEba70iiCdYg==", "cpu": [ "arm64" ], @@ -6982,9 +6924,9 @@ } }, "node_modules/@nx/nx-win32-x64-msvc": { - "version": "19.8.4", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.8.4.tgz", - "integrity": "sha512-//JntLrN3L7WL/WgP3D0FE34caYTPcG/GIMBguC9w7YDyTlEikLgLbobjdCPz+2f9OWGvIZbJgGmtHNjnETM/g==", + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.1.2.tgz", + "integrity": "sha512-6GmT8iswDiCvJaCtW9DpWeAQmLS/kfAuRLYBisfzlONuLPaDdjhgVIxZBqqUSFfclwcVz+NhIOGvdr0aGFZCtQ==", "cpu": [ "x64" ], @@ -7502,110 +7444,110 @@ "license": "MIT" }, "node_modules/@sentry-internal/browser-utils": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.35.0.tgz", - "integrity": "sha512-uj9nwERm7HIS13f/Q52hF/NUS5Al8Ma6jkgpfYGeppYvU0uSjPkwMogtqoJQNbOoZg973tV8qUScbcWY616wNA==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.38.0.tgz", + "integrity": "sha512-5QMVcssrAcmjKT0NdFYcX0b0wwZovGAZ9L2GajErXtHkBenjI2sgR2+5J7n+QZGuk2SC1qhGmT1O9i3p3UEwew==", "license": "MIT", "dependencies": { - "@sentry/core": "8.35.0", - "@sentry/types": "8.35.0", - "@sentry/utils": "8.35.0" + "@sentry/core": "8.38.0", + "@sentry/types": "8.38.0", + "@sentry/utils": "8.38.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/feedback": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.35.0.tgz", - "integrity": "sha512-7bjSaUhL0bDArozre6EiIhhdWdT/1AWNWBC1Wc5w1IxEi5xF7nvF/FfvjQYrONQzZAI3HRxc45J2qhLUzHBmoQ==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.38.0.tgz", + "integrity": "sha512-AW5HCCAlc3T1jcSuNhbFVNO1CHyJ5g5tsGKEP4VKgu+D1Gg2kZ5S2eFatLBUP/BD5JYb1A7p6XPuzYp1XfMq0A==", "license": "MIT", "dependencies": { - "@sentry/core": "8.35.0", - "@sentry/types": "8.35.0", - "@sentry/utils": "8.35.0" + "@sentry/core": "8.38.0", + "@sentry/types": "8.38.0", + "@sentry/utils": "8.38.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/replay": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.35.0.tgz", - "integrity": "sha512-3wkW03vXYMyWtTLxl9yrtkV+qxbnKFgfASdoGWhXzfLjycgT6o4/04eb3Gn71q9aXqRwH17ISVQbVswnRqMcmA==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.38.0.tgz", + "integrity": "sha512-mQPShKnIab7oKwkwrRxP/D8fZYHSkDY+cvqORzgi+wAwgnunytJQjz9g6Ww2lJu98rHEkr5SH4V4rs6PZYZmnQ==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "8.35.0", - "@sentry/core": "8.35.0", - "@sentry/types": "8.35.0", - "@sentry/utils": "8.35.0" + "@sentry-internal/browser-utils": "8.38.0", + "@sentry/core": "8.38.0", + "@sentry/types": "8.38.0", + "@sentry/utils": "8.38.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/replay-canvas": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.35.0.tgz", - "integrity": "sha512-TUrH6Piv19kvHIiRyIuapLdnuwxk/Un/l1WDCQfq7mK9p1Pac0FkQ7Uufjp6zY3lyhDDZQ8qvCS4ioCMibCwQg==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.38.0.tgz", + "integrity": "sha512-OxmlWzK9J8mRM+KxdSnQ5xuxq+p7TiBzTz70FT3HltxmeugvDkyp6803UcFqHOPHR35OYeVLOalym+FmvNn9kw==", "license": "MIT", "dependencies": { - "@sentry-internal/replay": "8.35.0", - "@sentry/core": "8.35.0", - "@sentry/types": "8.35.0", - "@sentry/utils": "8.35.0" + "@sentry-internal/replay": "8.38.0", + "@sentry/core": "8.38.0", + "@sentry/types": "8.38.0", + "@sentry/utils": "8.38.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/browser": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.35.0.tgz", - "integrity": "sha512-WHfI+NoZzpCsmIvtr6ChOe7yWPLQyMchPnVhY3Z4UeC70bkYNdKcoj/4XZbX3m0D8+71JAsm0mJ9s9OC3Ue6MQ==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.38.0.tgz", + "integrity": "sha512-AZR+b0EteNZEGv6JSdBD22S9VhQ7nrljKsSnzxobBULf3BpwmhmCzTbDrqWszKDAIDYmL+yQJIR2glxbknneWQ==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "8.35.0", - "@sentry-internal/feedback": "8.35.0", - "@sentry-internal/replay": "8.35.0", - "@sentry-internal/replay-canvas": "8.35.0", - "@sentry/core": "8.35.0", - "@sentry/types": "8.35.0", - "@sentry/utils": "8.35.0" + "@sentry-internal/browser-utils": "8.38.0", + "@sentry-internal/feedback": "8.38.0", + "@sentry-internal/replay": "8.38.0", + "@sentry-internal/replay-canvas": "8.38.0", + "@sentry/core": "8.38.0", + "@sentry/types": "8.38.0", + "@sentry/utils": "8.38.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/core": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.35.0.tgz", - "integrity": "sha512-Ci0Nmtw5ETWLqQJGY4dyF+iWh7PWKy6k303fCEoEmqj2czDrKJCp7yHBNV0XYbo00prj2ZTbCr6I7albYiyONA==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.38.0.tgz", + "integrity": "sha512-sGD+5TEHU9G7X7zpyaoJxpOtwjTjvOd1f/MKBrWW2vf9UbYK+GUJrOzLhMoSWp/pHSYgvObkJkDb/HwieQjvhQ==", "license": "MIT", "dependencies": { - "@sentry/types": "8.35.0", - "@sentry/utils": "8.35.0" + "@sentry/types": "8.38.0", + "@sentry/utils": "8.38.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/types": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.35.0.tgz", - "integrity": "sha512-AVEZjb16MlYPifiDDvJ19dPQyDn0jlrtC1PHs6ZKO+Rzyz+2EX2BRdszvanqArldexPoU1p5Bn2w81XZNXThBA==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.38.0.tgz", + "integrity": "sha512-fP5H9ZX01W4Z/EYctk3mkSHi7d06cLcX2/UWqwdWbyPWI+pL2QpUPICeO/C+8SnmYx//wFj3qWDhyPCh1PdFAA==", "license": "MIT", "engines": { "node": ">=14.18" } }, "node_modules/@sentry/utils": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.35.0.tgz", - "integrity": "sha512-MdMb6+uXjqND7qIPWhulubpSeHzia6HtxeJa8jYI09OCvIcmNGPydv/Gx/LZBwosfMHrLdTWcFH7Y7aCxrq7cg==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.38.0.tgz", + "integrity": "sha512-3X7MgIKIx+2q5Al7QkhaRB4wV6DvzYsaeIwdqKUzGLuRjXmNgJrLoU87TAwQRmZ6Wr3IoEpThZZMNrzYPXxArw==", "license": "MIT", "dependencies": { - "@sentry/types": "8.35.0" + "@sentry/types": "8.38.0" }, "engines": { "node": ">=14.18" @@ -8131,9 +8073,9 @@ } }, "node_modules/@tybys/wasm-util/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, "license": "0BSD" }, @@ -8549,9 +8491,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.8.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.1.tgz", - "integrity": "sha512-k6Gi8Yyo8EtrNtkHXutUu2corfDf9su95VYVP10aGYMMROM6SAItZi0w1XszA6RtWTHSVp5OeFof37w0IEqCQg==", + "version": "22.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", + "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9635,9 +9577,9 @@ "license": "BSD-2-Clause" }, "node_modules/@yarnpkg/parsers": { - "version": "3.0.0-rc.46", - "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", - "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.2.tgz", + "integrity": "sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -9645,7 +9587,7 @@ "tslib": "^2.4.0" }, "engines": { - "node": ">=14.15.0" + "node": ">=18.12.0" } }, "node_modules/@yarnpkg/parsers/node_modules/argparse": { @@ -9680,9 +9622,9 @@ "license": "BSD-3-Clause" }, "node_modules/@yarnpkg/parsers/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, "license": "0BSD" }, @@ -10038,6 +9980,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^1.9.0" @@ -12413,6 +12356,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", @@ -12427,6 +12371,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.8.0" @@ -13178,32 +13123,23 @@ } }, "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz", + "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==", "license": "MIT", "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", + "bytes": "3.1.2", + "compressible": "~2.0.18", "debug": "2.6.9", + "negotiator": "~0.6.4", "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", + "safe-buffer": "5.2.1", "vary": "~1.1.2" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -13219,6 +13155,35 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -22988,9 +22953,9 @@ } }, "node_modules/cronstrue": { - "version": "2.50.0", - "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.50.0.tgz", - "integrity": "sha512-ULYhWIonJzlScCCQrPUG5uMXzXxSixty4djud9SS37DoNxDdkeRocxzHuAo4ImRBUK+mAuU5X9TSwEDccnnuPg==", + "version": "2.51.0", + "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.51.0.tgz", + "integrity": "sha512-7EG9VaZZ5SRbZ7m25dmP6xaS0qe9ay6wywMskFOU/lMDKa+3gZr2oeT5OUfXwRP/Bcj8wxdYJ65AHU70CI3tsw==", "license": "MIT", "bin": { "cronstrue": "bin/cli.js" @@ -24586,13 +24551,13 @@ } }, "node_modules/dotenv-expand": { - "version": "11.0.6", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", - "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==", + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "dotenv": "^16.4.4" + "dotenv": "^16.4.5" }, "engines": { "node": ">=12" @@ -27143,21 +27108,21 @@ } }, "node_modules/file-selector": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", - "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.0.tgz", + "integrity": "sha512-ZuXAqGePcSPz4JuerOY06Dzzq0hrmQ6VGoXVzGyFI1npeOfBgqGIKKpznfYWRkSLJlXutkqVC5WvGZtkFVhu9Q==", "license": "MIT", "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.7.0" }, "engines": { "node": ">= 12" } }, "node_modules/file-selector/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/file-stream-rotator": { @@ -28738,6 +28703,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -34506,17 +34472,17 @@ } }, "node_modules/lerna": { - "version": "8.1.8", - "resolved": "https://registry.npmjs.org/lerna/-/lerna-8.1.8.tgz", - "integrity": "sha512-Rmo5ShMx73xM2CUcRixjmpZIXB7ZFlWEul1YvJyx/rH4onAwDHtUGD7Rx4NZYL8QSRiQHroglM2Oyq+WqA4BYg==", + "version": "8.1.9", + "resolved": "https://registry.npmjs.org/lerna/-/lerna-8.1.9.tgz", + "integrity": "sha512-ZRFlRUBB2obm+GkbTR7EbgTMuAdni6iwtTQTMy7LIrQ4UInG44LyfRepljtgUxh4HA0ltzsvWfPkd5J1DKGCeQ==", "dev": true, "license": "MIT", "dependencies": { - "@lerna/create": "8.1.8", + "@lerna/create": "8.1.9", "@npmcli/arborist": "7.5.4", "@npmcli/package-json": "5.2.0", "@npmcli/run-script": "8.1.0", - "@nx/devkit": ">=17.1.2 < 20", + "@nx/devkit": ">=17.1.2 < 21", "@octokit/plugin-enterprise-rest": "6.0.1", "@octokit/rest": "19.0.11", "aproba": "2.0.0", @@ -34530,7 +34496,7 @@ "conventional-changelog-angular": "7.0.0", "conventional-changelog-core": "5.0.1", "conventional-recommended-bump": "7.0.1", - "cosmiconfig": "^8.2.0", + "cosmiconfig": "9.0.0", "dedent": "1.5.3", "envinfo": "7.13.0", "execa": "5.0.0", @@ -34561,7 +34527,7 @@ "npm-package-arg": "11.0.2", "npm-packlist": "8.0.2", "npm-registry-fetch": "^17.1.0", - "nx": ">=17.1.2 < 20", + "nx": ">=17.1.2 < 21", "p-map": "4.0.0", "p-map-series": "2.1.0", "p-pipe": "3.1.0", @@ -34655,16 +34621,16 @@ "license": "MIT" }, "node_modules/lerna/node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "license": "MIT", "dependencies": { + "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "parse-json": "^5.2.0" }, "engines": { "node": ">=14" @@ -34975,9 +34941,9 @@ } }, "node_modules/libnpmpublish/node_modules/ci-info": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", - "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz", + "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==", "dev": true, "funding": [ { @@ -37988,17 +37954,16 @@ "license": "MIT" }, "node_modules/nx": { - "version": "19.8.4", - "resolved": "https://registry.npmjs.org/nx/-/nx-19.8.4.tgz", - "integrity": "sha512-fc833c3UKo6kuoG4z0kSKet17yWym3VzcQ+yPWYspxxxd8GFVVk42+9wieyVQDi9YqtKZQ6PdQfSEPm59/M7SA==", + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/nx/-/nx-20.1.2.tgz", + "integrity": "sha512-CvjmuQmI0RWLYZxRSIgQZmzsQv6dPp9oI0YZE3L1dagBPfTf5Cun65I0GLt7bdkDnVx2PGYkDbIoJSv2/V+83Q==", "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { "@napi-rs/wasm-runtime": "0.2.4", - "@nrwl/tao": "19.8.4", "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.0-rc.46", + "@yarnpkg/parsers": "3.0.2", "@zkochan/js-yaml": "0.0.7", "axios": "^1.7.4", "chalk": "^4.1.0", @@ -38022,7 +37987,6 @@ "ora": "5.3.0", "semver": "^7.5.3", "string-width": "^4.2.3", - "strong-log-transformer": "^2.1.0", "tar-stream": "~2.2.0", "tmp": "~0.2.1", "tsconfig-paths": "^4.1.2", @@ -38035,16 +37999,16 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "19.8.4", - "@nx/nx-darwin-x64": "19.8.4", - "@nx/nx-freebsd-x64": "19.8.4", - "@nx/nx-linux-arm-gnueabihf": "19.8.4", - "@nx/nx-linux-arm64-gnu": "19.8.4", - "@nx/nx-linux-arm64-musl": "19.8.4", - "@nx/nx-linux-x64-gnu": "19.8.4", - "@nx/nx-linux-x64-musl": "19.8.4", - "@nx/nx-win32-arm64-msvc": "19.8.4", - "@nx/nx-win32-x64-msvc": "19.8.4" + "@nx/nx-darwin-arm64": "20.1.2", + "@nx/nx-darwin-x64": "20.1.2", + "@nx/nx-freebsd-x64": "20.1.2", + "@nx/nx-linux-arm-gnueabihf": "20.1.2", + "@nx/nx-linux-arm64-gnu": "20.1.2", + "@nx/nx-linux-arm64-musl": "20.1.2", + "@nx/nx-linux-x64-gnu": "20.1.2", + "@nx/nx-linux-x64-musl": "20.1.2", + "@nx/nx-win32-arm64-msvc": "20.1.2", + "@nx/nx-win32-x64-msvc": "20.1.2" }, "peerDependencies": { "@swc-node/register": "^1.8.0", @@ -42328,13 +42292,13 @@ } }, "node_modules/react-dropzone": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.10.tgz", - "integrity": "sha512-Y98LOCYxGO2jOFWREeKJlL7gbrHcOlTBp+9DCM1dh9XQ8+P/8ThhZT7kFb05C+bPcTXq/rixpU+5+LzwYrFLUw==", + "version": "14.3.5", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.3.5.tgz", + "integrity": "sha512-9nDUaEEpqZLOz5v5SUcFA0CjM4vq8YbqO0WRls+EYT7+DvxUdzDPKNCPLqGfj3YL9MsniCLCD4RFA6M95V6KMQ==", "license": "MIT", "dependencies": { - "attr-accept": "^2.2.2", - "file-selector": "^0.6.0", + "attr-accept": "^2.2.4", + "file-selector": "^2.1.0", "prop-types": "^15.8.1" }, "engines": { @@ -42371,15 +42335,15 @@ } }, "node_modules/react-inlinesvg": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/react-inlinesvg/-/react-inlinesvg-4.1.4.tgz", - "integrity": "sha512-V7x3YGqG7LNeHpsIx90HDa2qhYCOPkzjIMToPWALyvOTI3kzicKF2O2PNZDaVqAVhwRbijLIUoQN5STleTO2rg==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/react-inlinesvg/-/react-inlinesvg-4.1.5.tgz", + "integrity": "sha512-DcCnmHhpKAUNp6iLPEEB2HJP3simDlyiy8JPZ1DwGCynrQQGQD04GJTFtai8JK8vRhCmoiBV6hSgj31D42Z3Lg==", "license": "MIT", "dependencies": { "react-from-dom": "^0.7.3" }, "peerDependencies": { - "react": "16.8 - 18" + "react": "16.8 - 19" } }, "node_modules/react-is": { @@ -47527,6 +47491,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^3.0.0" @@ -48341,15 +48306,6 @@ "license": "MIT", "peer": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -52006,26 +51962,26 @@ "@iobroker/js-controller-common-db": "^6.0.11", "@iobroker/socket-client": "^3.1.2", "@iobroker/types": "^6.0.11", - "@mui/icons-material": "^6.1.5", - "@mui/material": "^6.1.5", - "@sentry/browser": "^8.35.0", - "cronstrue": "^2.50.0", + "@mui/icons-material": "^6.1.7", + "@mui/material": "^6.1.7", + "@sentry/browser": "^8.38.0", + "cronstrue": "^2.51.0", "react-color": "^2.19.3", "react-colorful": "^5.6.1", "react-cropper": "^2.3.3", - "react-dropzone": "^14.2.10", - "react-inlinesvg": "^4.1.4" + "react-dropzone": "^14.3.5", + "react-inlinesvg": "^4.1.5" }, "devDependencies": { - "@babel/core": "^7.25.7", + "@babel/core": "^7.26.0", "@babel/plugin-proposal-class-properties": "^7.18.6", - "@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", - "@iobroker/eslint-config": "^0.1.6", - "@types/node": "^22.7.5", - "@types/react": "^18.3.11", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.26.0", + "@babel/preset-flow": "^7.25.9", + "@babel/preset-react": "^7.25.9", + "@iobroker/eslint-config": "^0.1.7", + "@types/node": "^22.9.0", + "@types/react": "^18.3.12", "@types/react-color": "^3.0.12", "ajv": "^8.17.1", "ts-node": "^10.9.2", @@ -52080,23 +52036,19 @@ "@iobroker/socket-classes": "^1.6.1", "@iobroker/webserver": "^1.0.6", "@iobroker/ws": "^2.0.0", - "@iobroker/ws-server": "4.0.1", + "@iobroker/ws-server": "4.1.0", "ajv": "^8.17.1", "archiver": "^7.0.1", - "axios": "^1.7.7", "body-parser": "^1.20.3", - "compression": "^1.7.4", + "compression": "^1.7.5", "connect-flash": "^0.1.1", - "cookie-parser": "^1.4.7", "express": "^4.21.1", "express-fileupload": "^1.5.1", "express-session": "^1.18.1", "json5": "^2.2.3", "mime": "^3.0.0", - "passport": "^0.7.0", "passport-local": "^1.0.0", - "semver": "^7.6.3", - "ws": "^8.18.0" + "semver": "^7.6.3" }, "devDependencies": { "@iobroker/build-tools": "^2.0.6", @@ -52115,13 +52067,9 @@ "@types/passport": "^1.0.16", "@types/passport-local": "^1.0.38", "@types/validator": "^13.12.2", - "chai": "^4.5.0", - "chai-as-promised": "^7.1.2", "colorette": "^2.0.20", "less": "^4.2.0", - "mocha": "^10.7.3", "puppeteer": "^23.6.0", - "sinon-chai": "^3.7.0", "src-rx": "file:src-admin", "typescript": "^5.6.3" }, @@ -52463,16 +52411,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "packages/admin/node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "packages/admin/node_modules/buffer": { "version": "6.0.3", "dev": true, @@ -52496,36 +52434,6 @@ "ieee754": "^1.2.1" } }, - "packages/admin/node_modules/chai": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/admin/node_modules/chai-as-promised": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-8.0.0.tgz", - "integrity": "sha512-sMsGXTrS3FunP/wbqh/KxM8Kj/aLPXQGkNtvE5wPfSToq8wkkvBpTZo1LIiEVmC4BwkKpag+l5h/20lBMk6nUg==", - "dev": true, - "license": "WTFPL", - "dependencies": { - "check-error": "^2.0.0" - }, - "peerDependencies": { - "chai": ">= 2.1.2 < 6" - } - }, "packages/admin/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -52544,16 +52452,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "packages/admin/node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, "packages/admin/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -52576,16 +52474,6 @@ "license": "MIT", "peer": true }, - "packages/admin/node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "packages/admin/node_modules/doctrine": { "version": "3.0.0", "dev": true, @@ -52869,13 +52757,6 @@ "node": ">=8" } }, - "packages/admin/node_modules/loupe": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", - "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", - "dev": true, - "license": "MIT" - }, "packages/admin/node_modules/mime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", @@ -52888,16 +52769,6 @@ "node": ">=10.0.0" } }, - "packages/admin/node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, "packages/admin/node_modules/rimraf": { "version": "3.0.2", "dev": true, @@ -52913,17 +52784,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "packages/admin/node_modules/sinon-chai": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-4.0.0.tgz", - "integrity": "sha512-cWqO7O2I4XfJDWyWElAQ9D/dtdh5Mo0RHndsfiiYyjWnlPzBJdIvjCVURO4EjyYaC3BjV+ISNXCfTXPXTEIEWA==", - "dev": true, - "license": "(BSD-2-Clause OR WTFPL)", - "peerDependencies": { - "chai": "^5.0.0", - "sinon": ">=4.0.0" - } - }, "packages/admin/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -52966,7 +52826,7 @@ }, "packages/admin/src-admin": { "name": "src-rx", - "version": "7.3.1", + "version": "7.3.2", "dev": true, "dependencies": { "@iobroker/adapter-react-v5": "file:../../adapter-react-v5", @@ -53060,9 +52920,34 @@ "devDependencies": { "@craco/craco": "^7.1.0", "@types/crypto-js": "^4.2.2", + "ajv": "^8.17.1", "tsc-alias": "^1.8.10" } }, + "packages/jsonConfig/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "packages/jsonConfig/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, "packages/react-components": { "name": "@iobroker/react-components", "version": "7.2.5", diff --git a/package.json b/package.json index ff538c6f7..46596f8d3 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "@alcalzone/release-script-plugin-iobroker": "^3.7.2", "@alcalzone/release-script-plugin-license": "^3.7.0", "@alcalzone/release-script-plugin-lerna": "^3.7.0", - "lerna": "^8.1.8" + "lerna": "^8.1.9" }, "scripts": { "build": "npm run clean && lerna run build", diff --git a/packages/adapter-react-v5/MIGRATION_4_5.md b/packages/adapter-react-v5/MIGRATION_4_5.md new file mode 100644 index 000000000..10f3225b0 --- /dev/null +++ b/packages/adapter-react-v5/MIGRATION_4_5.md @@ -0,0 +1,76 @@ +# Migration from adapter-react to adapter-react-v5 + +## In src/package.json => dependencies + +- `"@iobroker/adapter-react": "^2.0.22",` => `"@iobroker/adapter-react-v5": "^3.1.34",` +- `"@material-ui/core": "^4.12.3",` => `"@mui/material": "^5.10.9",` +- `"@material-ui/icons": "^4.11.2",` => `"@mui/icons-material": "^5.10.9",` +- Add `"@mui/styles": "^5.10.9",` +- Add `"babel-eslint": "^10.1.0",` + +## In Source files + +- All `@iobroker/adapter-react/...` => `@iobroker/adapter-react-v5/...` +- All `@material-ui/icons/...` => `@mui/icons-material/...` +- Change `import { withStyles } from '@material-ui/core/styles';` => `import { withStyles } from '@mui/styles';` +- Change `import { makeStyles } from '@mui/material/styles';` => `import { makeStyles } from '@mui/styles';` +- Change `import withWidth from '@material-ui/core/withWidth';` => `import { withWidth } from '@iobroker/adapter-react-v5';` +- All `@material-ui/core...` => `@mui/material...` +- Change `import { MuiThemeProvider } from '@material-ui/core/styles';` => `import { ThemeProvider, StyledEngineProvider } from '@mui/material/styles';` +- Change all `` to `` +- Rename in styles `theme.palette.type` => `theme.palette.mode` +- Add to all `TextField`, `Select`, `FormControl` the property `variant="standard"` +- Add to all `Button` that do not have `color` property: `color="grey"` +- Replace by `TextField` the `readOnly` attribute (if exists) with `InputProps={{readOnly: true}}` +- Remove px by all `theme.spacing`: `calc(100% - ${theme.spacing(4)}px)` => `calc(100% - ${theme.spacing(4)})` +- Replace `this.selectTab(e.target.parentNode.dataset.name, index)` => `this.selectTab(e.target.dataset.name, index)` + +If you still have questions, try to find an answer [here](https://mui.com/guides/migration-v4/). + +# Migration from adapter-react-v5@3.x to adapter-react-v5@4.x + +- Look for getObjectView socket requests and replace `socket.getObjectView('startKey', 'endKey', 'instance')` to `socket.getObjectViewSystem('instance', 'startKey', 'endKey')` +- Look for calls of custom like + +```jsx +this.props.socket._socket.emit('getObjectView', 'system', 'custom', { startKey: '', endKey: '\u9999' }, (err, objs) => { + (objs?.rows || []).forEach(item => console.log(item.id, item.value)); +}); +``` + +to + +```jsx +socket.getObjectViewCustom('custom', 'state', 'startKey', 'endKey').then(objects => { + Object.keys(objects).forEach(obj => console.log(obj._id)); +}); +``` + +- Replace all `socket.log.error('text')` to `socket.log('text', 'error')` +- Add to App.js `import { AdminConnection } from '@iobroker/adapter-react-v5';` and `super(props, { Connection: AdminConnection });` if run in admin + +# Migration from adapter-react-v5@4.x to adapter-react-v5@5.x + +- `Theme` is renamed to IobTheme. It is an object with classes inside. `Theme` is still inside and it same as mui `createTheme`. +- adapter-react-v5 has all types exported. So you can use `import { type IobTheme, Theme } from '@iobroker/adapter-react-v5';` and `const theme: IobTheme = Theme('light');` +- Json-Config is now an external package and must be included as dependency separately. +- Use type `Translate` for `t(word: string, ...args: any[]) => string` +- All components for admin JsonConfig must be changed: + Before `adapter-react-v5@5.x`: + +```jsx +import { ConfigGeneric, I18n } from '@iobroker/adapter-react-v5'; +class JsonComponent extends ConfigGeneric { + // ... +} +``` + +With `adapter-react-v5@5.x`: + +```jsx +import { I18n } from '@iobroker/adapter-react-v5'; +import { ConfigGeneric } from '@iobroker/json-config'; +class JsonComponent extends ConfigGeneric { + // ... +} +``` diff --git a/packages/adapter-react-v5/MIGRATION_5_6.md b/packages/adapter-react-v5/MIGRATION_5_6.md new file mode 100644 index 000000000..5fa36ea57 --- /dev/null +++ b/packages/adapter-react-v5/MIGRATION_5_6.md @@ -0,0 +1,90 @@ +# Migration from v5 to v6 + +The main change is that the `withStyles` was removed. So you have to replace all `withStyles` with `sx` or `style` properties. + +You can read more about sx [here](https://mui.com/system/getting-started/the-sx-prop/). + +- Remove at start of the file `import { withStyles } from '@mui/styles';` +- Replace it at the very end of the file `export default withStyles(styles)(MyComponent);` with `export default MyComponent;` +- Modify `const styles`: + Before: + +```typescript jsx +const styles: Record = (theme: IobTheme) => ({ + dialog: { + height: `calc(100% - ${theme.mixins.toolbar.minHeight}px)`, + padding: theme.spacing(1), + margin: theme.spacing(2), + gap: 5, + borderRadius: 5, + marginLeft: 10, // marginTop, marginRight, marginBottom + paddingLeft: 10, // paddingTop, paddingRight, paddingBottom + }, + ... +}); +``` + +After: + +```typescript jsx +const styles: Record = { + dialog: (theme: IobTheme) => ({ + height: `calc(100% - ${theme => theme.mixins.toolbar.minHeight}px)`, + p: 1, // or 8px, padding is OK too + m: '16px', // or 2, margin is OK too + gap: '5px', + borderRadius: '5px', + ml: '10px', // mt, mr, mb, but marginLeft, marginRight, marginBottom is OK too + pl: '10px', // pt, pr, pb, but paddingTop, paddingRight, paddingBottom is OK too + }), +}; +``` + +- Modify `className`: + Before: `
` + +After: `` + +Before: `` + +After: `` +Or if no one style is a function: `` + +Do not use `sx` if the style is not dynamic (not a function). Use `style` instead. + +Be aware, that all paddings and margins are now in `theme.spacing(1)` format. +So you have to replace all `padding: 8` with `padding: 1` or with `padding: '8px'`. + +The best practice is to replace `padding` with `p` and `margin` with `m`, so you will see immediately that it is a padding or margin for `sx` property. + +- Modify `classes`: + Before: `` + After: ``, + + Before: `` + After: `` + + Before: ``, + After: `` + + Before: ``, + After: `` + + Before: ``, + After: `` + + Before: ``, + After: `` + + Before: ``, + After: `` + + Before: ``, + After: ``, + Or: `` + + Before. ``, + After. `` + + Before. ``, + After. `` diff --git a/packages/adapter-react-v5/MIGRATION_6_7.md b/packages/adapter-react-v5/MIGRATION_6_7.md new file mode 100644 index 000000000..22afb1e37 --- /dev/null +++ b/packages/adapter-react-v5/MIGRATION_6_7.md @@ -0,0 +1,56 @@ +# Migration from adapter-react-v5@6.x to adapter-react-v5@7.x + +Only MUI library was updated from v5 to v6. + +## No `withStyles` at all + +`withStyles` was removed completely. So you have to replace all `withStyles` with `sx` or `style` properties. + +## slotProps + +`inputProps` and `InputProps` are now in `slotProps` + +Examples: +Before: + +```jsx + }} +/> +``` + +```jsx +, + }, + }} +/> +``` + +## SelectID dialog + +`SelectID` dialog now requires `theme` property. Without this property, the dialog will crash. + +## Grid => Grid2 + +Replace all `Grid` with `Grid2` component and remove `item` property as it not needed anymore. + +Attributes xs, sm, md, lg, xl are now in `size` property. + +Before: + +```jsx + + +``` + +```jsx + + +``` diff --git a/packages/adapter-react-v5/README.md b/packages/adapter-react-v5/README.md index d7d99e7f0..e8f55f1bb 100644 --- a/packages/adapter-react-v5/README.md +++ b/packages/adapter-react-v5/README.md @@ -13,7 +13,7 @@ If you want to create the configuration page with ReactJS: - Change `name` from `src` to `ADAPTERNAME-admin` (Of course replace `ADAPTERNAME` with yours) - Add to devDependencies: ```json - "@iobroker/adapter-react-v5": "^7.3.1", + "@iobroker/adapter-react-v5": "^7.3.2", ``` Versions can be higher. So your `src/package.json` should look like: @@ -24,7 +24,7 @@ If you want to create the configuration page with ReactJS: "version": "0.1.0", "private": true, "dependencies": { - "@iobroker/adapter-react-v5": "^7.3.1", + "@iobroker/adapter-react-v5": "^7.3.2", "@iobroker/build-tools": "^1.0.0", "babel-eslint": "^10.1.0", "react-scripts": "^5.0.1" @@ -689,6 +689,10 @@ You can find the migration instructions: --> ## Changelog +### **WORK IN PROGRESS** + +- (@GermanBluefox) Added new component: IconDeviceType + ### 7.2.3 (2024-10-05) - (@GermanBluefox) Corrected error in the simple CRON dialog diff --git a/packages/adapter-react-v5/modulefederation.admin.config.js b/packages/adapter-react-v5/modulefederation.admin.config.js index db8edf106..d37bcfdf2 100644 --- a/packages/adapter-react-v5/modulefederation.admin.config.js +++ b/packages/adapter-react-v5/modulefederation.admin.config.js @@ -12,6 +12,8 @@ function makeShared(pkgs) { // Admin shares these modules for all components module.exports = { shared: makeShared([ + '@emotion/react', + '@emotion/styled', '@iobroker/adapter-react-v5', '@iobroker/json-config', '@iobroker/dm-gui-components', diff --git a/packages/adapter-react-v5/package.json b/packages/adapter-react-v5/package.json index eb9c8348a..dbc4cefbc 100644 --- a/packages/adapter-react-v5/package.json +++ b/packages/adapter-react-v5/package.json @@ -21,7 +21,7 @@ "3-patchReadme": "node tasks --3-patchReadme", "npm": "npm i -f", "lint": "eslint -c eslint.config.mjs src", - "test": "ts-node test/testSchema.ts" + "test": "ts-node ../jsonConfig/test/testSchema.ts" }, "repository": { "type": "git", @@ -56,26 +56,26 @@ "@iobroker/js-controller-common-db": "^6.0.11", "@iobroker/socket-client": "^3.1.2", "@iobroker/types": "^6.0.11", - "@mui/icons-material": "^6.1.5", - "@mui/material": "^6.1.5", - "@sentry/browser": "^8.35.0", - "cronstrue": "^2.50.0", + "@mui/icons-material": "^6.1.7", + "@mui/material": "^6.1.7", + "@sentry/browser": "^8.38.0", + "cronstrue": "^2.51.0", "react-color": "^2.19.3", "react-colorful": "^5.6.1", "react-cropper": "^2.3.3", - "react-dropzone": "^14.2.10", - "react-inlinesvg": "^4.1.4" + "react-dropzone": "^14.3.5", + "react-inlinesvg": "^4.1.5" }, "devDependencies": { - "@babel/core": "^7.25.7", + "@babel/core": "^7.26.0", "@babel/plugin-proposal-class-properties": "^7.18.6", - "@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", - "@iobroker/eslint-config": "^0.1.6", - "@types/node": "^22.7.5", - "@types/react": "^18.3.11", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.26.0", + "@babel/preset-flow": "^7.25.9", + "@babel/preset-react": "^7.25.9", + "@iobroker/eslint-config": "^0.1.7", + "@types/node": "^22.9.0", + "@types/react": "^18.3.12", "@types/react-color": "^3.0.12", "ajv": "^8.17.1", "ts-node": "^10.9.2", diff --git a/packages/adapter-react-v5/src/Components/Icon.tsx b/packages/adapter-react-v5/src/Components/Icon.tsx index 484284836..0edaf3f88 100644 --- a/packages/adapter-react-v5/src/Components/Icon.tsx +++ b/packages/adapter-react-v5/src/Components/Icon.tsx @@ -105,7 +105,7 @@ export function getSelectIdIcon(obj: ioBroker.Object | null, imagePrefix?: strin return src || null; } -interface IconProps { +export interface IconProps { /** URL, UTF-8 character, or svg code (data:image/svg...) */ src: string | React.JSX.Element | null | undefined; /** Class name */ @@ -165,7 +165,7 @@ export function Icon(props: IconProps): React.JSX.Element | null { className={Utils.clsx(props.className, 'iconOwn')} width={props.style?.width || 28} height={props.style?.height || props.style?.width || 28} - style={props.style || {}} + style={props.style || undefined} /> ); } @@ -183,7 +183,7 @@ export function Icon(props: IconProps): React.JSX.Element | null { component="img" sx={props.sx} title={props.title || undefined} - style={props.style || {}} + style={props.style || undefined} className={Utils.clsx(props.className, 'iconOwn')} src={`https://remote-files.iobroker.in${src}`} alt={props.alt || undefined} @@ -195,7 +195,7 @@ export function Icon(props: IconProps): React.JSX.Element | null { return ( {props.alt + ); + } + return null; +} + +export function IconDeviceType(props: IconProps): React.JSX.Element | null { + const icon = getDeviceIcon(props.src as DeviceType, props); + if (icon) { + return icon; + } + + return ; +} diff --git a/packages/adapter-react-v5/src/icons/IconButtonImage.tsx b/packages/adapter-react-v5/src/icons/IconButtonImage.tsx new file mode 100644 index 000000000..5562e6d1f --- /dev/null +++ b/packages/adapter-react-v5/src/icons/IconButtonImage.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import { type IconProps } from './IconProps'; + +// Copyright Bluefox +export const IconButtonImage = (props: IconProps): React.JSX.Element => ( + props.onClick && props.onClick(e)} + viewBox="0 0 436 436" + width={props.width || (props.fontSize === 'small' ? 16 : 20)} + height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)} + className={props.className} + style={props.style} + > + + + + + +); diff --git a/packages/adapter-react-v5/src/icons/IconVacuum.tsx b/packages/adapter-react-v5/src/icons/IconVacuum.tsx new file mode 100644 index 000000000..44ae70186 --- /dev/null +++ b/packages/adapter-react-v5/src/icons/IconVacuum.tsx @@ -0,0 +1,37 @@ +import React, { type JSX } from 'react'; +import { type IconProps } from './IconProps'; + +export const IconVacuum = (props: IconProps): JSX.Element => ( + props.onClick && props.onClick(e)} + viewBox="0 0 339 339" + width={props.width || (props.fontSize === 'small' ? 16 : 20)} + height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)} + className={props.className} + style={props.style} + > + + + + vacuum + + +); diff --git a/packages/adapter-react-v5/src/index.ts b/packages/adapter-react-v5/src/index.ts index f44c00f62..95bed9896 100644 --- a/packages/adapter-react-v5/src/index.ts +++ b/packages/adapter-react-v5/src/index.ts @@ -23,6 +23,7 @@ export { type FileViewerState, } from './Components/FileViewer'; export { getSystemIcon, getSelectIdIcon, Icon } from './Components/Icon'; +export { isDeviceIcon, type DeviceType, IconDeviceType } from './Components/IconDeviceType'; export { IconPicker } from './Components/IconPicker'; export { IconSelector } from './Components/IconSelector'; export { Image } from './Components/Image'; @@ -60,20 +61,22 @@ export { LoaderMV } from './Components/Loaders/MV'; export { type IconProps } from './icons/IconProps'; export { IconAdapter } from './icons/IconAdapter'; export { IconAlias } from './icons/IconAlias'; +export { IconButtonImage } from './icons/IconButtonImage'; export { IconChannel } from './icons/IconChannel'; +export { IconClearFilter } from './icons/IconClearFilter'; export { IconClosed } from './icons/IconClosed'; export { IconCopy } from './icons/IconCopy'; export { IconDevice } from './icons/IconDevice'; export { IconDocument } from './icons/IconDocument'; +export { IconDocumentReadOnly } from './icons/IconDocumentReadOnly'; export { IconExpert } from './icons/IconExpert'; export { IconFx } from './icons/IconFx'; export { IconInstance } from './icons/IconInstance'; export { IconLogout } from './icons/IconLogout'; +export { IconNoIcon } from './icons/IconNoIcon'; export { IconOpen } from './icons/IconOpen'; export { IconState } from './icons/IconState'; -export { IconNoIcon } from './icons/IconNoIcon'; -export { IconDocumentReadOnly } from './icons/IconDocumentReadOnly'; -export { IconClearFilter } from './icons/IconClearFilter'; +export { IconVacuum } from './icons/IconVacuum'; export { DialogComplexCron } from './Dialogs/ComplexCron'; export { DialogComplexCron as ComplexCronDialog } from './Dialogs/ComplexCron'; // deprecated export { DialogConfirm } from './Dialogs/Confirm'; diff --git a/packages/admin/package.json b/packages/admin/package.json index a21f51a46..5ca57a7b8 100644 --- a/packages/admin/package.json +++ b/packages/admin/package.json @@ -28,29 +28,25 @@ "@iobroker/socket-classes": "^1.6.1", "@iobroker/webserver": "^1.0.6", "@iobroker/ws": "^2.0.0", - "@iobroker/ws-server": "4.0.1", + "@iobroker/ws-server": "4.1.0", "ajv": "^8.17.1", "archiver": "^7.0.1", - "axios": "^1.7.7", "body-parser": "^1.20.3", - "compression": "^1.7.4", + "compression": "^1.7.5", "connect-flash": "^0.1.1", - "cookie-parser": "^1.4.7", "express": "^4.21.1", "express-fileupload": "^1.5.1", "express-session": "^1.18.1", "json5": "^2.2.3", "mime": "^3.0.0", - "passport": "^0.7.0", "passport-local": "^1.0.0", - "semver": "^7.6.3", - "ws": "^8.18.0" + "semver": "^7.6.3" }, "devDependencies": { "@iobroker/build-tools": "^2.0.6", "@iobroker/dm-gui-components": "file:../dm-gui-components", - "@iobroker/json-config": "file:../jsonConfig", "@iobroker/legacy-testing": "^1.0.13", + "@iobroker/json-config": "file:../jsonConfig", "@iobroker/testing": "^5.0.0", "@types/archiver": "^6.0.2", "@types/body-parser": "^1.19.5", @@ -63,13 +59,9 @@ "@types/passport": "^1.0.16", "@types/passport-local": "^1.0.38", "@types/validator": "^13.12.2", - "chai": "^4.5.0", - "chai-as-promised": "^7.1.2", "colorette": "^2.0.20", "less": "^4.2.0", - "mocha": "^10.7.3", "puppeteer": "^23.6.0", - "sinon-chai": "^3.7.0", "src-rx": "file:src-admin", "typescript": "^5.6.3" }, diff --git a/packages/admin/src-admin/package.json b/packages/admin/src-admin/package.json index 6f4a68a68..799285c7c 100644 --- a/packages/admin/src-admin/package.json +++ b/packages/admin/src-admin/package.json @@ -99,5 +99,5 @@ } ] ], - "version": "7.3.1" + "version": "7.3.2" } \ No newline at end of file diff --git a/packages/admin/src/main.ts b/packages/admin/src/main.ts index b55334c9a..8d2566492 100644 --- a/packages/admin/src/main.ts +++ b/packages/admin/src/main.ts @@ -170,15 +170,11 @@ class Admin extends Adapter { * @param state the changed state value */ onStateChange(id: string, state: ioBroker.State | null | undefined): void { - if (socket) { - socket.stateChange(id, state); - } + socket?.stateChange(id, state); } onFileChange(id: string, fileName: string, size: number): void { - if (socket) { - socket.fileChange(id, fileName, size); - } + socket?.fileChange(id, fileName, size); } /** @@ -286,9 +282,7 @@ class Admin extends Adapter { return this.processNotificationsGui(obj); } - if (socket) { - socket.sendCommand(obj); - } + socket?.sendCommand(obj); } processNotificationsGui(obj: ioBroker.Message): void { diff --git a/packages/dm-gui-components/src/DeviceCard.tsx b/packages/dm-gui-components/src/DeviceCard.tsx index 3ad72ddb5..a212bcb33 100644 --- a/packages/dm-gui-components/src/DeviceCard.tsx +++ b/packages/dm-gui-components/src/DeviceCard.tsx @@ -21,12 +21,12 @@ import { MoreVert as MoreVertIcon, VideogameAsset as ControlIcon, Close as Close import { Utils, - Icon, type Connection, I18n, type ThemeName, type ThemeType, type IobTheme, + IconDeviceType, } from '@iobroker/adapter-react-v5'; import type { DeviceDetails, DeviceInfo, ActionBase, ControlBase, ControlState } from '@iobroker/dm-utils'; @@ -334,6 +334,8 @@ class DeviceCard extends Component { ? this.props.device.status : [this.props.device.status]; + const icon = this.state.icon ? : ; + return ( { socket={this.props.socket} /> ) : null} - {this.state.icon ? : } + {icon}
} action={ @@ -459,31 +461,29 @@ class DeviceCard extends Component { }; const headerStyle: React.CSSProperties = { display: 'flex', + alignItems: 'center', + gap: 8, + paddingLeft: 8, position: 'relative', - justifyContent: 'space-between', minHeight: 60, color: '#000', - padding: '0 10px 0 10px', - borderRadius: '4px 4px 0 0', }; const imgAreaStyle: React.CSSProperties = { height: 45, width: 45, - margin: 'auto', justifyContent: 'center', - display: 'grid', + display: 'flex', + alignItems: 'center', }; const imgStyle: React.CSSProperties = { zIndex: 2, maxWidth: '100%', maxHeight: '100%', + color: '#FFF', }; const titleStyle: React.CSSProperties = { - width: '100%', fontSize: 16, fontWeight: 'bold', - paddingTop: 16, - paddingLeft: 8, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', @@ -510,6 +510,17 @@ class DeviceCard extends Component { ? this.props.device.status : [this.props.device.status]; + const icon = this.state.icon ? ( + + ) : ( + + ); + + const title: string = this.state.details?.data?.name || this.props.title || ''; + return ( { socket={this.props.socket} /> ) : null} - + {icon} 20 ? title : undefined} sx={theme => ({ color: theme.palette.secondary.contrastText })} > {this.state.details?.data?.name || this.props.title} diff --git a/packages/dm-gui-components/src/DeviceList.tsx b/packages/dm-gui-components/src/DeviceList.tsx index 7e6bd53ab..d2d674d28 100644 --- a/packages/dm-gui-components/src/DeviceList.tsx +++ b/packages/dm-gui-components/src/DeviceList.tsx @@ -36,6 +36,8 @@ interface DeviceListProps extends CommunicationProps { style?: React.CSSProperties; /** Use small cards for devices */ smallCards?: boolean; + /** To trigger the reload of devices, just change this variable */ + triggerLoad?: number; } interface DeviceListState extends CommunicationState { @@ -45,6 +47,7 @@ interface DeviceListState extends CommunicationState { instanceInfo: InstanceDetails; loading: boolean; alive: boolean | null; + triggerLoad: number; } /** @@ -57,6 +60,8 @@ export default class DeviceList extends Communication | null; private readonly language: ioBroker.Languages; @@ -92,6 +97,7 @@ export default class DeviceList extends Communication this.loadData(), 50); + } + if (this.props.embedded && this.lastPropsFilter !== this.props.filter) { this.lastPropsFilter = this.props.filter; setTimeout(() => this.applyFilter(), 50); diff --git a/packages/dm-gui-components/src/Utils.tsx b/packages/dm-gui-components/src/Utils.tsx index 648882321..cf0e5649a 100644 --- a/packages/dm-gui-components/src/Utils.tsx +++ b/packages/dm-gui-components/src/Utils.tsx @@ -12,6 +12,7 @@ import { FastRewind, Fluorescent, Group, + Info, Lightbulb, Link as LinkIcon, LinkOff, @@ -29,6 +30,7 @@ import { Visibility, WbIncandescent, Wifi, + WifiFind, WifiOff, } from '@mui/icons-material'; @@ -106,67 +108,83 @@ function getFaIcon(icon: string, color?: string): React.JSX.Element | null { return ; } -function getIconByName(name: string, color?: string): React.JSX.Element | null { - if (name === 'edit' || name === 'rename') { +function getIconByName(name: string, altName?: string, color?: string): React.JSX.Element | null { + if (name === 'edit' || name === 'rename' || altName === 'edit' || altName === 'rename') { return ; } - if (name === 'delete') { + if (name === 'delete' || altName === 'delete') { return ; } - if (name === 'refresh') { + if (name === 'refresh' || altName === 'refresh') { return ; } - if (name === 'newDevice' || name === 'new' || name === 'add') { + if ( + name === 'newDevice' || + name === 'new' || + name === 'add' || + altName === 'newDevice' || + altName === 'new' || + altName === 'add' + ) { return ; } - if (name === 'discover' || name === 'search') { + if (name === 'discover' || name === 'search' || altName === 'discover' || altName === 'search') { return ; } - if (name === 'unpairDevice' || name === 'unpair') { + if (name === 'unpairDevice' || name === 'unpair' || altName === 'unpairDevice' || altName === 'unpair') { return ; } - if (name === 'pairDevice' || name === 'pair') { + if (name === 'pairDevice' || name === 'pair' || altName === 'pairDevice' || altName === 'pair') { return ; } - if (name === 'identify') { + if (name === 'identify' || altName === 'identify') { return ; } - if (name === 'play') { + if (name === 'play' || altName === 'play') { return ; } - if (name === 'stop') { + if (name === 'stop' || altName === 'stop') { return ; } - if (name === 'pause') { + if (name === 'pause' || altName === 'pause') { return ; } - if (name === 'forward' || name === 'next') { + if (name === 'forward' || name === 'next' || altName === 'forward' || altName === 'next') { return ; } - if (name === 'rewind' || name === 'previous') { + if (name === 'rewind' || name === 'previous' || altName === 'rewind' || altName === 'previous') { return ; } - if (name === 'lamp' || name === 'light') { + if (name === 'lamp' || name === 'light' || altName === 'lamp' || altName === 'light') { return ; } - if (name === 'backlight') { + if (name === 'backlight' || altName === 'backlight') { return ; } - if (name === 'dimmer') { + if (name === 'dimmer' || altName === 'dimmer') { return ; } - if (name === 'socket') { + if (name === 'socket' || altName === 'socket') { return ; } - if (name === 'settings') { + if (name === 'settings' || altName === 'settings') { return ; } - if (name === 'users' || name === 'group') { + if (name === 'users' || name === 'group' || altName === 'users' || altName === 'group') { return ; } - if (name === 'user') { + if (name === 'user' || altName === 'user') { return ; } + if (name === 'qrcode' || altName === 'qrcode') { + return ; + } + if (name === 'identify' || altName === 'identify') { + return ; + } + if (name === 'info' || altName === 'info') { + return ; + } return ; } @@ -208,7 +226,7 @@ export function renderControlIcon( /> ); } - return getIconByName(action.id, color); + return getIconByName(action.id, action.icon, color); } export function renderActionIcon(action: ActionBase): React.JSX.Element | null { @@ -227,7 +245,7 @@ export function renderActionIcon(action: ActionBase): React.JSX.Element | null { /> ); } - return getIconByName(action.id, action.color); + return getIconByName(action.id, action.icon, action.color); } let language: ioBroker.Languages; diff --git a/packages/jsonConfig/README.md b/packages/jsonConfig/README.md index 10dbce629..87d762acb 100644 --- a/packages/jsonConfig/README.md +++ b/packages/jsonConfig/README.md @@ -337,17 +337,18 @@ Tab with items Text component -| Property | Description | -|-----------------|--------------------------------------------------------------------------------------------------------| -| `maxLength` | max length of the text in field | -| `readOnly` | read-only field | -| `trim` | default is true. Set this attribute to `false` if trim is not desired. | -| `minRows` | default is 1. Set this attribute to `2` or more if you want to have a textarea with more than one row. | -| `maxRows` | max rows of textarea. Used only if `minRows` > 1. | -| `noClearButton` | if true, the clear button will not be shown (admin >= 6.17.13) | -| `validateJson` | if true, the text will be validated as JSON | -| `allowEmpty` | if true, the JSON will be validated only if the value is not empty | -| `time` | the value is time in ms or a string. Used only with readOnly flag | +| Property | Description | +|-------------------|--------------------------------------------------------------------------------------------------------| +| `maxLength` | max length of the text in field | +| `readOnly` | read-only field | +| `copyToClipboard` | show copy to clipboard button, but only if disabled or read-only is true | +| `trim` | default is true. Set this attribute to `false` if trim is not desired. | +| `minRows` | default is 1. Set this attribute to `2` or more if you want to have a textarea with more than one row. | +| `maxRows` | max rows of textarea. Used only if `minRows` > 1. | +| `noClearButton` | if true, the clear button will not be shown (admin >= 6.17.13) | +| `validateJson` | if true, the text will be validated as JSON | +| `allowEmpty` | if true, the JSON will be validated only if the value is not empty | +| `time` | the value is time in ms or a string. Used only with readOnly flag | ### `number` @@ -1103,6 +1104,27 @@ Special input for ports. It checks automatically if port is used by other instan | `variant` | Variant of button: `contained`, `outlined`, `text` | | `readOnly` | Defines if the control is read-only | +### `staticInfo` + +(admin >= 7.3.3) Shows static information in preformatted form, like "Title: value unit" +This control is used mostly in dynamic forms + +| Property | Description | +|-------------------|-------------------------------------------------------------------------------------------------------------------------------------------------| +| `data` | Value to be shown | +| `label` | Label for the value (could be multi-language) | +| `unit` | (optional) unit (could be multi-language) | +| `narrow` | (optional) Normally the title and value are shown on the left and right of the line. With this flag, the value will appear just after the label | +| `addColon` | (optional) Add to label the colon at the end if not exist in label | +| `blinkOnUpdate` | (optional) Value should blink when updated (true or color) | +| `blink` | (optional) Value should blink continuously (true or color) | +| `styleLabel` | (optional) React CSS Styles | +| `styleValue` | (optional) React CSS Styles | +| `styleUnit` | (optional) React CSS Styles | +| `copyToClipboard` | (optional) Show copy to clipboard button for value | +| `labelIcon` | (optional) base64 icon for label | +| `size` | (optional) font size: small, normal, large or number | + ### `deviceManager` show device manager. For that, the adapter must support device manager protocol. See iobroker/dm-utils. @@ -1400,3 +1422,6 @@ The following variables are available in JS function in custom settings: ``` You can find examples in [`telegram`](https://github.com/iobroker-community-adapters/ioBroker.telegram/tree/master/src-admin) or in [`pushbullet`](https://github.com/Jens1809/ioBroker.pushbullet/tree/master/src-admin) adapter. + +## For maintainer +To update location of JsonConfig schema, create pull request to this file: https://github.com/SchemaStore/schemastore/blob/master/src/api/json/catalog.json diff --git a/packages/jsonConfig/package.json b/packages/jsonConfig/package.json index 2c7d43eda..d23b78700 100644 --- a/packages/jsonConfig/package.json +++ b/packages/jsonConfig/package.json @@ -10,7 +10,9 @@ "prepublishOnly": "npm run build", "build:ts": "tsc -p tsconfig.json", "lint": "eslint -c eslint.config.mjs src", - "prettier": "prettier --write src/**/*.{ts,tsx,js,jsx,json,css,scss,md,html}" + "prettier": "prettier --write src/**/*.{ts,tsx,js,jsx,json,css,scss,md,html}", + "test": "tsc -p test/tsconfig.build.json && node test/testSchema.js", + "tsc-test": "tsc -p test/tsconfig.build.json" }, "publishConfig": { "access": "public" @@ -25,7 +27,8 @@ "devDependencies": { "@craco/craco": "^7.1.0", "@types/crypto-js": "^4.2.2", - "tsc-alias": "^1.8.10" + "tsc-alias": "^1.8.10", + "ajv": "^8.17.1" }, "files": [ "build/", diff --git a/packages/jsonConfig/schemas/jsonConfig.json b/packages/jsonConfig/schemas/jsonConfig.json new file mode 100644 index 000000000..9576205de --- /dev/null +++ b/packages/jsonConfig/schemas/jsonConfig.json @@ -0,0 +1,6745 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "multilingual": { + "type": "object", + "required": ["en"], + "patternProperties": { + "en|de|ru|pt|nl|fr|it|es|pl|uk|zh-cn": { + "type": "string" + } + }, + "additionalProperties": false + }, + "i18n": { + "description": "If translations will be provided via files, e.g. in admin/i18n/de/translations.json or provide the path to the i18n folder if it's custom or provide the translations inside this attribute as an object", + "oneOf": [ + { + "type": "string" + }, + { + "type": "boolean" + }, + { + "type": "object", + "patternProperties": { + "^.+": { + "$ref": "#/definitions/multilingual" + } + } + } + ] + }, + "componentType": { + "description": "Type of the element", + "type": "string", + "enum": [ + "accordion", + "alive", + "autocomplete", + "autocompleteSendTo", + "certificate", + "certificates", + "checkLicense", + "checkbox", + "chips", + "color", + "coordinates", + "cron", + "custom", + "datePicker", + "deviceManager", + "divider", + "file", + "fileSelector", + "func", + "header", + "icon", + "image", + "imageSendTo", + "instance", + "interface", + "ip", + "jsonEditor", + "language", + "number", + "objectId", + "panel", + "password", + "pattern", + "port", + "qrCode", + "room", + "select", + "selectSendTo", + "sendTo", + "setState", + "slider", + "state", + "staticImage", + "staticInfo", + "staticLink", + "staticText", + "table", + "text", + "textSendTo", + "timePicker", + "user", + "uuid" + ] + }, + "numberProps": { + "properties": { + "placeholder": { + "description": "Placeholder (for text control)", + "type": "string" + }, + "min": { + "description": "Minimal value", + "type": "number" + }, + "max": { + "description": "Maximum value", + "type": "number" + }, + "step": { + "description": "Step size for increase and decrease buttons", + "type": "number" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true, + "doNotSave": true + }, + "additionalProperties": false, + "required": ["type"] + }, + "staticLinkProps": { + "properties": { + "href": { + "description": "Link", + "type": "string" + }, + "text": { + "description": "Static link or button", + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/multilingual" + } + ] + }, + "color": { + "description": "Color of the link", + "type": "string" + }, + "icon": { + "description": "icon for button", + "type": "string" + }, + "variant": { + "description": "If button is outlined, contained or text", + "type": "string", + "enum": ["contained", "outlined", "text"] + }, + "controlStyle": { + "description": "Style of the button or control itself", + "type": "object" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "noTranslation": true, + "confirm": true, + "button": true + }, + "required": ["type", "href"] + }, + "textProps": { + "properties": { + "text": { + "description": "Text input", + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/multilingual" + } + ] + }, + "trim": { + "description": "If text must be trimmed or not (default = true)", + "type": "boolean" + }, + "readOnly": { + "type": "boolean", + "description": "Shows text as read only field" + }, + "copyToClipboard": { + "type": "boolean", + "description": "Shows copy to clipboard button, but only if disabled or read-only" + }, + "noClearButton": { + "type": "boolean", + "description": "Do not show a clear button" + }, + "placeholder": { + "description": "Placeholder (for text control)", + "type": "string" + }, + "minRows": { + "description": "default is 1. Set this attribute to `2` or more if you want to have a textarea with more than one row", + "type": "number" + }, + "maxRows": { + "description": "max rows of textarea. Used only if `minRows` > 1", + "type": "number" + }, + "time": { + "description": "If true, the text will be shown as time. The value is readonly automatically", + "type": "boolean" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true, + "maxLength": true, + "doNotSave": true + }, + "additionalProperties": false, + "required": ["type"] + }, + "tableItemBaseProps": { + "properties": { + "attr": { + "description": "The linked attribute name", + "type": "string" + }, + "width": { + "type": ["number", "string"] + }, + "title": { + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/multilingual" + } + ] + }, + "filter": { + "type": "boolean" + }, + "sort": { + "type": "boolean" + } + }, + "additionalProperties": true + }, + "customProps": { + "properties": { + "name": { + "description": "Component name that will be provided via props, like ComponentInstancesEditor", + "type": "string" + }, + "url": { + "description": "Location of the component", + "type": "string" + }, + "i18n": { + "$ref": "#/definitions/i18n" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + }, + "certificatesProps": { + "description": "Universal type that manages `certPublic`, `certPrivate`, `certChained` and `leCollection` attributes", + "properties": { + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + }, + "passwordProps": { + "properties": { + "encrypted": { + "description": "Is value encrypted or not (of course only for texts)", + "type": "boolean" + }, + "repeat": { + "description": "Password must be compared with password", + "type": "boolean" + }, + "visible": { + "description": "True if allow to view the password by toggling the view button", + "type": "boolean" + }, + "readOnly": { + "description": "The read-only flag. Visible is automatically true if readOnly is true", + "type": "boolean" + }, + "doNotSave": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true, + "maxLength": true + }, + "additionalProperties": false, + "required": ["type"] + }, + "checkboxProps": { + "properties": { + "doNotSave": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + }, + "aliveProps": { + "properties": { + "instance": { + "description": "Check if the instance is alive. If not defined, it will be used current instance. You can use `${data.number}` pattern in the text.", + "type": "string" + }, + "textAlive": { + "description": "Default text is `Instance %s is alive`, where `%s` will be replaced by `ADAPTER.0`", + "type": "string" + }, + "textNotAlive": { + "description": "Default text is `Instance %s is not alive`, where `%s` will be replaced by `ADAPTER.0`", + "type": "string" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + }, + "qrCodeProps": { + "required": ["type", "data"], + "additionalProperties": false, + "properties": { + "data": { + "description": "The data to be encoded in the QR Code", + "type": "string" + }, + "size": { + "description": "The size of the QR code", + "type": "number" + }, + "fgColor": { + "description": "Foreground color", + "type": "string" + }, + "bgColor": { + "description": "Background color", + "type": "string" + }, + "level": { + "description": "QR code level", + "enum": ["L", "M", "Q", "H"] + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + } + }, + "deviceManagerProps": { + "properties": { + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + }, + "cronProps": { + "properties": { + "complex": { + "description": "Show CRON with \"minutes\", \"seconds\" and so on", + "type": "boolean" + }, + "simple": { + "description": "Show simple CRON settings", + "type": "boolean" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"], + "oneOf": [ + { + "required": ["complex"] + }, + { + "required": ["simple"] + } + ] + }, + "sendToProps": { + "properties": { + "command": { + "description": "Command to be sent.", + "type": "string" + }, + "color": { + "description": "Optional color", + "type": "string", + "enum": ["primary", "secondary"] + }, + "icon": { + "description": "sendTo can have icon (base64)", + "type": "string" + }, + "jsonData": { + "description": "Data to be sent as parsable string, can contain special placeholder. E. g. '{\"subject1\": \"${data.subject}\", \"options1\": {\"host\": \"${data.host}\"}}'", + "type": "string" + }, + "data": { + "description": "Data to be sent as JSON.", + "type": "object" + }, + "result": { + "description": "{result1: {en: 'A'}, result2: {en: 'B'}}", + "type": "object" + }, + "error": { + "description": "{error1: {en: 'E'}, error2: {en: 'E2'}}", + "type": "object" + }, + "variant": { + "description": "If outlined or contained", + "type": "string", + "enum": ["contained", "outlined"] + }, + "placeholder": { + "description": "Placeholder (for text control)", + "type": "string" + }, + "useNative": { + "description": "if adapter returns result with `native` attribute it will be used for configuration. If `saveConfig` is true, the user will be requested to save the configuration", + "type": "boolean" + }, + "showProcess": { + "description": "Show spinner while request is in progress", + "type": "boolean" + }, + "openUrl": { + "description": "if true - open URL in new tab, if response contains attribute openUrl, like {\"openUrl\": \"http://1.2.3.4:80/aaa\", \"window\": \"_blank\", \"saveConfig\": true}. If saveConfig is true, the user will be requested to save the configuration.", + "type": "boolean" + }, + "onLoaded": { + "description": "if true - execute the button logic once initially", + "type": "boolean" + }, + "window": { + "description": "if `openUrl` is true, this is a name of the new window. Could be overwritten if response consist `window` attribute. It is not the title of the new window!", + "type": "string", + "default": ["_blank", "_self"] + }, + "controlStyle": { + "description": "Style of the button or control itself", + "type": "object" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "command"] + }, + "stateProps": { + "properties": { + "oid": { + "description": "Which object ID should be taken for the controlling. The ID is without \"adapter.X.\" prefix", + "type": "string" + }, + "system": { + "description": "IF true, the state will be taken from system.adapter.XX.I. and not from XX.I", + "type": "boolean" + }, + "control": { + "description": "How the value of the state should be shown", + "type": "string", + "enum": ["text", "html", "input", "number", "slider", "switch", "select", "button"] + }, + "controlled": { + "description": "If false, the control will be read only", + "type": "boolean" + }, + "unit": { + "description": "Add unit to the value", + "type": "string" + }, + "trueText": { + "description": "This text will be shown if the value is true", + "type": "string" + }, + "trueTextStyle": { + "description": "Style of the text if the value is true", + "type": "object" + }, + "falseText": { + "description": "This text will be shown if the value is false", + "type": "string" + }, + "falseTextStyle": { + "description": "Style of the text if the value is false", + "type": "object" + }, + "trueImage": { + "description": "This image will be shown if the value is true. It could be base64 or URL", + "type": "string" + }, + "falseImage": { + "description": "This image will be shown if the value is false. It could be base64 or URL", + "type": "string" + }, + "min": { + "description": "Minimum value for number or slider", + "type": "number" + }, + "max": { + "description": "Maximum value for number or slider", + "type": "number" + }, + "step": { + "description": "Step for number or slider", + "type": "number" + }, + "controlDelay": { + "description": "Delay in ms between the change and the command", + "type": "number" + }, + "variant": { + "description": "Show spinner while request is in progress", + "type": "string", + "enum": ["contained", "outlined", "text"] + }, + "readOnly": { + "description": "Defines if the control is read-only. Applied only to 'input', 'slider', 'select', 'button', 'switch', 'number'", + "type": "boolean" + }, + "label": true, + "type": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "tooltip": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "oid"] + }, + "instanceProps": { + "properties": { + "adapter": { + "description": "Name of the adapter. With special name _dataSources you can get all adapters with flag common.getHistory", + "type": "string" + }, + "adapters": { + "description": "Optional list of adapters, that should be shown. If not defined, all adapters will be shown. Only active if adapter attribute is not defined.", + "type": "array", + "items": { + "type": "string" + } + }, + "allowDeactivate": { + "description": "If true. Additional option \"deactivate\" is shown", + "type": "boolean" + }, + "onlyEnabled": { + "description": "If true. Only enabled instances will be shown", + "type": "boolean" + }, + "long": { + "description": "Value will look like system.adapter.ADAPTER.0 and not ADAPTER.0", + "type": "boolean" + }, + "short": { + "description": "Value will look like 0 and not ADAPTER.0", + "type": "boolean" + }, + "all": { + "description": "Add to the options ALL option with value *", + "type": "boolean" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "adapter"] + }, + "objectIdProps": { + "properties": { + "types": { + "description": "Filter for one of the possible types: 'channel', 'device', ... (is state by default)", + "oneOf": [ + { + "default": "state", + "type": "string", + "enum": [ + "state", + "channel", + "device", + "enum", + "host", + "adapter", + "instance", + "meta", + "config", + "script", + "user", + "group", + "chart", + "folder" + ] + }, + { + "type": "array", + "maxItems": 1, + "items": { + "type": "string", + "enum": [ + "state", + "channel", + "device", + "enum", + "host", + "adapter", + "instance", + "meta", + "config", + "script", + "user", + "group", + "chart", + "folder" + ] + } + } + ] + }, + "root": { + "description": "Show only this root object and its children", + "type": "boolean" + }, + "customFilter": { + "description": "Cannot be used together with `types` settings. Example: `{type: ['channel', 'device']}` - show only channels and devices", + "type": "string" + }, + "placeholder": { + "description": "Placeholder (for text control)", + "type": "string" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + }, + "fileSelectorProps": { + "properties": { + "pattern": { + "type": "string", + "description": "File extension pattern. Allowed '**/*.ext' to show all files from sub-folders too, '*.ext' to show from root folder or 'folderName/*.ext' to show all files in sub-folder folderName. Default '**/*.*'" + }, + "fileTypes": { + "enum": ["audio", "image", "text"], + "description": "Type of files" + }, + "objectID": { + "type": "string", + "description": "Object ID of type meta. You can use special placeholder '%INSTANCE%': like 'myAdapter.%INSTANCE%.files'" + }, + "upload": { + "type": "string", + "description": "path, where the uploaded files will be stored. Like 'folderName'. If not defined, no upload field will be shown. To upload in the root, set this field to '/'" + }, + "refresh": { + "type": "boolean", + "description": "Show refresh button near the select" + }, + "maxSize": { + "type": "string", + "description": "max file size (default 2MB)" + }, + "withFolder": { + "type": "boolean", + "description": "show folder name even if all files in same folder" + }, + "delete": { + "type": "boolean", + "description": "Allow deletion of files" + }, + "noNone": { + "type": "boolean", + "description": "Do not show 'none' option" + }, + "noSize": { + "type": "boolean", + "description": "Do not show size of files" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": [] + }, + "timePickerProps": { + "properties": { + "format": { + "description": "Format passed to the date picker", + "type": "string", + "default": "HH:mm:ss" + }, + "views": { + "description": "Configure which views should be shown to the users", + "type": "array", + "items": { + "type": "string", + "enum": ["hours", "minutes", "seconds"] + }, + "default": ["hours", "minutes", "seconds"] + }, + "timeSteps": { + "description": "Represent the available time steps for each view", + "type": "object", + "additionalProperties": false, + "default": { + "hours": 1, + "minutes": 5, + "seconds": 5 + }, + "properties": { + "hours": { + "type": "number" + }, + "minutes": { + "type": "number" + }, + "seconds": { + "type": "number" + } + } + }, + "returnFormat": { + "description": "Use `fullDate` or `HH:mm:ss`. Defaults to full date for backward compatibility reasons.", + "type": "string", + "enum": ["fullDate", "HH:mm:ss"] + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "style": true, + "darkStyle": true, + "noMultiEdit": true, + "tooltip": true, + "noTranslation": true + }, + "additionalProperties": false, + "required": ["type"] + }, + "interfaceProps": { + "properties": { + "ignoreLoopback": { + "description": "do not show loopback interface (127.0.0.1)", + "type": "boolean" + }, + "ignoreInternal": { + "description": "do not show internal interfaces (normally it is 127.0.0.1 too)", + "type": "boolean" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + }, + "coordinatesProps": { + "properties": { + "divider": { + "description": "divider between latitude and longitude. Default \",\" (Used if longitudeName and latitudeName are not defined)", + "type": "string" + }, + "autoInit": { + "description": "init field with current coordinates if empty", + "type": "boolean" + }, + "longitudeName": { + "description": "if defined, the longitude will be stored in this attribute, divider will be ignored", + "type": "string" + }, + "latitudeName": { + "description": "if defined, the latitude will be stored in this attribute, divider will be ignored", + "type": "string" + }, + "useSystemName": { + "description": "if defined, the checkbox with \"Use system settings\" will be shown and latitude, longitude will be read from system.config, a boolean will be saved to the given name", + "type": "string" + }, + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "maxLength": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + }, + "jsonEditorProps": { + "properties": { + "validateJson": { + "description": "if false, the text will be not validated as JSON", + "type": "boolean", + "default": true + }, + "allowEmpty": { + "type": "boolean", + "description": "if true, the JSON will be validated only if the value is not empty" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "style": true, + "darkStyle": true, + "noMultiEdit": true, + "tooltip": true, + "noTranslation": true + }, + "additionalProperties": false, + "required": ["type"] + }, + "doNotSaveProp": { + "type": "boolean", + "description": "Do not save this attribute as used only for internal calculations" + }, + "iconPositionProp": { + "description": "Only for panels that has `icon` attribute.", + "default": "start", + "enum": ["bottom", "end", "start", "top"] + }, + "allowAddByFilterProp": { + "type": "boolean", + "description": "If add allowed even if filter is set", + "default": false + }, + "alsoDependsOnSendProp": { + "description": "Depends on other attributes and will be re-calculated when other attributes changed", + "type": "array", + "items": { + "type": "string" + } + }, + "noInternalProp": { + "description": "Do not show internal IP addresses", + "type": "boolean" + }, + "tableItems": { + "description": "Items of the table", + "type": "array", + "items": { + "type": "object", + "required": ["type"], + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "language" + } + } + }, + "then": { + "allOf": [ + { + "properties": { + "system": { + "description": "Allow the usage of the system language from system.config as default", + "type": "boolean" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "system"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "autocompleteSendTo" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + } + ], + "properties": { + "attr": true, + "width": true, + "title": true, + "filter": true, + "sort": true, + "command": { + "description": "Command to be sent.", + "type": "string" + }, + "jsonData": { + "description": "Data to be sent as parsable string, can contain special placeholder. E. g. '{\"subject1\": \"${data.subject}\", \"options1\": {\"host\": \"${data.host}\"}}'", + "type": "string" + }, + "data": { + "description": "Data to be sent as JSON.", + "type": "object" + }, + "freeSolo": { + "description": "Set freeSolo to true so the textbox can contain any arbitrary value.", + "type": "boolean" + }, + "placeholder": { + "description": "Placeholder (for text control)", + "type": "string" + }, + "alsoDependsOn": { + "$ref": "#/definitions/alsoDependsOnSendProp" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true, + "maxLength": true + }, + "additionalProperties": false, + "required": ["type", "command"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "selectSendTo" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + } + ], + "properties": { + "attr": true, + "width": true, + "title": true, + "filter": true, + "sort": true, + "command": { + "description": "Command to be sent.", + "type": "string" + }, + "jsonData": { + "description": "Data to be sent as parsable string, can contain special placeholder. E. g. '{\"subject1\": \"${data.subject}\", \"options1\": {\"host\": \"${data.host}\"}}'", + "type": "string" + }, + "data": { + "description": "Data to be sent as JSON.", + "type": "object" + }, + "manual": { + "description": "Allow manual editing. Without Dropdown", + "type": "boolean" + }, + "doNotSave": { + "$ref": "#/definitions/doNotSaveProp" + }, + "alsoDependsOn": { + "$ref": "#/definitions/alsoDependsOnSendProp" + }, + "noTranslation": true, + "multiple": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "command"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "textSendTo" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + } + ], + "properties": { + "attr": true, + "width": true, + "title": true, + "filter": true, + "sort": true, + "container": { + "description": "div, text", + "type": "string" + }, + "copyToClipboard": { + "description": "If true, show button", + "type": "boolean" + }, + "alsoDependsOn": { + "$ref": "#/definitions/alsoDependsOnSendProp" + }, + "command": { + "description": "Command to be sent.", + "type": "string" + }, + "jsonData": { + "description": "Data to be sent as parsable string, can contain special placeholder. E. g. '{\"subject1\": \"${data.subject}\", \"options1\": {\"host\": \"${data.host}\"}}'", + "type": "string" + }, + "data": { + "description": "Data to be sent as JSON.", + "type": "object" + }, + "noTranslation": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "command"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "imageSendTo" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + } + ], + "properties": { + "attr": true, + "width": true, + "title": true, + "filter": true, + "sort": true, + "container": { + "description": "div, text", + "type": "string" + }, + "copyToClipboard": { + "description": "If true, show button", + "type": "boolean" + }, + "alsoDependsOn": { + "$ref": "#/definitions/alsoDependsOnSendProp" + }, + "command": { + "description": "Command to be sent.", + "type": "string" + }, + "jsonData": { + "description": "Data to be sent as parsable string, can contain special placeholder. E. g. '{\"subject1\": \"${data.subject}\", \"options1\": {\"host\": \"${data.host}\"}}'", + "type": "string" + }, + "data": { + "description": "Data to be sent as JSON.", + "type": "object" + }, + "noTranslation": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "command"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "header" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "properties": { + "size": { + "description": "Size of the header: h1-h5", + "type": "number", + "minimum": 1, + "maximum": 5 + }, + "text": { + "description": "Header text", + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/multilingual" + } + ] + }, + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "size", "text"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "color" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "properties": { + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "divider" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "properties": { + "color": { + "description": "Optional color", + "type": "string", + "enum": ["primary", "secondary"] + }, + "height": { + "description": "Optional height", + "type": "number" + }, + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "fileSelector" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + } + ], + "properties": { + "attr": true, + "width": true, + "title": true, + "filter": true, + "sort": true, + "pattern": { + "type": "string", + "description": "File extension pattern. Allowed '**/*.ext' to show all files from sub-folders too, '*.ext' to show from root folder or 'folderName/*.ext' to show all files in sub-folder folderName. Default '**/*.*'" + }, + "fileTypes": { + "enum": ["audio", "image", "text"], + "description": "Type of files" + }, + "objectID": { + "type": "string", + "description": "Object ID of type meta. You can use special placeholder '%INSTANCE%': like 'myAdapter.%INSTANCE%.files'" + }, + "upload": { + "type": "string", + "description": "path, where the uploaded files will be stored. Like 'folderName'. If not defined, no upload field will be shown. To upload in the root, set this field to '/'" + }, + "refresh": { + "type": "boolean", + "description": "Show refresh button near the select" + }, + "maxSize": { + "type": "string", + "description": "max file size (default 2MB)" + }, + "withFolder": { + "type": "boolean", + "description": "show folder name even if all files in same folder" + }, + "delete": { + "type": "boolean", + "description": "Allow deletion of files" + }, + "noNone": { + "type": "boolean", + "description": "Do not show 'none' option" + }, + "noSize": { + "type": "boolean", + "description": "Do not show size of files" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "icon" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "properties": { + "crop": { + "description": "If true, allow user to crop the image (only for non svg)", + "type": "boolean" + }, + "square": { + "description": "Width must be equal to height or crop must allow only square as shape", + "type": "boolean" + }, + "maxWidth": { + "description": "Maximum width", + "type": "number" + }, + "maxHeight": { + "description": "Maximum height", + "type": "number" + }, + "maxSize": { + "description": "Maximum size", + "type": "number" + }, + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "panel" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "properties": { + "items": { + "$ref": "#/definitions/topLevelProperties/properties/items" + }, + "icon": { + "description": "Panel can have icon (base64)", + "type": "string" + }, + "iconPosition": { + "$ref": "#/definitions/iconPositionProp" + }, + "#include": { + "description": "Include other JSON or JSON5 file. Here is the name of the file with extension. E.g. 'options.jsonConfig.json' for 'anyName.jsonConfig.json5'", + "type": "string", + "pattern": "^.+\\.jsonConfig(.json|.json5)$" + }, + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "innerStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"], + "oneOf": [ + { + "required": ["items"] + }, + { + "required": ["#include"] + } + ] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "image" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "properties": { + "accept": { + "description": "HTML accept attribute, like 'image/*,.pdf'", + "type": "string" + }, + "crop": { + "description": "If true, allow user to crop the image (only for non svg)", + "type": "boolean" + }, + "square": { + "description": "Width must be equal to height or crop must allow only square as shape", + "type": "boolean" + }, + "maxWidth": { + "description": "'Maximum width", + "type": "number" + }, + "maxHeight": { + "description": "'Maximum height", + "type": "number" + }, + "maxSize": { + "description": "'Maximum size", + "type": "number" + }, + "filename": { + "description": "Name of the file", + "type": "string" + }, + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "sendTo" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "properties": { + "command": { + "description": "Command to be sent.", + "type": "string" + }, + "color": { + "description": "Optional color", + "type": "string", + "enum": ["primary", "secondary"] + }, + "icon": { + "description": "sendTo can have icon (base64)", + "type": "string" + }, + "jsonData": { + "description": "Data to be sent as parsable string, can contain special placeholder. E. g. '{\"subject1\": \"${data.subject}\", \"options1\": {\"host\": \"${data.host}\"}}'", + "type": "string" + }, + "data": { + "description": "Data to be sent as JSON.", + "type": "object" + }, + "result": { + "description": "{result1: {en: 'A'}, result2: {en: 'B'}}", + "type": "object" + }, + "error": { + "description": "{error1: {en: 'E'}, error2: {en: 'E2'}}", + "type": "object" + }, + "variant": { + "description": "If outlined or contained", + "type": "string", + "enum": ["contained", "outlined"] + }, + "openUrl": { + "description": "if true - open URL in new tab, if response contains attribute openUrl, like {\"openUrl\": \"http://1.2.3.4:80/aaa\", \"window\": \"_blank\", \"saveConfig\": true}. If saveConfig is true, the user will be requested to save the configuration.", + "type": "boolean" + }, + "onLoaded": { + "description": "if true - execute the button logic once initially", + "type": "boolean" + }, + "placeholder": { + "description": "Placeholder (for text control)", + "type": "string" + }, + "useNative": { + "description": "if adapter returns result with `native` attribute it will be used for configuration. If `saveConfig` is true, the user will be requested to save the configuration", + "type": "boolean" + }, + "showProcess": { + "description": "Show spinner while request is in progress", + "type": "boolean" + }, + "attr": true, + "label": true, + "type": true, + "width": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "title": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "command"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "password" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + } + ], + "properties": { + "encrypted": { + "description": "Is value encrypted or not (of course only for texts)", + "type": "boolean" + }, + "repeat": { + "description": "Password must be compared with password", + "type": "boolean" + }, + "visible": { + "description": "True if allow to view the password by toggling the view button", + "type": "boolean" + }, + "attr": true, + "width": true, + "sort": true, + "title": true, + "filter": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "file" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "properties": { + "filename": { + "description": "Name of the file", + "type": "string" + }, + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "filename"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "slider" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "properties": { + "min": { + "description": "Minimal value", + "type": "number", + "default": 0 + }, + "max": { + "description": "Maximum value", + "type": "number", + "default": 100 + }, + "step": { + "description": "Step size", + "type": "number", + "default": 1 + }, + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "custom" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "$ref": "#/definitions/customProps" + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "checkbox" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + } + ], + "properties": { + "attr": true, + "width": true, + "title": true, + "filter": true, + "sort": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + }, + { + "if": { + "properties": { + "type": { + "enum": ["number", "port"] + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + } + ], + "properties": { + "attr": true, + "width": true, + "title": true, + "filter": true, + "sort": true, + "placeholder": { + "description": "Placeholder (for text control)", + "type": "string" + }, + "min": { + "description": "Minimal value", + "type": "number" + }, + "max": { + "description": "Maximum value", + "type": "number" + }, + "step": { + "description": "Step size for increase and decrease buttons", + "type": "number" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true, + "doNotSave": true + }, + "additionalProperties": false, + "required": ["type"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "alive" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "$ref": "#/definitions/aliveProps" + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "autocomplete" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "properties": { + "placeholder": { + "description": "Placeholder (for text control)", + "type": "string" + }, + "freeSolo": { + "description": "Set freeSolo to true so the textbox can contain any arbitrary value.", + "type": "boolean" + }, + "options": { + "description": "Options which can be completed. [\"value1\", \"value2\", ...] or [{\"value\": \"value\", \"label\": \"Value1\"}, \"value2\", ...]", + "type": "array", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "object" + } + ] + } + }, + "attr": true, + "width": true, + "title": true, + "filter": true, + "sort": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "options"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "cron" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + } + ], + "properties": { + "attr": true, + "width": true, + "title": true, + "filter": true, + "sort": true, + "complex": { + "description": "Show CRON with \"minutes\", \"seconds\" and so on", + "type": "boolean" + }, + "simple": { + "description": "Show simple CRON settings", + "type": "boolean" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"], + "oneOf": [ + { + "required": ["complex"] + }, + { + "required": ["simple"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "text" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + } + ], + "properties": { + "attr": true, + "width": true, + "title": true, + "filter": true, + "sort": true, + "text": { + "description": "Text input", + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/multilingual" + } + ] + }, + "trim": { + "description": "If text must be trimmed or not (default = true)", + "type": "boolean" + }, + "placeholder": { + "description": "Placeholder (for text control)", + "type": "string" + }, + "minRows": { + "description": "default is 1. Set this attribute to `2` or more if you want to have a textarea with more than one row", + "type": "number" + }, + "maxRows": { + "description": "max rows of textarea. Used only if `minRows` > 1", + "type": "number" + }, + "readOnly": { + "type": "boolean", + "description": "Shows text as read only field" + }, + "noClearButton": { + "type": "boolean", + "description": "Do not show a clear button" + }, + "validateJson": { + "type": "boolean", + "description": "if true, the text will be validated as JSON" + }, + "allowEmpty": { + "type": "boolean", + "description": "if true, the JSON will be validated only if the value is not empty" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true, + "maxLength": true, + "doNotSave": true + }, + "additionalProperties": false, + "required": ["type"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "select" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + } + ], + "properties": { + "attr": true, + "width": true, + "title": true, + "filter": true, + "sort": true, + "options": { + "description": "Options which can be selected", + "type": "array", + "items": { + "type": "object", + "required": ["label", "value"], + "additionalProperties": false, + "properties": { + "label": { + "description": "Label" + }, + "value": { + "description": "Value" + }, + "hidden": { + "type": "string", + "description": "JS function that could use `native.attribute` for calculation" + } + } + } + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "pattern" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "properties": { + "pattern": { + "description": "Read-only field with pattern like 'https://${data.ip}:${data.port}' (will not be saved in config)", + "type": "string" + }, + "copyToClipboard": { + "description": "If true, show copy button.", + "type": "boolean" + }, + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "pattern"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "setState" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "properties": { + "color": { + "description": "Optional color", + "type": "string", + "enum": ["primary", "secondary"] + }, + "icon": { + "description": "setState can have icon (base64)", + "type": "string" + }, + "id": { + "description": "State ID, e.g. 'info.test'", + "type": "string" + }, + "ack": { + "description": "ack-flag of the state", + "type": "boolean", + "default": false + }, + "val": { + "description": "State value to set" + }, + "okText": { + "description": "Alert that will be shown by pressing the button", + "type": "string" + }, + "error": { + "description": "{error1: {en: 'E'}, error2: {en: 'E2'}}", + "type": "object" + }, + "variant": { + "description": "If outlined or contained", + "type": "string", + "enum": ["contained", "outlined"] + }, + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "id", "val"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "qrCode" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "properties": { + "data": { + "description": "The data to be encoded in the QR Code", + "type": "string" + }, + "size": { + "description": "The size of the QR code", + "type": "number" + }, + "fgColor": { + "description": "Foreground color", + "type": "string" + }, + "bgColor": { + "description": "Background color", + "type": "string" + }, + "level": { + "description": "QR code level", + "enum": ["L", "M", "Q", "H"] + }, + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "data"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "func" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "properties": { + "short": { + "description": "no system.func.", + "type": "string" + }, + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "room" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "properties": { + "short": { + "description": "no system.room.", + "type": "string" + }, + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "user" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "properties": { + "short": { + "description": "no system.user.", + "type": "string" + }, + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "ip" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "properties": { + "listenOnAllPorts": { + "description": "Add 0.0.0.0 to option", + "type": "boolean" + }, + "onlyIp4": { + "description": "Show only IP4 addresses", + "type": "boolean" + }, + "onlyIp6": { + "description": "Show only IP6 addresses", + "type": "boolean" + }, + "noInternal": { + "$ref": "#/definitions/noInternalProp" + }, + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "certificate" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "properties": { + "certType": { + "description": "Type of the certificate", + "type": "string", + "enum": ["public", "private", "chained"] + }, + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "certType"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "certificates" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "$ref": "#/definitions/certificatesProps" + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "staticLink" + } + } + }, + "then": { + "additionalProperties": false, + "required": ["type"], + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "$ref": "#/definitions/staticLinkProps" + } + ], + "properties": { + "href": true, + "text": true, + "color": true, + "icon": true, + "variant": true, + "attr": true, + "width": true, + "title": true, + "filter": true, + "sort": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "staticText" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + } + ], + "properties": { + "attr": true, + "width": true, + "title": true, + "filter": true, + "sort": true, + "text": { + "description": "Static text like description", + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/multilingual" + } + ] + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"], + "oneOf": [ + { + "required": ["text"] + }, + { + "required": ["label"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "staticInfo" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + } + ], + "properties": { + "attr": true, + "width": true, + "title": true, + "filter": true, + "sort": true, + "label": true, + "type": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "tooltip": true, + "noTranslation": true, + "data": { + "description": "Value to be shown", + "type": ["object", "string", "number", "boolean"] + }, + "unit": { + "description": "unit (could be multi-language)", + "type": ["object", "string"] + }, + "narrow": { + "description": "With this flag, the value will appear just after the label", + "type": "boolean" + }, + "addColon": { + "description": "Add to label the colon at the end if not exist in label", + "type": "boolean" + }, + "blinkOnUpdate": { + "description": "Value should blink when updated (true or color)", + "type": ["boolean", "string"] + }, + "blink": { + "description": "Value should blink continuously (true or color)", + "type": ["boolean", "string"] + }, + "styleLabel": { + "description": "React CSS Styles for label", + "type": "object" + }, + "styleValue": { + "description": "React CSS Styles for value", + "type": "object" + }, + "styleUnit": { + "description": "React CSS Styles for unit", + "type": "object" + }, + "copyToClipboard": { + "description": "Show copy to clipboard button for value", + "type": "boolean" + }, + "labelIcon": { + "description": "Base64 icon for label", + "type": "string" + }, + "size": { + "description": "Font size", + "oneOf": [ + { + "default": "normal", + "type": "string", + "enum": [ + "small", + "normal", + "large" + ] + }, + { + "type": "number" + } + ] + } + }, + "additionalProperties": false, + "required": ["type", "label", "data"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "instance" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + } + ], + "properties": { + "attr": true, + "width": true, + "title": true, + "filter": true, + "sort": true, + "adapter": { + "description": "Name of the adapter. With special name _dataSources you can get all adapters with flag common.getHistory", + "type": "string" + }, + "adapters": { + "description": "Optional list of adapters, that should be shown. If not defined, all adapters will be shown. Only active if adapter attribute is not defined.", + "type": "array", + "items": { + "type": "string" + } + }, + "allowDeactivate": { + "description": "If true. Additional option \"deactivate\" is shown", + "type": "boolean" + }, + "onlyEnabled": { + "description": "If true. Only enabled instances will be shown", + "type": "boolean" + }, + "long": { + "description": "Value will look like system.adapter.ADAPTER.0 and not ADAPTER.0", + "type": "boolean" + }, + "short": { + "description": "Value will look like 0 and not ADAPTER.0", + "type": "boolean" + }, + "all": { + "description": "Add to the options ALL option with value *", + "type": "boolean" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "adapter"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "staticImage" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "properties": { + "src": { + "description": "Name of picture (from admin directory)", + "type": "string" + }, + "href": { + "description": "Link", + "type": "string" + }, + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "chips" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "properties": { + "delimiter": { + "description": "Delimiter for options. If no delimiter, the setting will be stored as array", + "type": "string" + }, + "attr": true, + "width": true, + "title": true, + "filter": true, + "sort": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "objectId" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + } + ], + "properties": { + "attr": true, + "width": true, + "title": true, + "filter": true, + "sort": true, + "types": { + "description": "Filter for one of the possible types: 'channel', 'device', ... (is state by default)", + "oneOf": [ + { + "default": "state", + "type": "string", + "enum": [ + "state", + "channel", + "device", + "enum", + "host", + "adapter", + "instance", + "meta", + "config", + "script", + "user", + "group", + "chart", + "folder" + ] + }, + { + "type": "array", + "maxItems": 1, + "items": { + "type": "string", + "enum": [ + "state", + "channel", + "device", + "enum", + "host", + "adapter", + "instance", + "meta", + "config", + "script", + "user", + "group", + "chart", + "folder" + ] + } + } + ] + }, + "root": { + "description": "Show only this root object and its children", + "type": "boolean" + }, + "customFilter": { + "description": "Cannot be used together with `types` settings. Example: `{type: ['channel', 'device']}` - show only channels and devices", + "type": "string" + }, + "placeholder": { + "description": "Placeholder (for text control)", + "type": "string" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "checkLicense" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "properties": { + "uuid": { + "description": "If UUID must be checked too", + "type": "boolean" + }, + "version": { + "description": "Check version", + "type": "boolean" + }, + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "style": true, + "darkStyle": true, + "noMultiEdit": true, + "noTranslation": true + }, + "additionalProperties": false + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "uuid" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + }, + { + "properties": { + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "style": true, + "darkStyle": true, + "noMultiEdit": true, + "noTranslation": true + }, + "additionalProperties": false + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "datePicker" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + } + ], + "properties": { + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "timePicker" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + } + ], + "properties": { + "format": { + "description": "Format passed to the date picker", + "type": "string", + "default": "HH:mm:ss" + }, + "views": { + "description": "Configure which views should be shown to the users", + "type": "array", + "items": { + "type": "string", + "enum": ["hours", "minutes", "seconds"] + }, + "default": ["hours", "minutes", "seconds"] + }, + "timeSteps": { + "description": "Represent the available time steps for each view", + "type": "object", + "additionalProperties": false, + "default": { + "hours": 1, + "minutes": 5, + "seconds": 5 + }, + "properties": { + "hours": { + "type": "number" + }, + "minutes": { + "type": "number" + }, + "seconds": { + "type": "number" + } + } + }, + "returnFormat": { + "description": "Use `fullDate` or `HH:mm:ss`. Defaults to full date for backward compatibility reasons.", + "type": "string", + "enum": ["fullDate", "HH:mm:ss"] + }, + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "coordinates" + } + } + }, + "then": { + "allOf": [ + { + "$ref": "#/definitions/tableItemBaseProps" + } + ], + "properties": { + "divider": { + "description": "divider between latitude and longitude. Default \",\" (Used if longitudeName and latitudeName are not defined)", + "type": "string" + }, + "autoInit": { + "description": "init field with current coordinates if empty", + "type": "boolean" + }, + "longitudeName": { + "description": "if defined, the longitude will be stored in this attribute, divider will be ignored", + "type": "string" + }, + "latitudeName": { + "description": "if defined, the latitude will be stored in this attribute, divider will be ignored", + "type": "string" + }, + "useSystemName": { + "description": "if defined, the checkbox with \"Use system settings\" will be shown and latitude, longitude will be read from system.config, a boolean will be saved to the given name", + "type": "string" + }, + "attr": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "maxLength": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + } + ], + "properties": { + "label": { + "oneOf": [ + { + "description": "Label of tab", + "type": "string" + }, + { + "$ref": "#/definitions/multilingual" + } + ] + }, + "type": { + "$ref": "#/definitions/componentType" + }, + "defaultSendTo": { + "description": "Command to request initial value from running instance", + "type": "string" + }, + "xs": { + "description": "width in 1/12 of screen on very small screens", + "type": "number" + }, + "sm": { + "description": "Width in 1/12 of screen on small screen", + "type": "number" + }, + "md": { + "description": "width in 1/12 of screen on middle screens", + "type": "number" + }, + "lg": { + "description": "width in 1/12 of screen on large screens", + "type": "number" + }, + "xl": { + "description": "width in 1/12 of screen on extra large screens", + "type": "number" + }, + "newLine": { + "description": "Should be shown from new line", + "type": "boolean" + }, + "hidden": { + "description": "JS function that could use 'native.attribute' for calculation", + "type": "string" + }, + "hideOnlyControl": { + "description": "If hidden the place will be shown, but no control", + "type": "boolean" + }, + "disabled": { + "description": "JS function that could use 'native.attribute' for calculation", + "type": "string" + }, + "helpLink": { + "description": "href to help", + "type": "string" + }, + "help": { + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/multilingual" + } + ] + }, + "style": { + "description": "CSS style in react notation: 'radiusBorder' and not 'radius-border'", + "type": "object" + }, + "darkStyle": { + "description": "CSS style for dark mode", + "type": "string" + }, + "validator": { + "description": "JS function: true no error, false - error", + "type": "string" + }, + "validatorNoSaveOnError": { + "description": "True if save must be disabled by errors", + "type": "boolean" + }, + "validatorErrorText": { + "type": "string", + "description": "Text to show if validator fails" + }, + "showSecondAddAt": { + "description": "The number of lines from which the second add button at the bottom of the table will be shown. Default 5", + "type": "number" + }, + "showFirstAddOnTop": { + "type": "boolean", + "description": "Show first plus button on top of the first column and not on the left." + }, + "tooltip": { + "description": "Optional tooltip", + "type": "string" + }, + "default": { + "description": "Default value" + }, + "onChange": { + "type": "object", + "additionalProperties": false, + "properties": { + "calculateFunc": { + "description": "JS function: that calculates value", + "type": "string" + }, + "ignoreOwnChanges": { + "description": "Do not trigger onChange event if changed value of this attribute", + "type": "boolean" + }, + "alsoDependsOn": { + "$ref": "#/definitions/alsoDependsOnSendProp" + } + } + }, + "doNotSave": { + "$ref": "#/definitions/doNotSaveProp" + }, + "defaultFunc": { + "description": "JS function to calculate default value", + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "func": { + "description": "JS function: that calculates value", + "type": "string" + }, + "alsoDependsOn": { + "$ref": "#/definitions/alsoDependsOnSendProp" + } + } + } + ] + }, + "noTranslation": { + "description": "Do not translate selects or other options (not for help, label or placeholder)", + "type": "boolean" + }, + "confirm": { + "description": "Confirm dialog", + "type": "object", + "additionalProperties": false, + "properties": { + "condition": { + "description": "JS function: true show confirm dialog", + "type": "string" + }, + "text": { + "description": "Text of confirmation dialog", + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/multilingual" + } + ] + }, + "title": { + "description": "Title of confirmation dialog", + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/multilingual" + } + ] + }, + "ok": { + "description": "Text for 'OK' button", + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/multilingual" + } + ] + }, + "cancel": { + "description": "Text for 'cancel' button", + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/multilingual" + } + ] + }, + "type": { + "type": "string", + "enum": ["info", "warning", "error", "none"] + }, + "alsoDependsOn": { + "description": "Trigger confirm dialog if one of the components changed.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "noMultiEdit": { + "description": "(only custom) if this flag set to true, this field will not be shown if user selected more than one object for edit", + "type": "boolean" + }, + "maxLength": { + "description": "max length of text in field", + "type": "number" + }, + "button": { + "description": "show link as button", + "type": "boolean" + } + } + } + }, + "topLevelProperties": { + "properties": { + "type": { + "type": "string", + "description": "Control type", + "enum": ["tabs", "panel"] + }, + "$schema": { + "description": "Specify a JSON schema", + "type": "string" + }, + "i18n": { + "$ref": "#/definitions/i18n" + }, + "items": { + "description": "Consists of objects representing e.g. a single tab", + "type": "object", + "patternProperties": { + "^.+": { + "description": "Object representing e.g. a tab", + "type": "object", + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "language" + } + } + }, + "then": { + "properties": { + "system": { + "description": "Allow the usage of the system language from system.config as default", + "type": "boolean" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "system"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "autocompleteSendTo" + } + } + }, + "then": { + "properties": { + "command": { + "description": "Command to be sent.", + "type": "string" + }, + "jsonData": { + "description": "Data to be sent as parsable string, can contain special placeholder. E. g. '{\"subject1\": \"${data.subject}\", \"options1\": {\"host\": \"${data.host}\"}}'", + "type": "string" + }, + "data": { + "description": "Data to be sent as JSON.", + "type": "object" + }, + "freeSolo": { + "description": "Set freeSolo to true so the textbox can contain any arbitrary value.", + "type": "boolean" + }, + "placeholder": { + "description": "Placeholder (for text control)", + "type": "string" + }, + "alsoDependsOn": { + "$ref": "#/definitions/alsoDependsOnSendProp" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true, + "maxLength": true + }, + "additionalProperties": false, + "required": ["type", "command"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "selectSendTo" + } + } + }, + "then": { + "properties": { + "command": { + "description": "Command to be sent.", + "type": "string" + }, + "jsonData": { + "description": "Data to be sent as parsable string, can contain special placeholder. E. g. '{\"subject1\": \"${data.subject}\", \"options1\": {\"host\": \"${data.host}\"}}'", + "type": "string" + }, + "data": { + "description": "Data to be sent as JSON.", + "type": "object" + }, + "manual": { + "description": "Allow manual editing. Without Dropdown", + "type": "boolean" + }, + "doNotSave": { + "$ref": "#/definitions/doNotSaveProp" + }, + "alsoDependsOn": { + "$ref": "#/definitions/alsoDependsOnSendProp" + }, + "noTranslation": true, + "multiple": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "command"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "textSendTo" + } + } + }, + "then": { + "properties": { + "container": { + "description": "div, text", + "type": "string" + }, + "copyToClipboard": { + "description": "If true, show button", + "type": "boolean" + }, + "alsoDependsOn": { + "$ref": "#/definitions/alsoDependsOnSendProp" + }, + "command": { + "description": "Command to be sent.", + "type": "string" + }, + "jsonData": { + "description": "Data to be sent as parsable string, can contain special placeholder. E. g. '{\"subject1\": \"${data.subject}\", \"options1\": {\"host\": \"${data.host}\"}}'", + "type": "string" + }, + "data": { + "description": "Data to be sent as JSON.", + "type": "object" + }, + "noTranslation": true, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "command"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "imageSendTo" + } + } + }, + "then": { + "properties": { + "alsoDependsOn": { + "$ref": "#/definitions/alsoDependsOnSendProp" + }, + "command": { + "description": "Command to be sent.", + "type": "string" + }, + "jsonData": { + "description": "Data to be sent as parsable string, can contain special placeholder. E. g. '{\"subject1\": \"${data.subject}\", \"options1\": {\"host\": \"${data.host}\"}}'", + "type": "string" + }, + "data": { + "description": "Data to be sent as JSON.", + "type": "object" + }, + "label": true, + "type": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "command"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "header" + } + } + }, + "then": { + "properties": { + "size": { + "description": "Size of the header: h1-h5", + "type": "number", + "minimum": 1, + "maximum": 5 + }, + "text": { + "description": "Header text", + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/multilingual" + } + ] + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "size", "text"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "color" + } + } + }, + "then": { + "properties": { + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "divider" + } + } + }, + "then": { + "properties": { + "color": { + "description": "Optional color", + "type": "string", + "enum": ["primary", "secondary"] + }, + "height": { + "description": "Optional height", + "type": "number" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "icon" + } + } + }, + "then": { + "properties": { + "crop": { + "description": "If true, allow user to crop the image (only for non svg)", + "type": "boolean" + }, + "square": { + "description": "Width must be equal to height or crop must allow only square as shape", + "type": "boolean" + }, + "maxWidth": { + "description": "Maximum width", + "type": "number" + }, + "maxHeight": { + "description": "Maximum height", + "type": "number" + }, + "maxSize": { + "description": "Maximum size", + "type": "number" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "panel" + } + } + }, + "then": { + "properties": { + "items": { + "$ref": "#/definitions/topLevelProperties/properties/items" + }, + "#include": { + "description": "Include other JSON or JSON5 file. Here is the name of the file with extension. E.g. 'options.jsonConfig.json' for 'anyName.jsonConfig.json5'", + "type": "string", + "pattern": "^.+\\.jsonConfig(.json|.json5)$" + }, + "icon": { + "description": "Panel can have icon (base64)", + "type": "string" + }, + "iconPosition": { + "$ref": "#/definitions/iconPositionProp" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "innerStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"], + "oneOf": [ + { + "required": ["items"] + }, + { + "required": ["#include"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "image" + } + } + }, + "then": { + "properties": { + "accept": { + "description": "HTML accept attribute, like 'image/*,.pdf'", + "type": "string" + }, + "crop": { + "description": "If true, allow user to crop the image (only for non svg)", + "type": "boolean" + }, + "square": { + "description": "Width must be equal to height or crop must allow only square as shape", + "type": "boolean" + }, + "maxWidth": { + "description": "'Maximum width", + "type": "number" + }, + "maxHeight": { + "description": "'Maximum height", + "type": "number" + }, + "maxSize": { + "description": "'Maximum size", + "type": "number" + }, + "filename": { + "description": "Name of the file", + "type": "string" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "sendTo" + } + } + }, + "then": { + "$ref": "#/definitions/sendToProps" + } + }, + { + "if": { + "properties": { + "type": { + "const": "state" + } + } + }, + "then": { + "$ref": "#/definitions/stateProps" + } + }, + { + "if": { + "properties": { + "type": { + "const": "password" + } + } + }, + "then": { + "$ref": "#/definitions/passwordProps" + } + }, + { + "if": { + "properties": { + "type": { + "const": "file" + } + } + }, + "then": { + "properties": { + "filename": { + "description": "Name of the file", + "type": "string" + }, + "label": true, + "type": true, + "title": true, + "filter": true, + "sort": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "filename"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "slider" + } + } + }, + "then": { + "properties": { + "min": { + "description": "Minimal value", + "type": "number", + "default": 0 + }, + "max": { + "description": "Maximum value", + "type": "number", + "default": 100 + }, + "step": { + "description": "Step size", + "type": "number", + "default": 1 + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "custom" + } + } + }, + "then": { + "$ref": "#/definitions/customProps" + } + }, + { + "if": { + "properties": { + "type": { + "const": "checkbox" + } + } + }, + "then": { + "$ref": "#/definitions/checkboxProps" + } + }, + { + "if": { + "properties": { + "type": { + "const": "fileSelector" + } + } + }, + "then": { + "$ref": "#/definitions/fileSelectorProps" + } + }, + { + "if": { + "properties": { + "type": { + "enum": ["number", "port"] + } + } + }, + "then": { + "$ref": "#/definitions/numberProps" + } + }, + { + "if": { + "properties": { + "type": { + "const": "alive" + } + } + }, + "then": { + "$ref": "#/definitions/aliveProps" + } + }, + { + "if": { + "properties": { + "type": { + "const": "autocomplete" + } + } + }, + "then": { + "properties": { + "placeholder": { + "description": "Placeholder (for text control)", + "type": "string" + }, + "freeSolo": { + "description": "Set freeSolo to true so the textbox can contain any arbitrary value.", + "type": "boolean" + }, + "options": { + "description": "Options which can be completed. [\"value1\", \"value2\", ...] or [{\"value\": \"value\", \"label\": \"Value1\"}, \"value2\", ...]", + "type": "array", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "object" + } + ] + } + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "options"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "qrCode" + } + } + }, + "then": { + "$ref": "#/definitions/qrCodeProps" + } + }, + { + "if": { + "properties": { + "type": { + "const": "cron" + } + } + }, + "then": { + "$ref": "#/definitions/cronProps" + } + }, + { + "if": { + "properties": { + "type": { + "const": "deviceManager" + } + } + }, + "then": { + "$ref": "#/definitions/deviceManagerProps" + } + }, + { + "if": { + "properties": { + "type": { + "const": "text" + } + } + }, + "then": { + "$ref": "#/definitions/textProps" + } + }, + { + "if": { + "properties": { + "type": { + "const": "select" + } + } + }, + "then": { + "properties": { + "options": { + "description": "Options which can be selected", + "type": "array", + "items": { + "type": "object", + "required": ["label", "value"], + "additionalProperties": false, + "properties": { + "label": { + "description": "Label" + }, + "value": { + "description": "Value" + }, + "hidden": { + "type": "string", + "description": "JS function that could use `native.attribute` for calculation" + } + } + } + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "table" + } + } + }, + "then": { + "properties": { + "noDelete": { + "description": "If delete or add disabled, If noDelete is false, add, delete and move up/down should work", + "type": "boolean" + }, + "uniqueColumns": { + "description": "Specify the 'attr' name of columns which need to be unique", + "type": "array", + "items": { + "type": "string" + } + }, + "compact": { + "description": "Show table in compact mode", + "type": "boolean" + }, + "export": { + "description": "If export button should be shown. Export as csv file.", + "type": "boolean" + }, + "import": { + "description": "If import button should be shown. Import from csv file.", + "type": "boolean" + }, + "clone": { + "description": "If clone button should be shown. If true, the clone button will be shown. If attribute name, this name will be unique.", + "type": "boolean" + }, + "encryptedAttributes": { + "description": "These items will be encrypted before saving with simple (not SHA) encryption method", + "type": "array", + "items": { + "type": "string" + } + }, + "allowAddByFilter": { + "$ref": "#/definitions/allowAddByFilterProp" + }, + "items": { + "$ref": "#/definitions/tableItems" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true, + "showSecondAddAt": true + }, + "required": ["type", "items"], + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "type": { + "const": "pattern" + } + } + }, + "then": { + "properties": { + "pattern": { + "description": "Read-only field with pattern like 'https://${data.ip}:${data.port}' (will not be saved in config)", + "type": "string" + }, + "copyToClipboard": { + "description": "If true, show copy button.", + "type": "boolean" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "pattern"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "setState" + } + } + }, + "then": { + "properties": { + "color": { + "description": "Optional color", + "type": "string", + "enum": ["primary", "secondary"] + }, + "icon": { + "description": "setState can have icon (base64)", + "type": "string" + }, + "id": { + "description": "State ID, e.g. 'info.test'", + "type": "string" + }, + "ack": { + "description": "ack-flag of the state", + "type": "boolean", + "default": false + }, + "val": { + "description": "State value to set" + }, + "okText": { + "description": "Alert that will be shown by pressing the button", + "type": "string" + }, + "error": { + "description": "{error1: {en: 'E'}, error2: {en: 'E2'}}", + "type": "object" + }, + "variant": { + "description": "If outlined or contained", + "type": "string", + "enum": ["contained", "outlined"] + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "id", "val"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "func" + } + } + }, + "then": { + "properties": { + "short": { + "description": "no system.func.", + "type": "string" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "room" + } + } + }, + "then": { + "properties": { + "short": { + "description": "no system.room.", + "type": "string" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "user" + } + } + }, + "then": { + "properties": { + "short": { + "description": "no system.user.", + "type": "string" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "ip" + } + } + }, + "then": { + "properties": { + "listenOnAllPorts": { + "description": "Add 0.0.0.0 to option", + "type": "boolean" + }, + "onlyIp4": { + "description": "Show only IP4 addresses", + "type": "boolean" + }, + "onlyIp6": { + "description": "Show only IP6 addresses", + "type": "boolean" + }, + "noInternal": { + "$ref": "#/definitions/noInternalProp" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "certificate" + } + } + }, + "then": { + "properties": { + "certType": { + "description": "Type of the certificate", + "type": "string", + "enum": ["public", "private", "chained"] + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type", "certType"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "certificates" + } + } + }, + "then": { + "$ref": "#/definitions/certificatesProps" + } + }, + { + "if": { + "properties": { + "type": { + "const": "staticLink" + } + } + }, + "then": { + "$ref": "#/definitions/staticLinkProps" + } + }, + { + "if": { + "properties": { + "type": { + "const": "staticText" + } + } + }, + "then": { + "properties": { + "text": { + "description": "Static text like description", + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/multilingual" + } + ] + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"], + "oneOf": [ + { + "required": ["text"] + }, + { + "required": ["label"] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "staticInfo" + } + } + }, + "then": { + "properties": { + "label": true, + "type": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "tooltip": true, + "noTranslation": true, + "data": { + "description": "Value to be shown", + "type": ["object", "string", "number", "boolean"] + }, + "unit": { + "description": "unit (could be multi-language)", + "type": ["object", "string"] + }, + "narrow": { + "description": "With this flag, the value will appear just after the label", + "type": "boolean" + }, + "addColon": { + "description": "Add to label the colon at the end if not exist in label", + "type": "boolean" + }, + "blinkOnUpdate": { + "description": "Value should blink when updated (true or color)", + "type": ["boolean", "string"] + }, + "blink": { + "description": "Value should blink continuously (true or color)", + "type": ["boolean", "string"] + }, + "styleLabel": { + "description": "React CSS Styles for label", + "type": "object" + }, + "styleValue": { + "description": "React CSS Styles for value", + "type": "object" + }, + "styleUnit": { + "description": "React CSS Styles for unit", + "type": "object" + }, + "copyToClipboard": { + "description": "Show copy to clipboard button for value", + "type": "boolean" + }, + "labelIcon": { + "description": "Base64 icon for label", + "type": "string" + }, + "size": { + "description": "Font size", + "oneOf": [ + { + "default": "normal", + "type": "string", + "enum": [ + "small", + "normal", + "large" + ] + }, + { + "type": "number" + } + ] + } + }, + "additionalProperties": false, + "required": ["type", "label", "data"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "instance" + } + } + }, + "then": { + "$ref": "#/definitions/instanceProps" + } + }, + { + "if": { + "properties": { + "type": { + "const": "staticImage" + } + } + }, + "then": { + "properties": { + "src": { + "description": "Name of picture (from admin directory)", + "type": "string" + }, + "href": { + "description": "Link", + "type": "string" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "chips" + } + } + }, + "then": { + "properties": { + "delimiter": { + "description": "Delimiter for options. If no delimiter, the setting will be stored as array", + "type": "string" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true + }, + "additionalProperties": false, + "required": ["type"] + } + }, + { + "if": { + "properties": { + "type": { + "const": "objectId" + } + } + }, + "then": { + "$ref": "#/definitions/objectIdProps" + } + }, + { + "if": { + "properties": { + "type": { + "const": "checkLicense" + } + } + }, + "then": { + "properties": { + "uuid": { + "description": "If UUID must be checked too", + "type": "boolean" + }, + "version": { + "description": "Check version", + "type": "boolean" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "style": true, + "darkStyle": true, + "noMultiEdit": true, + "noTranslation": true + }, + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "type": { + "const": "datePicker" + } + } + }, + "then": { + "properties": { + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "style": true, + "darkStyle": true, + "noMultiEdit": true, + "noTranslation": true + }, + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "type": { + "const": "timePicker" + } + } + }, + "then": { + "$ref": "#/definitions/timePickerProps" + } + }, + { + "if": { + "properties": { + "type": { + "const": "uuid" + } + } + }, + "then": { + "properties": { + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "style": true, + "darkStyle": true, + "noMultiEdit": true, + "noTranslation": true + }, + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "type": { + "const": "coordinates" + } + } + }, + "then": { + "$ref": "#/definitions/coordinatesProps" + } + }, + { + "if": { + "properties": { + "type": { + "const": "interface" + } + } + }, + "then": { + "$ref": "#/definitions/interfaceProps" + } + }, + { + "if": { + "properties": { + "type": { + "const": "accordion" + } + } + }, + "then": { + "properties": { + "titleAttr": { + "description": "Title shown on the accordion", + "type": "string" + }, + "noDelete": { + "description": "If delete or add disabled, If noDelete is false, add, delete and move up/down should work", + "type": "boolean" + }, + "clone": { + "description": "If clone button should be shown. If true, the clone button will be shown. If attribute name, this name will be unique.", + "type": "boolean" + }, + "items": { + "$ref": "#/definitions/tableItems" + }, + "label": true, + "type": true, + "defaultSendTo": true, + "allowSaveWithError": true, + "xs": true, + "sm": true, + "md": true, + "lg": true, + "xl": true, + "newLine": true, + "hidden": true, + "hideOnlyControl": true, + "disabled": true, + "helpLink": true, + "help": true, + "style": true, + "darkStyle": true, + "validator": true, + "validatorNoSaveOnError": true, + "validatorErrorText": true, + "noMultiEdit": true, + "tooltip": true, + "default": true, + "defaultFunc": true, + "onChange": true, + "noTranslation": true, + "confirm": true, + "showSecondAddAt": true + }, + "required": ["type", "items"], + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "type": { + "const": "state" + } + } + }, + "then": { + "$ref": "#/definitions/stateProps" + } + } + ], + "required": ["type"], + "properties": { + "label": { + "oneOf": [ + { + "description": "Label of tab", + "type": "string" + }, + { + "$ref": "#/definitions/multilingual" + } + ] + }, + "type": { + "$ref": "#/definitions/componentType" + }, + "defaultSendTo": { + "description": "Command to request initial value from running instance", + "type": "string" + }, + "allowSaveWithError": { + "description": "Allow saving of configuration even if the instance is offline. Used with defaultSendTo", + "type": "boolean" + }, + "xs": { + "description": "width in 1/12 of screen on very small screens", + "type": "number" + }, + "sm": { + "description": "Width in 1/12 of screen on small screen", + "type": "number" + }, + "md": { + "description": "width in 1/12 of screen on middle screens", + "type": "number" + }, + "lg": { + "description": "width in 1/12 of screen on large screens", + "type": "number" + }, + "xl": { + "description": "width in 1/12 of screen on extra large screens", + "type": "number" + }, + "newLine": { + "description": "Should be shown from new line", + "type": "boolean" + }, + "hidden": { + "description": "JS function that could use 'native.attribute' for calculation", + "type": "string" + }, + "hideOnlyControl": { + "description": "If hidden the place will be shown, but no control", + "type": "boolean" + }, + "disabled": { + "description": "JS function that could use 'native.attribute' for calculation", + "type": "string" + }, + "helpLink": { + "description": "href to help", + "type": "string" + }, + "help": { + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/multilingual" + } + ] + }, + "style": { + "description": "CSS style in react notation: 'radiusBorder' and not 'radius-border'", + "type": "object" + }, + "darkStyle": { + "description": "CSS style for dark mode", + "type": "string" + }, + "innerStyle": { + "description": "CSS style in react notation: 'radiusBorder' and not 'radius-border'", + "type": "object" + }, + "validator": { + "description": "JS function: true no error, false - error", + "type": "string" + }, + "validatorNoSaveOnError": { + "description": "True if save must be disabled by errors", + "type": "boolean" + }, + "validatorErrorText": { + "type": "string", + "description": "Text to show if validator fails" + }, + "showSecondAddAt": { + "description": "Number of lines from which the second add button at the bottom of the table will be shown. Default 5", + "type": "number" + }, + "tooltip": { + "description": "Optional tooltip", + "type": "string" + }, + "default": { + "description": "Default value" + }, + "onChange": { + "type": "object", + "additionalProperties": false, + "properties": { + "calculateFunc": { + "description": "JS function: that calculates value", + "type": "string" + }, + "ignoreOwnChanges": { + "description": "Do not trigger onChange event if changed value of this attribute", + "type": "boolean" + }, + "alsoDependsOn": { + "$ref": "#/definitions/alsoDependsOnSendProp" + } + } + }, + "doNotSave": { + "$ref": "#/definitions/doNotSaveProp" + }, + "defaultFunc": { + "description": "JS function to calculate default value", + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "func": { + "description": "JS function: that calculates value", + "type": "string" + }, + "alsoDependsOn": { + "$ref": "#/definitions/alsoDependsOnSendProp" + } + } + } + ] + }, + "noTranslation": { + "description": "Do not translate selects or other options (not for help, label or placeholder)", + "type": "boolean" + }, + "confirm": { + "description": "Confirm dialog", + "type": "object", + "additionalProperties": false, + "properties": { + "condition": { + "description": "JS function: true show confirm dialog", + "type": "string" + }, + "text": { + "description": "Text of confirmation dialog", + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/multilingual" + } + ] + }, + "title": { + "description": "Title of confirmation dialog", + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/multilingual" + } + ] + }, + "ok": { + "description": "Text for 'OK' button", + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/multilingual" + } + ] + }, + "cancel": { + "description": "Text for 'cancel' button", + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/definitions/multilingual" + } + ] + }, + "type": { + "type": "string", + "enum": ["info", "warning", "error", "none"] + }, + "alsoDependsOn": { + "description": "Trigger confirm dialog if on of the components changed.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "noMultiEdit": { + "description": "(only custom) if this flag set to true, this field will not be shown if user selected more than one object for edit", + "type": "boolean" + }, + "maxLength": { + "description": "max length of text in field", + "type": "number" + }, + "button": { + "description": "show link as button", + "type": "boolean" + } + } + } + } + } + } + } + }, + "if": { + "properties": { + "type": { + "const": "tabs" + } + } + }, + "then": { + "type": "object", + "required": ["type"], + "additionalProperties": false, + "properties": { + "type": true, + "$schema": true, + "i18n": true, + "items": true, + "iconPosition": true, + "tabsStyle": true + }, + "allOf": [ + { + "$ref": "#/definitions/topLevelProperties" + }, + { + "properties": { + "iconPosition": { + "$ref": "#/definitions/iconPositionProp" + }, + "tabsStyle": { + "description": "CSS styles in ReactJS notation: 'radiusBorder' and not 'radius-border'", + "type": "object" + } + } + } + ] + }, + "else": { + "type": "object", + "required": ["type"], + "additionalProperties": false, + "properties": { + "type": true, + "$schema": true, + "i18n": true, + "items": true + }, + "$ref": "#/definitions/topLevelProperties" + } +} diff --git a/packages/jsonConfig/schemas/testFailJsonConfig.json b/packages/jsonConfig/schemas/testFailJsonConfig.json new file mode 100644 index 000000000..fbdd80d2c --- /dev/null +++ b/packages/jsonConfig/schemas/testFailJsonConfig.json @@ -0,0 +1,409 @@ +{ + "$schema": "jsonConfig.json", + "type": "tabs", + "i18n": true, + "items": { + "mainTab": { + "type": "panel", + "label": "Main settings", + "items": { + "bind": { + "type": "ip", + "listenOnAllPorts": true, + "label": "IP", + "sm": 12, + "md": 8, + "lg": 5 + }, + "port": { + "type": "number", + "step": 1, + "min": 1, + "max": 65565, + "label": "Port", + "sm": 12, + "md": 4, + "lg": 3 + }, + "secure": { + "newLine": true, + "type": "checkbox", + "label": "Secure(HTTPS)", + "sm": 12, + "md": 6, + "lg": 2 + }, + "certPublic": { + "type": "certificate", + "hidden": "!data.secure", + "certType": "public", + "validator": "!data.secure || data.certPublic", + "label": "Public certificate", + "sm": 12, + "md": 6, + "lg": 2 + }, + "certPrivate": { + "hidden": "!data.secure", + "type": "certificate", + "certType": "private", + "validator": "!data.secure || data.certPrivate", + "label": "Private certificate", + "sm": 12, + "md": 6, + "lg": 2 + }, + "certChained": { + "hidden": "!data.secure", + "type": "certificate", + "certType": "chained", + "label": "Chained certificate", + "sm": 12, + "md": 6, + "lg": 2 + }, + "auth": { + "newLine": true, + "type": "checkbox", + "confirm": { + "condition": "!data.secure && data.auth", + "title": "Warning!", + "text": "Unsecure_Auth", + "ok": "Ignore warning", + "cancel": "Disable authentication", + "type": "warning", + "alsoDependsOn": ["secure"] + }, + "label": "Authentication", + "sm": 12, + "md": 6, + "lg": 2 + }, + "defaultUser": { + "hidden": "!!data.auth", + "type": "user", + "label": "Run as", + "sm": 12, + "md": 6, + "lg": 2 + }, + "ttl": { + "hidden": "!data.auth", + "type": "number", + "label": "Login timeout", + "step": 5, + "help": { + "en": "sec" + }, + "sm": 12, + "md": 6, + "lg": 2 + }, + "autoUpdate": { + "newLine": true, + "type": "select", + "label": "Auto update", + "options": [ + { + "label": "manually", + "value": 0 + }, + { + "label": "every 12 hours", + "value": 12 + }, + { + "label": "every day", + "value": 24 + }, + { + "label": "every 2 days", + "value": 48 + }, + { + "label": "every 3 days", + "value": 72 + }, + { + "label": "every week", + "value": 168 + }, + { + "label": "every 2 weeks", + "value": 336 + }, + { + "label": "monthly", + "value": 720 + } + ], + "sm": 12, + "md": 6, + "lg": 2 + }, + "thresholdValue": { + "type": "number", + "min": 50, + "label": "Events threshold value", + "sm": 12, + "md": 4, + "lg": 2 + }, + "react": { + "newLine": true, + "type": "checkbox", + "label": "Use react UI(experts)", + "sm": 12, + "md": 6, + "lg": 3 + } + } + }, + "leTab": { + "type": "panel", + "label": "Let's Encrypt SSL", + "disabled": "!data.secure", + "items": { + "_image": { + "type": "staticImage", + "tooltip": "Read about Let's Encrypt certificates", + "href": "https://github.com/ioBroker/ioBroker.admin/blob/master/README.md#lets-encrypt-certificates", + "src": "../../img/le.png", + "style": { + "width": 200, + "height": 59 + } + }, + "_link": { + "newLine": true, + "type": "staticLink", + "href": "https://github.com/ioBroker/ioBroker.admin/blob/master/README.md#lets-encrypt-certificates", + "text": "Read about Let's Encrypt certificates", + "style": { + "fontSize": 16, + "marginBottom": 20 + } + }, + "_linkButton": { + "button": true, + "variant": "contained", + "newLine": true, + "type": "staticLink", + "href": "https://github.com/ioBroker/ioBroker.admin/blob/master/README.md#lets-encrypt-certificates", + "text": "Read about Let's Encrypt certificates", + "style": { + "fontSize": 16, + "marginBottom": 20 + } + }, + "leEnabled": { + "newLine": true, + "type": "checkbox", + "label": "Use Lets Encrypt certificates" + }, + "leUpdate": { + "newLine": true, + "type": "checkbox", + "hidden": "!data.leEnabled", + "label": "Use this instance for automatic update" + }, + "lePort": { + "newLine": true, + "sm": 11, + "lg": 4, + "type": "number", + "doNotSave": true, + "hidden": "!data.leEnabled || !data.leUpdate", + "label": "Port to check the domain", + "style": { + "marginTop": 15, + "maxWidth": 200 + } + }, + "certs": { + "type": "certificates", + "newLine": true + } + } + }, + "loginTab": { + "type": "panel", + "label": "Login background", + "disabled": "!data.auth", + "items": { + "loginBackgroundColor": { + "type": "color", + "sm": 12, + "md": 8, + "lg": 4, + "label": "Background color of the login screen" + }, + "loginHideLogo": { + "newLine": true, + "sm": 12, + "md": 8, + "lg": 4, + "type": "checkbox", + "label": "Hide logo" + }, + "loginMotto": { + "newLine": true, + "sm": 12, + "md": 8, + "lg": 4, + "type": "text", + "label": "Own motto" + }, + "loginBackgroundImage": { + "newLine": true, + "sm": 12, + "md": 8, + "lg": 4, + "type": "checkbox", + "label": "Use background image" + }, + "login-bg.png": { + "newLine": true, + "type": "image", + "hidden": "!data.loginBackgroundImage", + "sm": 12, + "md": 8, + "lg": 4, + "accept": "image/*", + "label": "Upload image", + "crop": true + } + } + }, + "instancesTab": { + "type": "panel", + "label": { + "en": "Access to instances" + }, + "items": { + "_text1": { + "type": "staticText", + "text": { + "en": "There is a option to allow access to the specific configuration pages of selected instances." + } + }, + "accessLimit": { + "newLine": true, + "type": "checkbox", + "label": { + "en": "Allow access only to specific instances" + } + }, + "applyRights": { + "newLine": true, + "type": "checkbox", + "label": { + "en": "Apply access rights for selected instances" + } + }, + "accessAllowedConfigs": { + "hidden": "!data.accessLimit", + "newLine": true, + "type": "custom", + "url": "custom/customComponents.js", + "name": "AdminComponentEasyAccessSet/Components/ConfigCustomEasyAccess", + "i18n": true + } + } + }, + "demoTab": { + "type": "panel", + "label": { + "en": "Demo" + }, + "items": { + "demoPattern": { + "label": "Pattern", + "type": "pattern", + "pattern": "my ${data.bind} ${_alive}", + "copyToClipboard": true + }, + "_header": { + "newLine": true, + "type": "divider", + "sm": 12 + }, + "port": { + "type": "port", + "min": 1, + "max": 65565, + "label": "Port", + "sm": 12, + "md": 4, + "lg": 3 + }, + "myTable": { + "newLine": true, + "sm": 12, + "noDelete": false, + "type": "table", + "uniqueColumns": ["ip"], + "items": [ + { + "type": "certificates" + }, + { + "type": "text", + "attr": "ip", + "width": 100, + "title": "IP", + "filter": true, + "sort": true + }, + { + "type": "number", + "attr": "delay", + "width": "100%", + "title": "Delay", + "filter": false, + "sort": true, + "min": 1, + "test": 5 + }, + { + "type": "checkbox", + "attr": "enabled", + "width": 50, + "title": "Active", + "filter": false, + "sort": false + } + ] + }, + "myInstance": { + "newLine": true, + "sm": 6, + "type": "instance", + "adapter": "history", + "label": "History" + }, + "myObjectId": { + "type": "objectId", + "sm": 6, + "label": "Object ID" + }, + "myLanguage": { + "newLine": true, + "type": "language", + "sm": 6, + "label": "Language", + "system": true + }, + "_setState": { + "type": "setState", + "ack": true, + "variant": "contained", + "okText": "Done", + "val": "${data.myLanguage}", + "id": "javascript.0.value", + "label": "Test" + } + } + } + } +} diff --git a/packages/jsonConfig/schemas/testFailJsonConfigPanel.json b/packages/jsonConfig/schemas/testFailJsonConfigPanel.json new file mode 100644 index 000000000..55d9da404 --- /dev/null +++ b/packages/jsonConfig/schemas/testFailJsonConfigPanel.json @@ -0,0 +1,6 @@ +{ + "$schema": "jsonConfig.json", + "type": "panel", + "i18n": true, + "iconPosition": "bottom" +} diff --git a/packages/jsonConfig/schemas/testJSONConfigPanel.json b/packages/jsonConfig/schemas/testJSONConfigPanel.json new file mode 100644 index 000000000..da039294d --- /dev/null +++ b/packages/jsonConfig/schemas/testJSONConfigPanel.json @@ -0,0 +1,88 @@ +{ + "$schema": "jsonConfig.json", + "type": "panel", + "i18n": true, + "items": { + "deviceMan": { + "type": "deviceManager", + "sm": 12, + "style": { + "width": "100%", + "height": "100%", + "overflow": "hidden" + } + }, + "demoPattern": { + "label": "Pattern", + "type": "pattern", + "pattern": "my ${data.bind} ${_alive}", + "copyToClipboard": true + }, + "_header": { + "newLine": true, + "type": "divider", + "sm": 12 + }, + "myTable": { + "newLine": true, + "sm": 12, + "noDelete": false, + "type": "table", + "items": [ + { + "type": "text", + "attr": "ip", + "width": 100, + "title": "IP", + "filter": true, + "sort": true + }, + { + "type": "number", + "attr": "delay", + "width": "100%", + "title": "Delay", + "filter": false, + "sort": true + }, + { + "type": "checkbox", + "attr": "enabled", + "width": 50, + "title": "Active", + "filter": false, + "sort": false + } + ] + }, + "myInstance": { + "newLine": true, + "sm": 6, + "type": "instance", + "allowDeactivate": true, + "adapter": "history", + "label": "History" + }, + "myObjectId": { + "type": "objectId", + "sm": 6, + "label": "Object ID" + }, + "myLanguage": { + "newLine": true, + "type": "language", + "sm": 6, + "label": "Language", + "system": true + }, + "_setState": { + "type": "setState", + "ack": true, + "variant": "contained", + "okText": "Done", + "val": "${data.myLanguage}", + "id": "javascript.0.value", + "label": "Test" + } + } +} diff --git a/packages/jsonConfig/schemas/testJsonConfig.json b/packages/jsonConfig/schemas/testJsonConfig.json new file mode 100644 index 000000000..692c41b1d --- /dev/null +++ b/packages/jsonConfig/schemas/testJsonConfig.json @@ -0,0 +1,675 @@ +{ + "$schema": "jsonConfig.json", + "type": "tabs", + "i18n": true, + "iconPosition": "bottom", + "tabsStyle": {}, + "items": { + "mainTab": { + "type": "panel", + "style": {}, + "innerStyle": {}, + "label": "Main settings", + "items": { + "qrCode": { + "type": "qrCode", + "data": "MT:XYZ", + "bgColor": "red", + "fgColor": "blue", + "size": 24, + "level": "M" + }, + "timePicker": { + "type": "timePicker", + "format": "HH:mm:ss", + "views": ["hours", "minutes"], + "returnFormat": "HH:mm:ss", + "timeSteps": { + "minutes": 1, + "hours": 1 + }, + "tooltip": "test" + }, + "datePicker": { + "type": "datePicker" + }, + "fileSelector": { + "type": "fileSelector", + "pattern": "*.jsx", + "maxSize": "2MB", + "noSize": true + }, + "bind": { + "type": "ip", + "listenOnAllPorts": true, + "label": "IP", + "sm": 12, + "md": 8, + "lg": 5, + "noInternal": true + }, + "port": { + "type": "number", + "step": 1, + "min": 1, + "max": 65565, + "label": "Port", + "sm": 12, + "md": 4, + "lg": 3 + }, + "secure": { + "newLine": true, + "type": "checkbox", + "label": "Secure(HTTPS)", + "sm": 12, + "md": 6, + "lg": 2 + }, + "certPublic": { + "type": "certificate", + "hidden": "!data.secure", + "certType": "public", + "validator": "!data.secure || data.certPublic", + "label": "Public certificate", + "sm": 12, + "md": 6, + "lg": 2 + }, + "certPrivate": { + "hidden": "!data.secure", + "type": "certificate", + "certType": "private", + "validator": "!data.secure || data.certPrivate", + "label": "Private certificate", + "sm": 12, + "md": 6, + "lg": 2 + }, + "certChained": { + "hidden": "!data.secure", + "type": "certificate", + "certType": "chained", + "label": "Chained certificate", + "sm": 12, + "md": 6, + "lg": 2 + }, + "cron": { + "label": "cron", + "type": "cron", + "simple": true + }, + "auth": { + "newLine": true, + "type": "checkbox", + "confirm": { + "condition": "!data.secure && data.auth", + "title": "Warning!", + "text": "Unsecure_Auth", + "ok": "Ignore warning", + "cancel": "Disable authentication", + "type": "warning", + "alsoDependsOn": ["secure"] + }, + "label": "Authentication", + "sm": 12, + "md": 6, + "lg": 2 + }, + "autocmpleteSendTo": { + "type": "autocompleteSendTo", + "command": "", + "alsoDependsOn": ["auth"] + }, + "defaultUser": { + "hidden": "!!data.auth", + "type": "user", + "label": "Run as", + "sm": 12, + "md": 6, + "lg": 2 + }, + "ttl": { + "hidden": "!data.auth", + "type": "number", + "label": "Login timeout", + "step": 5, + "help": { + "en": "sec" + }, + "sm": 12, + "md": 6, + "lg": 2 + }, + "autoUpdate": { + "newLine": true, + "type": "select", + "label": "Auto update", + "options": [ + { + "label": "manually", + "value": 0 + }, + { + "label": "every 12 hours", + "value": 12 + }, + { + "label": "every day", + "value": 24 + }, + { + "label": "every 2 days", + "value": 48 + }, + { + "label": "every 3 days", + "value": 72 + }, + { + "label": "every week", + "value": 168 + }, + { + "label": "every 2 weeks", + "value": 336 + }, + { + "label": "monthly", + "value": 720 + } + ], + "sm": 12, + "md": 6, + "lg": 2 + }, + "thresholdValue": { + "type": "number", + "min": 50, + "label": "Events threshold value", + "sm": 12, + "md": 4, + "lg": 2 + }, + "react": { + "newLine": true, + "type": "checkbox", + "label": "Use react UI(experts)", + "sm": 12, + "md": 6, + "lg": 3 + }, + "instance": { + "type": "instance", + "allowDeactivate": true, + "adapter": "admin", + "long": true + } + } + }, + "leTab": { + "type": "panel", + "label": "Let's Encrypt SSL", + "disabled": "!data.secure", + "items": { + "_image": { + "type": "staticImage", + "tooltip": "Read about Let's Encrypt certificates", + "href": "https://github.com/ioBroker/ioBroker.admin/blob/master/README.md#lets-encrypt-certificates", + "src": "../../img/le.png", + "style": { + "width": 200, + "height": 59 + } + }, + "_link": { + "newLine": true, + "type": "staticLink", + "href": "https://github.com/ioBroker/ioBroker.admin/blob/master/README.md#lets-encrypt-certificates", + "text": "Read about Let's Encrypt certificates", + "color": "#fff", + "style": { + "fontSize": 16, + "marginBottom": 20 + } + }, + "_linkButton": { + "button": true, + "variant": "contained", + "newLine": true, + "type": "staticLink", + "href": "https://github.com/ioBroker/ioBroker.admin/blob/master/README.md#lets-encrypt-certificates", + "text": "Read about Let's Encrypt certificates", + "style": { + "fontSize": 16, + "marginBottom": 20 + } + }, + "leEnabled": { + "newLine": true, + "type": "checkbox", + "label": "Use Lets Encrypt certificates" + }, + "leUpdate": { + "newLine": true, + "type": "checkbox", + "hidden": "!data.leEnabled", + "label": "Use this instance for automatic update" + }, + "lePort": { + "newLine": true, + "sm": 11, + "lg": 4, + "type": "number", + "doNotSave": true, + "hidden": "!data.leEnabled || !data.leUpdate", + "label": "Port to check the domain", + "style": { + "marginTop": 15, + "maxWidth": 200 + } + }, + "certs": { + "type": "certificates", + "newLine": true + } + } + }, + "loginTab": { + "type": "panel", + "label": "Login background", + "disabled": "!data.auth", + "items": { + "loginBackgroundColor": { + "type": "color", + "sm": 12, + "md": 8, + "lg": 4, + "label": "Background color of the login screen" + }, + "loginHideLogo": { + "newLine": true, + "sm": 12, + "md": 8, + "lg": 4, + "type": "checkbox", + "label": "Hide logo" + }, + "loginMotto": { + "newLine": true, + "sm": 12, + "md": 8, + "lg": 4, + "type": "text", + "label": "Own motto", + "noClearButton": true + }, + "loginBackgroundImage": { + "newLine": true, + "sm": 12, + "md": 8, + "lg": 4, + "type": "checkbox", + "label": "Use background image" + }, + "login-bg.png": { + "newLine": true, + "type": "image", + "hidden": "!data.loginBackgroundImage", + "sm": 12, + "md": 8, + "lg": 4, + "accept": "image/*", + "label": "Upload image", + "crop": true + } + } + }, + "instancesTab": { + "type": "panel", + "icon": "", + "iconPosition": "start", + "label": { + "en": "Access to instances", + "de": "", + "uk": "" + }, + "items": { + "_text1": { + "type": "staticText", + "text": { + "en": "There is a option to allow access to the specific configuration pages of selected instances." + } + }, + "_text2": { + "type": "staticText", + "label": { + "en": "label is also ok instead of text" + } + }, + "defaultSendToText": { + "type": "text", + "defaultSendTo": "fill", + "allowSaveWithError": true + }, + "textSendTo": { + "type": "textSendTo", + "command": "test" + }, + "accessLimit": { + "newLine": true, + "type": "checkbox", + "label": { + "en": "Allow access only to specific instances" + } + }, + "applyRights": { + "newLine": true, + "type": "checkbox", + "label": { + "en": "Apply access rights for selected instances" + } + }, + "accessAllowedConfigs": { + "hidden": "!data.accessLimit", + "newLine": true, + "type": "custom", + "url": "custom/customComponents.js", + "name": "AdminComponentEasyAccessSet/Components/ConfigCustomEasyAccess", + "i18n": true + } + } + }, + "demoTab": { + "type": "panel", + "label": { + "en": "Demo" + }, + "items": { + "demoPattern": { + "label": "Pattern", + "type": "pattern", + "pattern": "my ${data.bind} ${_alive}", + "copyToClipboard": true + }, + "_header": { + "newLine": true, + "type": "divider", + "sm": 12 + }, + "port": { + "type": "port", + "min": 1, + "max": 65565, + "label": "Port", + "sm": 12, + "md": 4, + "lg": 3 + }, + "sendTo": { + "type": "sendTo", + "command": "test", + "openUrl": true, + "onLoaded": true + }, + "reverseProxy": { + "sm": 12, + "newLine": true, + "type": "table", + "showSecondAddAt": 1, + "items": [ + { + "type": "chips", + "width": 100, + "filter": false + }, + { + "type": "autocomplete", + "options": [], + "width": 100, + "filter": false + }, + { + "filter": true, + "width": 200, + "type": "staticLink", + "href": "https://iobroker.net", + "color": "#fff" + }, + { + "type": "datePicker" + }, + { + "type": "timePicker", + "tooltip": "test", + "format": "HH:mm:ss", + "views": ["hours", "minutes"], + "returnFormat": "HH:mm:ss", + "timeSteps": { + "minutes": 1, + "hours": 1 + } + }, + { + "type": "panel", + "#include": "dummy.jsonConfig.json" + }, + { + "type": "text", + "defaultSendTo": "fill" + }, + { + "type": "fileSelector", + "pattern": "*.js" + }, + { + "type": "objectId", + "title": "s_TargetState", + "attr": "chTargetState", + "filter": false, + "sort": false, + "width": "40%", + "types": ["state"] + }, + { + "type": "autocompleteSendTo", + "command": "", + "alsoDependsOn": [], + "width": 50 + }, + { + "type": "text", + "width": "50%", + "title": "Global path", + "attr": "globalPath", + "filter": false, + "sort": false, + "default": "/iobroker/" + }, + { + "type": "staticText", + "text": "=>", + "noTranslation": true, + "width": 20 + }, + { + "type": "table", + "width": "50%", + "attr": "paths", + "filter": false, + "sort": false, + "default": [ + { + "instance": "web.0", + "path": "/web/" + } + ], + "items": [ + { + "type": "instance", + "width": 200, + "title": { + "en": "Instance" + }, + "attr": "instance", + "filter": false, + "sort": false, + "default": "web.0" + }, + { + "type": "text", + "width": "80%", + "title": { + "en": "Instance path behind proxy" + }, + "attr": "path", + "filter": false, + "sort": false, + "default": "/web/" + } + ] + } + ] + }, + "myTable": { + "newLine": true, + "sm": 12, + "noDelete": false, + "type": "table", + "export": true, + "allowAddByFilter": false, + "uniqueColumns": ["ip"], + "items": [ + { + "type": "cron", + "complex": true, + "width": 50 + }, + { + "type": "select", + "width": 50 + }, + { + "type": "password", + "width": 10, + "attr": "pw1" + }, + { + "type": "selectSendTo", + "alsoDependsOn": ["sendTo"], + "command": "test", + "width": 50, + "title": { + "en": "Select send to", + "de": "" + }, + "doNotSave": true + }, + { + "type": "certificates" + }, + { + "type": "text", + "noClearButton": true, + "attr": "ip", + "width": 100, + "title": "IP", + "filter": true, + "sort": true + }, + { + "type": "number", + "attr": "delay", + "width": "100%", + "title": "Delay", + "filter": false, + "sort": true, + "min": 1 + }, + { + "type": "checkbox", + "attr": "enabled", + "width": 50, + "title": "Active", + "filter": false, + "sort": false + }, + { + "type": "qrCode", + "data": "MT:XYZ", + "bgColor": "red", + "fgColor": "blue", + "size": 24, + "level": "L" + } + ] + }, + "myAccordion": { + "hidden": "!!data.foreignSettingsInstance", + "newLine": true, + "type": "accordion", + "titleAttr": "name", + "sm": 12, + "md": 12, + "lg": 12, + "items": [ + { + "type": "header", + "attr": "_header", + "text": "Headline", + "size": 4 + }, + { + "type": "text", + "attr": "name", + "label": "Name", + "sm": 12, + "md": 4, + "lg": 4, + "default": "custom", + "help": "Just lower case letters (a-z)", + "validator": "/^([a-z]{1,})$/.test(data.name) && !['time', 'date', 'temperature', 'humidity', 'battery'].includes(data.name) && [...globalData.customApps, ...globalData.historyApps, ...globalData.expertApps].filter(app => app.name === data.name).length === 1", + "validatorErrorText": "Just lower case letters (a-z)", + "validatorNoSaveOnError": true + } + ] + }, + "alive": { + "type": "alive", + "instance": "admin.0", + "textAlive": "Instance %s is alive", + "textNotAlive": "Instance %s is not alive" + }, + "myInstance": { + "newLine": true, + "sm": 6, + "type": "instance", + "adapter": "history", + "label": "History" + }, + "myObjectId": { + "type": "objectId", + "sm": 6, + "label": "Object ID" + }, + "myLanguage": { + "newLine": true, + "type": "language", + "sm": 6, + "label": "Language", + "system": true + }, + "_setState": { + "type": "setState", + "ack": true, + "variant": "contained", + "okText": "Done", + "val": "${data.myLanguage}", + "id": "javascript.0.value", + "label": "Test" + } + } + } + } +} diff --git a/packages/jsonConfig/src/JsonConfigComponent/ConfigPanel.tsx b/packages/jsonConfig/src/JsonConfigComponent/ConfigPanel.tsx index 74ed772af..38a5b089d 100644 --- a/packages/jsonConfig/src/JsonConfigComponent/ConfigPanel.tsx +++ b/packages/jsonConfig/src/JsonConfigComponent/ConfigPanel.tsx @@ -50,6 +50,7 @@ import ConfigState from './ConfigState'; import ConfigStaticDivider from './ConfigStaticDivider'; import ConfigStaticHeader from './ConfigStaticHeader'; import ConfigStaticImage from './ConfigStaticImage'; +import ConfigStaticInfo from './ConfigStaticInfo'; import ConfigStaticText from './ConfigStaticText'; import ConfigTable from './ConfigTable'; import ConfigText from './ConfigText'; @@ -107,6 +108,7 @@ const components: Record> = { slider: ConfigSlider, state: ConfigState, staticImage: ConfigStaticImage, + staticInfo: ConfigStaticInfo, staticLink: ConfigStaticText, staticText: ConfigStaticText, table: ConfigTable, diff --git a/packages/jsonConfig/src/JsonConfigComponent/ConfigPattern.tsx b/packages/jsonConfig/src/JsonConfigComponent/ConfigPattern.tsx index 541e39f7d..8d37adbf4 100644 --- a/packages/jsonConfig/src/JsonConfigComponent/ConfigPattern.tsx +++ b/packages/jsonConfig/src/JsonConfigComponent/ConfigPattern.tsx @@ -2,7 +2,7 @@ import React, { type JSX } from 'react'; import { IconButton, TextField } from '@mui/material'; -import { IconCopy, Utils } from '@iobroker/adapter-react-v5'; +import { I18n, IconCopy, Utils } from '@iobroker/adapter-react-v5'; import type { ConfigItemPattern } from '#JC/types'; import ConfigGeneric, { type ConfigGenericProps, type ConfigGenericState } from './ConfigGeneric'; @@ -24,7 +24,7 @@ class ConfigPattern extends ConfigGeneric { Utils.copyToClipboard(this.getPattern(this.props.schema.pattern)); - window.alert('Copied'); + window.alert(I18n.t('ra_Copied')); }} > diff --git a/packages/jsonConfig/src/JsonConfigComponent/ConfigStaticInfo.tsx b/packages/jsonConfig/src/JsonConfigComponent/ConfigStaticInfo.tsx new file mode 100644 index 000000000..245274034 --- /dev/null +++ b/packages/jsonConfig/src/JsonConfigComponent/ConfigStaticInfo.tsx @@ -0,0 +1,273 @@ +import React, { type JSX } from 'react'; + +import { Box } from '@mui/material'; +import { ContentCopy } from '@mui/icons-material'; +import { I18n, Icon, type IobTheme, Utils } from '@iobroker/adapter-react-v5'; + +import type { ConfigItemStaticInfo } from '#JC/types'; +import ConfigGeneric, { type ConfigGenericProps, type ConfigGenericState } from './ConfigGeneric'; + +function valueBlinkOnce(theme: IobTheme, force: boolean, color?: string | boolean): any { + if (typeof color === 'string') { + return { + '@keyframes newValueAnimationOnceColor': { + '0%': { + color: force ? `${color} !important` : color, + }, + '100%': { + color: + theme.palette.mode === 'dark' + ? force + ? '#fff !important' + : '#fff' + : force + ? '#000 !important' + : '#000', + }, + }, + animation: 'newValueAnimationOnceColor 2s ease-in-out', + }; + } + return { + '@keyframes newValueAnimationOnce': { + '0%': { + color: force ? `#00f900 !important` : '#00f900', + }, + '80%': { + color: + theme.palette.mode === 'dark' + ? force + ? `#518851 !important` + : '#518851' + : force + ? `#008000 !important` + : '#008000', + }, + '100%': { + color: + theme.palette.mode === 'dark' + ? force + ? '#fff !important' + : '#fff' + : force + ? '#000 !important' + : '#000', + }, + }, + animation: 'newValueAnimationOnce 2s ease-in-out', + }; +} + +function valueBlink(theme: IobTheme, color?: string | boolean): any { + if (typeof color === 'string') { + return { + '@keyframes blinkAnimationColor': { + '0%': { + color, + }, + '100%': { + color: theme.palette.mode === 'dark' ? '#fff' : '#000', + }, + }, + animation: 'blinkAnimationColor 2s ease-in-out infinite', + }; + } + return { + '@keyframes blinkAnimation': { + '0%': { + color: '#00f900', + }, + '80%': { + color: theme.palette.mode === 'dark' ? '#518851' : '#008000', + }, + '100%': { + color: theme.palette.mode === 'dark' ? '#fff' : '#000', + }, + }, + animation: 'blinkAnimation 2s ease-in-out infinite', + }; +} + +const styles: Record = { + label: { + fontWeight: 'bold', + }, + valueImage: { + maxHeight: '100%', + }, + valueAndUnit: { + display: 'flex', + gap: 4, + alignItems: 'baseline', + }, + value: {}, + unit: { + fontSize: 'smaller', + opacity: 0.7, + }, +}; + +interface ConfigStaticInfoProps extends ConfigGenericProps { + schema: ConfigItemStaticInfo; +} + +class ConfigStaticInfo extends ConfigGeneric { + renderItem(_error: string): JSX.Element { + let label: string | JSX.Element | JSX.Element[] = this.getText( + this.props.schema.text || this.props.schema.label, + this.props.schema.noTranslation, + ); + if (this.props.schema.addColon && typeof label === 'string' && !label.trim().endsWith(':')) { + label = `${label.trim()}:`; + } + + if ( + label && + (label.includes('') || label.includes('')) + ) { + label = Utils.renderTextWithA(label); + } + let fontSize: number | undefined; + if (this.props.schema.size === 'normal') { + fontSize = 16; + } else if (this.props.schema.size === 'large') { + fontSize = 20; + } else if (typeof this.props.schema.size === 'number') { + fontSize = this.props.schema.size; + } + + const divStyle: React.CSSProperties = { + width: '100%', + height: '100%', + display: 'flex', + alignItems: 'center', + position: 'relative', + fontSize, + }; + + if (this.props.schema.narrow) { + divStyle.gap = 8; + } else { + divStyle.justifyContent = 'space-between'; + } + + let value: React.JSX.Element; + let valueTxt: string; + if (this.props.schema.data && typeof this.props.schema.data === 'object' && this.props.schema.data.en) { + valueTxt = this.getText(this.props.schema.data); + } else if ( + typeof this.props.schema.data === 'object' || + this.props.schema.data === undefined || + this.props.schema.data === null + ) { + valueTxt = JSON.stringify(this.props.schema.data); + } else if (typeof this.props.schema.data === 'number') { + valueTxt = this.props.schema.data.toString(); + if (this.props.isFloatComma) { + valueTxt = valueTxt.replace('.', ','); + } + } else { + valueTxt = this.props.schema.data.toString(); + } + if (valueTxt.startsWith('data:image/')) { + value = ( +
+ +
+ ); + } else { + value =
{valueTxt}
; + } + if (this.props.schema.blinkOnUpdate && this.props.schema.blink) { + const style1 = valueBlinkOnce(this.props.theme, true, this.props.schema.blinkOnUpdate); + const style2 = valueBlink(this.props.theme, this.props.schema.blink); + value = ( + + {value} + + ); + } else if (this.props.schema.blinkOnUpdate) { + const style = valueBlinkOnce(this.props.theme, false, this.props.schema.blinkOnUpdate); + value = ( + + {value} + + ); + } else if (this.props.schema.blink) { + const style = valueBlink(this.props.theme, this.props.schema.blink); + value = {value}; + } + + if (this.props.schema.unit) { + value = ( +
+ {value} +
+ {this.getText(this.props.schema.unit)} +
+
+ ); + } + + let labelIcon: React.JSX.Element | undefined; + if (this.props.schema.labelIcon) { + labelIcon = ( + + ); + } + let copyButton: React.JSX.Element | undefined; + if (this.props.schema.copyToClipboard) { + copyButton = ( + { + Utils.copyToClipboard(valueTxt); + window.alert(I18n.t('ra_Copied')); + }} + /> + ); + } + + return ( + +
+ {labelIcon} + {label} +
+ {value} + {copyButton} +
+ ); + } +} + +export default ConfigStaticInfo; diff --git a/packages/jsonConfig/src/JsonConfigComponent/ConfigStaticText.tsx b/packages/jsonConfig/src/JsonConfigComponent/ConfigStaticText.tsx index 7f73563e7..dffcddaee 100644 --- a/packages/jsonConfig/src/JsonConfigComponent/ConfigStaticText.tsx +++ b/packages/jsonConfig/src/JsonConfigComponent/ConfigStaticText.tsx @@ -65,11 +65,11 @@ function onLink(href: string, target: '_blank' | '_self' | string, instanceId: s } } -interface ConfigInstanceSelectProps extends ConfigGenericProps { +interface ConfigStaticTextProps extends ConfigGenericProps { schema: ConfigItemStaticText; } -class ConfigStaticText extends ConfigGeneric { +class ConfigStaticText extends ConfigGeneric { renderItem(_error: string, disabled: boolean /* , defaultValue */): JSX.Element { if (this.props.schema.button) { const icon = this.getIcon(); diff --git a/packages/jsonConfig/src/JsonConfigComponent/ConfigText.tsx b/packages/jsonConfig/src/JsonConfigComponent/ConfigText.tsx index cdfb3db84..7c94f9c14 100644 --- a/packages/jsonConfig/src/JsonConfigComponent/ConfigText.tsx +++ b/packages/jsonConfig/src/JsonConfigComponent/ConfigText.tsx @@ -4,7 +4,7 @@ import { Autocomplete, TextField, TextareaAutosize, InputAdornment, IconButton } import { Close as CloseIcon } from '@mui/icons-material'; -import { I18n } from '@iobroker/adapter-react-v5'; +import { I18n, IconCopy, Utils } from '@iobroker/adapter-react-v5'; import type { ConfigItemText } from '#JC/types'; import ConfigGeneric, { type ConfigGenericProps, type ConfigGenericState } from './ConfigGeneric'; @@ -234,6 +234,36 @@ class ConfigText extends ConfigGeneric { ); } + let actionButton: React.JSX.Element | undefined; + if ((this.props.schema.readOnly || disabled) && this.props.schema.copyToClipboard) { + actionButton = ( + { + Utils.copyToClipboard(this.state.value); + window.alert(I18n.t('ra_Copied')); + }} + > + + + ); + } else if (!this.props.schema.readOnly && !disabled && this.state.value && !this.props.schema.noClearButton) { + actionButton = ( + + + this.setState({ value: '', oldValue: this.state.value }, () => + this.onChange(this.props.attr, ''), + ) + } + > + + + + ); + } + return ( { readOnly: this.props.schema.readOnly || false, }, input: { - endAdornment: - !this.props.schema.readOnly && - !disabled && - this.state.value && - !this.props.schema.noClearButton ? ( - - - this.setState({ value: '', oldValue: this.state.value }, () => - this.onChange(this.props.attr, ''), - ) - } - > - - - - ) : null, + endAdornment: actionButton, }, }} onChange={e => { diff --git a/packages/jsonConfig/src/JsonConfigComponent/ConfigTextSendTo.tsx b/packages/jsonConfig/src/JsonConfigComponent/ConfigTextSendTo.tsx index 8d5ec970d..f7ddafe18 100644 --- a/packages/jsonConfig/src/JsonConfigComponent/ConfigTextSendTo.tsx +++ b/packages/jsonConfig/src/JsonConfigComponent/ConfigTextSendTo.tsx @@ -2,7 +2,7 @@ import React, { type JSX } from 'react'; import { TextField, IconButton } from '@mui/material'; -import { Icon, IconCopy, Utils } from '@iobroker/adapter-react-v5'; +import { I18n, Icon, IconCopy, Utils } from '@iobroker/adapter-react-v5'; import type { ConfigItemSendTo } from '#JC/types'; import getIconByName from './Icons'; @@ -124,7 +124,7 @@ class ConfigTextSendTo extends ConfigGeneric { Utils.copyToClipboard(this.state.text); - window.alert('Copied'); + window.alert(I18n.t('ra_Copied')); }} > diff --git a/packages/jsonConfig/src/types.d.ts b/packages/jsonConfig/src/types.d.ts index 7d7f0a4a4..6b8d04bb5 100644 --- a/packages/jsonConfig/src/types.d.ts +++ b/packages/jsonConfig/src/types.d.ts @@ -32,6 +32,7 @@ export type ConfigItemType = | 'pattern' | 'sendto' | 'setState' + | 'staticInfo' | 'staticText' | 'staticLink' | 'staticImage' @@ -263,6 +264,8 @@ export interface ConfigItemText extends ConfigItem { max?: number; /** read-only field */ readOnly?: boolean; + /** show copy to clipboard button, but only if disabled or read-only */ + copyToClipboard?: boolean; /** default is true. Set this attribute to `false` if trim is not desired. */ trim?: boolean; /** default is 1. Set this attribute to `2` or more if you want to have a textarea with more than one row. */ @@ -418,7 +421,7 @@ export interface ConfigItemStaticImage extends ConfigItem { export interface ConfigItemStaticText extends Omit { type: 'staticText'; /** multi-language text */ - text: string; + text: ioBroker.StringOrTranslated; /** @deprecated use text */ label?: ioBroker.StringOrTranslated; /** link. Link could be dynamic like `#tab-objects/customs/${data.parentId} */ @@ -439,6 +442,34 @@ export interface ConfigItemStaticText extends Omit { controlStyle: CustomCSSProperties; } +export interface ConfigItemStaticInfo extends ConfigItem { + type: 'staticInfo'; + /** multi-language text or value */ + data: ioBroker.StringOrTranslated | number | boolean; + /** Base64 icon */ + labelIcon?: string; + /** Unit */ + unit?: ioBroker.StringOrTranslated; + /** Normally the title and value are shown on the left and right of the line. With this flag, the value will appear just after the label*/ + narrow?: boolean; + /** Add to label the colon at the end if not exist in label */ + addColon?: boolean; + /** Value should blink when updated (true or color) */ + blinkOnUpdate?: boolean | string; + /** Value should blink continuously (true or color) */ + blink?: boolean | string; + /** Show copy to clipboard button for value */ + copyToClipboard?: boolean; + /** Label style */ + styleLabel?: CustomCSSProperties; + /** Value style */ + styleValue?: CustomCSSProperties; + /** Unit style */ + styleUnit?: CustomCSSProperties; + /** Font size */ + size?: number | 'small' | 'normal' | 'large'; +} + export interface ConfigItemRoom extends ConfigItem { type: 'room'; short?: boolean; @@ -938,6 +969,7 @@ export type ConfigItemAny = | ConfigItemSetState | ConfigItemStaticDivider | ConfigItemStaticHeader + | ConfigItemStaticInfo | ConfigItemStaticImage | ConfigItemStaticText | ConfigItemTopic diff --git a/packages/adapter-react-v5/test/testSchema.ts b/packages/jsonConfig/test/testSchema.ts similarity index 100% rename from packages/adapter-react-v5/test/testSchema.ts rename to packages/jsonConfig/test/testSchema.ts diff --git a/packages/jsonConfig/test/tsconfig.build.json b/packages/jsonConfig/test/tsconfig.build.json new file mode 100644 index 000000000..99f5e2a56 --- /dev/null +++ b/packages/jsonConfig/test/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": false, + "noEmit": false, + "declaration": false, + "skipLibCheck": true, + "module": "commonjs" + }, + "include": ["./**/*.ts"] +} diff --git a/packages/jsonConfig/test/tsconfig.check.json b/packages/jsonConfig/test/tsconfig.check.json new file mode 100644 index 000000000..60fc496a5 --- /dev/null +++ b/packages/jsonConfig/test/tsconfig.check.json @@ -0,0 +1,7 @@ +// Specialized tsconfig for type-checking js files +{ + "extends": "./tsconfig.json", + "compilerOptions": {}, + "include": ["**/*.ts"], + "exclude": ["**/build-test", "node_modules/"] +} diff --git a/packages/jsonConfig/test/tsconfig.json b/packages/jsonConfig/test/tsconfig.json new file mode 100644 index 000000000..bfe2082bc --- /dev/null +++ b/packages/jsonConfig/test/tsconfig.json @@ -0,0 +1,26 @@ +// Root tsconfig to set the settings and power editor support for all TS files +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "module": "esnext", + "target": "esnext", + "baseUrl": ".", + "jsx": "preserve", + "moduleResolution": "node", + + // do not compile anything. This file is just to configure type checking + "noEmit": true, + "allowJs": false, + "checkJs": false, + "outDir": "./", + "sourceMap": true, + "inlineSources": true, + + // This is necessary for the automatic typing of the adapter config + "noImplicitAny": true, + "useUnknownInCatchVariables": false, + "types": ["@types/node"] + }, + "include": ["**/*.ts", "**/*.d.ts", "eslint.config.mjs"], + "exclude": ["node_modules/**", "test/testSchema.js"] +}