diff --git a/CHANGELOG.md b/CHANGELOG.md index 35d89591b..d2c759a41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,21 @@ All notable changes to homebridge-config-ui-x will be documented in this file. +## Beta-4.52.2 (2023-11-XX) + +### Notable Changes + +- Prevent the UI from updating when running an unsupported version of Node.js + - This mimics the behaviour of updating Homebridge itself + - The option of 'Update Anyway' will still appear for other plugins when running an unsupported version of Node.js + +### Other Changes + +- **i18n:** Update pl.json ([1633](https://github.com/homebridge/homebridge-config-ui-x/pull/1633)) +- **i18n:** Update fr.json ([1629](https://github.com/homebridge/homebridge-config-ui-x/pull/1629)) +- **i18n:** Update es.json (Improves Spanish localization) ([1632](https://github.com/homebridge/homebridge-config-ui-x/pull/1632)) +- Updated dependencies, including `@homebridge/node-pty-prebuilt-multiarch` to `0.11.10` + ## 4.52.1 (2023-11-04) ### Other Changes diff --git a/config.schema.json b/config.schema.json index 4dfad1efd..ef62b00c9 100644 --- a/config.schema.json +++ b/config.schema.json @@ -2,7 +2,7 @@ "pluginAlias": "config", "pluginType": "platform", "singular": true, - "footerDisplay": "[REST API Documentation ](/swagger)", + "footerDisplay": "[REST API Documentation ](/swagger)", "schema": { "type": "object", "properties": { diff --git a/nodemon.json b/nodemon.json index 78ab00927..783307b8a 100644 --- a/nodemon.json +++ b/nodemon.json @@ -8,4 +8,4 @@ ], "exec": "sleep 2 && UIX_INSECURE_MODE=1 UIX_SERVICE_MODE=1 HOMEBRIDGE_CONFIG_UI_TERMINAL=1 ts-node -r tsconfig-paths/register src/bin/hb-service.ts run --stdout", "signal": "SIGTERM" -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index 9f8e1a14c..16c8f6fce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "@fastify/multipart": "8.0.0", "@fastify/static": "6.12.0", "@fastify/swagger": "8.12.0", - "@homebridge/node-pty-prebuilt-multiarch": "0.11.8", + "@homebridge/node-pty-prebuilt-multiarch": "0.11.10", "@nestjs/axios": "3.0.1", "@nestjs/common": "10.2.8", "@nestjs/core": "10.2.8", @@ -31,17 +31,17 @@ "@nestjs/passport": "10.0.2", "@nestjs/platform-fastify": "10.2.8", "@nestjs/platform-socket.io": "10.2.8", - "@nestjs/swagger": "7.1.14", + "@nestjs/swagger": "7.1.15", "@nestjs/websockets": "10.2.8", "@oznu/hap-client": "1.9.0", - "axios": "1.6.0", + "axios": "1.6.1", "class-transformer": "0.5.1", "class-validator": "0.14.0", - "commander": "7.2.0", + "commander": "11.1.0", "dayjs": "1.11.10", "emoji-js": "3.7.0", "fastify": "4.24.3", - "fs-extra": "10.1.0", + "fs-extra": "11.1.1", "node-cache": "5.1.2", "node-schedule": "2.1.1", "ora": "5.4.1", @@ -63,15 +63,18 @@ }, "devDependencies": { "@nestjs/testing": "^10.2.7", - "@types/fs-extra": "^9.0.13", - "@types/jest": "^29.5.7", - "@types/node": "^18.18.8", - "@types/node-schedule": "^2.1.2", - "@types/semver": "^7.5.4", - "@types/tar": "^6.1.7", - "@types/unzipper": "^0.10.8", - "@typescript-eslint/eslint-plugin": "^6.9.1", - "@typescript-eslint/parser": "^6.9.1", + "@types/fs-extra": "^11.0.4", + "@types/jest": "^29.5.8", + "@types/node": "^18.18.9", + "@types/node-schedule": "^2.1.3", + "@types/passport-jwt": "^3.0.13", + "@types/semver": "^7.5.5", + "@types/tail": "^2.2.3", + "@types/tar": "^6.1.8", + "@types/tcp-port-used": "^1.0.4", + "@types/unzipper": "^0.10.9", + "@typescript-eslint/eslint-plugin": "^6.10.0", + "@typescript-eslint/parser": "^6.10.0", "babel-jest": "^29.7.0", "bash-color": "^0.0.4", "buffer-shims": "^1.0.0", @@ -938,9 +941,9 @@ } }, "node_modules/@homebridge/node-pty-prebuilt-multiarch": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@homebridge/node-pty-prebuilt-multiarch/-/node-pty-prebuilt-multiarch-0.11.8.tgz", - "integrity": "sha512-rVG0Hr6kYeauCtKZRoJaNg2jNlx4LPSH5siQdWlfrezwjxXw3Whu50ulGKL42dHvkpvJDj5EpZbOhIgm3RpVFQ==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@homebridge/node-pty-prebuilt-multiarch/-/node-pty-prebuilt-multiarch-0.11.10.tgz", + "integrity": "sha512-ttOE8QQRq/aRXDoKD2rfYEF50AiDLM9LPTohqCog1Z78g8k3Zqk15R/EHfTl/8cfw4l0fxt3y0dWL56wq79p2A==", "hasInstallScript": true, "dependencies": { "nan": "^2.18.0", @@ -1955,9 +1958,9 @@ } }, "node_modules/@nestjs/mapped-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.2.tgz", - "integrity": "sha512-V0izw6tWs6fTp9+KiiPUbGHWALy563Frn8X6Bm87ANLRuE46iuBMD5acKBDP5lKL/75QFvrzSJT7HkCbB0jTpg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.3.tgz", + "integrity": "sha512-40Zdqg98lqoF0+7ThWIZFStxgzisK6GG22+1ABO4kZiGF/Tu2FE+DYLw+Q9D94vcFWizJ+MSjNN4ns9r6hIGxw==", "peerDependencies": { "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", "class-transformer": "^0.4.0 || ^0.5.0", @@ -2033,15 +2036,15 @@ } }, "node_modules/@nestjs/swagger": { - "version": "7.1.14", - "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-7.1.14.tgz", - "integrity": "sha512-2Ol4S6qHeYVVmkshkWBM8E/qkmEqEOUj2QIewr0jLSyo30H7f3v81pJyks6pTLy4PK0LGUXojMvIfFIE3mmGQQ==", + "version": "7.1.15", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-7.1.15.tgz", + "integrity": "sha512-ZaAO90R9MQXk4iLQLijIH6jrsllkUSYoh0Su6DECGgu8Y4Q/9LfdESwsZ9nmzr/48aLOu+wrv+cdI5Wr6fLKJw==", "dependencies": { - "@nestjs/mapped-types": "2.0.2", + "@nestjs/mapped-types": "2.0.3", "js-yaml": "4.1.0", "lodash": "4.17.21", "path-to-regexp": "3.2.0", - "swagger-ui-dist": "5.9.0" + "swagger-ui-dist": "5.9.1" }, "peerDependencies": { "@fastify/static": "^6.0.0", @@ -2380,9 +2383,9 @@ "dev": true }, "node_modules/@types/babel__core": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.3.tgz", - "integrity": "sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", + "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -2393,18 +2396,18 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.6", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.6.tgz", - "integrity": "sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==", + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.3.tgz", - "integrity": "sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -2412,31 +2415,50 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.3.tgz", - "integrity": "sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" } }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" }, "node_modules/@types/cors": { - "version": "2.8.15", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.15.tgz", - "integrity": "sha512-n91JxbNLD8eQIuXDIChAN1tCKNWCEgpceU9b7ZMbFA+P+Q4yIeh80jizFLEvolRPc1ES0VdwFlGv+kJTSirogw==", + "version": "2.8.16", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.16.tgz", + "integrity": "sha512-Trx5or1Nyg1Fq138PCuWqoApzvoSLWzZ25ORBiHMbbUT42g578lH1GT4TwYDbiUOLFuDsCkfLneT2105fsFWGg==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/eslint": { - "version": "8.44.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.6.tgz", - "integrity": "sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==", + "version": "8.44.7", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.7.tgz", + "integrity": "sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==", "dev": true, "dependencies": { "@types/estree": "*", @@ -2444,9 +2466,9 @@ } }, "node_modules/@types/eslint-scope": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.6.tgz", - "integrity": "sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, "dependencies": { "@types/eslint": "*", @@ -2454,57 +2476,88 @@ } }, "node_modules/@types/estree": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.4.tgz", - "integrity": "sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", "dev": true, "dependencies": { + "@types/jsonfile": "*", "@types/node": "*" } }, "node_modules/@types/graceful-fs": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.8.tgz", - "integrity": "sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "dependencies": { "@types/node": "*" } }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz", - "integrity": "sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz", - "integrity": "sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/jest": { - "version": "29.5.7", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.7.tgz", - "integrity": "sha512-HLyetab6KVPSiF+7pFcUyMeLsx25LDNDemw9mGsJBkai/oouwrjTycocSDYopMEwFhN2Y4s9oPyOCZNofgSt2g==", + "version": "29.5.8", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", + "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -2512,9 +2565,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", - "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/json5": { @@ -2523,6 +2576,15 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/jsonfile": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", + "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/jsonwebtoken": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", @@ -2531,85 +2593,166 @@ "@types/node": "*" } }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, "node_modules/@types/node": { - "version": "18.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.8.tgz", - "integrity": "sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==", + "version": "18.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.9.tgz", + "integrity": "sha512-0f5klcuImLnG4Qreu9hPj/rEfFq6YRc5n2mAjSsH+ec/mJL+3voBH0+8T7o8RpFjH7ovc+TRsL/c7OYIQsPTfQ==", "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/node-schedule": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/node-schedule/-/node-schedule-2.1.2.tgz", - "integrity": "sha512-pNf6vCw14EYbqo0Y1eLGhkyv9RhgvphrxpPk4bd1CqwsWbHCrLSVYpO+9NmKOCUSYwxG6eRaWDR3Y6C+4gtzow==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@types/node-schedule/-/node-schedule-2.1.3.tgz", + "integrity": "sha512-sTWHBCD+17XjHRuxkLwoC0VdxAx/TVNny+1DUxv8RTPJNZGuokEKiSiGag+v9XdrnJ/c36ObWi4HA3JiokvOQw==", "dev": true, "dependencies": { "@types/node": "*" } }, + "node_modules/@types/passport": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.15.tgz", + "integrity": "sha512-oHOgzPBp5eLI1U/7421qYV/ZySQXMYCBSfRkDe1tQ0YrIbLY/M/76qIXE7Bs7lFyvw1x5QqiNQ9imvh0fQHe9Q==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/passport-jwt": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-3.0.13.tgz", + "integrity": "sha512-fjHaC6Bv8EpMMqzTnHP32SXlZGaNfBPC/Po5dmRGYi2Ky7ljXPbGnOy+SxZqa6iZvFgVhoJ1915Re3m93zmcfA==", + "dev": true, + "dependencies": { + "@types/express": "*", + "@types/jsonwebtoken": "*", + "@types/passport-strategy": "*" + } + }, + "node_modules/@types/passport-strategy": { + "version": "0.2.38", + "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.38.tgz", + "integrity": "sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==", + "dev": true, + "dependencies": { + "@types/express": "*", + "@types/passport": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.10", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", + "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, "node_modules/@types/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", + "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", "dev": true }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, "node_modules/@types/stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/tail": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@types/tail/-/tail-2.2.3.tgz", + "integrity": "sha512-Hnf352egOlDR4nVTaGX0t/kmTNXHMdovF2C7PVDFtHTHJPFmIspOI1b86vEOxU7SfCq/dADS7ptbqgG/WGGxnA==", "dev": true }, "node_modules/@types/tar": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.7.tgz", - "integrity": "sha512-57ovoJf/lFhugSbDqDgpulTfm78uwO0Pa3EwgO3Op2IAIDZaDE4Z/orZ2yl25QRr8NQa1xjms9ElcoHx4pUedQ==", + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.8.tgz", + "integrity": "sha512-p8Rc0vas9n+7cv0JiSdUMHiL42gOflrj3v0RMSbe8x5lauEygCEFpS0B/Rw9ZI62qrxlsvZqTggIEIas2gBQrA==", "dev": true, "dependencies": { "@types/node": "*", "minipass": "^4.0.0" } }, + "node_modules/@types/tcp-port-used": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/tcp-port-used/-/tcp-port-used-1.0.4.tgz", + "integrity": "sha512-0vQ4fz9TTM4bCdllYWEJ2JHBUXR9xqPtc70dJ7BMRDVfvZyYdrgey3nP5RRcVj+qAgnHJM8r9fvgrfnPMxdnhA==", + "dev": true + }, "node_modules/@types/unzipper": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/@types/unzipper/-/unzipper-0.10.8.tgz", - "integrity": "sha512-Cior/4Y78R1ZVF6tnWEHWIkAMDqKxU5pPCbaC62826oEfchPGg90fKdi3sLZ2D7oB7GrFu3+PW2elEMBOtd27w==", + "version": "0.10.9", + "resolved": "https://registry.npmjs.org/@types/unzipper/-/unzipper-0.10.9.tgz", + "integrity": "sha512-vHbmFZAw8emNAOVkHVbS3qBnbr0x/qHQZ+ei1HE7Oy6Tyrptl+jpqnOX+BF5owcu/HZLOV0nJK+K9sjs1Ox2JA==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/validator": { - "version": "13.11.5", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.5.tgz", - "integrity": "sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q==" + "version": "13.11.6", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.6.tgz", + "integrity": "sha512-HUgHujPhKuNzgNXBRZKYexwoG+gHKU+tnfPqjWXFghZAnn73JElicMkuSKJyLGr9JgyA8IgK7fj88IyA9rwYeQ==" }, "node_modules/@types/yargs": { - "version": "17.0.29", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.29.tgz", - "integrity": "sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==", + "version": "17.0.31", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", + "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.2", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.2.tgz", - "integrity": "sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz", - "integrity": "sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz", + "integrity": "sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/type-utils": "6.9.1", - "@typescript-eslint/utils": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/type-utils": "6.10.0", + "@typescript-eslint/utils": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -2635,15 +2778,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.1.tgz", - "integrity": "sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz", + "integrity": "sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/typescript-estree": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", "debug": "^4.3.4" }, "engines": { @@ -2663,13 +2806,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz", - "integrity": "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", + "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1" + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -2680,13 +2823,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz", - "integrity": "sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz", + "integrity": "sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.9.1", - "@typescript-eslint/utils": "6.9.1", + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/utils": "6.10.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -2707,9 +2850,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz", - "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", + "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -2720,13 +2863,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz", - "integrity": "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", + "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2747,17 +2890,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.1.tgz", - "integrity": "sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", + "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", "semver": "^7.5.4" }, "engines": { @@ -2772,12 +2915,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz", - "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", + "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/types": "6.10.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -3352,9 +3495,9 @@ } }, "node_modules/axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", + "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -4056,11 +4199,11 @@ } }, "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "engines": { - "node": ">= 10" + "node": ">=16" } }, "node_modules/concat-map": { @@ -4815,9 +4958,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.576", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.576.tgz", - "integrity": "sha512-yXsZyXJfAqzWk1WKryr0Wl0MN2D47xodPvEEwlVePBnhU5E7raevLQR+E6b9JAD3GfL/7MbAL9ZtWQQPcLx7wA==", + "version": "1.4.578", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.578.tgz", + "integrity": "sha512-V0ZhSu1BQZKfG0yNEL6Dadzik8E1vAzfpVOapdSiT9F6yapEJ3Bk+4tZ4SMPdWiUchCgnM/ByYtBzp5ntzDMIA==", "dev": true }, "node_modules/emittery": { @@ -5850,9 +5993,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -6200,16 +6343,16 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=14.14" } }, "node_modules/fs-minipass": { @@ -6628,9 +6771,9 @@ } }, "node_modules/helmet": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.0.0.tgz", - "integrity": "sha512-MsIgYmdBh460ZZ8cJC81q4XJknjG567wzEmv46WOBblDb6TUd3z8/GhgmsM9pn8g2B80tAJ4m5/d3Bi1KrSUBQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.1.0.tgz", + "integrity": "sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==", "engines": { "node": ">=16.0.0" } @@ -7229,9 +7372,9 @@ } }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.1.tgz", + "integrity": "sha512-opCrKqbthmq3SKZ10mFMQG9dk3fTa3quaOLD35kJa5ejwZHd9xAr+kLuziiZz2cG32s4lMZxNdmdcEQnTDP4+g==", "dev": true, "engines": { "node": ">=8" @@ -11387,9 +11530,9 @@ } }, "node_modules/swagger-ui-dist": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.9.0.tgz", - "integrity": "sha512-NUHSYoe5XRTk/Are8jPJ6phzBh3l9l33nEyXosM17QInoV95/jng8+PuSGtbD407QoPf93MH3Bkh773OgesJpA==" + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.9.1.tgz", + "integrity": "sha512-5zAx+hUwJb9T3EAntc7TqYkV716CMqG6sZpNlAAMOMWkNXRYxGkN8ADIvD55dQZ10LxN90ZM/TQmN7y1gpICnw==" }, "node_modules/synckit": { "version": "0.8.5", diff --git a/package.json b/package.json index 43adf93fb..f6f0b06e9 100644 --- a/package.json +++ b/package.json @@ -42,8 +42,8 @@ "start": "ts-node -r tsconfig-paths/register src/main.ts", "serve": "npm run watch", "lint": "npm run lint:server && npm run lint:ui", - "lint:server": "eslint \"{src,test}/**/*.ts\" --max-warnings=0 --fix", - "lint:ui": "npm run lint --prefix ui --fix", + "lint:server": "eslint \"{src,test}/**/*.ts\" --max-warnings=0", + "lint:ui": "npm run lint --prefix ui", "webpack": "webpack --config webpack.config.js", "install:ui": "npm install --prefix ui", "test": "jest --forceExit --detectOpenHandles --verbose=true --silent --config ./test/jest-e2e.json", @@ -56,7 +56,7 @@ "@fastify/multipart": "8.0.0", "@fastify/static": "6.12.0", "@fastify/swagger": "8.12.0", - "@homebridge/node-pty-prebuilt-multiarch": "0.11.8", + "@homebridge/node-pty-prebuilt-multiarch": "0.11.10", "@nestjs/axios": "3.0.1", "@nestjs/common": "10.2.8", "@nestjs/core": "10.2.8", @@ -64,17 +64,17 @@ "@nestjs/passport": "10.0.2", "@nestjs/platform-fastify": "10.2.8", "@nestjs/platform-socket.io": "10.2.8", - "@nestjs/swagger": "7.1.14", + "@nestjs/swagger": "7.1.15", "@nestjs/websockets": "10.2.8", "@oznu/hap-client": "1.9.0", - "axios": "1.6.0", + "axios": "1.6.1", "class-transformer": "0.5.1", "class-validator": "0.14.0", - "commander": "7.2.0", + "commander": "11.1.0", "dayjs": "1.11.10", "emoji-js": "3.7.0", "fastify": "4.24.3", - "fs-extra": "10.1.0", + "fs-extra": "11.1.1", "node-cache": "5.1.2", "node-schedule": "2.1.1", "ora": "5.4.1", @@ -92,15 +92,18 @@ }, "devDependencies": { "@nestjs/testing": "^10.2.7", - "@types/fs-extra": "^9.0.13", - "@types/jest": "^29.5.7", - "@types/node": "^18.18.8", - "@types/node-schedule": "^2.1.2", - "@types/semver": "^7.5.4", - "@types/tar": "^6.1.7", - "@types/unzipper": "^0.10.8", - "@typescript-eslint/eslint-plugin": "^6.9.1", - "@typescript-eslint/parser": "^6.9.1", + "@types/fs-extra": "^11.0.4", + "@types/jest": "^29.5.8", + "@types/node": "^18.18.9", + "@types/node-schedule": "^2.1.3", + "@types/passport-jwt": "^3.0.13", + "@types/semver": "^7.5.5", + "@types/tail": "^2.2.3", + "@types/tar": "^6.1.8", + "@types/tcp-port-used": "^1.0.4", + "@types/unzipper": "^0.10.9", + "@typescript-eslint/eslint-plugin": "^6.10.0", + "@typescript-eslint/parser": "^6.10.0", "babel-jest": "^29.7.0", "bash-color": "^0.0.4", "buffer-shims": "^1.0.0", diff --git a/src/bin/hb-service.ts b/src/bin/hb-service.ts index bc432ddc9..97072cdd8 100644 --- a/src/bin/hb-service.ts +++ b/src/bin/hb-service.ts @@ -10,7 +10,7 @@ import * as child_process from 'child_process'; import * as os from 'os'; import * as path from 'path'; import axios from 'axios'; -import * as commander from 'commander'; +import { program } from 'commander'; import * as fs from 'fs-extra'; import * as ora from 'ora'; import * as semver from 'semver'; @@ -29,18 +29,17 @@ export class HomebridgeServiceHelper { public action: 'install' | 'uninstall' | 'start' | 'stop' | 'restart' | 'rebuild' | 'run' | 'add' | 'remove' | 'logs' | 'view' | 'update-node' | 'before-start' | 'status'; public selfPath = __filename; public serviceName = 'Homebridge'; - public storagePath; + public storagePath: string; public usingCustomStoragePath = false; public allowRunRoot = false; public enableHbServicePluginManagement = false; - public asUser; + public asUser: string; public addGroup: string; private log: fs.WriteStream | NodeJS.WriteStream; private homebridgeModulePath: string; private homebridgePackage: { version: string; bin: { homebridge: string } }; private homebridgeBinary: string; private homebridge: child_process.ChildProcessWithoutNullStreams; - private homebridgeStopped = true; private homebridgeOpts = ['-I']; private homebridgeCustomEnv = {}; private uiBinary: string; @@ -87,7 +86,7 @@ export class HomebridgeServiceHelper { process.exit(1); } - commander + program .allowUnknownOption() .storeOptionsAsProperties(true) .arguments('[install|uninstall|start|stop|restart|rebuild|run|logs|view|add|remove]') @@ -139,7 +138,7 @@ export class HomebridgeServiceHelper { } case 'rebuild': { this.logger(`Rebuilding for Node.js ${process.version}...`); - this.installer.rebuild(commander.args.includes('--all')); + this.installer.rebuild(program.args.includes('--all')); break; } case 'run': { @@ -155,15 +154,15 @@ export class HomebridgeServiceHelper { break; } case 'add': { - this.npmPluginManagement(commander.args); + this.npmPluginManagement(program.args); break; } case 'remove': { - this.npmPluginManagement(commander.args); + this.npmPluginManagement(program.args); break; } case 'update-node': { - this.checkForNodejsUpdates(commander.args.length === 2 ? commander.args[1] : null); + this.checkForNodejsUpdates(program.args.length === 2 ? program.args[1] : null); break; } case 'before-start': { @@ -175,7 +174,7 @@ export class HomebridgeServiceHelper { break; } default: { - commander.outputHelp(); + program.outputHelp(); console.log('\nThe hb-service command is provided by homebridge-config-ui-x\n'); console.log('Please provide a command:'); @@ -204,7 +203,7 @@ export class HomebridgeServiceHelper { /** * Logger function, log to homebridge.log file when possible */ - public logger(msg, type: 'info' | 'succeed' | 'fail' | 'warn' = 'info') { + public logger(msg: string, type: 'info' | 'succeed' | 'fail' | 'warn' = 'info') { if (this.action === 'run') { msg = `\x1b[37m[${new Date().toLocaleString()}]\x1b[0m ` + '\x1b[36m[HB Supervisor]\x1b[0m ' + msg; @@ -374,7 +373,7 @@ export class HomebridgeServiceHelper { // start the ui await this.runUi(); - // tell the ui what homebridge we are running initialy (this is refreshed when Homebridge is restarted) + // tell the ui what homebridge we are running initially (this is refreshed when Homebridge is restarted) if (this.ipcService && this.homebridgePackage) { this.ipcService.setHomebridgeVersion(this.homebridgePackage.version); } @@ -416,8 +415,6 @@ export class HomebridgeServiceHelper { * Starts homebridge as a child process, sending the log output to the homebridge.log */ private runHomebridge() { - this.homebridgeStopped = false; - if (!this.homebridgeBinary || !fs.pathExistsSync(this.homebridgeBinary)) { this.logger('Could not find Homebridge. Make sure you have installed homebridge using the -g flag then restart.', 'fail'); this.logger('npm install -g --unsafe-perm homebridge', 'fail'); @@ -509,7 +506,6 @@ export class HomebridgeServiceHelper { * @param signal */ private handleHomebridgeClose(code: number, signal: string) { - this.homebridgeStopped = true; this.logger(`Homebridge Process Ended. Code: ${code}, Signal: ${signal}`); this.checkForStaleHomebridgeProcess(); @@ -655,7 +651,7 @@ export class HomebridgeServiceHelper { // See https://github.com/sebhildebrandt/systeminformation/issues/775#issuecomment-1741836906 // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - const defaultInterface = (await si.networkInterfaces()).find(x => x.iface === defaultAdapter); + const defaultInterface = (await si.networkInterfaces()).find((x: any) => x.iface === defaultAdapter); console.log('\nManage Homebridge by going to one of the following in your browser:\n'); @@ -724,7 +720,7 @@ export class HomebridgeServiceHelper { if (!Array.isArray(currentConfig.platforms)) { currentConfig.platforms = []; } - let uiConfigBlock = currentConfig.platforms.find((x) => x.platform === 'config'); + let uiConfigBlock = currentConfig.platforms.find((x: any) => x.platform === 'config'); // if the config block does not exist, then create it if (!uiConfigBlock) { @@ -743,7 +739,7 @@ export class HomebridgeServiceHelper { restartRequired = true; } - // if doing an install, make sure the port number matches the value passed in by the user + // if doing an installation, make sure the port number matches the value passed in by the user if (this.action === 'install') { // correct the port if (uiConfigBlock.port !== this.uiPort) { @@ -861,7 +857,7 @@ export class HomebridgeServiceHelper { } /** - * Returns true if running on the Homebridge Rasbpian Image + * Returns true if running on the Homebridge Raspbian Image */ private async isRaspbianImage(): Promise { return os.platform() === 'linux' && await fs.pathExists('/etc/hb-ui-port'); @@ -886,7 +882,7 @@ export class HomebridgeServiceHelper { return envPort; } - // otherwise return the defaul port + // otherwise return the default port return this.uiPort; } @@ -1225,7 +1221,7 @@ export class HomebridgeServiceHelper { const spinner = ora(`Installing Node.js ${targetVersion}`).start(); try { - await tar.x(extractConfig); + tar.x(extractConfig); spinner.succeed(`Installed Node.js ${targetVersion}`); } catch (e) { spinner.fail(e.message); @@ -1252,7 +1248,7 @@ export class HomebridgeServiceHelper { } /** - * Check the current status of the Homebridge UI by calling it's API + * Check the current status of the Homebridge UI by calling its API */ private async checkStatus() { this.logger(`Testing hb-service is running on port ${this.uiPort}...`); @@ -1272,7 +1268,7 @@ export class HomebridgeServiceHelper { } /** - * Parse an npm package and version string + * Parse an NPM package and version string * Based on: https://github.com/egoist/parse-package-name */ private parseNpmPackageString(input: string) { @@ -1296,7 +1292,7 @@ export class HomebridgeServiceHelper { /** * Install / Remove a plugin using pnpm (supported platforms only) */ - private async npmPluginManagement(args) { + private async npmPluginManagement(args: any[]) { if (!this.enableHbServicePluginManagement) { this.logger('Plugin management is not supported on your platform using hb-service.', 'fail'); process.exit(1); @@ -1326,7 +1322,7 @@ export class HomebridgeServiceHelper { this.logger(`Path does not exist: "${cwd}"`, 'fail'); } - let cmd; + let cmd: string; if (process.env.UIX_USE_PNPM === '1') { cmd = `pnpm -C "${cwd}" ${action} ${target.name}`; diff --git a/src/bin/platforms/darwin.ts b/src/bin/platforms/darwin.ts index 30fe5514f..3cf32e3ec 100644 --- a/src/bin/platforms/darwin.ts +++ b/src/bin/platforms/darwin.ts @@ -214,7 +214,7 @@ export class DarwinInstaller extends BasePlatform { } /** - * Resolves the target user home directory when running the install command as SUDO + * Resolves the target user home directory when running the installation command as SUDO */ private getUserHomeDir() { try { @@ -253,7 +253,7 @@ export class DarwinInstaller extends BasePlatform { const downloadUrl = `https://nodejs.org/dist/${job.target}/node-${job.target}-darwin-${process.arch}.tar.gz`; const targetPath = path.dirname(path.dirname(process.execPath)); - // only allow updates when installed using the offical Node.js installer / Homebridge package + // only allow updates when installed using the official Node.js installer / Homebridge package if (targetPath !== '/usr/local' && !targetPath.startsWith('/Library/Application Support/Homebridge/node-')) { this.hbService.logger(`Cannot update Node.js on your system. Non-standard installation path detected: ${targetPath}`, 'fail'); process.exit(1); diff --git a/src/bin/platforms/freebsd.ts b/src/bin/platforms/freebsd.ts index 7aabf142c..52e75a5ba 100644 --- a/src/bin/platforms/freebsd.ts +++ b/src/bin/platforms/freebsd.ts @@ -222,7 +222,7 @@ export class FreeBSDInstaller extends BasePlatform { } /** - * Allows the homebridge user to shutdown and restart the server from the UI + * Allows the homebridge user to shut down and restart the server from the UI * There is no need for full sudo access when running using hb-service */ private setupSudo() { diff --git a/src/bin/platforms/linux.ts b/src/bin/platforms/linux.ts index 7476a1884..b55cacc14 100644 --- a/src/bin/platforms/linux.ts +++ b/src/bin/platforms/linux.ts @@ -142,7 +142,7 @@ export class LinuxInstaller extends BasePlatform { '/usr/local/lib/node_modules', '/usr/lib/node_modules' ].includes(path.dirname(process.env.UIX_BASE_PATH))) { - // systemd has a 90 second default timeout in the pre-start jobs + // systemd has a 90-second default timeout in the pre-start jobs // terminate this task after 60 seconds to be safe setTimeout(() => { process.exit(0); @@ -553,7 +553,7 @@ export class LinuxInstaller extends BasePlatform { } /** - * Allows the homebridge user to shutdown and restart the server from the UI + * Allows the homebridge user to shut down and restart the server from the UI * There is no need for full sudo access when running using hb-service */ private setupSudo() { @@ -689,7 +689,7 @@ export class LinuxInstaller extends BasePlatform { } /** - * Setup the run-parts path and scripts + * Set up the run-parts path and scripts * This allows users to define their own scripts to run before Homebridge starts/restarts * The default script will ensure the homebridge storage path has the correct permissions each time Homebridge starts */ diff --git a/src/bin/platforms/win32.ts b/src/bin/platforms/win32.ts index c307aac90..9654fa88b 100644 --- a/src/bin/platforms/win32.ts +++ b/src/bin/platforms/win32.ts @@ -161,7 +161,7 @@ export class Win32Installer extends BasePlatform { .on('finish', () => { return resolve(nssmPath); }) - .on('error', (err) => { + .on('error', (err: any) => { return reject(err); }); }).catch(async (e) => { diff --git a/src/bin/standalone.ts b/src/bin/standalone.ts index c27feaa01..cf7f1c486 100644 --- a/src/bin/standalone.ts +++ b/src/bin/standalone.ts @@ -4,9 +4,9 @@ process.title = 'homebridge-config-ui-x'; import * as os from 'os'; import * as path from 'path'; -import * as commander from 'commander'; +import { program } from 'commander'; -commander +program .allowUnknownOption() .option('-U, --user-storage-path [path]', '', (p) => process.env.UIX_STORAGE_PATH = p) .option('-P, --plugin-path [path]', '', (p) => process.env.UIX_CUSTOM_PLUGIN_PATH = p) diff --git a/src/core/auth/auth.service.ts b/src/core/auth/auth.service.ts index 24617feed..83d34de51 100644 --- a/src/core/auth/auth.service.ts +++ b/src/core/auth/auth.service.ts @@ -39,6 +39,7 @@ export class AuthService { * Authenticate a user with their credentials * @param username * @param password + * @param otp */ async authenticate(username: string, password: string, otp?: string): Promise { try { @@ -86,10 +87,11 @@ export class AuthService { * Authenticate and provide a JWT response * @param username * @param password + * @param otp */ async signIn(username: string, password: string, otp?: string): Promise { const user = await this.authenticate(username, password, otp); - const token = await this.jwtService.sign(user); + const token = this.jwtService.sign(user); return { access_token: token, @@ -128,7 +130,7 @@ export class AuthService { const user = users.find(x => x.admin === true); // generate a token - const token = await this.jwtService.sign({ + const token = this.jwtService.sign({ username: user.username, name: user.name, admin: user.admin, @@ -147,15 +149,15 @@ export class AuthService { * All information about the user we need is stored in the payload * @param payload the decoded, verified jwt payload */ - async validateUser(payload): Promise { + async validateUser(payload: any): Promise { return payload; } /** * Verify a token is signed correctly - * @param token + * @param client */ - async verifyWsConnection(client) { + async verifyWsConnection(client: any) { try { return jwt.verify(client.handshake.query.token, this.configService.secrets.secretKey); } catch (e) { @@ -191,7 +193,7 @@ export class AuthService { } /** - * Setup the first user + * Set up the first user */ async setupFirstUser(user: UserDto) { if (this.configService.setupWizardComplete) { @@ -224,7 +226,7 @@ export class AuthService { } // generate a token - const token = await this.jwtService.sign({ + const token = this.jwtService.sign({ username: 'setup-wizard', name: 'setup-wizard', admin: true, @@ -239,7 +241,7 @@ export class AuthService { } /** - * Executed on startup to see if the auth file is setup yet + * Executed on startup to see if the auth file is set up yet */ async checkAuthFile() { if (!await fs.pathExists(this.configService.authPath)) { @@ -285,23 +287,21 @@ export class AuthService { } /** - * Return a user by it's id + * Return a user by id * @param id */ async findById(id: number): Promise { const users = await this.getUsers(); - const user = users.find(x => x.id === id); - return user; + return users.find(x => x.id === id); } /** - * Return a user by it's username + * Return a user by username * @param username */ async findByUsername(username: string): Promise { const users = await this.getUsers(); - const user = users.find(x => x.username === username); - return user; + return users.find(x => x.username === username); } /** @@ -317,7 +317,7 @@ export class AuthService { * Add a new user * @param user */ - async addUser(user) { + async addUser(user: UserDto) { const authfile = await this.getUsers(); const salt = await this.genSalt(); @@ -373,7 +373,7 @@ export class AuthService { /** * Updates a user - * @param userId + * @param id * @param update */ async updateUser(id: number, update: UserDto) { @@ -404,7 +404,7 @@ export class AuthService { } // update the auth.json - this.saveUserFile(authfile); + await this.saveUserFile(authfile); this.logger.log(`Updated user: ${user.username}`); return this.desensitiseUserProfile(user); @@ -413,7 +413,7 @@ export class AuthService { /** * Change a users own password */ - async updateOwnPassword(username, currentPassword: string, newPassword: string) { + async updateOwnPassword(username: string, currentPassword: string, newPassword: string) { const authfile = await this.getUsers(); const user = authfile.find(x => x.username === username); @@ -424,7 +424,7 @@ export class AuthService { // this will throw an error of the password is wrong await this.checkPassword(user, currentPassword); - // generate a new salf + // generate a new salt const salt = await this.genSalt(); user.hashedPassword = await this.hashPassword(newPassword, salt); user.salt = salt; diff --git a/src/core/auth/jwt.strategy.ts b/src/core/auth/jwt.strategy.ts index 03af2488f..932f5835b 100644 --- a/src/core/auth/jwt.strategy.ts +++ b/src/core/auth/jwt.strategy.ts @@ -16,7 +16,7 @@ export class JwtStrategy extends PassportStrategy(Strategy) { }); } - async validate(payload) { + async validate(payload: any) { const user = await this.authService.validateUser(payload); if (!user) { throw new UnauthorizedException(); diff --git a/src/index.ts b/src/index.ts index cd5d21c47..dc6c03b85 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,7 +4,7 @@ import * as child_process from 'child_process'; import * as path from 'path'; -import * as commander from 'commander'; +import { program } from 'commander'; import * as semver from 'semver'; let homebridge; @@ -19,7 +19,7 @@ class HomebridgeConfigUi { process.env.UIX_STORAGE_PATH = homebridge.user.storagePath(); process.env.UIX_PLUGIN_NAME = config.name || 'homebridge-config-ui-x'; - commander + program .allowUnknownOption() .option('-P, --plugin-path [path]', '', (p) => process.env.UIX_CUSTOM_PLUGIN_PATH = p) .option('-I, --insecure', '', () => process.env.UIX_INSECURE_MODE = '1') diff --git a/src/modules/custom-plugins/plugins-settings-ui/plugins-settings-ui.service.ts b/src/modules/custom-plugins/plugins-settings-ui/plugins-settings-ui.service.ts index d90053495..e32e4e36e 100644 --- a/src/modules/custom-plugins/plugins-settings-ui/plugins-settings-ui.service.ts +++ b/src/modules/custom-plugins/plugins-settings-ui/plugins-settings-ui.service.ts @@ -190,7 +190,7 @@ export class PluginsSettingsUiService { }); child.on('exit', () => { - this.loggerService.log(`[${pluginName}]`, 'Child process ended'); + this.loggerService.debug(`[${pluginName}]`, 'Custom UI: closed (child process ended)'); }); child.addListener('message', (response: { action: string; payload: any }) => { @@ -202,7 +202,7 @@ export class PluginsSettingsUiService { // function to handle cleanup const cleanup = () => { - this.loggerService.log(`[${pluginName}]`, 'Terminating child process...'); + this.loggerService.debug(`[${pluginName}]`, 'Custom UI: closing (terminating child process)...'); const childPid = child.pid; if (child.connected) { diff --git a/src/modules/log/log.service.ts b/src/modules/log/log.service.ts index fce9bf94c..6394dfcce 100644 --- a/src/modules/log/log.service.ts +++ b/src/modules/log/log.service.ts @@ -47,6 +47,7 @@ export class LogService { /** * Socket handler * @param client + * @param size */ public connect(client: EventEmitter, size: LogTermSize) { this.ending = false; @@ -203,8 +204,11 @@ export class LogService { interval: 200, }, }); - } else if (this.nativeTail.listenerCount('line') === 0) { - this.nativeTail.watch(); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + } else { // @ts-expect-error + if (this.nativeTail.listenerCount('line') === 0) { + this.nativeTail.watch(); + } } // watch for lines and emit to client @@ -223,10 +227,17 @@ export class LogService { const onEnd = () => { this.ending = true; + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error this.nativeTail.removeListener('line', onLine); + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error this.nativeTail.removeListener('error', onError); // stop watching the file if there are no other watchers + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error if (this.nativeTail.listenerCount('line') === 0) { this.nativeTail.unwatch(); } diff --git a/src/modules/server/server.controller.ts b/src/modules/server/server.controller.ts index 13586dc01..c3fe7c271 100644 --- a/src/modules/server/server.controller.ts +++ b/src/modules/server/server.controller.ts @@ -171,3 +171,4 @@ export class ServerController { return this.serverService.setHomebridgeMdnsSetting(body); } } + diff --git a/src/modules/server/server.dto.ts b/src/modules/server/server.dto.ts index bbbe4585a..006684b3c 100644 --- a/src/modules/server/server.dto.ts +++ b/src/modules/server/server.dto.ts @@ -20,3 +20,4 @@ export class HomebridgeNetworkInterfacesDto { @ApiProperty() adapters: string[]; } + diff --git a/src/modules/server/server.module.ts b/src/modules/server/server.module.ts index 155d5491f..b7ea59b64 100644 --- a/src/modules/server/server.module.ts +++ b/src/modules/server/server.module.ts @@ -30,3 +30,4 @@ import { ServerService } from './server.service'; ] }) export class ServerModule { } + diff --git a/src/modules/server/server.service.ts b/src/modules/server/server.service.ts index 55ee36e80..fcaaf2684 100644 --- a/src/modules/server/server.service.ts +++ b/src/modules/server/server.service.ts @@ -7,18 +7,18 @@ import { NotFoundException, ServiceUnavailableException } from '@nestjs/common'; -import { Categories } from '@oznu/hap-client/dist/hap-types'; +import {Categories} from '@oznu/hap-client/dist/hap-types'; import * as bufferShim from 'buffer-shims'; import * as fs from 'fs-extra'; import * as NodeCache from 'node-cache'; import * as si from 'systeminformation'; import * as tcpPortUsed from 'tcp-port-used'; -import { ConfigService, HomebridgeConfig } from '../../core/config/config.service'; -import { HomebridgeIpcService } from '../../core/homebridge-ipc/homebridge-ipc.service'; -import { Logger } from '../../core/logger/logger.service'; -import { AccessoriesService } from '../accessories/accessories.service'; -import { ConfigEditorService } from '../config-editor/config-editor.service'; -import { HomebridgeMdnsSettingDto } from './server.dto'; +import {ConfigService, HomebridgeConfig} from '../../core/config/config.service'; +import {HomebridgeIpcService} from '../../core/homebridge-ipc/homebridge-ipc.service'; +import {Logger} from '../../core/logger/logger.service'; +import {AccessoriesService} from '../accessories/accessories.service'; +import {ConfigEditorService} from '../config-editor/config-editor.service'; +import {HomebridgeMdnsSettingDto} from './server.dto'; @Injectable() export class ServerService { @@ -105,7 +105,7 @@ export class ServerService { const persistPath = path.join(this.configService.storagePath, 'persist'); const devices = (await fs.readdir(persistPath)) - .filter(x => x.match(/AccessoryInfo\.([A-F,a-f,0-9]+)\.json/)); + .filter(x => x.match(/AccessoryInfo\.([A-F,a-f0-9]+)\.json/)); return Promise.all(devices.map(async (x) => { return this.getDevicePairingById(x.split('.')[1]); @@ -119,7 +119,7 @@ export class ServerService { public async getDevicePairingById(deviceId: string) { const persistPath = path.join(this.configService.storagePath, 'persist'); - let device; + let device: any; try { device = await fs.readJson(path.join(persistPath, `AccessoryInfo.${deviceId}.json`)); } catch (e) { @@ -296,11 +296,10 @@ export class ServerService { /** * Generates the setup code */ - private generateSetupCode(accessoryInfo): string { + private generateSetupCode(accessoryInfo: any): string { // this code is from https://github.com/KhaosT/HAP-NodeJS/blob/master/lib/Accessory.js#L369 const buffer = bufferShim.alloc(8); - const setupCode = parseInt(accessoryInfo.pincode.replace(/-/g, ''), 10); - let valueLow = setupCode; + let valueLow = parseInt(accessoryInfo.pincode.replace(/-/g, ''), 10); const valueHigh = accessoryInfo.category >> 1; valueLow |= 1 << 28; // Supports IP; @@ -452,17 +451,13 @@ export class ServerService { * Check if the system Node.js version has changed */ private async nodeVersionChanged(): Promise { - return new Promise((resolve, reject) => { + return new Promise((resolve) => { let result = false; const child = child_process.spawn(process.execPath, ['-v']); child.stdout.once('data', (data) => { - if (data.toString().trim() === process.version) { - result = false; - } else { - result = true; - } + result = data.toString().trim() !== process.version; }); child.on('error', () => { diff --git a/src/modules/status/status.service.ts b/src/modules/status/status.service.ts index 14f48ebfb..14ada25e6 100644 --- a/src/modules/status/status.service.ts +++ b/src/modules/status/status.service.ts @@ -16,7 +16,6 @@ import { PluginsService } from '../plugins/plugins.service'; import { ServerService } from '../server/server.service'; export const enum HomebridgeStatus { - PENDING = 'pending', OK = 'ok', UP = 'up', DOWN = 'down', @@ -36,7 +35,7 @@ const execAsync = util.promisify(child_process.exec); @Injectable() export class StatusService { private statusCache = new NodeCache({ stdTTL: 3600 }); - private dashboardLayout; + private dashboardLayout: any; private homebridgeStatus: HomebridgeStatus = HomebridgeStatus.DOWN; private homebridgeStatusChange = new Subject(); @@ -204,7 +203,7 @@ export class StatusService { /** * Saves the current dashboard layout */ - public async setDashboardLayout(layout) { + public async setDashboardLayout(layout: any) { fs.writeJSONSync(path.resolve(this.configService.storagePath, '.uix-dashboard.json'), layout); this.dashboardLayout = layout; return { status: 'ok' }; @@ -244,7 +243,7 @@ export class StatusService { */ public async getServerUptimeInfo() { return { - time: await si.time(), + time: si.time(), processUptime: process.uptime(), }; } @@ -278,7 +277,7 @@ export class StatusService { * Start emitting server stats to client * @param client */ - public async watchStats(client) { + public async watchStats(client: any) { let homebridgeStatusChangeSub: Subscription; let homebridgeStatusInterval: NodeJS.Timeout; @@ -286,7 +285,7 @@ export class StatusService { // ipc status events are only available in Homebridge 1.3.3 or later - and when running in service mode if (this.configService.serviceMode && this.configService.homebridgeVersion && semver.gt(this.configService.homebridgeVersion, '1.3.3-beta.5')) { - homebridgeStatusChangeSub = this.homebridgeStatusChange.subscribe(async (status) => { + homebridgeStatusChangeSub = this.homebridgeStatusChange.subscribe(async () => { client.emit('homebridge-status', await this.getHomebridgeStats()); }); } else { @@ -387,6 +386,29 @@ export class StatusService { return osInfo; } + /** + * Get / Cache the GLIBC version + */ + private getGlibcVersion(): string { + if (os.platform() !== 'linux') { + return ''; + } + + const cachedResult = this.statusCache.get('glibcVersion') as string; + if (cachedResult) { + return cachedResult; + } + + try { + const glibcVersion = child_process.execSync('getconf GNU_LIBC_VERSION 2>/dev/null').toString().split('glibc')[1].trim(); + this.statusCache.set('glibcVersion', glibcVersion, 86400); + return glibcVersion; + } catch (e) { + this.logger.debug('Could not check glibc version:', e.message); + return ''; + } + } + /** * Returns details about this Homebridge server */ @@ -397,13 +419,15 @@ export class StatusService { homebridgeStoragePath: this.configService.storagePath, homebridgeInsecureMode: this.configService.homebridgeInsecureMode, homebridgeCustomPluginPath: this.configService.customPluginPath, + homebridgePluginPath: path.resolve(process.env.UIX_BASE_PATH, '..'), homebridgeRunningInDocker: this.configService.runningInDocker, homebridgeRunningInSynologyPackage: this.configService.runningInSynologyPackage, homebridgeRunningInPackageMode: this.configService.runningInPackageMode, homebridgeServiceMode: this.configService.serviceMode, nodeVersion: process.version, os: await this.getOsInfo(), - time: await si.time(), + glibcVersion: this.getGlibcVersion(), + time: si.time(), network: await this.getDefaultInterface() || {}, }; } @@ -428,11 +452,17 @@ export class StatusService { try { const versionList = (await this.httpService.get('https://nodejs.org/dist/index.json').toPromise()).data; const currentLts = versionList.filter(x => x.lts)[0]; + + // See why this is set to 2.29 at https://homebridge.io/w/JJSun + const glibcVersion = this.getGlibcVersion(); + const showNextUpdateWarning = glibcVersion && parseFloat(glibcVersion) < 2.29; + const versionInformation = { currentVersion: process.version, latestVersion: currentLts.version, updateAvailable: semver.gt(currentLts.version, process.version), showUpdateWarning: semver.lt(process.version, '18.15.0'), + showNextUpdateWarning, installPath: path.dirname(process.execPath), }; this.statusCache.set('nodeJsVersion', versionInformation, 86400); @@ -444,6 +474,7 @@ export class StatusService { latestVersion: process.version, updateAvailable: false, showUpdateWarning: false, + showNextUpdateWarning: false, }; this.statusCache.set('nodeJsVersion', versionInformation, 3600); return versionInformation; @@ -470,11 +501,7 @@ export class StatusService { if (!isNaN(throttledHex)) { for (const bit of Object.keys(this.rpiGetThrottledMapping)) { - if ((throttledHex >> parseInt(bit, 10)) & 1) { - output[this.rpiGetThrottledMapping[bit]] = true; - } else { - output[this.rpiGetThrottledMapping[bit]] = false; - } + output[this.rpiGetThrottledMapping[bit]] = !!((throttledHex >> parseInt(bit, 10)) & 1); } } } catch (e) { diff --git a/test/e2e/config-editor.e2e-spec.ts b/test/e2e/config-editor.e2e-spec.ts index 527efcaae..ffd0b9029 100644 --- a/test/e2e/config-editor.e2e-spec.ts +++ b/test/e2e/config-editor.e2e-spec.ts @@ -44,7 +44,7 @@ describe('ConfigEditorController (e2e)', () => { // copy test plugins await fs.remove(pluginsPath); - await fs.copy(path.resolve(__dirname, '../mocks', 'plugins'), pluginsPath, { recursive: true }); + await fs.copy(path.resolve(__dirname, '../mocks', 'plugins'), pluginsPath); const moduleFixture: TestingModule = await Test.createTestingModule({ imports: [ConfigEditorModule, AuthModule], diff --git a/test/e2e/plugin-settings-ui.e2e-spec.ts b/test/e2e/plugin-settings-ui.e2e-spec.ts index 392a2cd88..1ab2c32e5 100644 --- a/test/e2e/plugin-settings-ui.e2e-spec.ts +++ b/test/e2e/plugin-settings-ui.e2e-spec.ts @@ -33,7 +33,7 @@ describe('PluginsSettingsUiController (e2e)', () => { await fs.copy(path.resolve(__dirname, '../mocks', '.uix-secrets'), secretsFilePath); await fs.remove(pluginsPath); - await fs.copy(path.resolve(__dirname, '../mocks', 'plugins'), pluginsPath, { recursive: true }); + await fs.copy(path.resolve(__dirname, '../mocks', 'plugins'), pluginsPath); // create httpService instance httpService = new HttpService(); diff --git a/test/e2e/plugins.e2e-spec.ts b/test/e2e/plugins.e2e-spec.ts index f422ce38a..b61ee994c 100644 --- a/test/e2e/plugins.e2e-spec.ts +++ b/test/e2e/plugins.e2e-spec.ts @@ -35,7 +35,7 @@ describe('PluginController (e2e)', () => { await fs.copy(path.resolve(__dirname, '../mocks', '.uix-secrets'), secretsFilePath); await fs.remove(pluginsPath); - await fs.copy(path.resolve(__dirname, '../mocks', 'plugins'), pluginsPath, { recursive: true }); + await fs.copy(path.resolve(__dirname, '../mocks', 'plugins'), pluginsPath); // create httpService instance httpService = new HttpService(); diff --git a/test/e2e/plugins.gateway.e2e-spec.ts b/test/e2e/plugins.gateway.e2e-spec.ts index e7f33099a..69e136212 100644 --- a/test/e2e/plugins.gateway.e2e-spec.ts +++ b/test/e2e/plugins.gateway.e2e-spec.ts @@ -46,7 +46,7 @@ describe('PluginsGateway (e2e)', () => { await fs.copy(path.resolve(__dirname, '../mocks', '.uix-secrets'), secretsFilePath); await fs.remove(pluginsPath); - await fs.copy(path.resolve(__dirname, '../mocks', 'plugins'), pluginsPath, { recursive: true }); + await fs.copy(path.resolve(__dirname, '../mocks', 'plugins'), pluginsPath); const moduleFixture: TestingModule = await Test.createTestingModule({ imports: [PluginsModule], diff --git a/test/e2e/server.e2e-spec.ts b/test/e2e/server.e2e-spec.ts index 07e333647..39a08a47f 100644 --- a/test/e2e/server.e2e-spec.ts +++ b/test/e2e/server.e2e-spec.ts @@ -72,8 +72,8 @@ describe('ServerController (e2e)', () => { await fs.remove(accessoriesPath); // copy mock accessories and persist - await fs.copy(path.resolve(__dirname, '../mocks', 'persist'), persistPath, { recursive: true }); - await fs.copy(path.resolve(__dirname, '../mocks', 'accessories'), accessoriesPath, { recursive: true }); + await fs.copy(path.resolve(__dirname, '../mocks', 'persist'), persistPath); + await fs.copy(path.resolve(__dirname, '../mocks', 'accessories'), accessoriesPath); }); it('PUT /server/restart', async () => { diff --git a/ui/package-lock.json b/ui/package-lock.json index ace00726c..c659bfb4b 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -36,25 +36,23 @@ "lodash-es": "4.17.21", "mdbootstrap": "4.20.0", "mobile-detect": "1.4.5", - "monaco-editor": "0.33.0", "ng-inline-svg": "13.1.2", "ng2-charts": "2.4.3", "ng2-dragula": "2.1.1", - "ng2-nouislider": "1.8.3", + "ng2-nouislider": "2.0.0", "ngx-md": "8.1.6", "ngx-monaco-editor": "8.1.1", "ngx-toastr": "15.2.2", - "nouislider": "14.7.0", "popper.js": "1.16.1", "qrcode": "1.5.3", "rxjs": "7.8.1", "semver": "7.5.4", "socket.io-client": "2.5.0", "tslib": "2.6.2", - "xterm": "4.19.0", - "xterm-addon-fit": "0.5.0", - "xterm-addon-web-links": "0.6.0", - "zone.js": "0.11.8" + "xterm": "5.3.0", + "xterm-addon-fit": "0.8.0", + "xterm-addon-web-links": "0.9.0", + "zone.js": "0.12.0" }, "devDependencies": { "@angular-devkit/build-angular": "^14.2.13", @@ -67,16 +65,16 @@ "@angular/compiler-cli": "^14.3.0", "@angular/language-service": "^14.3.0", "@fortawesome/fontawesome-free": "^6.4.2", - "@types/node": "^18.18.8", - "@types/qrcode": "^1.5.4", - "@types/semver": "^7.5.4", + "@types/node": "^18.18.9", + "@types/qrcode": "^1.5.5", + "@types/semver": "^7.5.5", "@types/socket.io-client": "^1.4.36", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "codelyzer": "^6.0.2", "eslint": "^8.53.0", "eslint-plugin-import": "^2.29.0", - "eslint-plugin-jsdoc": "^39.9.1", + "eslint-plugin-jsdoc": "^41.1.2", "eslint-plugin-prefer-arrow": "^1.2.3", "ts-node": "^10.9.1", "typescript": "^4.8.4" @@ -2893,17 +2891,17 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.36.1", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.36.1.tgz", - "integrity": "sha512-922xqFsTpHs6D0BUiG4toiyPOMc8/jafnWKxz1KWgS4XzKPy2qXf1Pe6UFuNSCQqt6tOuhAWXBNuuyUhJmw9Vg==", + "version": "0.37.1", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz", + "integrity": "sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==", "dev": true, "dependencies": { "comment-parser": "1.3.1", - "esquery": "^1.4.0", - "jsdoc-type-pratt-parser": "~3.1.0" + "esquery": "^1.5.0", + "jsdoc-type-pratt-parser": "~4.0.0" }, "engines": { - "node": "^14 || ^16 || ^17 || ^18 || ^19" + "node": "^14 || ^16 || ^17 || ^18 || ^19 || ^20" } }, "node_modules/@esbuild/linux-loong64": { @@ -3510,9 +3508,9 @@ "dev": true }, "node_modules/@types/body-parser": { - "version": "1.19.4", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.4.tgz", - "integrity": "sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, "dependencies": { "@types/connect": "*", @@ -3520,35 +3518,35 @@ } }, "node_modules/@types/bonjour": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.12.tgz", - "integrity": "sha512-ky0kWSqXVxSqgqJvPIkgFkcn4C8MnRog308Ou8xBBIVo39OmUFy+jqNe0nPwLCDFxUpmT9EvT91YzOJgkDRcFg==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/chart.js": { - "version": "2.9.39", - "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.9.39.tgz", - "integrity": "sha512-FAsZ6v8ds40mVCgM44T1/ZDKuT1Lh6/a2D3nD8ZNX9SqBObBc0vH2VrcLjYP3PL8onPPt9rIw+QyEkgrzj31TQ==", + "version": "2.9.40", + "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.9.40.tgz", + "integrity": "sha512-ApIH2LIDXzKTNtG4oTMmn2CIII6lvRvxyKnmLb1zYFlwXtE4lTOb2ywgXQJYVuhgWpqaCSHSYOlzO+5gs6hL+A==", "dependencies": { "moment": "^2.10.2" } }, "node_modules/@types/connect": { - "version": "3.4.37", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.37.tgz", - "integrity": "sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.2.tgz", - "integrity": "sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.3.tgz", + "integrity": "sha512-6mfQ6iNvhSKCZJoY6sIG3m0pKkdUcweVNOLuBBKvoWGzl2yRxOJcYOTRyLKt3nxXvBLJWa6QkW//tgbIwJehmA==", "dev": true, "dependencies": { "@types/express-serve-static-core": "*", @@ -3556,14 +3554,14 @@ } }, "node_modules/@types/dragula": { - "version": "2.1.38", - "resolved": "https://registry.npmjs.org/@types/dragula/-/dragula-2.1.38.tgz", - "integrity": "sha512-JM8Qu+ym7d5oTSYFGmXj3Uj9sZ1K91OcMAxlgJgjVMjDPPp8xCKpvALh0gdP4PhiWPn4rEx1GqFkN24zfAk8kw==" + "version": "2.1.39", + "resolved": "https://registry.npmjs.org/@types/dragula/-/dragula-2.1.39.tgz", + "integrity": "sha512-MC6C61MJ1+RZjyFujDXgLoslsFnY19Zoo5p13PNDU5X/t+gPychd2onam9IGHSc3Al36yw3jd4mcIaTX95RQCA==" }, "node_modules/@types/eslint": { - "version": "8.44.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.6.tgz", - "integrity": "sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==", + "version": "8.44.7", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.7.tgz", + "integrity": "sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==", "dev": true, "dependencies": { "@types/estree": "*", @@ -3571,9 +3569,9 @@ } }, "node_modules/@types/eslint-scope": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.6.tgz", - "integrity": "sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, "dependencies": { "@types/eslint": "*", @@ -3587,9 +3585,9 @@ "dev": true }, "node_modules/@types/express": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.20.tgz", - "integrity": "sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, "dependencies": { "@types/body-parser": "*", @@ -3599,9 +3597,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.39", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz", - "integrity": "sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==", + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", "dev": true, "dependencies": { "@types/node": "*", @@ -3611,24 +3609,24 @@ } }, "node_modules/@types/http-errors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.3.tgz", - "integrity": "sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "dev": true }, "node_modules/@types/http-proxy": { - "version": "1.17.13", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.13.tgz", - "integrity": "sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw==", + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/json-schema": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", - "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/json5": { @@ -3638,54 +3636,54 @@ "dev": true }, "node_modules/@types/mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.4.tgz", - "integrity": "sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true }, "node_modules/@types/node": { - "version": "18.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.8.tgz", - "integrity": "sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==", + "version": "18.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.9.tgz", + "integrity": "sha512-0f5klcuImLnG4Qreu9hPj/rEfFq6YRc5n2mAjSsH+ec/mJL+3voBH0+8T7o8RpFjH7ovc+TRsL/c7OYIQsPTfQ==", "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/node-forge": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.8.tgz", - "integrity": "sha512-vGXshY9vim9CJjrpcS5raqSjEfKlJcWy2HNdgUasR66fAnVEYarrf1ULV4nfvpC1nZq/moA9qyqBcu83x+Jlrg==", + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.9.tgz", + "integrity": "sha512-meK88cx/sTalPSLSoCzkiUB4VPIFHmxtXm5FaaqRDqBX2i/Sy8bJ4odsan0b20RBjPh06dAQ+OTTdnyQyhJZyQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/parse-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.1.tgz", - "integrity": "sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "dev": true }, "node_modules/@types/qrcode": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.5.4.tgz", - "integrity": "sha512-ufYqUO7wUBq49hugJry+oIYKscvxIQerJSmXeny215aJKfrepN04DDZP8FCgxvV82kOqKPULCE4PIW3qUmZrRA==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.5.5.tgz", + "integrity": "sha512-CdfBi/e3Qk+3Z/fXYShipBT13OJ2fDO2Q2w5CIP5anLTLIndQG9z6P1cnm+8zCWSpm5dnxMFd/uREtb0EXuQzg==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/qs": { - "version": "6.9.9", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.9.tgz", - "integrity": "sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==", + "version": "6.9.10", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", + "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", "dev": true }, "node_modules/@types/range-parser": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.6.tgz", - "integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true }, "node_modules/@types/retry": { @@ -3695,15 +3693,15 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", + "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", "dev": true }, "node_modules/@types/send": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.3.tgz", - "integrity": "sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, "dependencies": { "@types/mime": "^1", @@ -3711,18 +3709,18 @@ } }, "node_modules/@types/serve-index": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.3.tgz", - "integrity": "sha512-4KG+yMEuvDPRrYq5fyVm/I2uqAJSAwZK9VSa+Zf+zUq9/oxSSvy3kkIqyL+jjStv6UCVi8/Aho0NHtB1Fwosrg==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.4.tgz", - "integrity": "sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", "dev": true, "dependencies": { "@types/http-errors": "*", @@ -3737,18 +3735,18 @@ "dev": true }, "node_modules/@types/sockjs": { - "version": "0.3.35", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.35.tgz", - "integrity": "sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw==", + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/ws": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.8.tgz", - "integrity": "sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg==", + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz", + "integrity": "sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==", "dev": true, "dependencies": { "@types/node": "*" @@ -4631,6 +4629,15 @@ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "dev": true, + "engines": { + "node": ">=14" + } + }, "node_modules/are-we-there-yet": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", @@ -6537,9 +6544,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.576", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.576.tgz", - "integrity": "sha512-yXsZyXJfAqzWk1WKryr0Wl0MN2D47xodPvEEwlVePBnhU5E7raevLQR+E6b9JAD3GfL/7MbAL9ZtWQQPcLx7wA==" + "version": "1.4.578", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.578.tgz", + "integrity": "sha512-V0ZhSu1BQZKfG0yNEL6Dadzik8E1vAzfpVOapdSiT9F6yapEJ3Bk+4tZ4SMPdWiUchCgnM/ByYtBzp5ntzDMIA==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -7406,16 +7413,17 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "39.9.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.9.1.tgz", - "integrity": "sha512-Rq2QY6BZP2meNIs48aZ3GlIlJgBqFCmR55+UBvaDkA3ZNQ0SvQXOs2QKkubakEijV8UbIVbVZKsOVN8G3MuqZw==", + "version": "41.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-41.1.2.tgz", + "integrity": "sha512-MePJXdGiPW7AG06CU5GbKzYtKpoHwTq1lKijjq+RwL/cQkZtBZ59Zbv5Ep0RVxSMnq6242249/n+w4XrTZ1Afg==", "dev": true, "dependencies": { - "@es-joy/jsdoccomment": "~0.36.1", + "@es-joy/jsdoccomment": "~0.37.0", + "are-docs-informative": "^0.0.2", "comment-parser": "1.3.1", "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", - "esquery": "^1.4.0", + "esquery": "^1.5.0", "semver": "^7.3.8", "spdx-expression-parse": "^3.0.1" }, @@ -7944,9 +7952,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -9500,9 +9508,9 @@ } }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "engines": { "node": ">=8" @@ -9595,9 +9603,9 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-3.1.0.tgz", - "integrity": "sha512-MgtD0ZiCDk9B+eI73BextfRrVQl0oyzRG8B2BjORts6jbunj4ScKPcyXGTbB6eXL4y9TzxCm6hyeLq/2ASzNdw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", + "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", "dev": true, "engines": { "node": ">=12.0.0" @@ -10397,11 +10405,6 @@ "node": "*" } }, - "node_modules/monaco-editor": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.33.0.tgz", - "integrity": "sha512-VcRWPSLIUEgQJQIE0pVT8FcGBIgFoxz7jtqctE+IiCxWugD0DwgyQBcZBhdSrdMC84eumoqMZsGl2GTreOzwqw==" - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -10426,9 +10429,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -10552,13 +10555,16 @@ } }, "node_modules/ng2-nouislider": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/ng2-nouislider/-/ng2-nouislider-1.8.3.tgz", - "integrity": "sha512-Vl8tHCcJ/ioJLAs2t6FBC35sZq1P/O5ZdqdFwYxOCOMVbILGWNg+2gWZIjFstvv9pqb/mVvVUYe6qGG/mA/RBQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ng2-nouislider/-/ng2-nouislider-2.0.0.tgz", + "integrity": "sha512-NGbF/0w0+bZqclpSPFOlWIeVJaVwRRYFJzD1x8PClbw9GIeo7fCHoBzZ81y7K7FTJg6to+cgjSTFETPZG/Dizg==", + "dependencies": { + "tslib": "^2.3.0" + }, "peerDependencies": { - "@angular/common": ">=2.x", - "@angular/core": ">=2.x", - "nouislider": ">=9.x" + "@angular/common": ">=14.x", + "@angular/core": ">=14.x", + "nouislider": ">=15.x" } }, "node_modules/ngx-md": { @@ -10773,9 +10779,10 @@ } }, "node_modules/nouislider": { - "version": "14.7.0", - "resolved": "https://registry.npmjs.org/nouislider/-/nouislider-14.7.0.tgz", - "integrity": "sha512-4RtQ1+LHJKesDCNJrXkQcwXAWCrC2aggdLYMstS/G5fEWL+fXZbUA9pwVNHFghMGuFGRATlDLNInRaPeRKzpFQ==" + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/nouislider/-/nouislider-15.7.1.tgz", + "integrity": "sha512-5N7C1ru/i8y3dg9+Z6ilj6+m1EfabvOoaRa7ztpxBSKKRZso4vA52DGSbBJjw5XLtFr/LZ9SgGAXqyVtlVHO5w==", + "peer": true }, "node_modules/npm-bundled": { "version": "1.1.2", @@ -15190,24 +15197,24 @@ } }, "node_modules/xterm": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/xterm/-/xterm-4.19.0.tgz", - "integrity": "sha512-c3Cp4eOVsYY5Q839dR5IejghRPpxciGmLWWaP9g+ppfMeBChMeLa1DCA+pmX/jyDZ+zxFOmlJL/82qVdayVoGQ==" + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/xterm/-/xterm-5.3.0.tgz", + "integrity": "sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg==" }, "node_modules/xterm-addon-fit": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.5.0.tgz", - "integrity": "sha512-DsS9fqhXHacEmsPxBJZvfj2la30Iz9xk+UKjhQgnYNkrUIN5CYLbw7WEfz117c7+S86S/tpHPfvNxJsF5/G8wQ==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.8.0.tgz", + "integrity": "sha512-yj3Np7XlvxxhYF/EJ7p3KHaMt6OdwQ+HDu573Vx1lRXsVxOcnVJs51RgjZOouIZOczTsskaS+CpXspK81/DLqw==", "peerDependencies": { - "xterm": "^4.0.0" + "xterm": "^5.0.0" } }, "node_modules/xterm-addon-web-links": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/xterm-addon-web-links/-/xterm-addon-web-links-0.6.0.tgz", - "integrity": "sha512-H6XzjWWZu8FBo+fnYpxdPk9w5M6drbsvwPEJZGRS38MihiQaVFpKlCMKdfRgDbKGE530tw1yH54rhpZfHgt2/A==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/xterm-addon-web-links/-/xterm-addon-web-links-0.9.0.tgz", + "integrity": "sha512-LIzi4jBbPlrKMZF3ihoyqayWyTXAwGfu4yprz1aK2p71e9UKXN6RRzVONR0L+Zd+Ik5tPVI9bwp9e8fDTQh49Q==", "peerDependencies": { - "xterm": "^4.0.0" + "xterm": "^5.0.0" } }, "node_modules/y18n": { @@ -15284,9 +15291,9 @@ } }, "node_modules/zone.js": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz", - "integrity": "sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.12.0.tgz", + "integrity": "sha512-XtC+I5dXU14HrzidAKBNMqneIVUykLEAA1x+v4KVrd6AUPWlwYORF8KgsVqvgdHiKZ4BkxxjvYi/ksEixTPR0Q==", "dependencies": { "tslib": "^2.3.0" } diff --git a/ui/package.json b/ui/package.json index 29d7edad3..626de758b 100644 --- a/ui/package.json +++ b/ui/package.json @@ -38,25 +38,23 @@ "lodash-es": "4.17.21", "mdbootstrap": "4.20.0", "mobile-detect": "1.4.5", - "monaco-editor": "0.33.0", "ng-inline-svg": "13.1.2", "ng2-charts": "2.4.3", "ng2-dragula": "2.1.1", - "ng2-nouislider": "1.8.3", + "ng2-nouislider": "2.0.0", "ngx-md": "8.1.6", "ngx-monaco-editor": "8.1.1", "ngx-toastr": "15.2.2", - "nouislider": "14.7.0", "popper.js": "1.16.1", "qrcode": "1.5.3", "rxjs": "7.8.1", "semver": "7.5.4", "socket.io-client": "2.5.0", "tslib": "2.6.2", - "xterm": "4.19.0", - "xterm-addon-fit": "0.5.0", - "xterm-addon-web-links": "0.6.0", - "zone.js": "0.11.8" + "xterm": "5.3.0", + "xterm-addon-fit": "0.8.0", + "xterm-addon-web-links": "0.9.0", + "zone.js": "0.12.0" }, "devDependencies": { "@angular-devkit/build-angular": "^14.2.13", @@ -69,16 +67,16 @@ "@angular/compiler-cli": "^14.3.0", "@angular/language-service": "^14.3.0", "@fortawesome/fontawesome-free": "^6.4.2", - "@types/node": "^18.18.8", - "@types/qrcode": "^1.5.4", - "@types/semver": "^7.5.4", + "@types/node": "^18.18.9", + "@types/qrcode": "^1.5.5", + "@types/semver": "^7.5.5", "@types/socket.io-client": "^1.4.36", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "codelyzer": "^6.0.2", "eslint": "^8.53.0", "eslint-plugin-import": "^2.29.0", - "eslint-plugin-jsdoc": "^39.9.1", + "eslint-plugin-jsdoc": "^41.1.2", "eslint-plugin-prefer-arrow": "^1.2.3", "ts-node": "^10.9.1", "typescript": "^4.8.4" diff --git a/ui/src/app/core/accessories/accessory-tile/accessory-tile.component.html b/ui/src/app/core/accessories/accessory-tile/accessory-tile.component.html index a82bc8bf0..be6bfe251 100644 --- a/ui/src/app/core/accessories/accessory-tile/accessory-tile.component.html +++ b/ui/src/app/core/accessories/accessory-tile/accessory-tile.component.html @@ -1,8 +1,8 @@ - + - + Switch @@ -58,4 +58,4 @@ Stateless Programmable Switch {{ service.humanType }} - \ No newline at end of file + diff --git a/ui/src/app/core/backup-restore/backup-restore.component.html b/ui/src/app/core/backup-restore/backup-restore.component.html index 0dfbb1829..a6665a16a 100644 --- a/ui/src/app/core/backup-restore/backup-restore.component.html +++ b/ui/src/app/core/backup-restore/backup-restore.component.html @@ -14,7 +14,7 @@

@@ -33,7 +33,7 @@

- \ No newline at end of file + diff --git a/ui/src/app/core/backup-restore/scheduled-backups/scheduled-backups.component.html b/ui/src/app/core/backup-restore/scheduled-backups/scheduled-backups.component.html index 9024c0e29..f49ef0d56 100644 --- a/ui/src/app/core/backup-restore/scheduled-backups/scheduled-backups.component.html +++ b/ui/src/app/core/backup-restore/scheduled-backups/scheduled-backups.component.html @@ -20,7 +20,7 @@
  • - {{ backup.fileName}} + {{ backup.fileName}} @@ -48,7 +48,7 @@

    {{ 'toast.title_error' | translate }}

    - \ No newline at end of file + diff --git a/ui/src/app/core/components/information/information.component.html b/ui/src/app/core/components/information/information.component.html new file mode 100644 index 000000000..b6ccefb60 --- /dev/null +++ b/ui/src/app/core/components/information/information.component.html @@ -0,0 +1,17 @@ + diff --git a/ui/src/app/core/components/information/information.component.scss b/ui/src/app/core/components/information/information.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/ui/src/app/core/components/information/information.component.ts b/ui/src/app/core/components/information/information.component.ts new file mode 100644 index 000000000..7d68be7aa --- /dev/null +++ b/ui/src/app/core/components/information/information.component.ts @@ -0,0 +1,20 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +@Component({ + selector: 'app-confirm', + templateUrl: './information.component.html', + styleUrls: ['./information.component.scss'], +}) +export class InformationComponent implements OnInit { + @Input() title: string; + @Input() message: string; + @Input() ctaButtonLabel: string; + @Input() ctaButtonLink: string; + + constructor( + public activeModal: NgbActiveModal, + ) { } + + ngOnInit() {} +} diff --git a/ui/src/app/core/core.module.ts b/ui/src/app/core/core.module.ts index d72b01aa6..e0ff1bbca 100644 --- a/ui/src/app/core/core.module.ts +++ b/ui/src/app/core/core.module.ts @@ -16,6 +16,7 @@ import { SchemaFormComponent } from './components/schema-form/schema-form.compon import { QrcodeComponent } from './components/qrcode/qrcode.component'; import { RtlDirective } from './directives/rtl.directive'; import { JsonSchemaFormPatchDirective } from './directives/json-schema-form-patch.directive'; +import { InformationComponent } from '@/app/core/components/information/information.component'; @NgModule({ declarations: [ @@ -31,6 +32,7 @@ import { JsonSchemaFormPatchDirective } from './directives/json-schema-form-patc BackupRestoreComponent, ScheduledBackupsComponent, ConfirmComponent, + InformationComponent, QrcodeComponent, ], imports: [ diff --git a/ui/src/app/core/manage-plugins/bridge-plugins-modal/bridge-plugins-modal.component.html b/ui/src/app/core/manage-plugins/bridge-plugins-modal/bridge-plugins-modal.component.html index da2559a97..9853878bf 100644 --- a/ui/src/app/core/manage-plugins/bridge-plugins-modal/bridge-plugins-modal.component.html +++ b/ui/src/app/core/manage-plugins/bridge-plugins-modal/bridge-plugins-modal.component.html @@ -37,7 +37,7 @@
    - + {{ 'child_bridge.message_restart_homebridge' | translate }}
    {{ 'child_bridge.message_return_to_pair' | translate }}
    @@ -54,7 +54,7 @@
    - +

    {{ 'child_bridge.label_bridge_paired' | translate }}

    @@ -66,7 +66,7 @@
    [disabled]="restartInProgress[item._bridge?.username]" ngbTooltip="{{'menu.tooltip_restart' | translate}}" container="body" openDelay="150" (click)="restartChildBridge(item._bridge?.username)"> - @@ -83,13 +83,13 @@
    - + {{ 'child_bridge.message_must_configure_plugin_first' | translate }}
    - + {{ 'plugins.settings.message_manual_config_required' | translate }} {{ 'plugins.settings.message_consult_documentation' | translate }} @@ -105,7 +105,7 @@
    {{ 'child_bridge.message_wiki_link' | translate }} - +

    @@ -117,7 +117,7 @@
    -
    \ No newline at end of file +
    diff --git a/ui/src/app/core/manage-plugins/custom-plugins/custom-plugins.component.html b/ui/src/app/core/manage-plugins/custom-plugins/custom-plugins.component.html index 1c46cfc67..4e097ba85 100644 --- a/ui/src/app/core/manage-plugins/custom-plugins/custom-plugins.component.html +++ b/ui/src/app/core/manage-plugins/custom-plugins/custom-plugins.component.html @@ -9,7 +9,7 @@