From 82bb3e5ca7591aeeaea7b157210405d67e3ce147 Mon Sep 17 00:00:00 2001 From: James Bithell Date: Tue, 23 May 2023 16:27:30 +0100 Subject: [PATCH 01/42] bump --- package-lock.json | 1072 ++++++++++++++++++++++----------------------- package.json | 38 +- 2 files changed, 546 insertions(+), 564 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6f366ff0..ceda71d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "2.2.3", "license": "GPL-3.0-only", "dependencies": { - "@emotion/react": "^11.10.6", + "@emotion/react": "^11.11.0", "@mantine/core": "~5.10.5", "@mantine/form": "~5.10.5", "@mantine/hooks": "~5.10.5", @@ -19,12 +19,12 @@ "@mantine/rte": "~5.10.5", "@paradise-pi/e131": "~1.3.0", "@react-icons/all-files": "^4.1.0", - "@reduxjs/toolkit": "^1.9.3", + "@reduxjs/toolkit": "^1.9.5", "@types/ip": "^1.1.0", "@types/node-os-utils": "^1.3.1", "@types/react-beautiful-dnd": "^13.1.4", - "axios": "^1.3.5", - "better-sqlite3": "^8.2.0", + "axios": "^1.4.0", + "better-sqlite3": "^8.4.0", "electron-squirrel-startup": "^1.0.0", "formidable": "^3.2.5", "ip": "^1.1.8", @@ -37,12 +37,12 @@ "react-beautiful-dnd": "^13.1.1", "react-dom": "^18.2.0", "react-redux": "^8.0.5", - "react-router-dom": "^6.10.0", + "react-router-dom": "^6.11.2", "reflect-metadata": "^0.1.13", "socket.io": "^4.6.1", "socket.io-client": "^4.6.1", "timeago.js": "^4.0.2", - "typeorm": "^0.3.14", + "typeorm": "^0.3.16", "winston": "^3.8.2" }, "devDependencies": { @@ -53,18 +53,18 @@ "@electron-forge/maker-zip": "^6.1.1", "@electron-forge/plugin-webpack": "^6.1.1", "@electron-forge/publisher-github": "^6.1.1", - "@types/formidable": "^2.0.5", - "@types/node": "^18.15.11", + "@types/formidable": "^2.0.6", + "@types/node": "^18.16.14", "@types/node-static": "^0.7.7", - "@types/react": "^18.0.33", - "@types/react-dom": "^18.0.11", - "@typescript-eslint/eslint-plugin": "^5.57.1", - "@typescript-eslint/parser": "^5.57.1", + "@types/react": "^18.2.6", + "@types/react-dom": "^18.2.4", + "@typescript-eslint/eslint-plugin": "^5.59.7", + "@typescript-eslint/parser": "^5.59.7", "@vercel/webpack-asset-relocator-loader": "^1.7.3", "autoprefixer": "^10.4.14", - "css-loader": "^6.7.3", - "electron": "^23.2.2", - "eslint": "^8.37.0", + "css-loader": "^6.7.4", + "electron": "^24.3.1", + "eslint": "^8.41.0", "eslint-config-google": "^0.14.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", @@ -75,11 +75,11 @@ "eslint-plugin-unused-imports": "^2.0.0", "fork-ts-checker-webpack-plugin": "^7.3.0", "node-loader": "^2.0.0", - "postcss": "^8.4.21", + "postcss": "^8.4.23", "postcss-import": "^15.1.0", - "postcss-loader": "^7.2.4", - "prettier": "^2.8.7", - "style-loader": "^3.3.2", + "postcss-loader": "^7.3.0", + "prettier": "^2.8.8", + "style-loader": "^3.3.3", "ts-loader": "^9.4.2", "ts-node": "^10.9.1", "typescript": "^4.9.5" @@ -112,9 +112,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", "engines": { "node": ">=6.9.0" } @@ -205,9 +205,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", + "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -216,11 +216,11 @@ } }, "node_modules/@babel/types": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", - "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", + "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-string-parser": "^7.21.5", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, @@ -613,9 +613,9 @@ } }, "node_modules/@electron/asar": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.3.tgz", - "integrity": "sha512-wmOfE6szYyqZhRIiLH+eyZEp+bGcJI0OD/SCvSUrfBE0jvauyGYO2ZhpWxmNCcDojKu5DYrsVqT5BOCZZ01XIg==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.4.tgz", + "integrity": "sha512-lykfY3TJRRWFeTxccEKdf1I6BLl2Plw81H0bbp4Fc5iEc67foDCa5pjJQULVgo0wF+Dli75f3xVcdb/67FFZ/g==", "dev": true, "dependencies": { "chromium-pickle-js": "^0.2.0", @@ -628,9 +628,6 @@ }, "engines": { "node": ">=10.12.0" - }, - "optionalDependencies": { - "@types/glob": "^7.1.1" } }, "node_modules/@electron/asar/node_modules/commander": { @@ -754,9 +751,9 @@ } }, "node_modules/@electron/rebuild": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.2.10.tgz", - "integrity": "sha512-SUBM6Mwi3yZaDFQjZzfGKpYTtOp9m60glounwX6tfGeVc/ZOl4jbquktUcyy7gYSLDWFLtKkftkY2xgMJZLQgg==", + "version": "3.2.13", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.2.13.tgz", + "integrity": "sha512-DH9Ol4JCnHDYVOD0fKWq+Qqbn/0WU1O6QR0mIpMXEVU4YFM4PlaqNC9K36mGShNBxxGFotZCMDrB1wl/iHM12g==", "dev": true, "dependencies": { "@malept/cross-spawn-promise": "^2.0.0", @@ -765,7 +762,6 @@ "detect-libc": "^2.0.1", "fs-extra": "^10.0.0", "got": "^11.7.0", - "lzma-native": "^8.0.5", "node-abi": "^3.0.0", "node-api-version": "^0.1.4", "node-gyp": "^9.0.0", @@ -775,7 +771,7 @@ "yargs": "^17.0.1" }, "bin": { - "electron-rebuild": "lib/src/cli.js" + "electron-rebuild": "lib/cli.js" }, "engines": { "node": ">=12.13.0" @@ -837,57 +833,57 @@ } }, "node_modules/@emotion/babel-plugin": { - "version": "11.10.6", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz", - "integrity": "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/serialize": "^1.1.1", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", "source-map": "^0.5.7", - "stylis": "4.1.3" + "stylis": "4.2.0" } }, "node_modules/@emotion/cache": { - "version": "11.10.7", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.7.tgz", - "integrity": "sha512-VLl1/2D6LOjH57Y8Vem1RoZ9haWF4jesHDGiHtKozDQuBIkJm2gimVo0I02sWCuzZtVACeixTVB4jeE8qvCBoQ==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", "dependencies": { - "@emotion/memoize": "^0.8.0", - "@emotion/sheet": "^1.2.1", - "@emotion/utils": "^1.2.0", - "@emotion/weak-memoize": "^0.3.0", - "stylis": "4.1.3" + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" } }, "node_modules/@emotion/hash": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", - "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" }, "node_modules/@emotion/memoize": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", - "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "node_modules/@emotion/react": { - "version": "11.10.6", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz", - "integrity": "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.0.tgz", + "integrity": "sha512-ZSK3ZJsNkwfjT3JpDAWJZlrGD81Z3ytNDsxw1LKq1o+xkmO5pnWfr6gmCC8gHEFf3nSSX/09YrG67jybNPxSUw==", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.10.6", - "@emotion/cache": "^11.10.5", - "@emotion/serialize": "^1.1.1", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@emotion/utils": "^1.2.0", - "@emotion/weak-memoize": "^0.3.0", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", "hoist-non-react-statics": "^3.3.1" }, "peerDependencies": { @@ -900,44 +896,44 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", - "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", "dependencies": { - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/unitless": "^0.8.0", - "@emotion/utils": "^1.2.0", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", "csstype": "^3.0.2" } }, "node_modules/@emotion/sheet": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", - "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" }, "node_modules/@emotion/unitless": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", - "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", - "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", "peerDependencies": { "react": ">=16.8.0" } }, "node_modules/@emotion/utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", - "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" }, "node_modules/@emotion/weak-memoize": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", - "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", @@ -955,23 +951,23 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.1", + "espree": "^9.5.2", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -987,9 +983,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.37.0.tgz", - "integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", + "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1001,9 +997,9 @@ "integrity": "sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg==" }, "node_modules/@floating-ui/dom": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.6.tgz", - "integrity": "sha512-02vxFDuvuVPs22iJICacezYJyf7zwwOCWkPNkWNBr1U0Qt1cKFYzWvxts0AmqcOQGwt/3KJWcWIgtbUU38keyw==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.8.tgz", + "integrity": "sha512-XLwhYV90MxiHDq6S0rzFZj00fnDM+A1R9jhSioZoMsa7G0Q0i+Q4x40ajR8FHSdYDE1bgjG45mIWe6jtv9UPmg==", "dependencies": { "@floating-ui/core": "^1.2.6" } @@ -1669,14 +1665,14 @@ } }, "node_modules/@reduxjs/toolkit": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.3.tgz", - "integrity": "sha512-GU2TNBQVofL09VGmuSioNPQIu6Ml0YLf4EJhgj0AvBadRlCGzUWet8372LjvO4fqKZF2vH1xU0htAa7BrK9pZg==", + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz", + "integrity": "sha512-Rt97jHmfTeaxL4swLRNPD/zV4OxTes4la07Xc4hetpUW/vc75t5m1ANyxG6ymnEQ2FsLQsoMlYB2vV1sO3m8tQ==", "dependencies": { - "immer": "^9.0.16", - "redux": "^4.2.0", + "immer": "^9.0.21", + "redux": "^4.2.1", "redux-thunk": "^2.4.2", - "reselect": "^4.1.7" + "reselect": "^4.1.8" }, "peerDependencies": { "react": "^16.9.0 || ^17.0.0 || ^18", @@ -1692,9 +1688,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.5.0.tgz", - "integrity": "sha512-bkUDCp8o1MvFO+qxkODcbhSqRa6P2GXgrGZVpt0dCXNW2HCSCqYI0ZoAqEOSAjRWmmlKcYgFvN4B4S+zo/f8kg==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.2.tgz", + "integrity": "sha512-LzqpSrMK/3JBAVBI9u3NWtOhWNw5AMQfrUFYB0+bDHTSw17z++WJLsPsxAuK+oSddsxk4d7F/JcdDPM1M5YAhA==", "engines": { "node": ">=14" } @@ -1732,12 +1728,6 @@ "url": "https://opencollective.com/serialport/donate" } }, - "node_modules/@serialport/bindings-cpp/node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", - "optional": true - }, "node_modules/@serialport/bindings-interface": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@serialport/bindings-interface/-/bindings-interface-1.2.2.tgz", @@ -1966,9 +1956,9 @@ "dev": true }, "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, "node_modules/@types/body-parser": { @@ -2012,9 +2002,9 @@ } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", "dev": true, "dependencies": { "@types/express-serve-static-core": "*", @@ -2035,9 +2025,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", - "integrity": "sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==", "dev": true, "dependencies": { "@types/estree": "*", @@ -2055,9 +2045,9 @@ } }, "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", "dev": true }, "node_modules/@types/express": { @@ -2073,20 +2063,21 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", "dev": true, "dependencies": { "@types/node": "*", "@types/qs": "*", - "@types/range-parser": "*" + "@types/range-parser": "*", + "@types/send": "*" } }, "node_modules/@types/formidable": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-2.0.5.tgz", - "integrity": "sha512-uvMcdn/KK3maPOaVUAc3HEYbCEhjaGFwww4EsX6IJfWIJ1tzHtDHczuImH3GKdusPnAAmzB07St90uabZeCKPA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-2.0.6.tgz", + "integrity": "sha512-L4HcrA05IgQyNYJj6kItuIkXrInJvsXTPC5B1i64FggWKKqSL+4hgt7asiSNva75AoLQjq29oPxFfU4GAQ6Z2w==", "dev": true, "dependencies": { "@types/node": "*" @@ -2135,9 +2126,9 @@ "dev": true }, "node_modules/@types/http-proxy": { - "version": "1.17.10", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.10.tgz", - "integrity": "sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==", + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", "dev": true, "dependencies": { "@types/node": "*" @@ -2186,9 +2177,9 @@ "optional": true }, "node_modules/@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" + "version": "18.16.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.14.tgz", + "integrity": "sha512-+ImzUB3mw2c5ISJUq0punjDilUQ5GnUim0ZRvchHIWJmOC0G+p0kzhXBqj6cDjK0QdPFwzrHWgrJp3RPvCG5qg==" }, "node_modules/@types/node-os-utils": { "version": "1.3.1", @@ -2236,9 +2227,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.0.33", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.33.tgz", - "integrity": "sha512-sHxzVxeanvQyQ1lr8NSHaj0kDzcNiGpILEVt69g9S31/7PfMvNCKLKcsHw4lYKjs3cGNJjXSP4mYzX43QlnjNA==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.6.tgz", + "integrity": "sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2254,9 +2245,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.0.11", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", - "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.4.tgz", + "integrity": "sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==", "dev": true, "dependencies": { "@types/react": "*" @@ -2294,11 +2285,21 @@ "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, "node_modules/@types/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", @@ -2357,15 +2358,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.1.tgz", - "integrity": "sha512-1MeobQkQ9tztuleT3v72XmY0XuKXVXusAhryoLuU5YZ+mXoYKZP9SQ7Flulh1NX4DTjpGTc2b/eMu4u7M7dhnQ==", + "version": "5.59.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.7.tgz", + "integrity": "sha512-BL+jYxUFIbuYwy+4fF86k5vdT9lT0CNJ6HtwrIvGh0PhH8s0yy5rjaKH2fDCrz5ITHy07WCzVGNvAmjJh4IJFA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.57.1", - "@typescript-eslint/type-utils": "5.57.1", - "@typescript-eslint/utils": "5.57.1", + "@typescript-eslint/scope-manager": "5.59.7", + "@typescript-eslint/type-utils": "5.59.7", + "@typescript-eslint/utils": "5.59.7", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -2391,14 +2392,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.1.tgz", - "integrity": "sha512-hlA0BLeVSA/wBPKdPGxoVr9Pp6GutGoY380FEhbVi0Ph4WNe8kLvqIRx76RSQt1lynZKfrXKs0/XeEk4zZycuA==", + "version": "5.59.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.7.tgz", + "integrity": "sha512-VhpsIEuq/8i5SF+mPg9jSdIwgMBBp0z9XqjiEay+81PYLJuroN+ET1hM5IhkiYMJd9MkTz8iJLt7aaGAgzWUbQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.57.1", - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/typescript-estree": "5.57.1", + "@typescript-eslint/scope-manager": "5.59.7", + "@typescript-eslint/types": "5.59.7", + "@typescript-eslint/typescript-estree": "5.59.7", "debug": "^4.3.4" }, "engines": { @@ -2418,13 +2419,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.1.tgz", - "integrity": "sha512-N/RrBwEUKMIYxSKl0oDK5sFVHd6VI7p9K5MyUlVYAY6dyNb/wHUqndkTd3XhpGlXgnQsBkRZuu4f9kAHghvgPw==", + "version": "5.59.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.7.tgz", + "integrity": "sha512-FL6hkYWK9zBGdxT2wWEd2W8ocXMu3K94i3gvMrjXpx+koFYdYV7KprKfirpgY34vTGzEPPuKoERpP8kD5h7vZQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/visitor-keys": "5.57.1" + "@typescript-eslint/types": "5.59.7", + "@typescript-eslint/visitor-keys": "5.59.7" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2435,13 +2436,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.1.tgz", - "integrity": "sha512-/RIPQyx60Pt6ga86hKXesXkJ2WOS4UemFrmmq/7eOyiYjYv/MUSHPlkhU6k9T9W1ytnTJueqASW+wOmW4KrViw==", + "version": "5.59.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.7.tgz", + "integrity": "sha512-ozuz/GILuYG7osdY5O5yg0QxXUAEoI4Go3Do5xeu+ERH9PorHBPSdvD3Tjp2NN2bNLh1NJQSsQu2TPu/Ly+HaQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.57.1", - "@typescript-eslint/utils": "5.57.1", + "@typescript-eslint/typescript-estree": "5.59.7", + "@typescript-eslint/utils": "5.59.7", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -2462,9 +2463,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.1.tgz", - "integrity": "sha512-bSs4LOgyV3bJ08F5RDqO2KXqg3WAdwHCu06zOqcQ6vqbTJizyBhuh1o1ImC69X4bV2g1OJxbH71PJqiO7Y1RuA==", + "version": "5.59.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.7.tgz", + "integrity": "sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2475,13 +2476,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.1.tgz", - "integrity": "sha512-A2MZqD8gNT0qHKbk2wRspg7cHbCDCk2tcqt6ScCFLr5Ru8cn+TCfM786DjPhqwseiS+PrYwcXht5ztpEQ6TFTw==", + "version": "5.59.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.7.tgz", + "integrity": "sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/visitor-keys": "5.57.1", + "@typescript-eslint/types": "5.59.7", + "@typescript-eslint/visitor-keys": "5.59.7", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2502,17 +2503,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.1.tgz", - "integrity": "sha512-kN6vzzf9NkEtawECqze6v99LtmDiUJCVpvieTFA1uL7/jDghiJGubGZ5csicYHU1Xoqb3oH/R5cN5df6W41Nfg==", + "version": "5.59.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.7.tgz", + "integrity": "sha512-yCX9WpdQKaLufz5luG4aJbOpdXf/fjwGMcLFXZVPUz3QqLirG5QcwwnIHNf8cjLjxK4qtzTO8udUtMQSAToQnQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.57.1", - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/typescript-estree": "5.57.1", + "@typescript-eslint/scope-manager": "5.59.7", + "@typescript-eslint/types": "5.59.7", + "@typescript-eslint/typescript-estree": "5.59.7", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -2528,12 +2529,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.1.tgz", - "integrity": "sha512-RjQrAniDU0CEk5r7iphkm731zKlFiUjvcBS2yHAg8WWqFMCaCrD0rKEVOMUyMMcbGPZ0bPp56srkGWrgfZqLRA==", + "version": "5.59.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.7.tgz", + "integrity": "sha512-tyN+X2jvMslUszIiYbF0ZleP+RqQsFVpGrKI6e0Eet1w8WmhsAtmzaqm8oM8WJQ1ysLwhnsK/4hYHJjOgJVfQQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.57.1", + "@typescript-eslint/types": "5.59.7", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -2554,148 +2555,148 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, @@ -2742,9 +2743,9 @@ } }, "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, "peerDependencies": { "acorn": "^8" @@ -3248,9 +3249,9 @@ } }, "node_modules/axios": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.5.tgz", - "integrity": "sha512-glL/PvG/E+xCWwV8S6nCHcrfg1exGx7vxyUIivIA1iL7BIh6bePylCfVHwp6k13ao7SATxB6imau2kqY+I67kw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -3326,9 +3327,9 @@ "dev": true }, "node_modules/better-sqlite3": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-8.2.0.tgz", - "integrity": "sha512-8eTzxGk9535SB3oSNu0tQ6I4ZffjVCBUjKHN9QeeIFtphBX0sEd0NxAuglBNR9TO5ThnxBB7GqzfcYo9kjadJQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-8.4.0.tgz", + "integrity": "sha512-NmsNW1CQvqMszu/CFAJ3pLct6NEFlNfuGM6vw72KHkjOD1UDnL96XNN1BMQc1hiHo8vE2GbOWQYIpZ+YM5wrZw==", "hasInstallScript": true, "dependencies": { "bindings": "^1.5.0", @@ -3724,9 +3725,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001474", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001474.tgz", - "integrity": "sha512-iaIZ8gVrWfemh5DG3T9/YqarVZoYf0r188IjaGwx68j4Pf0SGY6CQkmJUIE+NZHkkecQGohzXmBGEwWDr9aM3Q==", + "version": "1.0.30001489", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001489.tgz", + "integrity": "sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==", "dev": true, "funding": [ { @@ -3919,9 +3920,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.8.0.tgz", - "integrity": "sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", "dev": true, "engines": { "node": ">=6" @@ -4070,9 +4071,9 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "node_modules/colors": { @@ -4276,22 +4277,6 @@ "node": ">=10" } }, - "node_modules/cosmiconfig-typescript-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz", - "integrity": "sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==", - "dev": true, - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@types/node": "*", - "cosmiconfig": ">=7", - "ts-node": ">=10", - "typescript": ">=3" - } - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -4390,15 +4375,15 @@ } }, "node_modules/css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.4.tgz", + "integrity": "sha512-0Y5uHtK5BswfaGJ+jrO+4pPg1msFBc0pwPIE1VqfpmVn6YbDfYfXMj8rfd7nt+4goAhJueO+H/I40VWJfcP1mQ==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.19", + "postcss": "^8.4.21", "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-local-by-default": "^4.0.1", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", @@ -4460,6 +4445,21 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -4775,9 +4775,9 @@ "dev": true }, "node_modules/dns-packet": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.5.0.tgz", - "integrity": "sha512-USawdAUzRkV6xrqTjiAEp6M9YagZEzWcSUaZTcIFAiyQWW1SoI6KyId8y2+/71wbgHKQAKd+iupLv4YvEwYWvA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", "dev": true, "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" @@ -4908,14 +4908,14 @@ "dev": true }, "node_modules/electron": { - "version": "23.2.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-23.2.2.tgz", - "integrity": "sha512-8UfC2NCaqLJvdWoAfzAi56DaF+8cD3QPbnabKMdYNxMhYJ54gAje4ChVRo3sUMD5uSMk6MbPYCdnoMusCrfzrQ==", + "version": "24.3.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-24.3.1.tgz", + "integrity": "sha512-lKfC0umie1k5LW48troHzpPKJrqPEW+5j14/CPTC41K9+dJA98oUPt/05G7QAe8OGD4fHjQQuulfRdZ9MjjXeQ==", "dev": true, "hasInstallScript": true, "dependencies": { "@electron/get": "^2.0.0", - "@types/node": "^16.11.26", + "@types/node": "^18.11.18", "extract-zip": "^2.0.1" }, "bin": { @@ -5262,9 +5262,9 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/electron-to-chromium": { - "version": "1.4.355", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.355.tgz", - "integrity": "sha512-056hxzEE4l667YeOccgjhRr5fTiwZ6EIJ4FpzGps4k3YcS8iAhiaBYUBrv5E2LDQJsussscv9EEUwAYKnv+ZKg==", + "version": "1.4.404", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.404.tgz", + "integrity": "sha512-te57sWvQdpxmyd1GiswaodKdXdPgn9cN4ht8JlNa04QgtrfnUdWEo1261rY2vaC6TKaiHn0E7QerJWPKFCvMVw==", "dev": true }, "node_modules/electron-winstaller": { @@ -5320,12 +5320,6 @@ "node": ">= 4.0.0" } }, - "node_modules/electron/node_modules/@types/node": { - "version": "16.18.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.23.tgz", - "integrity": "sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==", - "dev": true - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -5481,9 +5475,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", + "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -5574,9 +5568,9 @@ } }, "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", "dev": true }, "node_modules/es-set-tostringtag": { @@ -5652,15 +5646,15 @@ } }, "node_modules/eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.37.0.tgz", - "integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", + "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.37.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.41.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -5670,9 +5664,9 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -5680,13 +5674,12 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -5753,9 +5746,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -6000,9 +5993,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6012,9 +6005,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -6022,17 +6015,20 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6329,9 +6325,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, "node_modules/fast-glob": { @@ -6954,12 +6950,13 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { @@ -7226,6 +7223,12 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -7275,7 +7278,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -7444,9 +7446,9 @@ } }, "node_modules/html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.1.tgz", + "integrity": "sha512-cTUzZ1+NqjGEKjmVgZKLMdiFg3m9MdRXkZW2OEe69WYVi5ONLMmlnSZdXzGGMOq0C8jGDrL6EWyEDDUioHO/pA==", "dev": true, "dependencies": { "@types/html-minifier-terser": "^6.0.0", @@ -7887,9 +7889,9 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dependencies": { "has": "^1.0.3" }, @@ -8256,22 +8258,21 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jiti": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", + "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", "dev": true }, - "node_modules/js-sdsl": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -8692,24 +8693,6 @@ "node": ">=12" } }, - "node_modules/lzma-native": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/lzma-native/-/lzma-native-8.0.6.tgz", - "integrity": "sha512-09xfg67mkL2Lz20PrrDeNYZxzeW7ADtpYFbwSQh9U8+76RIzx5QsJBMy8qikv3hbUPfpy6hqwxt6FcGK81g9AA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^3.1.0", - "node-gyp-build": "^4.2.1", - "readable-stream": "^3.6.0" - }, - "bin": { - "lzmajs": "bin/lzmajs" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/macos-alias": { "version": "0.2.11", "resolved": "https://registry.npmjs.org/macos-alias/-/macos-alias-0.2.11.tgz", @@ -8806,9 +8789,9 @@ } }, "node_modules/memfs": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.0.tgz", - "integrity": "sha512-yK6o8xVJlQerz57kvPROwTMgx5WtGwC2ZxDtOUsnGl49rHjYkfQoPNZPCKH73VdLE1BwBu/+Fx/NL8NYMUw2aA==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz", + "integrity": "sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==", "dev": true, "dependencies": { "fs-monkey": "^1.0.3" @@ -9159,9 +9142,9 @@ } }, "node_modules/node-abi": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.35.0.tgz", - "integrity": "sha512-jAlSOFR1Bls963NmFwxeQkNTzqjUF0NThm8Le7eRIRGzFUVJuMOFZDLv5Y30W/Oaw+KEebEJLAigwO9gQHoEmw==", + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.40.0.tgz", + "integrity": "sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==", "dependencies": { "semver": "^7.3.5" }, @@ -9176,10 +9159,10 @@ "dev": true }, "node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "optional": true }, "node_modules/node-api-version": { "version": "0.1.4", @@ -9191,9 +9174,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", "dev": true, "dependencies": { "whatwg-url": "^5.0.0" @@ -9247,7 +9230,7 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "devOptional": true, + "optional": true, "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -9279,9 +9262,9 @@ "integrity": "sha512-fvnX9tZbR7WfCG5BAy3yO/nCLyjVWD6MghEq0z5FDfN+ZXpLWNITBdbifxQkQ25ebr16G0N7eRWJisOcMEHG3Q==" }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.11.tgz", + "integrity": "sha512-+M0PwXeU80kRohZ3aT4J/OnR+l9/KD2nVLNNoRgFtnf+umQVFdGBAO2N8+nCnEi0xlh/Wk3zOGC+vNNx+uM79Q==", "dev": true }, "node_modules/node-static": { @@ -10123,9 +10106,9 @@ } }, "node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", "dev": true, "funding": [ { @@ -10135,10 +10118,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -10164,13 +10151,13 @@ } }, "node_modules/postcss-loader": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.2.4.tgz", - "integrity": "sha512-F88rpxxNspo5hatIc+orYwZDtHFaVFOSIVAx+fBfJC1GmhWbVmPWtmg2gXKE1OxJbneOSGn8PWdIwsZFcruS+w==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.0.tgz", + "integrity": "sha512-qLAFjvR2BFNz1H930P7mj1iuWJFjGey/nVhimfOAAQ1ZyPpcClAxP8+A55Sl8mBvM+K2a9Pjgdj10KpANWrNfw==", "dev": true, "dependencies": { "cosmiconfig": "^8.1.3", - "cosmiconfig-typescript-loader": "^4.3.0", + "jiti": "^1.18.2", "klona": "^2.0.6", "semver": "^7.3.8" }, @@ -10183,17 +10170,7 @@ }, "peerDependencies": { "postcss": "^7.0.0 || ^8.0.1", - "ts-node": ">=10", - "typescript": ">=4", "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } } }, "node_modules/postcss-loader/node_modules/cosmiconfig": { @@ -10227,9 +10204,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.2.tgz", + "integrity": "sha512-mR/pcIsQhU2UgKYOPjRCSgacmjn08pyrHk+Vrm8WEKjDWgqO43vdRkzmxyZOZWiKr6Ed9gpReQHhLUGVAcn9jw==", "dev": true, "dependencies": { "icss-utils": "^5.0.0", @@ -10274,9 +10251,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -10327,9 +10304,9 @@ } }, "node_modules/prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -10538,9 +10515,9 @@ "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" }, "node_modules/quill-mention": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/quill-mention/-/quill-mention-3.1.0.tgz", - "integrity": "sha512-uyjGK8QPJHEcjvNc3wUJy6a05Oiu+6JJ0N9SFAwjYHYThgMzlKucyD975fq28Mr1it8ZFRNiRMPa0sCiVOAEwA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/quill-mention/-/quill-mention-3.2.0.tgz", + "integrity": "sha512-GVARl6kiOuo/YbizaoiseJaNlhU+5yQ01YlAyk0UAINQLNezZS7G9lZB/3DveYf6rGjQ7IpHOnR0OZo8g4Dp9A==", "dependencies": { "quill": "^1.3.7" } @@ -10761,11 +10738,11 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/react-router": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.10.0.tgz", - "integrity": "sha512-Nrg0BWpQqrC3ZFFkyewrflCud9dio9ME3ojHCF/WLsprJVzkq3q3UeEhMCAW1dobjeGbWgjNn/PVF6m46ANxXQ==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.2.tgz", + "integrity": "sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg==", "dependencies": { - "@remix-run/router": "1.5.0" + "@remix-run/router": "1.6.2" }, "engines": { "node": ">=14" @@ -10775,12 +10752,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.10.0.tgz", - "integrity": "sha512-E5dfxRPuXKJqzwSe/qGcqdwa18QiWC6f3H3cWXM24qj4N0/beCIf/CWTipop2xm7mR0RCS99NnaqPNjHtrAzCg==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.11.2.tgz", + "integrity": "sha512-JNbKtAeh1VSJQnH6RvBDNhxNwemRj7KxCzc5jb7zvDSKRnPWIFj9pO+eXqjM69gQJ0r46hSz1x4l9y0651DKWw==", "dependencies": { - "@remix-run/router": "1.5.0", - "react-router": "6.10.0" + "@remix-run/router": "1.6.2", + "react-router": "6.11.2" }, "engines": { "node": ">=14" @@ -11000,13 +10977,13 @@ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -11078,9 +11055,9 @@ "dev": true }, "node_modules/reselect": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz", - "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==" + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" }, "node_modules/resolve": { "version": "1.22.2", @@ -11245,9 +11222,9 @@ } }, "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "dependencies": { "tslib": "^2.1.0" @@ -11309,9 +11286,9 @@ } }, "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -11345,9 +11322,9 @@ } }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -11638,9 +11615,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", - "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11819,9 +11796,9 @@ } }, "node_modules/socket.io-parser": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", - "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", + "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" @@ -12185,9 +12162,9 @@ } }, "node_modules/style-loader": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.2.tgz", - "integrity": "sha512-RHs/vcrKdQK8wZliteNK4NKzxvLBzpuHMqYmUVWeKa6MkaIQ97ZTOS0b+zapZhy6GcrgWnvWYCMHRirC3FsUmw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", + "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", "dev": true, "engines": { "node": ">= 12.13.0" @@ -12201,9 +12178,9 @@ } }, "node_modules/stylis": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", - "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, "node_modules/sudo-prompt": { "version": "9.2.1", @@ -12246,9 +12223,9 @@ } }, "node_modules/tabbable": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.1.1.tgz", - "integrity": "sha512-4kl5w+nCB44EVRdO0g/UGoOp3vlwgycUVtkk/7DPyeLZUCuNFFKCFG6/t/DgHLrUPHjrZg6s5tNm+56Q2B0xyg==" + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.1.2.tgz", + "integrity": "sha512-qCN98uP7i9z0fIS4amQ5zbGBOq+OSigYeGvPy7NDk8Y9yncqDZ9pRPgfsc2PJIVM9RrJj7GIfuRgmjoUU9zTHQ==" }, "node_modules/tapable": { "version": "2.2.1", @@ -12260,14 +12237,14 @@ } }, "node_modules/tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", "dev": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" @@ -12308,9 +12285,9 @@ } }, "node_modules/tar/node_modules/minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, "engines": { "node": ">=8" @@ -12357,9 +12334,9 @@ } }, "node_modules/terser": { - "version": "5.16.8", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.8.tgz", - "integrity": "sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA==", + "version": "5.17.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.6.tgz", + "integrity": "sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.2", @@ -12375,16 +12352,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", - "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.5" + "terser": "^5.16.8" }, "engines": { "node": ">= 10.13.0" @@ -12664,9 +12641,9 @@ } }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", + "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -12752,15 +12729,16 @@ } }, "node_modules/typeorm": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.14.tgz", - "integrity": "sha512-tEPEN8qmA2a2wmjkaDcWBZ6LsECHofJW2vaCQMklYs+4JRJMAJ5FfbPIWMbhJ3ANJGMtLAmU1GfC8rLFIpbWsg==", + "version": "0.3.16", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.16.tgz", + "integrity": "sha512-wJ4Qy1oqRKNDdZiBTTaVMqwo/XxC52Q7uNPTjltPgLhvIW173bL6Iad0lhptMOsFlpixFPaUu3PNziaRBwX2Zw==", "dependencies": { "@sqltools/formatter": "^1.2.5", "app-root-path": "^3.1.0", "buffer": "^6.0.3", "chalk": "^4.1.2", "cli-highlight": "^2.1.11", + "date-fns": "^2.29.3", "debug": "^4.3.4", "dotenv": "^16.0.3", "glob": "^8.1.0", @@ -12788,7 +12766,7 @@ "better-sqlite3": "^7.1.2 || ^8.0.0", "hdb-pool": "^0.1.6", "ioredis": "^5.0.4", - "mongodb": "^3.6.0", + "mongodb": "^5.2.0", "mssql": "^9.1.1", "mysql2": "^2.2.5 || ^3.0.1", "oracledb": "^5.1.0", @@ -13016,9 +12994,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "funding": [ { @@ -13028,6 +13006,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { @@ -13035,7 +13017,7 @@ "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -13206,22 +13188,22 @@ "dev": true }, "node_modules/webpack": { - "version": "5.78.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.78.0.tgz", - "integrity": "sha512-gT5DP72KInmE/3azEaQrISjTvLYlSM0j1Ezhht/KLVkrqtv10JoP/RXhwmX/frrutOPuSq3o5Vq0ehR/4Vmd1g==", + "version": "5.83.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.83.1.tgz", + "integrity": "sha512-TNsG9jDScbNuB+Lb/3+vYolPplCS3bbEaJf+Bj0Gw4DhP3ioAflBb1flcRt9zsWITyvOhM96wMQNRWlSX52DgA==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.14.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -13230,9 +13212,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.1.2", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, @@ -13310,15 +13292,15 @@ "dev": true }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", + "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -13329,9 +13311,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz", - "integrity": "sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw==", + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz", + "integrity": "sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -13431,15 +13413,15 @@ "dev": true }, "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", + "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -13471,9 +13453,9 @@ } }, "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", @@ -13557,9 +13539,9 @@ } }, "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true, "optional": true }, @@ -13593,9 +13575,9 @@ } }, "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, "node_modules/winston": { @@ -13785,9 +13767,9 @@ } }, "node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", diff --git a/package.json b/package.json index 504c037d..d9ac8cd2 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "email": "Jbithell@users.noreply.github.com" }, "dependencies": { - "@emotion/react": "^11.10.6", + "@emotion/react": "^11.11.0", "@mantine/core": "~5.10.5", "@mantine/form": "~5.10.5", "@mantine/hooks": "~5.10.5", @@ -36,12 +36,12 @@ "@mantine/rte": "~5.10.5", "@paradise-pi/e131": "~1.3.0", "@react-icons/all-files": "^4.1.0", - "@reduxjs/toolkit": "^1.9.3", + "@reduxjs/toolkit": "^1.9.5", "@types/ip": "^1.1.0", "@types/node-os-utils": "^1.3.1", "@types/react-beautiful-dnd": "^13.1.4", - "axios": "^1.3.5", - "better-sqlite3": "^8.2.0", + "axios": "^1.4.0", + "better-sqlite3": "^8.4.0", "electron-squirrel-startup": "^1.0.0", "formidable": "^3.2.5", "ip": "^1.1.8", @@ -54,12 +54,12 @@ "react-beautiful-dnd": "^13.1.1", "react-dom": "^18.2.0", "react-redux": "^8.0.5", - "react-router-dom": "^6.10.0", + "react-router-dom": "^6.11.2", "reflect-metadata": "^0.1.13", "socket.io": "^4.6.1", "socket.io-client": "^4.6.1", "timeago.js": "^4.0.2", - "typeorm": "^0.3.14", + "typeorm": "^0.3.16", "winston": "^3.8.2" }, "devDependencies": { @@ -70,18 +70,18 @@ "@electron-forge/maker-zip": "^6.1.1", "@electron-forge/plugin-webpack": "^6.1.1", "@electron-forge/publisher-github": "^6.1.1", - "@types/formidable": "^2.0.5", - "@types/node": "^18.15.11", + "@types/formidable": "^2.0.6", + "@types/node": "^18.16.14", "@types/node-static": "^0.7.7", - "@types/react": "^18.0.33", - "@types/react-dom": "^18.0.11", - "@typescript-eslint/eslint-plugin": "^5.57.1", - "@typescript-eslint/parser": "^5.57.1", + "@types/react": "^18.2.6", + "@types/react-dom": "^18.2.4", + "@typescript-eslint/eslint-plugin": "^5.59.7", + "@typescript-eslint/parser": "^5.59.7", "@vercel/webpack-asset-relocator-loader": "^1.7.3", "autoprefixer": "^10.4.14", - "css-loader": "^6.7.3", - "electron": "^23.2.2", - "eslint": "^8.37.0", + "css-loader": "^6.7.4", + "electron": "^24.3.1", + "eslint": "^8.41.0", "eslint-config-google": "^0.14.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", @@ -92,11 +92,11 @@ "eslint-plugin-unused-imports": "^2.0.0", "fork-ts-checker-webpack-plugin": "^7.3.0", "node-loader": "^2.0.0", - "postcss": "^8.4.21", + "postcss": "^8.4.23", "postcss-import": "^15.1.0", - "postcss-loader": "^7.2.4", - "prettier": "^2.8.7", - "style-loader": "^3.3.2", + "postcss-loader": "^7.3.0", + "prettier": "^2.8.8", + "style-loader": "^3.3.3", "ts-loader": "^9.4.2", "ts-node": "^10.9.1", "typescript": "^4.9.5" From 19fa8c0d0e33b88acab4721d958347c100dfea72 Mon Sep 17 00:00:00 2001 From: James Bithell Date: Sat, 3 Jun 2023 09:02:38 +0100 Subject: [PATCH 02/42] TS Docs aren't actually provided as far as I can see --- Readme.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/Readme.md b/Readme.md index 9b8860d7..8eaf92ad 100644 --- a/Readme.md +++ b/Readme.md @@ -32,8 +32,6 @@ Pre-built packages are provided for Windows, MacOS (Intel) and Linux at the [Lat ### Docs -Documentation is provided (style is [TSDoc](https://tsdoc.org)) throughout the codebase. Some markdown files are provided in directors where it might be helpful. - The Paradise website is hosted on Cloudflare Pages, and is built using Docusaurus. The source is in the `/docs` directory. ### Running locally From c8ed799afc3aa0514207bdc002e92f98c8e56f43 Mon Sep 17 00:00:00 2001 From: James Bithell Date: Sat, 3 Jun 2023 09:03:56 +0100 Subject: [PATCH 03/42] Bump --- package-lock.json | 353 ++++++++++++++++++++++++---------------------- package.json | 28 ++-- 2 files changed, 196 insertions(+), 185 deletions(-) diff --git a/package-lock.json b/package-lock.json index ceda71d7..d70db3f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,14 +36,14 @@ "react": "^18.2.0", "react-beautiful-dnd": "^13.1.1", "react-dom": "^18.2.0", - "react-redux": "^8.0.5", + "react-redux": "^8.0.7", "react-router-dom": "^6.11.2", "reflect-metadata": "^0.1.13", - "socket.io": "^4.6.1", - "socket.io-client": "^4.6.1", + "socket.io": "^4.6.2", + "socket.io-client": "^4.6.2", "timeago.js": "^4.0.2", "typeorm": "^0.3.16", - "winston": "^3.8.2" + "winston": "^3.9.0" }, "devDependencies": { "@electron-forge/cli": "^6.1.1", @@ -54,17 +54,17 @@ "@electron-forge/plugin-webpack": "^6.1.1", "@electron-forge/publisher-github": "^6.1.1", "@types/formidable": "^2.0.6", - "@types/node": "^18.16.14", + "@types/node": "^18.16.16", "@types/node-static": "^0.7.7", - "@types/react": "^18.2.6", + "@types/react": "^18.2.8", "@types/react-dom": "^18.2.4", - "@typescript-eslint/eslint-plugin": "^5.59.7", - "@typescript-eslint/parser": "^5.59.7", + "@typescript-eslint/eslint-plugin": "^5.59.8", + "@typescript-eslint/parser": "^5.59.8", "@vercel/webpack-asset-relocator-loader": "^1.7.3", "autoprefixer": "^10.4.14", - "css-loader": "^6.7.4", - "electron": "^24.3.1", - "eslint": "^8.41.0", + "css-loader": "^6.8.1", + "electron": "^24.4.1", + "eslint": "^8.42.0", "eslint-config-google": "^0.14.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", @@ -75,12 +75,12 @@ "eslint-plugin-unused-imports": "^2.0.0", "fork-ts-checker-webpack-plugin": "^7.3.0", "node-loader": "^2.0.0", - "postcss": "^8.4.23", + "postcss": "^8.4.24", "postcss-import": "^15.1.0", - "postcss-loader": "^7.3.0", + "postcss-loader": "^7.3.2", "prettier": "^2.8.8", "style-loader": "^3.3.3", - "ts-loader": "^9.4.2", + "ts-loader": "^9.4.3", "ts-node": "^10.9.1", "typescript": "^4.9.5" }, @@ -205,9 +205,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", - "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz", + "integrity": "sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -216,9 +216,9 @@ } }, "node_modules/@babel/types": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", - "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.4.tgz", + "integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==", "dependencies": { "@babel/helper-string-parser": "^7.21.5", "@babel/helper-validator-identifier": "^7.19.1", @@ -983,9 +983,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", - "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", + "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -997,9 +997,9 @@ "integrity": "sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg==" }, "node_modules/@floating-ui/dom": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.8.tgz", - "integrity": "sha512-XLwhYV90MxiHDq6S0rzFZj00fnDM+A1R9jhSioZoMsa7G0Q0i+Q4x40ajR8FHSdYDE1bgjG45mIWe6jtv9UPmg==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.9.tgz", + "integrity": "sha512-sosQxsqgxMNkV3C+3UqTS6LxP7isRLwX8WMepp843Rb3/b0Wz8+MdUkxJksByip3C2WwLugLHN1b4ibn//zKwQ==", "dependencies": { "@floating-ui/core": "^1.2.6" } @@ -1037,9 +1037,9 @@ "dev": true }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -2143,9 +2143,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "node_modules/@types/json5": { @@ -2177,9 +2177,9 @@ "optional": true }, "node_modules/@types/node": { - "version": "18.16.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.14.tgz", - "integrity": "sha512-+ImzUB3mw2c5ISJUq0punjDilUQ5GnUim0ZRvchHIWJmOC0G+p0kzhXBqj6cDjK0QdPFwzrHWgrJp3RPvCG5qg==" + "version": "18.16.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.16.tgz", + "integrity": "sha512-NpaM49IGQQAUlBhHMF82QH80J08os4ZmyF9MkpCzWAGuOHqE4gTEbhzd7L3l5LmWuZ6E0OiC1FweQ4tsiW35+g==" }, "node_modules/@types/node-os-utils": { "version": "1.3.1", @@ -2227,9 +2227,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.2.6", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.6.tgz", - "integrity": "sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA==", + "version": "18.2.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.8.tgz", + "integrity": "sha512-lTyWUNrd8ntVkqycEEplasWy2OxNlShj3zqS0LuB1ENUGis5HodmhM7DtCoUGbxj3VW/WsGA0DUhpG6XrM7gPA==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2358,15 +2358,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.7.tgz", - "integrity": "sha512-BL+jYxUFIbuYwy+4fF86k5vdT9lT0CNJ6HtwrIvGh0PhH8s0yy5rjaKH2fDCrz5ITHy07WCzVGNvAmjJh4IJFA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", + "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.7", - "@typescript-eslint/type-utils": "5.59.7", - "@typescript-eslint/utils": "5.59.7", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/type-utils": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -2392,14 +2392,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.7.tgz", - "integrity": "sha512-VhpsIEuq/8i5SF+mPg9jSdIwgMBBp0z9XqjiEay+81PYLJuroN+ET1hM5IhkiYMJd9MkTz8iJLt7aaGAgzWUbQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", + "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.7", - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/typescript-estree": "5.59.7", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "debug": "^4.3.4" }, "engines": { @@ -2419,13 +2419,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.7.tgz", - "integrity": "sha512-FL6hkYWK9zBGdxT2wWEd2W8ocXMu3K94i3gvMrjXpx+koFYdYV7KprKfirpgY34vTGzEPPuKoERpP8kD5h7vZQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", + "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/visitor-keys": "5.59.7" + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2436,13 +2436,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.7.tgz", - "integrity": "sha512-ozuz/GILuYG7osdY5O5yg0QxXUAEoI4Go3Do5xeu+ERH9PorHBPSdvD3Tjp2NN2bNLh1NJQSsQu2TPu/Ly+HaQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", + "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.7", - "@typescript-eslint/utils": "5.59.7", + "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -2463,9 +2463,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.7.tgz", - "integrity": "sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2476,13 +2476,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.7.tgz", - "integrity": "sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/visitor-keys": "5.59.7", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2503,17 +2503,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.7.tgz", - "integrity": "sha512-yCX9WpdQKaLufz5luG4aJbOpdXf/fjwGMcLFXZVPUz3QqLirG5QcwwnIHNf8cjLjxK4qtzTO8udUtMQSAToQnQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", + "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.7", - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/typescript-estree": "5.59.7", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -2529,12 +2529,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.7.tgz", - "integrity": "sha512-tyN+X2jvMslUszIiYbF0ZleP+RqQsFVpGrKI6e0Eet1w8WmhsAtmzaqm8oM8WJQ1ysLwhnsK/4hYHJjOgJVfQQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.7", + "@typescript-eslint/types": "5.59.8", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -3487,9 +3487,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.21.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", + "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", "dev": true, "funding": [ { @@ -3499,13 +3499,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001489", + "electron-to-chromium": "^1.4.411", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" @@ -3725,9 +3729,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001489", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001489.tgz", - "integrity": "sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==", + "version": "1.0.30001492", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001492.tgz", + "integrity": "sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw==", "dev": true, "funding": [ { @@ -4375,15 +4379,15 @@ } }, "node_modules/css-loader": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.4.tgz", - "integrity": "sha512-0Y5uHtK5BswfaGJ+jrO+4pPg1msFBc0pwPIE1VqfpmVn6YbDfYfXMj8rfd7nt+4goAhJueO+H/I40VWJfcP1mQ==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.21", "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.1", + "postcss-modules-local-by-default": "^4.0.3", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", @@ -4882,11 +4886,14 @@ } }, "node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.3.tgz", + "integrity": "sha512-FYssxsmCTtKL72fGBSvb1K9dRz0/VZeWqFme/vSb7r7323x4CRaHu4LvQ5JG3+s6yt2YPbBrkpiEODktfyjI9A==", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, "node_modules/ds-store": { @@ -4908,9 +4915,9 @@ "dev": true }, "node_modules/electron": { - "version": "24.3.1", - "resolved": "https://registry.npmjs.org/electron/-/electron-24.3.1.tgz", - "integrity": "sha512-lKfC0umie1k5LW48troHzpPKJrqPEW+5j14/CPTC41K9+dJA98oUPt/05G7QAe8OGD4fHjQQuulfRdZ9MjjXeQ==", + "version": "24.4.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-24.4.1.tgz", + "integrity": "sha512-tVZw5/dKGJbU1h8bdY0gfz4Y7ANYi8VddnIiLg/sPidJWc4CdshCZhLfU0lW1ySjtEt35JYxGHfmerkJJqUSTw==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -5262,9 +5269,9 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/electron-to-chromium": { - "version": "1.4.404", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.404.tgz", - "integrity": "sha512-te57sWvQdpxmyd1GiswaodKdXdPgn9cN4ht8JlNa04QgtrfnUdWEo1261rY2vaC6TKaiHn0E7QerJWPKFCvMVw==", + "version": "1.4.419", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.419.tgz", + "integrity": "sha512-jdie3RiEgygvDTyS2sgjq71B36q2cDSBfPlwzUyuOrfYTNoYWyBxxjGJV/HAu3A2hB0Y+HesvCVkVAFoCKwCSw==", "dev": true }, "node_modules/electron-winstaller": { @@ -5439,9 +5446,9 @@ } }, "node_modules/engine.io-parser": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", - "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.7.tgz", + "integrity": "sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ==", "engines": { "node": ">=10.0.0" } @@ -5475,9 +5482,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", - "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", + "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -5646,16 +5653,16 @@ } }, "node_modules/eslint": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", - "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", + "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.41.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint/js": "8.42.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -6744,9 +6751,9 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", "dev": true }, "node_modules/fs-temp": { @@ -8789,9 +8796,9 @@ } }, "node_modules/memfs": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz", - "integrity": "sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.2.tgz", + "integrity": "sha512-4kbWXbVZ+LU4XFDS2CuA7frnwz2HxCMB/0yOXc86q7aCQrfWKkL11t6al1e2CsVC7uhnBNTQ1TfUsAxVauO9IQ==", "dev": true, "dependencies": { "fs-monkey": "^1.0.3" @@ -9142,9 +9149,9 @@ } }, "node_modules/node-abi": { - "version": "3.40.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.40.0.tgz", - "integrity": "sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==", + "version": "3.43.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.43.0.tgz", + "integrity": "sha512-QB0MMv+tn9Ur2DtJrc8y09n0n6sw88CyDniWSX2cHW10goQXYPK9ZpFJOktDS4ron501edPX6h9i7Pg+RnH5nQ==", "dependencies": { "semver": "^7.3.5" }, @@ -9262,9 +9269,9 @@ "integrity": "sha512-fvnX9tZbR7WfCG5BAy3yO/nCLyjVWD6MghEq0z5FDfN+ZXpLWNITBdbifxQkQ25ebr16G0N7eRWJisOcMEHG3Q==" }, "node_modules/node-releases": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.11.tgz", - "integrity": "sha512-+M0PwXeU80kRohZ3aT4J/OnR+l9/KD2nVLNNoRgFtnf+umQVFdGBAO2N8+nCnEi0xlh/Wk3zOGC+vNNx+uM79Q==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", "dev": true }, "node_modules/node-static": { @@ -10106,9 +10113,9 @@ } }, "node_modules/postcss": { - "version": "8.4.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", - "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", "dev": true, "funding": [ { @@ -10151,9 +10158,9 @@ } }, "node_modules/postcss-loader": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.0.tgz", - "integrity": "sha512-qLAFjvR2BFNz1H930P7mj1iuWJFjGey/nVhimfOAAQ1ZyPpcClAxP8+A55Sl8mBvM+K2a9Pjgdj10KpANWrNfw==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.2.tgz", + "integrity": "sha512-c7qDlXErX6n0VT+LUsW+nwefVtTu3ORtVvK8EXuUIDcxo+b/euYqpuHlJAvePb0Af5e8uMjR/13e0lTuYifaig==", "dev": true, "dependencies": { "cosmiconfig": "^8.1.3", @@ -10204,9 +10211,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.2.tgz", - "integrity": "sha512-mR/pcIsQhU2UgKYOPjRCSgacmjn08pyrHk+Vrm8WEKjDWgqO43vdRkzmxyZOZWiKr6Ed9gpReQHhLUGVAcn9jw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", "dev": true, "dependencies": { "icss-utils": "^5.0.0", @@ -10695,9 +10702,9 @@ } }, "node_modules/react-redux": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.5.tgz", - "integrity": "sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw==", + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.7.tgz", + "integrity": "sha512-1vRQuCQI5Y2uNmrMXg81RXKiBHY3jBzvCvNmZF437O/Z9/pZ+ba2uYHbemYXb3g8rjsacBGo+/wmfrQKzMhJsg==", "dependencies": { "@babel/runtime": "^7.12.1", "@types/hoist-non-react-statics": "^3.3.1", @@ -10707,14 +10714,18 @@ "use-sync-external-store": "^1.0.0" }, "peerDependencies": { + "@reduxjs/toolkit": "^1 || ^2.0.0-beta.0", "@types/react": "^16.8 || ^17.0 || ^18.0", "@types/react-dom": "^16.8 || ^17.0 || ^18.0", "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0", "react-native": ">=0.59", - "redux": "^4" + "redux": "^4 || ^5.0.0-beta.0" }, "peerDependenciesMeta": { + "@reduxjs/toolkit": { + "optional": true + }, "@types/react": { "optional": true }, @@ -11738,16 +11749,16 @@ } }, "node_modules/socket.io": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", - "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.2.tgz", + "integrity": "sha512-Vp+lSks5k0dewYTfwgPT9UeGGd+ht7sCpB7p0e83VgO4X/AHYWhXITMrNk/pg8syY2bpx23ptClCQuHhqi2BgQ==", "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.2", - "engine.io": "~6.4.1", + "engine.io": "~6.4.2", "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.1" + "socket.io-parser": "~4.2.4" }, "engines": { "node": ">=10.0.0" @@ -11782,23 +11793,23 @@ } }, "node_modules/socket.io-client": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.1.tgz", - "integrity": "sha512-5UswCV6hpaRsNg5kkEHVcbBIXEYoVbMQaHJBXJCyEQ+CiFPV1NIOY0XOFWG4XR4GZcB8Kn6AsRs/9cy9TbqVMQ==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.2.tgz", + "integrity": "sha512-OwWrMbbA8wSqhBAR0yoPK6EdQLERQAYjXb3A0zLpgxfM1ZGLKoxHx8gVmCHA6pcclRX5oA/zvQf7bghAS11jRA==", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", "engine.io-client": "~6.4.0", - "socket.io-parser": "~4.2.1" + "socket.io-parser": "~4.2.4" }, "engines": { "node": ">=10.0.0" } }, "node_modules/socket.io-parser": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", - "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" @@ -12334,13 +12345,13 @@ } }, "node_modules/terser": { - "version": "5.17.6", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.6.tgz", - "integrity": "sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ==", + "version": "5.17.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.7.tgz", + "integrity": "sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==", "dev": true, "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -12555,9 +12566,9 @@ "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, "node_modules/ts-loader": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", - "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.3.tgz", + "integrity": "sha512-n3hBnm6ozJYzwiwt5YRiJZkzktftRpMiBApHaJPoWLA+qetQBAXkHqCLM6nwSdRDimqVtA5ocIkcTRLMTt7yzA==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -12641,9 +12652,9 @@ } }, "node_modules/tslib": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", - "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -13188,9 +13199,9 @@ "dev": true }, "node_modules/webpack": { - "version": "5.83.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.83.1.tgz", - "integrity": "sha512-TNsG9jDScbNuB+Lb/3+vYolPplCS3bbEaJf+Bj0Gw4DhP3ioAflBb1flcRt9zsWITyvOhM96wMQNRWlSX52DgA==", + "version": "5.85.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.85.0.tgz", + "integrity": "sha512-7gazTiYqwo5OSqwH1tigLDL2r3qDeP2dOKYgd+LlXpsUMqDTklg6tOghexqky0/+6QY38kb/R/uRPUleuL43zg==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -13199,10 +13210,10 @@ "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.14.0", + "enhanced-resolve": "^5.14.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -13398,9 +13409,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", "dev": true, "engines": { "node": ">= 10" @@ -13581,9 +13592,9 @@ "dev": true }, "node_modules/winston": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz", - "integrity": "sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.9.0.tgz", + "integrity": "sha512-jW51iW/X95BCW6MMtZWr2jKQBP4hV5bIDq9QrIjfDk6Q9QuxvTKEAlpUNAzP+HYHFFCeENhph16s0zEunu4uuQ==", "dependencies": { "@colors/colors": "1.5.0", "@dabh/diagnostics": "^2.0.2", diff --git a/package.json b/package.json index d9ac8cd2..6ab9ccb1 100644 --- a/package.json +++ b/package.json @@ -53,14 +53,14 @@ "react": "^18.2.0", "react-beautiful-dnd": "^13.1.1", "react-dom": "^18.2.0", - "react-redux": "^8.0.5", + "react-redux": "^8.0.7", "react-router-dom": "^6.11.2", "reflect-metadata": "^0.1.13", - "socket.io": "^4.6.1", - "socket.io-client": "^4.6.1", + "socket.io": "^4.6.2", + "socket.io-client": "^4.6.2", "timeago.js": "^4.0.2", "typeorm": "^0.3.16", - "winston": "^3.8.2" + "winston": "^3.9.0" }, "devDependencies": { "@electron-forge/cli": "^6.1.1", @@ -71,17 +71,17 @@ "@electron-forge/plugin-webpack": "^6.1.1", "@electron-forge/publisher-github": "^6.1.1", "@types/formidable": "^2.0.6", - "@types/node": "^18.16.14", + "@types/node": "^18.16.16", "@types/node-static": "^0.7.7", - "@types/react": "^18.2.6", + "@types/react": "^18.2.8", "@types/react-dom": "^18.2.4", - "@typescript-eslint/eslint-plugin": "^5.59.7", - "@typescript-eslint/parser": "^5.59.7", + "@typescript-eslint/eslint-plugin": "^5.59.8", + "@typescript-eslint/parser": "^5.59.8", "@vercel/webpack-asset-relocator-loader": "^1.7.3", "autoprefixer": "^10.4.14", - "css-loader": "^6.7.4", - "electron": "^24.3.1", - "eslint": "^8.41.0", + "css-loader": "^6.8.1", + "electron": "^24.4.1", + "eslint": "^8.42.0", "eslint-config-google": "^0.14.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", @@ -92,12 +92,12 @@ "eslint-plugin-unused-imports": "^2.0.0", "fork-ts-checker-webpack-plugin": "^7.3.0", "node-loader": "^2.0.0", - "postcss": "^8.4.23", + "postcss": "^8.4.24", "postcss-import": "^15.1.0", - "postcss-loader": "^7.3.0", + "postcss-loader": "^7.3.2", "prettier": "^2.8.8", "style-loader": "^3.3.3", - "ts-loader": "^9.4.2", + "ts-loader": "^9.4.3", "ts-node": "^10.9.1", "typescript": "^4.9.5" } From 7a300979f76ab0f04f58c9d360ca1e0205c4285b Mon Sep 17 00:00:00 2001 From: James Bithell Date: Mon, 5 Jun 2023 17:27:02 +0100 Subject: [PATCH 04/42] Add database structure --- .github/pull_request_template.md | 1 + docs/docs/user-guide/admin/presets/macro.md | 2 ++ docs/tsconfig.json | 1 + src/database/dataSource.ts | 4 ++++ .../migration/1685981931584-ScheduledPresets.ts | 16 ++++++++++++++++ .../migration/1685982219806-HTTPTriggers.ts | 16 ++++++++++++++++ src/database/model/Preset.ts | 14 ++++++++++++++ src/database/repository/preset.ts | 8 ++++++++ 8 files changed, 62 insertions(+) create mode 100644 src/database/migration/1685981931584-ScheduledPresets.ts create mode 100644 src/database/migration/1685982219806-HTTPTriggers.ts diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 72d023c4..5ee1c031 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -48,5 +48,6 @@ Please describe the changes - [ ] Macros are triggered successfully - [ ] Macros can trigger other macros +- [ ] Scheduled macros are triggered successfully diff --git a/docs/docs/user-guide/admin/presets/macro.md b/docs/docs/user-guide/admin/presets/macro.md index 3a90e42a..ba119ea6 100644 --- a/docs/docs/user-guide/admin/presets/macro.md +++ b/docs/docs/user-guide/admin/presets/macro.md @@ -10,3 +10,5 @@ These can be used to trigger presets in multiple folders (such as lighting and s Macro presets can also be used to open certain pages, including the custom [Keypad](../../control/keypad) and [Channel Check](../../control/chan-check) pages for sACN. ![Macro editing](@site/static/img/tutorial/admin/admin-preset-macro.png) + +Macros themselves can be triggered by other macros, allowing you to create complex sequences of presets. They can also be triggered by time events, allowing you to schedule macros to run at certain times (for example to turn off a system at night time). \ No newline at end of file diff --git a/docs/tsconfig.json b/docs/tsconfig.json index 3d092387..7ce63831 100644 --- a/docs/tsconfig.json +++ b/docs/tsconfig.json @@ -2,6 +2,7 @@ // This file is not used in compilation. It is here just for a nice editor experience. "extends": "@tsconfig/docusaurus/tsconfig.json", "compilerOptions": { + "jsx": "react", "baseUrl": "." } } diff --git a/src/database/dataSource.ts b/src/database/dataSource.ts index c39b142e..41371b22 100644 --- a/src/database/dataSource.ts +++ b/src/database/dataSource.ts @@ -32,6 +32,8 @@ import { Logo1656867549439 } from './migration/1656867549439-Logo' import { Fullscreen1657356807729 } from './migration/1657356807729-Fullscreen' import { RemotePassword1668243876000 } from './migration/1668243876000-RemotePassword' import { AdminPin1668252943000 } from './migration/1668252943000-AdminPin' +import { ScheduledPresets1685981931584 } from './migration/1685981931584-ScheduledPresets' +import { HTTPTriggers1685982219806 } from './migration/1685982219806-HTTPTriggers' const dataSource = new DataSource({ type: 'better-sqlite3', @@ -62,6 +64,8 @@ const dataSource = new DataSource({ Fullscreen1657356807729, RemotePassword1668243876000, AdminPin1668252943000, + ScheduledPresets1685981931584, + HTTPTriggers1685982219806, ], subscribers: [], logger: new MyCustomLogger(), diff --git a/src/database/migration/1685981931584-ScheduledPresets.ts b/src/database/migration/1685981931584-ScheduledPresets.ts new file mode 100644 index 00000000..111024b8 --- /dev/null +++ b/src/database/migration/1685981931584-ScheduledPresets.ts @@ -0,0 +1,16 @@ +import { MigrationInterface, QueryRunner } from 'typeorm' + +export class ScheduledPresets1685981931584 implements MigrationInterface { + name = 'ScheduledPresets1685981931584' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE presets + ADD "timeClockTriggers" text` + ) + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(``) + } +} diff --git a/src/database/migration/1685982219806-HTTPTriggers.ts b/src/database/migration/1685982219806-HTTPTriggers.ts new file mode 100644 index 00000000..9bfb6877 --- /dev/null +++ b/src/database/migration/1685982219806-HTTPTriggers.ts @@ -0,0 +1,16 @@ +import { MigrationInterface, QueryRunner } from 'typeorm' + +export class HTTPTriggers1685982219806 implements MigrationInterface { + name = 'HTTPTriggers1685982219806' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE presets + ADD "httpTriggerEnabled" boolean NOT NULL DEFAULT (0)` + ) + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(``) + } +} diff --git a/src/database/model/Preset.ts b/src/database/model/Preset.ts index cada4b2c..0f3e10f6 100644 --- a/src/database/model/Preset.ts +++ b/src/database/model/Preset.ts @@ -54,6 +54,20 @@ export class Preset { [key: string]: any } + @Column('simple-json', { nullable: true }) + timeClockTriggers: [ + { + time: string + enabled: boolean + timeout: number + } + ] + + @Column('boolean', { + default: false, + }) + httpTriggerEnabled: boolean + @Column('integer', { default: 1 }) sort: number diff --git a/src/database/repository/preset.ts b/src/database/repository/preset.ts index 0d5154c7..e6a64d71 100644 --- a/src/database/repository/preset.ts +++ b/src/database/repository/preset.ts @@ -12,6 +12,8 @@ export interface DatabasePreset { universe?: string | null fadeTime?: number data?: string | null + timeClockTriggers?: string | null + httpTriggerEnabled: boolean folderId?: string // An unfortunate feature of the mantine select is that it requires a string instead of a number :( color?: string } @@ -42,6 +44,8 @@ export const PresetRepository = dataSource.getRepository(Preset).extend({ universe: item.universe, fadeTime: item.fadeTime !== null ? item.fadeTime : 0, data: item.data !== null ? JSON.stringify(item.data) : null, + timeClockTriggers: item.timeClockTriggers !== null ? JSON.stringify(item.timeClockTriggers) : null, + httpTriggerEnabled: item.httpTriggerEnabled, folderId: item.folder !== null ? item.folder.id.toString() : null, color: item.color !== null ? item.color : '#2C2E33', } @@ -67,6 +71,10 @@ export const PresetRepository = dataSource.getRepository(Preset).extend({ universe: preset.universe !== null ? parseInt(preset.universe) : null, folder: preset.folderId !== null ? parseInt(preset.folderId) : null, data: preset.data !== null && preset.data.length > 0 ? parseJSON(preset.data) : null, + timeClockTriggers: + preset.timeClockTriggers !== null && preset.timeClockTriggers.length > 0 + ? parseJSON(preset.timeClockTriggers) + : null, } }) await this.upsert(presetsToInsert, ['id']) From ec409dcf4191e4cd08f46ccfa12a6041e97c1ebf Mon Sep 17 00:00:00 2001 From: James Bithell Date: Mon, 5 Jun 2023 19:56:48 +0100 Subject: [PATCH 05/42] Add edit page --- .github/pull_request_template.md | 2 + .../Controls/Presets/EditModal/Macro.tsx | 1 + .../Presets/EditModal/TimeClockTriggers.tsx | 74 +++++++++++++++++++ src/app/Pages/Admin/Presets.tsx | 30 +++++--- src/database/model/Preset.ts | 10 +-- 5 files changed, 100 insertions(+), 17 deletions(-) create mode 100644 src/app/Components/Admin/Controls/Presets/EditModal/TimeClockTriggers.tsx diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 5ee1c031..cf3b04fd 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -26,6 +26,7 @@ Please describe the changes - [ ] Presets/Faders/Folders can be enabled, and they are shown in the control panel - [ ] Preset/Folders colors can be changed, and this is shown in the control panel - [ ] Preset/Faders/Folders sort order is maintained +- [ ] Presets can be triggered by HTTP requests ### Preset Types @@ -48,6 +49,7 @@ Please describe the changes - [ ] Macros are triggered successfully - [ ] Macros can trigger other macros +- [ ] Lock macro functions - [ ] Scheduled macros are triggered successfully diff --git a/src/app/Components/Admin/Controls/Presets/EditModal/Macro.tsx b/src/app/Components/Admin/Controls/Presets/EditModal/Macro.tsx index 9f517a36..2f67487a 100644 --- a/src/app/Components/Admin/Controls/Presets/EditModal/Macro.tsx +++ b/src/app/Components/Admin/Controls/Presets/EditModal/Macro.tsx @@ -55,6 +55,7 @@ export const MacroPresetEditModal = (props: InputProps) => { data={[ { value: 'preset', label: 'Trigger Preset' }, { value: 'link', label: 'Open a Page' }, + { value: 'link', label: 'Lock the what do we say here??' }, ]} /> {form.values.steps[index].type === 'preset' ? ( diff --git a/src/app/Components/Admin/Controls/Presets/EditModal/TimeClockTriggers.tsx b/src/app/Components/Admin/Controls/Presets/EditModal/TimeClockTriggers.tsx new file mode 100644 index 00000000..10ed019c --- /dev/null +++ b/src/app/Components/Admin/Controls/Presets/EditModal/TimeClockTriggers.tsx @@ -0,0 +1,74 @@ +import React, { useEffect } from 'react' +import { Group, ActionIcon, Button, Select } from '@mantine/core' +import { useForm } from '@mantine/form' +import { FaTrash } from '@react-icons/all-files/fa/FaTrash' +import { randomId } from '@mantine/hooks' +import { InputProps } from '../../../../InputProps' +interface Trigger { + time: string + enabled: boolean + timeout: number + countdownWarning: number + key: string +} +interface FormValues { + triggers: Array +} + +export const TimeClockTriggersEditor = (props: InputProps) => { + const form = useForm({ + initialValues: { + triggers: [], + }, + }) + useEffect(() => { + if (props.value !== null) { + const valueObject = JSON.parse(props.value) || {} + form.setValues({ + triggers: valueObject.map((item: Trigger) => ({ + time: item.time, + enabled: item.enabled, + timeout: item.timeout, + countdownWarning: item.countdownWarning, + key: item.key, + })), + }) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [props.value]) + return ( + <> + {form.values.triggers.map((item, index) => ( + + ) : null} form.removeListItem('steps', index)}> From 9c1d6c6e2b391118381db13ec7c804851ac72e9f Mon Sep 17 00:00:00 2001 From: James Bithell Date: Sat, 10 Jun 2023 11:57:24 +0100 Subject: [PATCH 07/42] Allow presets to be recalled over http --- docs/docs/user-guide/admin/presets/intro.md | 7 +++-- docs/docs/user-guide/admin/presets/macro.md | 4 ++- docs/docs/user-guide/admin/presets/sacn.md | 2 ++ src/webServer/index.ts | 30 +++++++++++++++++++++ 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/docs/docs/user-guide/admin/presets/intro.md b/docs/docs/user-guide/admin/presets/intro.md index dff9a9fa..62d790f6 100644 --- a/docs/docs/user-guide/admin/presets/intro.md +++ b/docs/docs/user-guide/admin/presets/intro.md @@ -16,11 +16,14 @@ All Presets have the following configuration options: - Name - this is shown to the user on the control panel - [Folder](../folders) - where the preset will be shown on the control panel + +The following options are accessed using the edit icon for that preset: + - Button Colour - defaults to dark grey -- Fade time - this only applies to sACN presets. The default is 0 seconds. - Visibility - whether to show the preset on the control panel, or whether to keep it hidden. It's useful to keep it hidden if you want to use it as part of a macro. +- HTTP Enabled - whether to allow the preset to be recalled over HTTP. This is useful for triggering presets from other software, such as QLab. All presets can be recalled via HTTP, including macros - although macro actions to open pages will be skipped. -The remaining configuration options depend on the preset type. To edit the preset options, click the edit icon for that preset. +The remaining configuration options depend on the preset type. ## Creating presets diff --git a/docs/docs/user-guide/admin/presets/macro.md b/docs/docs/user-guide/admin/presets/macro.md index ba119ea6..7c023a55 100644 --- a/docs/docs/user-guide/admin/presets/macro.md +++ b/docs/docs/user-guide/admin/presets/macro.md @@ -7,7 +7,9 @@ Macros are special presets that can be used to trigger more than one preset at o These can be used to trigger presets in multiple folders (such as lighting and sound) - such as turning everything off. They can also be used to show one preset in multiple folders. -Macro presets can also be used to open certain pages, including the custom [Keypad](../../control/keypad) and [Channel Check](../../control/chan-check) pages for sACN. +Macro presets can also be used to open certain pages, including the custom [Keypad](../../control/keypad) and [Channel Check](../../control/chan-check) pages for sACN. This function of opening pages does not work if the macro is triggered via a HTTP call. + +Macro presets can also be used to change the configuration of the system - such as locking/unlocking the control panel. This is useful for locking/unlocking the control panel over HTTP. Unlocking the control panel with a macro can only be performed over HTTP, as the control panel will be locked when the macro would be triggered. ![Macro editing](@site/static/img/tutorial/admin/admin-preset-macro.png) diff --git a/docs/docs/user-guide/admin/presets/sacn.md b/docs/docs/user-guide/admin/presets/sacn.md index e417aa9a..323480e4 100644 --- a/docs/docs/user-guide/admin/presets/sacn.md +++ b/docs/docs/user-guide/admin/presets/sacn.md @@ -9,6 +9,8 @@ sACN (e1.31) presets are usually used for lighting control. sACN is based on uni The 512 channels (parameters) in a universe are displayed in banks for ease of viewing, you can move between banks using the plus and minus buttons. If a channel is blank then when the preset is recalled the value of that channel will not be changed from its current value (which will have been set by another preset, or be 0 if it has not been set by any presets). Channel values can be between 0 and 255. +The fade time option defaults to 0 seconds. This means that when the preset is recalled, the values will be sent immediately. If you set a fade time, then the values will be sent over that time period. This is useful for slowly fading lights up and down. + ## Shortcuts Shortcuts allow you to manipulate the entire universe in bulk. This is useful if you are editing a preset captured, or you want to set all the values you've left blank to a certain value (or want to blank all 0 channels). This is especially useful for editing presets captured from a lighting console using sampling mode. diff --git a/src/webServer/index.ts b/src/webServer/index.ts index 213f94d8..447e59fd 100644 --- a/src/webServer/index.ts +++ b/src/webServer/index.ts @@ -13,6 +13,8 @@ import { getAvailablePort } from './availablePorts' import { createDatabaseObject, Database, sendDatabaseObject } from './../api/database' import { ConfigRepository } from './../database/repository/config' import { createAndSendImagesObject } from './../api/images' +import { PresetRepository } from './../database/repository/preset' +import { Preset } from './../database/model/Preset' /** * The webserver is responsible for serving requests from other devices on the network that might want to connect. * This includes devices such as iPads who want to use the remote interface, a web browser which wants to @@ -151,6 +153,34 @@ export class WebServer { }) } }) + } else if (req.url.startsWith('/trigger')) { + if (req.url.startsWith('/trigger/preset/')) { + // This allows external clients to make HTTP requests to trigger presets + const presetId = parseInt(req.url.split('/').pop()) + if (isNaN(presetId)) { + res.writeHead(400, { 'Content-Type': 'text/html' }) + res.write('Preset ID not found') + res.end() + } else { + PresetRepository.findOneOrFail({ where: { id: presetId } }).then((value: Preset) => { + if (value.httpTriggerEnabled) { + routeRequest('/presets/recall/' + presetId, 'GET', {}).then(() => { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.write('Preset triggered') + res.end() + }) + .catch(error => { + res.writeHead(500, { 'Content-Type': 'text/html' }) + res.write("Error - preset could not be recalled") + res.end() + }) + } else { + res.writeHead(403, { 'Content-Type': 'text/html' }) + res.write('Preset not enabled for trigger via HTTP') + res.end() + } + }) + } } else { // Serve the react app WebServer.staticFileServer.serve(req, res, (e: Error) => { From 22ff9d0de38aca9dcb579cb38eb222a4b49a558a Mon Sep 17 00:00:00 2001 From: James Bithell Date: Sat, 10 Jun 2023 11:59:53 +0100 Subject: [PATCH 08/42] Bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6ab9ccb1..28b0586d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "paradisepi", - "version": "2.2.3", + "version": "2.3.0", "description": "Raspberry Pi based sACN lighting/OSC sound facility control panel", "main": ".webpack/main", "scripts": { From 03b325c4ee7803a7b0fba229d05cc2c36f06979e Mon Sep 17 00:00:00 2001 From: James Bithell Date: Sat, 10 Jun 2023 12:17:05 +0100 Subject: [PATCH 09/42] Improve locked message, and fix logic error in web server --- src/app/Components/Locked.tsx | 34 ++++++++++++++++++++++++--- src/webServer/index.ts | 44 ++++++++++++++++++++++------------- 2 files changed, 59 insertions(+), 19 deletions(-) diff --git a/src/app/Components/Locked.tsx b/src/app/Components/Locked.tsx index 80ed0b1b..3b56d6aa 100644 --- a/src/app/Components/Locked.tsx +++ b/src/app/Components/Locked.tsx @@ -1,8 +1,36 @@ import { Stack, Title, Collapse, Text } from '@mantine/core' -import React, { useEffect, useState } from 'react' -import { useViewportSize } from '@mantine/hooks' +import React, { useCallback, useEffect, useState } from 'react' +import { useEventListener, useViewportSize } from '@mantine/hooks' import { FaLock } from '@react-icons/all-files/fa/FaLock' import { useAppSelector } from './../apis/redux/mainStore' + +const LockedMessage = () => { + const [count, setCount] = useState(0) + const { width } = useViewportSize() + const increment = useCallback(() => setCount(c => c + 1), []) + const ref = useEventListener('click', increment) + const ipAddress = useAppSelector(state => (state.database ? state.database.about.ipAddress : null)) + const port = useAppSelector(state => (state.database ? state.database.about.port : false)) + if (count >= 5) { + return ( + + Device is locked. To unlock it access the setup and administration area, by ensuring you are on the + same network as this device and then navigating to http:// + {ipAddress + ':' + port ?? ''} with a web browser + + ) + } else { + return ( + + Device is locked, unlock it using the setup and administration area on another device + + ) + } +} const LockedView = () => { /** * When locked, show a bit more of a message when clicked. The idea is to provide a bit more feedback @@ -34,7 +62,7 @@ const LockedView = () => { - Device is locked, unlock it using the administrator interface + ) diff --git a/src/webServer/index.ts b/src/webServer/index.ts index 447e59fd..4dc63505 100644 --- a/src/webServer/index.ts +++ b/src/webServer/index.ts @@ -162,25 +162,37 @@ export class WebServer { res.write('Preset ID not found') res.end() } else { - PresetRepository.findOneOrFail({ where: { id: presetId } }).then((value: Preset) => { - if (value.httpTriggerEnabled) { - routeRequest('/presets/recall/' + presetId, 'GET', {}).then(() => { - res.writeHead(200, { 'Content-Type': 'text/html' }) - res.write('Preset triggered') + PresetRepository.findOneOrFail({ where: { id: presetId } }) + .then((value: Preset) => { + if (value.httpTriggerEnabled) { + routeRequest('/presets/recall/' + presetId, 'GET', {}) + .then(() => { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.write('Preset triggered') + res.end() + }) + .catch(() => { + res.writeHead(500, { 'Content-Type': 'text/html' }) + res.write('Error - preset could not be recalled') + res.end() + }) + } else { + res.writeHead(403, { 'Content-Type': 'text/html' }) + res.write('Preset not enabled for trigger via HTTP') res.end() - }) - .catch(error => { - res.writeHead(500, { 'Content-Type': 'text/html' }) - res.write("Error - preset could not be recalled") - res.end() - }) - } else { - res.writeHead(403, { 'Content-Type': 'text/html' }) - res.write('Preset not enabled for trigger via HTTP') + } + }) + .catch(() => { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.write('Error - preset not found') res.end() - } - }) + }) } + } else { + res.writeHead(404, { 'Content-Type': 'text/html' }) + res.write('Not found') + res.end() + } } else { // Serve the react app WebServer.staticFileServer.serve(req, res, (e: Error) => { From 3cfca8ec986bb018a25f72d7f3247983c6092324 Mon Sep 17 00:00:00 2001 From: James Bithell Date: Sat, 10 Jun 2023 16:17:34 +0100 Subject: [PATCH 10/42] Basic work on time clock triggers --- .../Presets/EditModal/TimeClockTriggers.tsx | 74 +++++++++++++------ src/app/Pages/Admin/Presets.tsx | 44 +++++++---- 2 files changed, 83 insertions(+), 35 deletions(-) diff --git a/src/app/Components/Admin/Controls/Presets/EditModal/TimeClockTriggers.tsx b/src/app/Components/Admin/Controls/Presets/EditModal/TimeClockTriggers.tsx index 10ed019c..130148fd 100644 --- a/src/app/Components/Admin/Controls/Presets/EditModal/TimeClockTriggers.tsx +++ b/src/app/Components/Admin/Controls/Presets/EditModal/TimeClockTriggers.tsx @@ -1,9 +1,10 @@ import React, { useEffect } from 'react' -import { Group, ActionIcon, Button, Select } from '@mantine/core' +import { Group, ActionIcon, Button, Text, Checkbox, NumberInput } from '@mantine/core' import { useForm } from '@mantine/form' import { FaTrash } from '@react-icons/all-files/fa/FaTrash' import { randomId } from '@mantine/hooks' import { InputProps } from '../../../../InputProps' + interface Trigger { time: string enabled: boolean @@ -27,9 +28,6 @@ export const TimeClockTriggersEditor = (props: InputProps) => { form.setValues({ triggers: valueObject.map((item: Trigger) => ({ time: item.time, - enabled: item.enabled, - timeout: item.timeout, - countdownWarning: item.countdownWarning, key: item.key, })), }) @@ -38,23 +36,11 @@ export const TimeClockTriggersEditor = (props: InputProps) => { }, [props.value]) return ( <> - {form.values.triggers.map((item, index) => ( - - ({ value: value, icon: value, diff --git a/src/app/Pages/ControlPanel/Preset.tsx b/src/app/Pages/ControlPanel/Preset.tsx index 5c8b9e0e..a34a276c 100644 --- a/src/app/Pages/ControlPanel/Preset.tsx +++ b/src/app/Pages/ControlPanel/Preset.tsx @@ -7,7 +7,7 @@ import { DangerouslySetHTML } from './../../Components/DangerouslySetHTML' import { pickTextColorBasedOnBgColor } from './../../apis/utilities/pickOppositeTextColor' import { useAppSelector } from './../../apis/redux/mainStore' import { ApiCall } from './../../apis/wrapper' -import { FolderIconReact } from './../../Components/ControlPanel/FolderIcon' +import { ButtonIconReact } from '../../Components/ControlPanel/ButtonIcon' import { PresetFaders } from './../../Components/ControlPanel/PresetFaders' const PresetButton = ({ text, presetId, color }: { text: string; presetId: number; color: string }) => { const navigate = useNavigate() @@ -53,7 +53,7 @@ const FolderButton = ({ size="xl" mx="xs" my="xs" - leftIcon={backButton ? : } + leftIcon={backButton ? : } > {text} From 7f0834cc83d880cf28114f79ffa766f9fee149d5 Mon Sep 17 00:00:00 2001 From: James Bithell Date: Thu, 15 Jun 2023 19:07:37 +0100 Subject: [PATCH 20/42] Add preset icons, and make icons searchable --- .../Components/ControlPanel/ButtonIcon.tsx | 12 +++++++---- src/app/Pages/Admin/Folders.tsx | 2 ++ src/app/Pages/Admin/Presets.tsx | 20 +++++++++++++++++++ src/app/Pages/ControlPanel/Preset.tsx | 14 ++++++++++++- src/database/dataSource.ts | 2 ++ .../migration/1686849999231-PresetIcons.ts | 16 +++++++++++++++ src/database/model/Preset.ts | 8 ++++++++ src/database/repository/folder.ts | 3 +++ src/database/repository/preset.ts | 2 ++ 9 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 src/database/migration/1686849999231-PresetIcons.ts diff --git a/src/app/Components/ControlPanel/ButtonIcon.tsx b/src/app/Components/ControlPanel/ButtonIcon.tsx index efcbbad2..ad3334d6 100644 --- a/src/app/Components/ControlPanel/ButtonIcon.tsx +++ b/src/app/Components/ControlPanel/ButtonIcon.tsx @@ -68,11 +68,15 @@ export const ButtonIconSelectItem = forwardRef( ({ icon, label, ...others }: ItemProps, ref) => (
- - - + {icon ? ( + + + + ) : ( + '' + )}
- {label} + {label !== '' ? label : 'None'}
diff --git a/src/app/Pages/Admin/Folders.tsx b/src/app/Pages/Admin/Folders.tsx index 4b6c0b43..923dd675 100644 --- a/src/app/Pages/Admin/Folders.tsx +++ b/src/app/Pages/Admin/Folders.tsx @@ -134,6 +134,8 @@ export const FoldersConfigurationPage = () => { placeholder="Folder Icon" {...form.getInputProps(`folders.${index}.icon`)} defaultValue="FaFolder" + searchable={true} + nothingFound="No icons found" itemComponent={ButtonIconSelectItem} data={Object.entries(AvailableIcons).map(([value, name]) => ({ value: value, diff --git a/src/app/Pages/Admin/Presets.tsx b/src/app/Pages/Admin/Presets.tsx index e0e28ca8..30a5fd2b 100644 --- a/src/app/Pages/Admin/Presets.tsx +++ b/src/app/Pages/Admin/Presets.tsx @@ -43,6 +43,7 @@ import { useModals } from '@mantine/modals' import { FaCheck } from '@react-icons/all-files/fa/FaCheck' import { showNotification } from '@mantine/notifications' import { isValidJson } from './../../Components/Admin/Controls/Presets/EditModal/isValidJson' +import { AvailableIcons, ButtonIconSelectItem } from './../../Components/ControlPanel/ButtonIcon' interface FormValues { presets: Array @@ -159,6 +160,23 @@ export const PresetsConfigurationPage = () => { title="Edit Preset" overflow="inside" > + + + + + + + form.insertListItem('triggers', form.values.triggers[index])} + > + + + + + form.removeListItem('triggers', index)} + > + + + + + )} + + )) + + return ( + +
+ + {timeClockTriggers !== false && presets !== false ? ( +
+ + Scheduled Presets + {saveByUserNeeded ? ( + + ) : null} + + + + + + + + + + + {fields} +
+ + TimePresetEnabled
+
+ ) : ( + 'Loading' + )} +
+
+ ) +} diff --git a/src/app/router.tsx b/src/app/router.tsx index 9c66631a..fca130bb 100644 --- a/src/app/router.tsx +++ b/src/app/router.tsx @@ -16,6 +16,7 @@ import { ChannelCheckPage } from './Pages/ControlPanel/E131/ChannelCheck' import { KeypadPage } from './Pages/ControlPanel/E131/Keypad' import { useViewportSize } from '@mantine/hooks' import { AdminPin } from './Components/Admin/AdminPin' +import { TimeClockTriggersConfigurationPage } from './Pages/Admin/TimeClockTriggers' const MainNav = ({ navigation }: { navigation: ReactElement }) => { const { height } = useViewportSize() @@ -61,6 +62,7 @@ const HashRouter = createHashRouter( } /> } /> } /> + } /> } /> diff --git a/src/database/dataSource.ts b/src/database/dataSource.ts index 60004604..334ad815 100644 --- a/src/database/dataSource.ts +++ b/src/database/dataSource.ts @@ -32,6 +32,7 @@ import { Logo1656867549439 } from './migration/1656867549439-Logo' import { Fullscreen1657356807729 } from './migration/1657356807729-Fullscreen' import { RemotePassword1668243876000 } from './migration/1668243876000-RemotePassword' import { AdminPin1668252943000 } from './migration/1668252943000-AdminPin' +import { TimeClockTriggers1685981931584 } from './migration/1685981931584-TimeClockTriggers' import { HTTPTriggers1685982219806 } from './migration/1685982219806-HTTPTriggers' import { PresetIcons1686849999231 } from './migration/1686849999231-PresetIcons' @@ -64,6 +65,7 @@ const dataSource = new DataSource({ Fullscreen1657356807729, RemotePassword1668243876000, AdminPin1668252943000, + TimeClockTriggers1685981931584, HTTPTriggers1685982219806, PresetIcons1686849999231, ], diff --git a/src/database/migration/1685981931584-TimeClockTriggers.ts b/src/database/migration/1685981931584-TimeClockTriggers.ts new file mode 100644 index 00000000..3073b03d --- /dev/null +++ b/src/database/migration/1685981931584-TimeClockTriggers.ts @@ -0,0 +1,16 @@ +import { MigrationInterface, QueryRunner } from 'typeorm' + +export class TimeClockTriggers1685981931584 implements MigrationInterface { + name = 'TimeClockTriggers1685981931584' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE presets + ADD "timeClockTriggers" text` + ) + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(``) + } +} diff --git a/src/database/model/Preset.ts b/src/database/model/Preset.ts index 6b9a0d9a..3b56ec7d 100644 --- a/src/database/model/Preset.ts +++ b/src/database/model/Preset.ts @@ -62,6 +62,11 @@ export class Preset { [key: string]: any } + @Column('simple-json', { nullable: true }) + timeClockTriggers: { + [key: string]: any + } + @Column('boolean', { default: false, }) diff --git a/src/database/repository/preset.ts b/src/database/repository/preset.ts index 0bd4b33d..53729db7 100644 --- a/src/database/repository/preset.ts +++ b/src/database/repository/preset.ts @@ -13,10 +13,19 @@ export interface DatabasePreset { universe?: string | null fadeTime?: number data?: string | null + timeClockTriggers?: string | null httpTriggerEnabled: boolean folderId?: string // An unfortunate feature of the mantine select is that it requires a string instead of a number :( color?: string } +export interface TimeClockTrigger { + presetId: number + time: string + enabled: boolean + timeout: number + countdownWarning: number + countdownWarningText: string +} export const PresetRepository = dataSource.getRepository(Preset).extend({ //get one preset @@ -45,6 +54,7 @@ export const PresetRepository = dataSource.getRepository(Preset).extend({ universe: item.universe, fadeTime: item.fadeTime !== null ? item.fadeTime : 0, data: item.data !== null ? JSON.stringify(item.data) : null, + timeClockTriggers: item.timeClockTriggers !== null ? JSON.stringify(item.timeClockTriggers) : null, httpTriggerEnabled: item.httpTriggerEnabled, folderId: item.folder !== null ? item.folder.id.toString() : null, color: item.color !== null ? item.color : '#2C2E33', @@ -71,6 +81,10 @@ export const PresetRepository = dataSource.getRepository(Preset).extend({ universe: preset.universe !== null ? parseInt(preset.universe) : null, folder: preset.folderId !== null ? parseInt(preset.folderId) : null, data: preset.data !== null && preset.data.length > 0 ? parseJSON(preset.data) : null, + timeClockTriggers: + preset.timeClockTriggers !== null && preset.timeClockTriggers.length > 0 + ? parseJSON(preset.timeClockTriggers) + : null, } }) await this.upsert(presetsToInsert, ['id']) From b779322ae3b9183a46dc2b1dd61c784dd5cfd56d Mon Sep 17 00:00:00 2001 From: James Bithell Date: Thu, 15 Jun 2023 19:47:42 +0100 Subject: [PATCH 25/42] Bump --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 573b0d03..57f26007 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "paradisepi", - "version": "2.3.0", + "version": "2.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "paradisepi", - "version": "2.3.0", + "version": "2.4.0", "license": "GPL-3.0-only", "dependencies": { "@emotion/react": "^11.11.0", diff --git a/package.json b/package.json index 28b0586d..c4446c0b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "paradisepi", - "version": "2.3.0", + "version": "2.4.0", "description": "Raspberry Pi based sACN lighting/OSC sound facility control panel", "main": ".webpack/main", "scripts": { From 20448309833f426b19c51f6bd377c9b8b3112345 Mon Sep 17 00:00:00 2001 From: James Bithell Date: Thu, 15 Jun 2023 19:59:16 +0100 Subject: [PATCH 26/42] Fix imports --- .../Components/ControlPanel/ButtonIcon.tsx | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/app/Components/ControlPanel/ButtonIcon.tsx b/src/app/Components/ControlPanel/ButtonIcon.tsx index db8bac9d..3b9c37cb 100644 --- a/src/app/Components/ControlPanel/ButtonIcon.tsx +++ b/src/app/Components/ControlPanel/ButtonIcon.tsx @@ -1,25 +1,25 @@ -import React, { forwardRef } from 'react' +import { Avatar, Group, Text } from '@mantine/core' import { IconType } from '@react-icons/all-files/lib' -import { Group, SelectItem as MantineSelectItem, Avatar, Text } from '@mantine/core' +import React, { forwardRef } from 'react' -import { FaVideo } from '@react-icons/all-files/fa/FaVideo' +import { FaArrowDown } from '@react-icons/all-files/fa/FaArrowDown' +import { FaArrowLeft } from '@react-icons/all-files/fa/FaArrowLeft' +import { FaArrowRight } from '@react-icons/all-files/fa/FaArrowRight' +import { FaArrowUp } from '@react-icons/all-files/fa/FaArrowUp' +import { FaFolder } from '@react-icons/all-files/fa/FaFolder' import { FaLightbulb } from '@react-icons/all-files/fa/FaLightbulb' +import { FaMicrophone } from '@react-icons/all-files/fa/FaMicrophone' +import { FaMicrophoneAlt } from '@react-icons/all-files/fa/FaMicrophoneAlt' +import { FaPhoneVolume } from '@react-icons/all-files/fa/FaPhoneVolume' +import { FaPowerOff } from '@react-icons/all-files/fa/FaPowerOff' import { FaRegLightbulb } from '@react-icons/all-files/fa/FaRegLightbulb' +import { FaToggleOff } from '@react-icons/all-files/fa/FaToggleOff' +import { FaToggleOn } from '@react-icons/all-files/fa/FaToggleOn' +import { FaVideo } from '@react-icons/all-files/fa/FaVideo' import { FaVolumeDown } from '@react-icons/all-files/fa/FaVolumeDown' import { FaVolumeMute } from '@react-icons/all-files/fa/FaVolumeMute' import { FaVolumeOff } from '@react-icons/all-files/fa/FaVolumeOff' import { FaVolumeUp } from '@react-icons/all-files/fa/FaVolumeUp' -import { FaPhoneVolume } from '@react-icons/all-files/fa/FaPhoneVolume' -import { FaMicrophone } from '@react-icons/all-files/fa/FaMicrophone' -import { FaMicrophoneAlt } from '@react-icons/all-files/fa/FaMicrophoneAlt' -import { FaFolder } from '@react-icons/all-files/fa/FaFolder' -import { FaArrowUp } from '@react-icons/all-files/fa/FaArrowUp' -import { FaArrowDown } from '@react-icons/all-files/fa/FaArrowDown' -import { FaArrowLeft } from '@react-icons/all-files/fa/FaArrowLeft' -import { FaArrowRight } from '@react-icons/all-files/fa/FaArrowRight' -import { FaPowerOff } from '@react-icons/all-files/fa/FaPowerOff' -import { FaToggleOn } from '@react-icons/all-files/fa/FaToggleOn' -import { FaToggleOff } from '@react-icons/all-files/fa/FaToggleOff' export const AvailableIcons = { FaLightbulb: 'Lightbulb', From 95fd6ab7a6a4973ee8ee3cc0d7fdf6976ae1fa4c Mon Sep 17 00:00:00 2001 From: James Bithell Date: Thu, 15 Jun 2023 20:13:15 +0100 Subject: [PATCH 27/42] Add more ui --- src/api/database.ts | 12 +-- src/api/preset/presetRouter.ts | 15 +++- src/app/Pages/Admin/TimeClockTriggers.tsx | 96 +++++++++++------------ src/database/repository/preset.ts | 36 ++++++++- 4 files changed, 100 insertions(+), 59 deletions(-) diff --git a/src/api/database.ts b/src/api/database.ts index acab28ad..7ecb2aac 100644 --- a/src/api/database.ts +++ b/src/api/database.ts @@ -1,11 +1,11 @@ -import { DatabasePreset, PresetRepository } from './../database/repository/preset' -import { DatabaseFolder, FolderRepository } from './../database/repository/folder' +import ip from 'ip' +import { version } from './../../package.json' import { ConfigRepository } from './../database/repository/config' +import { DatabaseFader, FaderRepository } from './../database/repository/fader' +import { DatabaseFolder, FolderRepository } from './../database/repository/folder' +import { DatabasePreset, DatabaseTimeClockTrigger, PresetRepository } from './../database/repository/preset' import { getOperatingSystemName } from './about/operatingSystem/info' -import { version } from './../../package.json' import { broadcast } from './broadcast' -import ip from 'ip' -import { DatabaseFader, FaderRepository } from './../database/repository/fader' export interface Database { // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -46,6 +46,7 @@ export interface Database { } } presets: Array + timeClockTriggers: Array folders: { [key: number]: DatabaseFolder } @@ -95,6 +96,7 @@ export const createDatabaseObject = async (message: string): Promise = }, }, presets: await PresetRepository.getAll(), + timeClockTriggers: await PresetRepository.getAllTimeClockTriggers(), folders: await FolderRepository.getAll(), faders: await FaderRepository.getAll(), } diff --git a/src/api/preset/presetRouter.ts b/src/api/preset/presetRouter.ts index 05d6ff88..a0a13b89 100644 --- a/src/api/preset/presetRouter.ts +++ b/src/api/preset/presetRouter.ts @@ -1,9 +1,9 @@ -import { Preset } from './../../database/model/Preset' -import { DatabasePreset, PresetRepository } from './../../database/repository/preset' -import { createDatabaseObject, Database, sendDatabaseObject } from './../database' import axios from 'axios' import { parseJSON } from '../parseUserJson' +import { Preset } from './../../database/model/Preset' import { ConfigRepository } from './../../database/repository/config' +import { DatabasePreset, PresetRepository } from './../../database/repository/preset' +import { Database, createDatabaseObject, sendDatabaseObject } from './../database' /** * This is a REST router for the preset API. * @param path - The path requested by the original route requestor @@ -73,6 +73,15 @@ export const presetRouter = ( }) } else resolve({}) }) + } else if (method === 'PUT' && path[0] === 'timeClockTriggers') { + return Promise.resolve() + .then(() => { + return createDatabaseObject('updating all presets in bulk') + }) + .then((response: Database) => { + sendDatabaseObject(response) + resolve({}) + }) } else if (method === 'PUT') { return PresetRepository.setAllFromApp(payload as Array) .then(() => { diff --git a/src/app/Pages/Admin/TimeClockTriggers.tsx b/src/app/Pages/Admin/TimeClockTriggers.tsx index e75959f4..ff97e094 100644 --- a/src/app/Pages/Admin/TimeClockTriggers.tsx +++ b/src/app/Pages/Admin/TimeClockTriggers.tsx @@ -19,13 +19,12 @@ import { FaRegClone } from '@react-icons/all-files/fa/FaRegClone' import { FaSave } from '@react-icons/all-files/fa/FaSave' import { FaTrash } from '@react-icons/all-files/fa/FaTrash' import React, { useEffect, useState } from 'react' -import { Draggable } from 'react-beautiful-dnd' -import { TimeClockTrigger } from '../../../database/repository/preset' +import { DatabaseTimeClockTrigger } from '../../../database/repository/preset' import { useAppSelector } from '../../apis/redux/mainStore' import { ApiCall } from '../../apis/wrapper' interface FormValues { - triggers: Array + triggers: Array } export const TimeClockTriggersConfigurationPage = () => { @@ -47,7 +46,7 @@ export const TimeClockTriggersConfigurationPage = () => { // Setup the form const form = useForm({ initialValues: { - triggers: Array(), + triggers: Array(), }, validate: { triggers: { @@ -69,7 +68,7 @@ export const TimeClockTriggersConfigurationPage = () => { // Handle the submit button const handleSubmit = (values: typeof form.values) => { setLoadingOverlayVisible(true) - ApiCall.put('/timeClockTriggers', values.triggers).then(() => { + ApiCall.put('/presets/timeClockTriggers', values.triggers).then(() => { showNotification({ message: 'Your changes have been saved', autoClose: 2000, @@ -80,49 +79,45 @@ export const TimeClockTriggersConfigurationPage = () => { }) } const fields = form.values.triggers.map((_, index) => ( - - {provided => ( - - - - - - + + + + + + form.insertListItem('triggers', form.values.triggers[index])} + > + + + + + form.removeListItem('triggers', index)} + > + + + + )) return ( @@ -145,6 +140,7 @@ export const TimeClockTriggersConfigurationPage = () => { + Time - Time Preset Enabled + + {fields} diff --git a/src/database/repository/preset.ts b/src/database/repository/preset.ts index 53729db7..a709d053 100644 --- a/src/database/repository/preset.ts +++ b/src/database/repository/preset.ts @@ -1,5 +1,5 @@ -import { parseJSON } from './../../api/parseUserJson' import { In, Not } from 'typeorm' +import { parseJSON } from './../../api/parseUserJson' import dataSource from './../dataSource' import { Preset } from './../model/Preset' @@ -18,7 +18,7 @@ export interface DatabasePreset { folderId?: string // An unfortunate feature of the mantine select is that it requires a string instead of a number :( color?: string } -export interface TimeClockTrigger { +export interface DatabaseTimeClockTrigger { presetId: number time: string enabled: boolean @@ -89,4 +89,36 @@ export const PresetRepository = dataSource.getRepository(Preset).extend({ }) await this.upsert(presetsToInsert, ['id']) }, + /** + * Get all time clock triggers + * @returns An array of all time clock triggers + */ + async getAllTimeClockTriggers(): Promise> { + const presets = await this.find({ + select: { + id: true, + timeClockTriggers: true, + }, + order: { + sort: 'ASC', + }, + }) + const returnTriggers: Array = [] + presets.forEach(preset => { + if (preset.timeClockTriggers !== null) { + preset.timeClockTriggers = JSON.parse(preset.timeClockTriggers) + preset.timeClockTriggers.forEach((trigger: DatabaseTimeClockTrigger) => { + returnTriggers.push({ + presetId: preset.id, + time: trigger.time, + enabled: trigger.enabled, + timeout: trigger.timeout !== null ? trigger.timeout : 0, + countdownWarning: trigger.countdownWarning !== null ? trigger.countdownWarning : 0, + countdownWarningText: trigger.countdownWarningText !== null ? trigger.countdownWarningText : '', + }) + }) + } + }) + return returnTriggers + }, }) From 3abcf330f4d552dd9ad7bbbaccaa51d096127e2a Mon Sep 17 00:00:00 2001 From: James Bithell Date: Fri, 16 Jun 2023 16:32:47 +0100 Subject: [PATCH 28/42] Remove webpack cache to fix database error in https://github.com/electron-userland/electron-forge/issues/2412#issuecomment-1013740102 --- webpack.main.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/webpack.main.config.ts b/webpack.main.config.ts index b59a35b1..2d8d5558 100644 --- a/webpack.main.config.ts +++ b/webpack.main.config.ts @@ -15,4 +15,5 @@ export const mainConfig: Configuration = { resolve: { extensions: ['.js', '.ts', '.jsx', '.tsx', '.css', '.json'], }, + cache: false, } From b1c386114e635dcb909b1559b858bed02011459c Mon Sep 17 00:00:00 2001 From: James Bithell Date: Fri, 16 Jun 2023 17:37:20 +0100 Subject: [PATCH 29/42] Radically simplify icon file --- .../Components/ControlPanel/ButtonIcon.tsx | 167 +++++++++++------- src/app/Navigation/AdminNavigation.tsx | 36 ++-- src/app/Navigation/ControlPanelNavigation.tsx | 19 +- src/app/Navigation/NavbarItem.tsx | 11 +- src/app/Navigation/Styles.tsx | 7 +- src/app/Pages/Admin/Folders.tsx | 32 ++-- src/app/Pages/Admin/Presets.tsx | 52 +++--- src/app/Pages/ControlPanel/Preset.tsx | 14 +- 8 files changed, 194 insertions(+), 144 deletions(-) diff --git a/src/app/Components/ControlPanel/ButtonIcon.tsx b/src/app/Components/ControlPanel/ButtonIcon.tsx index 3b9c37cb..b0a30a81 100644 --- a/src/app/Components/ControlPanel/ButtonIcon.tsx +++ b/src/app/Components/ControlPanel/ButtonIcon.tsx @@ -1,5 +1,4 @@ import { Avatar, Group, Text } from '@mantine/core' -import { IconType } from '@react-icons/all-files/lib' import React, { forwardRef } from 'react' import { FaArrowDown } from '@react-icons/all-files/fa/FaArrowDown' @@ -21,68 +20,112 @@ import { FaVolumeMute } from '@react-icons/all-files/fa/FaVolumeMute' import { FaVolumeOff } from '@react-icons/all-files/fa/FaVolumeOff' import { FaVolumeUp } from '@react-icons/all-files/fa/FaVolumeUp' -export const AvailableIcons = { - FaLightbulb: 'Lightbulb', - FaRegLightbulb: 'Lightbulb', - FaVolumeUp: 'Volume Up', - FaVolumeDown: 'Volume Down', - FaVolumeMute: 'Volume Mute', - FaVolumeOff: 'Volume Off', - FaPhoneVolume: 'Phone', - FaMicrophone: 'Microphone', - FaMicrophoneAlt: 'Microphone', - FaVideo: 'Camera', - FaFolder: 'Folder', - FaArrowUp: 'Arrow Up', - FaArrowDown: 'Arrow Down', - FaArrowLeft: 'Arrow Left', - FaArrowRight: 'Arrow Right', - FaPowerOff: 'Power Off', - FaToggleOn: 'Toggle On', - FaToggleOff: 'Toggle Off', -} +const iconDatabase = [ + { + id: 'FaLightbulb', + name: 'Lightbulb', + icon: , + }, + { + id: 'FaRegLightbulb', + name: 'Lightbulb', + icon: , + }, + { + id: 'FaVolumeUp', + name: 'Volume Up', + icon: , + }, + { + id: 'FaVolumeDown', + name: 'Volume Down', + icon: , + }, + { + id: 'FaVolumeMute', + name: 'Volume Mute', + icon: , + }, + { + id: 'FaVolumeOff', + name: 'Volume Off', + icon: , + }, + { + id: 'FaPhoneVolume', + name: 'Phone', + icon: , + }, + { + id: 'FaMicrophone', + name: 'Microphone', + icon: , + }, + { + id: 'FaMicrophoneAlt', + name: 'Microphone', + icon: , + }, + { + id: 'FaVideo', + name: 'Camera', + icon: , + }, + { + id: 'FaFolder', + name: 'Folder', + icon: , + }, + { + id: 'FaArrowUp', + name: 'Arrow Up', + icon: , + }, + { + id: 'FaArrowDown', + name: 'Arrow Down', + icon: , + }, + { + id: 'FaArrowLeft', + name: 'Arrow Left', + icon: , + }, + { + id: 'FaArrowRight', + name: 'Arrow Right', + icon: , + }, + { + id: 'FaPowerOff', + name: 'Power Off', + icon: , + }, + { + id: 'FaToggleOn', + name: 'Toggle On', + icon: , + }, + { + id: 'FaToggleOff', + name: 'Toggle Off', + icon: , + }, +] -export const ButtonIcon = (icon: string): IconType => { - if (icon === 'FaLightbulb') return FaLightbulb - else if (icon === 'FaRegLightbulb') return FaRegLightbulb - else if (icon === 'FaVolumeDown') return FaVolumeDown - else if (icon === 'FaVolumeMute') return FaVolumeMute - else if (icon === 'FaVolumeOff') return FaVolumeOff - else if (icon === 'FaVolumeUp') return FaVolumeUp - else if (icon === 'FaPhoneVolume') return FaPhoneVolume - else if (icon === 'FaMicrophone') return FaMicrophone - else if (icon === 'FaMicrophoneAlt') return FaMicrophoneAlt - else if (icon === 'FaVideo') return FaVideo - else if (icon === 'FaFolder') return FaFolder - else if (icon === 'FaArrowUp') return FaArrowUp - else if (icon === 'FaArrowDown') return FaArrowDown - else if (icon === 'FaArrowLeft') return FaArrowLeft - else if (icon === 'FaArrowRight') return FaArrowRight - else if (icon === 'FaPowerOff') return FaPowerOff - else if (icon === 'FaToggleOn') return FaToggleOn - else if (icon === 'FaToggleOff') return FaToggleOff - else return null +export const availableIcons = () => { + const icons: { + [key: string]: string + } = {} + iconDatabase.forEach(icon => { + icons[icon.id] = icon.name + }) + return icons } -// TODO surely we don't need two functions? -export const ButtonIconReact = (props: { icon: string }) => { - if (props.icon === 'FaLightbulb') return - else if (props.icon === 'FaRegLightbulb') return - else if (props.icon === 'FaVolumeDown') return - else if (props.icon === 'FaVolumeMute') return - else if (props.icon === 'FaVolumeOff') return - else if (props.icon === 'FaVolumeUp') return - else if (props.icon === 'FaPhoneVolume') return - else if (props.icon === 'FaMicrophone') return - else if (props.icon === 'FaMicrophoneAlt') return - else if (props.icon === 'FaVideo') return - else if (props.icon === 'FaFolder') return - else if (props.icon === 'FaArrowUp') return - else if (props.icon === 'FaArrowDown') return - else if (props.icon === 'FaArrowLeft') return - else if (props.icon === 'FaArrowRight') return - else if (props.icon === 'FaPowerOff') return - else if (props.icon === 'FaToggleOn') return - else if (props.icon === 'FaToggleOff') return + +export const ButtonIcon = (props: { icon: string }) => { + const icon = iconDatabase.find(icon => icon.id === props.icon) + if (icon) return icon.icon else return <> } @@ -98,7 +141,7 @@ export const ButtonIconSelectItem = forwardRef( {icon ? ( - + ) : ( '' diff --git a/src/app/Navigation/AdminNavigation.tsx b/src/app/Navigation/AdminNavigation.tsx index 8e47424a..5e9acc7c 100644 --- a/src/app/Navigation/AdminNavigation.tsx +++ b/src/app/Navigation/AdminNavigation.tsx @@ -1,18 +1,18 @@ -import React from 'react' -import { Navbar, Group, Code, Text, ScrollArea } from '@mantine/core' +import { Code, Group, Navbar, ScrollArea, Text } from '@mantine/core' import { useViewportSize } from '@mantine/hooks' -import { Link } from 'react-router-dom' import { FaCogs } from '@react-icons/all-files/fa/FaCogs' +import { FaDatabase } from '@react-icons/all-files/fa/FaDatabase' import { FaLevelUpAlt } from '@react-icons/all-files/fa/FaLevelUpAlt' +import { FaRegClock } from '@react-icons/all-files/fa/FaRegClock' import { FaRegFolder } from '@react-icons/all-files/fa/FaRegFolder' -import { FaDatabase } from '@react-icons/all-files/fa/FaDatabase' import { FaRegPlayCircle } from '@react-icons/all-files/fa/FaRegPlayCircle' import { FaWindowClose } from '@react-icons/all-files/fa/FaWindowClose' -import { useStyles } from './Styles' -import { NavbarItem } from './NavbarItem' -import { useAppSelector } from './../apis/redux/mainStore' +import React from 'react' +import { Link } from 'react-router-dom' import { runningInElectron } from '../apis/utilities/version' -import { FaRegClock } from '@react-icons/all-files/fa/FaRegClock' +import { useAppSelector } from './../apis/redux/mainStore' +import { NavbarItem } from './NavbarItem' +import { useStyles } from './Styles' export const AdminNavigation = () => { const { classes, cx } = useStyles() @@ -33,14 +33,22 @@ export const AdminNavigation = () => { Exit ) : null} - - - - - + } + /> + } /> + } /> + } /> + } + /> - + } /> ) diff --git a/src/app/Navigation/ControlPanelNavigation.tsx b/src/app/Navigation/ControlPanelNavigation.tsx index b0fab8bd..35dd9bae 100644 --- a/src/app/Navigation/ControlPanelNavigation.tsx +++ b/src/app/Navigation/ControlPanelNavigation.tsx @@ -1,15 +1,16 @@ -import React from 'react' import { Navbar, ScrollArea } from '@mantine/core' import { useViewportSize } from '@mantine/hooks' import { FaQuestion } from '@react-icons/all-files/fa/FaQuestion' -import { useStyles } from './Styles' -import { NavbarItem } from './NavbarItem' -import { useAppSelector } from './../apis/redux/mainStore' -import { DatabaseFolder } from './../../database/repository/folder' +import React from 'react' import { ButtonIcon } from '../Components/ControlPanel/ButtonIcon' +import { DatabaseFolder } from './../../database/repository/folder' +import { useAppSelector } from './../apis/redux/mainStore' +import { NavbarItem } from './NavbarItem' +import { useStyles } from './Styles' const TopLevelFolders = () => { const folders = useAppSelector(state => (state.database ? state.database.folders : false)) + const { classes } = useStyles() const topLevelFolders: Array = [] if (folders !== false) { Object.entries(folders) @@ -31,7 +32,11 @@ const TopLevelFolders = () => { key={item.id} link={'folder/' + item.id.toString()} label={item.name} - Icon={ButtonIcon(item.icon)} + Icon={ + + + + } /> ))} @@ -46,7 +51,7 @@ export const ControlPanelNavigation = () => { - + } /> ) diff --git a/src/app/Navigation/NavbarItem.tsx b/src/app/Navigation/NavbarItem.tsx index 1d11c4fc..ac38b785 100644 --- a/src/app/Navigation/NavbarItem.tsx +++ b/src/app/Navigation/NavbarItem.tsx @@ -1,9 +1,8 @@ -import React from 'react' -import { Link, useLocation } from 'react-router-dom' -import { IconType } from '@react-icons/all-files/lib' -import { useStyles } from './Styles' +import React from 'react'; +import { Link, useLocation } from 'react-router-dom'; +import { useStyles } from './Styles'; -export const NavbarItem = ({ link, label, Icon }: { link: string; label: string; Icon: IconType }) => { +export const NavbarItem = ({ link, label, Icon }: { link: string; label: string; Icon: React.ReactNode }) => { const location = useLocation() const pathLink = location.pathname.replace('/admin/', '').replace('/controlPanel/', '') const { classes, cx } = useStyles() @@ -15,7 +14,7 @@ export const NavbarItem = ({ link, label, Icon }: { link: string; label: string; to={link} key={label} > - + {Icon} {label} ) diff --git a/src/app/Navigation/Styles.tsx b/src/app/Navigation/Styles.tsx index a3aeb1ce..7fe22aaa 100644 --- a/src/app/Navigation/Styles.tsx +++ b/src/app/Navigation/Styles.tsx @@ -1,7 +1,6 @@ import { createStyles } from '@mantine/core' -export const useStyles = createStyles((theme, _params, getRef) => { - const icon = getRef('icon') +export const useStyles = createStyles((theme, _params) => { return { navbar: { backgroundColor: theme.colors.dark[6], @@ -48,7 +47,6 @@ export const useStyles = createStyles((theme, _params, getRef) => { }, linkIcon: { - ref: icon, color: theme.white, opacity: 0.75, marginRight: theme.spacing.sm, @@ -58,9 +56,6 @@ export const useStyles = createStyles((theme, _params, getRef) => { linkActive: { '&, &:hover': { backgroundColor: theme.colors.dark[7], - [`& .${icon}`]: { - opacity: 0.9, - }, }, }, } diff --git a/src/app/Pages/Admin/Folders.tsx b/src/app/Pages/Admin/Folders.tsx index 923dd675..ef64b832 100644 --- a/src/app/Pages/Admin/Folders.tsx +++ b/src/app/Pages/Admin/Folders.tsx @@ -1,34 +1,34 @@ -import React, { useEffect, useState } from 'react' import { - Group, - TextInput, + ActionIcon, Box, Button, Center, - ActionIcon, - Select, + Group, LoadingOverlay, SelectItem as MantineSelectItem, Modal, - Text, + Select, Table, + Text, + TextInput, Title, } from '@mantine/core' import { useForm } from '@mantine/form' -import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd' +import { showNotification } from '@mantine/notifications' +import { RichTextEditor } from '@mantine/rte' +import { FaCheck } from '@react-icons/all-files/fa/FaCheck' import { FaFolder } from '@react-icons/all-files/fa/FaFolder' import { FaGripVertical } from '@react-icons/all-files/fa/FaGripVertical' +import { FaPencilAlt } from '@react-icons/all-files/fa/FaPencilAlt' +import { FaPlus } from '@react-icons/all-files/fa/FaPlus' +import { FaSave } from '@react-icons/all-files/fa/FaSave' import { FaTrash } from '@react-icons/all-files/fa/FaTrash' -import { useAppSelector } from './../../apis/redux/mainStore' +import React, { useEffect, useState } from 'react' +import { DragDropContext, Draggable, Droppable } from 'react-beautiful-dnd' +import { ButtonIconSelectItem, availableIcons } from '../../Components/ControlPanel/ButtonIcon' import { DatabaseFolder } from './../../../database/repository/folder' +import { useAppSelector } from './../../apis/redux/mainStore' import { ApiCall } from './../../apis/wrapper' -import { AvailableIcons, ButtonIconSelectItem } from '../../Components/ControlPanel/ButtonIcon' -import { FaPencilAlt } from '@react-icons/all-files/fa/FaPencilAlt' -import { RichTextEditor } from '@mantine/rte' -import { FaSave } from '@react-icons/all-files/fa/FaSave' -import { FaPlus } from '@react-icons/all-files/fa/FaPlus' -import { showNotification } from '@mantine/notifications' -import { FaCheck } from '@react-icons/all-files/fa/FaCheck' interface FormValues { folders: Array @@ -137,7 +137,7 @@ export const FoldersConfigurationPage = () => { searchable={true} nothingFound="No icons found" itemComponent={ButtonIconSelectItem} - data={Object.entries(AvailableIcons).map(([value, name]) => ({ + data={Object.entries(availableIcons()).map(([value, name]) => ({ value: value, icon: value, label: name, diff --git a/src/app/Pages/Admin/Presets.tsx b/src/app/Pages/Admin/Presets.tsx index f3fdfccd..d1a1fb0d 100644 --- a/src/app/Pages/Admin/Presets.tsx +++ b/src/app/Pages/Admin/Presets.tsx @@ -1,49 +1,49 @@ -import React, { useEffect, useState } from 'react' import { - Group, - TextInput, + ActionIcon, + Alert, + Badge, Box, Button, Center, - ActionIcon, - Select, - LoadingOverlay, Checkbox, + Chip, ColorInput, + Group, + LoadingOverlay, Modal, - SelectItem, NumberInput, - Chip, + Select, + SelectItem, + Table, Text, + TextInput, Title, - Table, - Alert, - Badge, } from '@mantine/core' import { useForm } from '@mantine/form' -import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd' +import { useModals } from '@mantine/modals' +import { showNotification } from '@mantine/notifications' +import { FaCheck } from '@react-icons/all-files/fa/FaCheck' import { FaFolder } from '@react-icons/all-files/fa/FaFolder' import { FaGripVertical } from '@react-icons/all-files/fa/FaGripVertical' -import { FaRegClock } from '@react-icons/all-files/fa/FaRegClock' -import { FaTrash } from '@react-icons/all-files/fa/FaTrash' -import { FaRegClone } from '@react-icons/all-files/fa/FaRegClone' import { FaPencilAlt } from '@react-icons/all-files/fa/FaPencilAlt' -import { FaSpaceShuttle } from '@react-icons/all-files/fa/FaSpaceShuttle' -import { FaSave } from '@react-icons/all-files/fa/FaSave' import { FaPlus } from '@react-icons/all-files/fa/FaPlus' import { FaRecycle } from '@react-icons/all-files/fa/FaRecycle' -import { useAppSelector } from './../../apis/redux/mainStore' +import { FaRegClock } from '@react-icons/all-files/fa/FaRegClock' +import { FaRegClone } from '@react-icons/all-files/fa/FaRegClone' +import { FaSave } from '@react-icons/all-files/fa/FaSave' +import { FaSpaceShuttle } from '@react-icons/all-files/fa/FaSpaceShuttle' +import { FaTrash } from '@react-icons/all-files/fa/FaTrash' +import React, { useEffect, useState } from 'react' +import { DragDropContext, Draggable, Droppable } from 'react-beautiful-dnd' import { DatabasePreset, PresetTypes } from './../../../database/repository/preset' -import { ApiCall } from './../../apis/wrapper' -import { OSCPresetEditModal } from './../../Components/Admin/Controls/Presets/EditModal/OSC' +import { E131PresetEditModal } from './../../Components/Admin/Controls/Presets/EditModal/E131' import { HTTPPresetEditModal } from './../../Components/Admin/Controls/Presets/EditModal/HTTP' import { MacroPresetEditModal } from './../../Components/Admin/Controls/Presets/EditModal/Macro' -import { E131PresetEditModal } from './../../Components/Admin/Controls/Presets/EditModal/E131' -import { useModals } from '@mantine/modals' -import { FaCheck } from '@react-icons/all-files/fa/FaCheck' -import { showNotification } from '@mantine/notifications' +import { OSCPresetEditModal } from './../../Components/Admin/Controls/Presets/EditModal/OSC' import { isValidJson } from './../../Components/Admin/Controls/Presets/EditModal/isValidJson' -import { AvailableIcons, ButtonIconSelectItem } from './../../Components/ControlPanel/ButtonIcon' +import { ButtonIconSelectItem, availableIcons } from './../../Components/ControlPanel/ButtonIcon' +import { useAppSelector } from './../../apis/redux/mainStore' +import { ApiCall } from './../../apis/wrapper' interface FormValues { presets: Array @@ -170,7 +170,7 @@ export const PresetsConfigurationPage = () => { clearable={true} data={[ { value: null, icon: null, label: '' }, - ...Object.entries(AvailableIcons).map(([value, name]) => ({ + ...Object.entries(availableIcons()).map(([value, name]) => ({ value: value, icon: value, label: name, diff --git a/src/app/Pages/ControlPanel/Preset.tsx b/src/app/Pages/ControlPanel/Preset.tsx index 7d127fa2..52b867fa 100644 --- a/src/app/Pages/ControlPanel/Preset.tsx +++ b/src/app/Pages/ControlPanel/Preset.tsx @@ -1,14 +1,14 @@ +import { Button, Paper } from '@mantine/core' +import { FaLevelUpAlt } from '@react-icons/all-files/fa/FaLevelUpAlt' import React from 'react' import { Link, useNavigate, useParams } from 'react-router-dom' +import { ButtonIcon } from '../../Components/ControlPanel/ButtonIcon' import { DatabaseFolder } from './../../../database/repository/folder' -import { Button, Paper } from '@mantine/core' -import { FaLevelUpAlt } from '@react-icons/all-files/fa/FaLevelUpAlt' +import { PresetFaders } from './../../Components/ControlPanel/PresetFaders' import { DangerouslySetHTML } from './../../Components/DangerouslySetHTML' -import { pickTextColorBasedOnBgColor } from './../../apis/utilities/pickOppositeTextColor' import { useAppSelector } from './../../apis/redux/mainStore' +import { pickTextColorBasedOnBgColor } from './../../apis/utilities/pickOppositeTextColor' import { ApiCall } from './../../apis/wrapper' -import { ButtonIconReact } from '../../Components/ControlPanel/ButtonIcon' -import { PresetFaders } from './../../Components/ControlPanel/PresetFaders' const PresetButton = ({ text, presetId, @@ -40,7 +40,7 @@ const PresetButton = ({ size="xl" mx="xs" my="xs" - rightIcon={icon ? : null} + rightIcon={icon ? : null} > {text} @@ -64,7 +64,7 @@ const FolderButton = ({ size="xl" mx="xs" my="xs" - leftIcon={backButton ? : } + leftIcon={backButton ? : } > {text} From 360a0668c4bca20de0e7f4e0255d59360d617d87 Mon Sep 17 00:00:00 2001 From: James Bithell Date: Fri, 16 Jun 2023 19:31:18 +0100 Subject: [PATCH 30/42] Basic UI --- docs/docs/user-guide/admin/timer-presets.md | 8 ++ src/api/database.ts | 5 +- src/api/preset/presetRouter.ts | 9 -- src/api/router.ts | 15 ++- .../timeClockTriggers/timeClockTriggers.ts | 29 ++++++ src/app/Pages/Admin/TimeClockTriggers.tsx | 49 ++++++++-- src/app/app.css | 6 -- src/database/dataSource.ts | 13 +-- .../1685981931584-TimeClockTriggers.ts | 16 ---- .../1686937486497-TimeClockTriggers.ts | 15 +++ src/database/model/Preset.ts | 8 +- src/database/model/TimeClockTrigger.ts | 94 +++++++++++++++++++ src/database/repository/preset.ts | 46 --------- src/database/repository/timeClockTrigger.ts | 67 +++++++++++++ src/globals.d.ts | 1 + src/index.ts | 18 ++-- src/timeClockTriggerRunner.ts | 0 17 files changed, 290 insertions(+), 109 deletions(-) create mode 100644 docs/docs/user-guide/admin/timer-presets.md create mode 100644 src/api/timeClockTriggers/timeClockTriggers.ts delete mode 100644 src/database/migration/1685981931584-TimeClockTriggers.ts create mode 100644 src/database/migration/1686937486497-TimeClockTriggers.ts create mode 100644 src/database/model/TimeClockTrigger.ts create mode 100644 src/database/repository/timeClockTrigger.ts create mode 100644 src/timeClockTriggerRunner.ts diff --git a/docs/docs/user-guide/admin/timer-presets.md b/docs/docs/user-guide/admin/timer-presets.md new file mode 100644 index 00000000..8670688e --- /dev/null +++ b/docs/docs/user-guide/admin/timer-presets.md @@ -0,0 +1,8 @@ +--- +sidebar_position: 30 +title: Timer Presets +--- + +TODO + +Timeout is in minutes \ No newline at end of file diff --git a/src/api/database.ts b/src/api/database.ts index 7ecb2aac..9ffa7d63 100644 --- a/src/api/database.ts +++ b/src/api/database.ts @@ -3,7 +3,8 @@ import { version } from './../../package.json' import { ConfigRepository } from './../database/repository/config' import { DatabaseFader, FaderRepository } from './../database/repository/fader' import { DatabaseFolder, FolderRepository } from './../database/repository/folder' -import { DatabasePreset, DatabaseTimeClockTrigger, PresetRepository } from './../database/repository/preset' +import { DatabasePreset, PresetRepository } from './../database/repository/preset' +import { TimeClockTriggersRepository } from './../database/repository/timeClockTrigger' import { getOperatingSystemName } from './about/operatingSystem/info' import { broadcast } from './broadcast' @@ -96,7 +97,7 @@ export const createDatabaseObject = async (message: string): Promise = }, }, presets: await PresetRepository.getAll(), - timeClockTriggers: await PresetRepository.getAllTimeClockTriggers(), + timeClockTriggers: await TimeClockTriggersRepository.getAll(), folders: await FolderRepository.getAll(), faders: await FaderRepository.getAll(), } diff --git a/src/api/preset/presetRouter.ts b/src/api/preset/presetRouter.ts index a0a13b89..a33a33a8 100644 --- a/src/api/preset/presetRouter.ts +++ b/src/api/preset/presetRouter.ts @@ -73,15 +73,6 @@ export const presetRouter = ( }) } else resolve({}) }) - } else if (method === 'PUT' && path[0] === 'timeClockTriggers') { - return Promise.resolve() - .then(() => { - return createDatabaseObject('updating all presets in bulk') - }) - .then((response: Database) => { - sendDatabaseObject(response) - resolve({}) - }) } else if (method === 'PUT') { return PresetRepository.setAllFromApp(payload as Array) .then(() => { diff --git a/src/api/router.ts b/src/api/router.ts index 8ed81b75..421ec43d 100644 --- a/src/api/router.ts +++ b/src/api/router.ts @@ -1,12 +1,13 @@ +import { reboot } from './../electron/windowUtilities' import { aboutRouter } from './about/aboutRouter' -import { createDatabaseObject } from './database' -import { presetRouter } from './preset/presetRouter' -import { folderRouter } from './folder/folderRouter' import { configRouter } from './config/configRouter' -import { outputModulesRouter } from './outputModules/outputModulesRouter' -import { reboot } from './../electron/windowUtilities' +import { createDatabaseObject } from './database' import { faderRouter } from './fader/faderRouter' +import { folderRouter } from './folder/folderRouter' import { createImagesObject } from './images' +import { outputModulesRouter } from './outputModules/outputModulesRouter' +import { presetRouter } from './preset/presetRouter' +import { timeClockTriggersRouter } from './timeClockTriggers/timeClockTriggers' /** * This is a REST router that triages all requests and sends them to relevant routers @@ -52,6 +53,10 @@ export const routeRequest = ( // {@link configRouter} - this router handles all about requests for the /config path resolve(configRouter(pathArr.slice(1), method, payload)) break + case 'timeClockTriggers': + // {@link timeClockTriggers} - the timeClockTriggers router handles all about requests for the /timeClockTriggers path + resolve(timeClockTriggersRouter(pathArr.slice(1), method, payload)) + break case 'outputModules': // {@link outputModulesRouter} - this router handles all about requests for the /outputModules path resolve(outputModulesRouter(pathArr.slice(1), method, payload)) diff --git a/src/api/timeClockTriggers/timeClockTriggers.ts b/src/api/timeClockTriggers/timeClockTriggers.ts new file mode 100644 index 00000000..a85656b5 --- /dev/null +++ b/src/api/timeClockTriggers/timeClockTriggers.ts @@ -0,0 +1,29 @@ +import { Database, createDatabaseObject, sendDatabaseObject } from '../database' +import { DatabaseTimeClockTrigger, TimeClockTriggersRepository } from './../../database/repository/timeClockTrigger' +/** + * This is a REST router for the preset API. + * @param path - The path requested by the original route requestor + * @param method - The method requested by the original route requestor + * @param payload - Any payload sent + * @returns the retrieved response from the given route + * @throws an error if the requested route is not found + */ +export const timeClockTriggersRouter = ( + path: Array, + method: 'GET' | 'POST' | 'PUT' | 'DELETE', + payload: apiObject +): Promise => { + logger.debug('Preset router has a request', { path, method, payload }) + return new Promise((resolve, reject) => { + if (method === 'PUT') { + return TimeClockTriggersRepository.setAllFromApp(payload as Array) + .then(() => { + return createDatabaseObject('updating all time clock triggers in bulk') + }) + .then((response: Database) => { + sendDatabaseObject(response) + resolve({}) + }) + } else reject(new Error('Path not found')) + }) +} diff --git a/src/app/Pages/Admin/TimeClockTriggers.tsx b/src/app/Pages/Admin/TimeClockTriggers.tsx index ff97e094..3749c142 100644 --- a/src/app/Pages/Admin/TimeClockTriggers.tsx +++ b/src/app/Pages/Admin/TimeClockTriggers.tsx @@ -5,6 +5,7 @@ import { Checkbox, Group, LoadingOverlay, + NumberInput, Select, SelectItem, Table, @@ -19,7 +20,7 @@ import { FaRegClone } from '@react-icons/all-files/fa/FaRegClone' import { FaSave } from '@react-icons/all-files/fa/FaSave' import { FaTrash } from '@react-icons/all-files/fa/FaTrash' import React, { useEffect, useState } from 'react' -import { DatabaseTimeClockTrigger } from '../../../database/repository/preset' +import { DatabaseTimeClockTrigger } from '../../../database/repository/timeClockTrigger' import { useAppSelector } from '../../apis/redux/mainStore' import { ApiCall } from '../../apis/wrapper' @@ -31,15 +32,16 @@ export const TimeClockTriggersConfigurationPage = () => { const [loadingOverlayVisible, setLoadingOverlayVisible] = useState(false) const [formOriginalValues, setFormOriginalValues] = useState('') // Values used to detect unsaved changes const presets = useAppSelector(state => (state.database ? state.database.presets : false)) + const folders = useAppSelector(state => (state.database ? state.database.folders : false)) const timeClockTriggers = useAppSelector(state => (state.database ? state.database.timeClockTriggers : false)) const presetsForSelect: Array = [] // Prepare folders list for select dropdown - if (presets !== false) { + if (presets !== false && folders !== false) { Object.entries(presets).forEach(([, value]) => { presetsForSelect.push({ value: value.id.toString(), label: value.name, - group: value.folderId.toString(), + group: folders[value.folderId as unknown as number].name, }) }) } @@ -50,8 +52,12 @@ export const TimeClockTriggersConfigurationPage = () => { }, validate: { triggers: { - timeout: value => (value < 0 ? 'Timeout should be a number' : null), - time: value => (value.match(/^\d{1,2}:\d{2}$/) ? null : 'Time should be in hh:mm format'), + timeout: (value: number) => (value < 0 ? 'Timeout should be a number' : null), + time: (value: string) => (value.match(/^\d{1,2}:\d{2}$/) ? null : 'Time should be in hh:mm format'), + presetId: value => + typeof value === 'undefined' || value == null || parseInt(value) == 0 + ? 'Preset must be selected' + : null, }, }, }) @@ -68,7 +74,7 @@ export const TimeClockTriggersConfigurationPage = () => { // Handle the submit button const handleSubmit = (values: typeof form.values) => { setLoadingOverlayVisible(true) - ApiCall.put('/presets/timeClockTriggers', values.triggers).then(() => { + ApiCall.put('/timeClockTriggers', values.triggers).then(() => { showNotification({ message: 'Your changes have been saved', autoClose: 2000, @@ -80,24 +86,40 @@ export const TimeClockTriggersConfigurationPage = () => { } const fields = form.values.triggers.map((_, index) => ( - + + + + {['Mon', 'Tues', 'Weds', 'Thurs', 'Fri', 'Sat', 'Sun'].map((day, i) => ( + + ))} + + { /> - - - - + { + setModalVisible(false) + }} + size="xl" + title="Advanced Options" + overflow="inside" + > + + + + + + setModalVisible(index)}> + + form.insertListItem('triggers', form.values.triggers[index])} + onClick={() => { + const newItem = form.values.triggers[index] + newItem.id = null + form.insertListItem('triggers', newItem) + }} > @@ -169,6 +202,7 @@ export const TimeClockTriggersConfigurationPage = () => { time: '00:00', timeout: 5, enabled: true, + enabledWhenLocked: true, mon: true, tues: true, weds: true, @@ -182,12 +216,11 @@ export const TimeClockTriggersConfigurationPage = () => { > - Time + Days of Week - Days of Week + Time Preset - Enabled - Timeout + diff --git a/src/app/index.html b/src/app/index.html index c641b66a..40909227 100644 --- a/src/app/index.html +++ b/src/app/index.html @@ -4,6 +4,7 @@ + ParadisePi
diff --git a/src/database/migration/1686937486497-TimeClockTriggers.ts b/src/database/migration/1686937486497-TimeClockTriggers.ts index 0c84aca1..7b195100 100644 --- a/src/database/migration/1686937486497-TimeClockTriggers.ts +++ b/src/database/migration/1686937486497-TimeClockTriggers.ts @@ -5,7 +5,7 @@ export class TimeClockTriggers1686937486497 implements MigrationInterface { public async up(queryRunner: QueryRunner): Promise { await queryRunner.query( - `CREATE TABLE "timeclocktriggers" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "time" text NOT NULL, "lastTriggered" numeric NOT NULL DEFAULT (0), "enabled" boolean NOT NULL DEFAULT (1), "timeout" text NOT NULL, "countdownWarning" text NOT NULL, "countdownWarningText" text, "mon" boolean NOT NULL DEFAULT (1), "tues" boolean NOT NULL DEFAULT (1), "weds" boolean NOT NULL DEFAULT (1), "thurs" boolean NOT NULL DEFAULT (1), "fri" boolean NOT NULL DEFAULT (1), "sat" boolean NOT NULL DEFAULT (1), "sun" boolean NOT NULL DEFAULT (1), "createdAt" datetime DEFAULT (datetime('now')), "updatedAt" datetime DEFAULT (datetime('now')), "version" integer, "presetId" integer)` + `CREATE TABLE "timeclocktriggers" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "time" text NOT NULL, "lastTriggered" integer NOT NULL DEFAULT (0), "enabled" boolean NOT NULL DEFAULT (1), "enabledWhenLocked" boolean NOT NULL DEFAULT (1), "timeout" integer NOT NULL DEFAULT (0), "countdownWarning" integer NOT NULL DEFAULT (0), "countdownWarningText" text, "mon" boolean NOT NULL DEFAULT (1), "tues" boolean NOT NULL DEFAULT (1), "weds" boolean NOT NULL DEFAULT (1), "thurs" boolean NOT NULL DEFAULT (1), "fri" boolean NOT NULL DEFAULT (1), "sat" boolean NOT NULL DEFAULT (1), "sun" boolean NOT NULL DEFAULT (1), "createdAt" datetime DEFAULT (datetime('now')), "updatedAt" datetime DEFAULT (datetime('now')), "version" integer, "presetId" integer)` ) } diff --git a/src/database/model/TimeClockTrigger.ts b/src/database/model/TimeClockTrigger.ts index 9b332f0b..37b3850b 100644 --- a/src/database/model/TimeClockTrigger.ts +++ b/src/database/model/TimeClockTrigger.ts @@ -22,21 +22,29 @@ export class TimeClockTrigger { @Column('text') time: string - @Column('numeric', { + @Column('integer', { default: 0, }) lastTriggered: number - // Enabled is taken to mean visible - macros can still trigger the preset but it is hidden @Column('boolean', { default: true, }) enabled: boolean - @Column('text') + @Column('boolean', { + default: true, + }) + enabledWhenLocked: boolean + + @Column('integer', { + default: 5, + }) timeout: number - @Column('text') + @Column('integer', { + default: 0, + }) countdownWarning: number @Column('text', { nullable: true }) diff --git a/src/database/repository/timeClockTrigger.ts b/src/database/repository/timeClockTrigger.ts index b6af2e30..fcf34139 100644 --- a/src/database/repository/timeClockTrigger.ts +++ b/src/database/repository/timeClockTrigger.ts @@ -7,6 +7,7 @@ export interface DatabaseTimeClockTrigger { presetId: string // An unfortunate feature of the mantine select is that it requires a string instead of a number :( time: string enabled: boolean + enabledWhenLocked: boolean timeout: number countdownWarning: number // TODO implement countdownWarningText: string // TODO implement @@ -25,8 +26,21 @@ export const TimeClockTriggersRepository = dataSource.getRepository(TimeClockTri const items = await this.find() return items.map((item: TimeClockTrigger) => { return { - ...item, + id: item.id, + time: item.time, presetId: item.preset !== null ? item.preset.id.toString() : null, + enabled: item.enabled, + enabledWhenLocked: item.enabledWhenLocked, + timeout: item.timeout, + countdownWarning: item.countdownWarning, + countdownWarningText: item.countdownWarningText, + mon: item.mon, + tues: item.tues, + weds: item.weds, + thurs: item.thurs, + fri: item.fri, + sat: item.sat, + sun: item.sun, } }) }, @@ -59,6 +73,7 @@ export const TimeClockTriggersRepository = dataSource.getRepository(TimeClockTri ...trigger, preset: presetId, countdownWarning: 0, + countdownWarningText: '', } } ) diff --git a/src/logger/index.ts b/src/logger/index.ts index 55c750c7..b21bcfde 100644 --- a/src/logger/index.ts +++ b/src/logger/index.ts @@ -1,14 +1,13 @@ -import { createLogger, format, transports } from 'winston' -import { BroadcastTransport } from './broadcastTransport' import fs from 'fs' import path from 'path' +import { createLogger, format, transports } from 'winston' import { isRunningInDevelopmentMode } from './../electron/developmentMode' +import { BroadcastTransport } from './broadcastTransport' const logDir = path.join(__dirname, '../../logs') if (!fs.existsSync(logDir)) { fs.mkdirSync(logDir) } - const logLevels = { levels: { error: 0, // Errors that cannot be recovered from - these are crashing the app (e.g. multiple interfaces found) From 0b769409dfd6e8c11a800fa3a053cb3f2d38b513 Mon Sep 17 00:00:00 2001 From: James Bithell Date: Sun, 18 Jun 2023 11:58:01 +0100 Subject: [PATCH 32/42] Edit functionality complete --- src/app/Components/Locked.tsx | 7 ++++--- src/app/Pages/Admin/TimeClockTriggers.tsx | 14 ++++++++++++++ .../migration/1686937486497-TimeClockTriggers.ts | 2 +- src/database/model/TimeClockTrigger.ts | 3 +++ src/database/repository/timeClockTrigger.ts | 2 ++ 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/app/Components/Locked.tsx b/src/app/Components/Locked.tsx index 9f2371a1..97fc8a17 100644 --- a/src/app/Components/Locked.tsx +++ b/src/app/Components/Locked.tsx @@ -1,7 +1,7 @@ -import { Stack, Title, Collapse, Text } from '@mantine/core' -import React, { useCallback, useEffect, useState } from 'react' +import { Collapse, Stack, Text, Title } from '@mantine/core' import { useEventListener, useViewportSize } from '@mantine/hooks' import { FaLock } from '@react-icons/all-files/fa/FaLock' +import React, { useCallback, useEffect, useState } from 'react' import { useAppSelector } from './../apis/redux/mainStore' const LockedMessage = () => { @@ -12,7 +12,7 @@ const LockedMessage = () => { const port = useAppSelector(state => (state.database ? state.database.about.port : false)) if (count >= 5) { return ( - + Device is locked. To unlock it access the setup and administration area, by ensuring you are on the same network as this device and then navigating to http:// {ipAddress + ':' + port ?? ''} with a web browser @@ -23,6 +23,7 @@ const LockedMessage = () => { Device is locked, unlock it using the setup and administration area on another device diff --git a/src/app/Pages/Admin/TimeClockTriggers.tsx b/src/app/Pages/Admin/TimeClockTriggers.tsx index 913cef38..6475425f 100644 --- a/src/app/Pages/Admin/TimeClockTriggers.tsx +++ b/src/app/Pages/Admin/TimeClockTriggers.tsx @@ -10,7 +10,9 @@ import { Select, SelectItem, Table, + Text, TextInput, + Textarea, Title, } from '@mantine/core' import { useForm } from '@mantine/form' @@ -91,6 +93,7 @@ export const TimeClockTriggersConfigurationPage = () => { const fields = form.values.triggers.map((_, index) => ( + {form.values.triggers[index].notes ? {form.values.triggers[index].notes} : null} {['Mon', 'Tues', 'Weds', 'Thurs', 'Fri', 'Sat', 'Sun'].map((day, i) => ( { title="Advanced Options" overflow="inside" > +