diff --git a/CHANGELOG.md b/CHANGELOG.md index 3eb4d6417cec6278e06f7e49881d844e104a2583..a83211896256b0101746b3cd611673213b02a8b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,17 @@ - No modifications / Keep major and minors versions in sync with all parts of the project --> -## 3.0.0 (?) + +## 3.1.0 (???) + +### 🔨 Internal / Developers +- **Typescript**: Add linter (ESLint) + +### 🐛 Bugfix +- **CLI**: Fix error messages when not logged in + + +## 3.0.0 (2023-11-03) ### ✨ Feature - Login to Dojo app via Gitlab OAuth diff --git a/NodeApp/.env.vault b/NodeApp/.env.vault index e6e7181907e0b3b11f2a65563dd356f6db2f4ea4..ee797ee12ea991372b88e3f45f29142da9b2d76f 100644 --- a/NodeApp/.env.vault +++ b/NodeApp/.env.vault @@ -4,8 +4,11 @@ #/--------------------------------------------------/ # development -DOTENV_VAULT_DEVELOPMENT="Dp7/4qdTYrrd++/Ny+nykGpmkSKB8DCqhJkuX9/ZQkDB+cvsX5wRTgXBnxA4aIp+HX7QZNnKRKbU3kkzwa3sLHqu58E4Ns1gNGxSYeConwM+ebopPujewxhZbnQ8CxVqMA4cG/GB556yBDtbYYngw2EPdxFlAvLinD5MQbsJvpzDDUiPD9S6bxM20ciMmtsIcV+NI9lInwINIS8vLVWaXVdulnvB4SwVlLiEgfGfiMt2L2YahOG76AnACyL+xKC/QCmAhc3tR6nn6xPdovY3TDWOJe/25Qg2kgm1EvY5ry5r0nskxYPxCe/sIIqhIhE5rvp+uvCCG81Ilec1+RSA7EP7vJ0VJ8zOrurYZn09cZSkrLC+EYuQtlRXk0dBTALfuLWnqpwYN3ADC16YMEc1nI7VtPFwDBnO4cUHikot8XXXNpzsQRKE7S2kt5Cl3YOkO+JYIvNSbqc4OEiWEPZHJp0bNhXPaen0sqACD13GFA5WwaNR+bF9JZKYEZk9AJNp4pHYfuYDbCnTIfxXQ7atO9o90RYZynmX2BtbWCSmj2nWRc2UNfM+P7uZnGWxzrCAY3lb0P0BFrPMBiCzHXqUeOWjHc8s2RU55V/P0JNKEL4ePww9lCAq7dWHQcVtPQCMNU73GgJWtSbmXLw3WRXPtu+Ewe8o+zXuQYd4rUaieyhI36+A50lMEfvbdEpxoqd+guOCzLEo7MDXjNrDnaki2iIs1LHXu0X2p4qycfMHy0xs7lU/2maiUyZwEs3Uyrima1U8SofwPB+akpyfi3qTaIkV73yZWP4tdIEZfCz/lpM+uhyiD5g/YLOU+VoMRy+loUn4PyMIc3dDKLox06fbG8MJPS10goYTwHmsK9K2ywgVJmfQr4JVEY4rsgv22/IKfse1bPF12MCIxUSAKBzQA1rzRSkI8BUtU7cphVX50A3oOJeJe+t5/SdKTF4HwIE895rb2u4YceJt5UYKjxxTibmx1q9qzrLeeUbGemO9vvCrkxzSt7OUvMKR52GEwakEO3/+i+0G35SVBKoghRKVtMMvNIp9a4KnOogx5K0AErkbIYgXXoFH5gsiXU5oUBsU4Pz0QPAxCOvA+rLwDsssEPPmO0Yn1cMMb/aBdQl5AtLTY4GG8u9UvTZSo1Ly6z6Q6HxbeJsazfvEJuySSD/ckExRJoS817JvgpeKJViONN3td7qdtxZwMlP+AmSECv6uGUHbphkox17PE5FAN+lFaDyOGR+4VJoTPaeGds4CnDYDBLfYhaWktkvQbierlvj15HuhffP+IeziHd/YkpFtp9yLNRjjCwouCkgTnpo0CqI9V8uXW0aMPZXV6HEsj46sx2no6rWTkCj5u6SUufx/iCLLwCk6nOzW3ftbzP7vO3qTIPuWJ6sdYPSgWw6PyXhwxp3OEiV/jCpbq85pYQbS2YH4wDi9sZCtweud0nctPf+EnW/Imgy49/xuw7HEmay9okwUSsfr/Pw9p78GEJTm/eF9BIlxvly4aDCrYtqQGqOhRqNQICAd0RTw0z7hqAjrCKzhdQt79YSHCVvKy3tE01XDtgpiUL78HVRAYfdYGp1of1fPIpLzgnwOkER5rgGltYNVaJjvHXisyrL4+v4ww5NP2spxGsGEGUuQZes/YkDjafP026x8ZLusWNB1K96+REESXLOWnz7D/QYinZ9MP8f3CGF9ARFnYv9dKJuUIsAPPbZxAd4R9KtMHja5izkg37PHrRs/9cSD2gghu2+S4EYJ68mqGs1b6ao0fCYlcy/m+0U=" +DOTENV_VAULT_DEVELOPMENT="+X2VvBPV+1rmI5WUTNg1xcdpPDQlea8x/n19GqoF+wRuqpftUFH/bjbi5J7PonIY6PtVYi62NiGFW1cQlhKhEJC6vP1QGRgTTayTdRTxqfuWS/MGmBBBh8utzdDO73DK/aI60xXipytbp+couaF4i8v2C1ooac3sq4Jte41zeiqENInbliKaiJmXfyXPsAetU9wyGF0XYLF3WgO3LsYr8ff8l1vYyUaYzW6hkAM8m4Iw6ZSKfyApKhbbWJpMuCb//OFJ20Eo5weGbjj9ja9OUX/XR0oS8MvzkwBFrznSm6SIhIZmNPKsEoHAJqnVg0pLWjXnlWGWPJm+17tEyi/I0EmoUe3NQ3Bqtg/c0/8NQ6F53lI7OURrGlnjJqNJQtjc8bIpZHrQSVxfhZGLCqFuZMe15+ZWgUBZGShHttz2Qvmum0pZQ9hhudpK84bWdiB/snTRJ145h7SsBuP3liG1bP0mfq3ZE95+rKSzCMYnx4f7Bl1ohFd5nfiVrYWzZ7Bp5bll0eUFBpYoM2+gWveE374vreyCjGIshDxowzwbvugD57JcLIyoc9/BWrEit1bsrpB/cRGyQeBvPvsY1a76uhCn65vsVHe358zQ+mjWY3c2GB8EE8l5zAxFaZ/CFeQdwewhiPqQKrl1SUVuRdPnRCeUN0dia8ck2+cMGtCjcNEiQ8EH1U5YZnT8vcbOtfUXYSNQwEzTCUwN11zXq8SlePHluCDiYbXy2JffeRy/LBGXpfQkYstgxVOAnFE9fDm3rFqOSso3Bypz5ounyIYlleM/LWuHh2V/qTcRVjkTR211ALtYPErttmrkXQqrddShl0d2frl9gY6pLUuNdHJVjtVtQqSGIdnFEyCZ+jVB+VkoLR0xDuw2alEpRhehm4JJSatChfuQjOjaxZXe6dHfqP0ffW3vbPhgBWtEsgmTQvMQ0gYfNDahEnOxF4XK+PH+NdMYklPaHwuW2LJBPiTcYZuZvZGjnaActBIr3E5schXENM5oNWBQVcDuRFoh3WWwhsmRqUPfU2+wpuarI2zSfSKm3RXvWFFsOkTcOmKlS1lOxobBnG5clroegJFTvphceLk/JSV49qe9Xrg+1hPi2YF0cyI+Lb/V96WQ7i3o43+zlgsTkfYHfSrkadW7Bjiqh4s9QQo8n+dXCcuG7rFsrkjCUU6gp+tORvIsEmCO5tq5OYG/yJG42DWdUiYzYHk7oADSlAKKSIUao9g0D5QwuNSKzvlduEKR38oQXuGWyePcoG5zJEMjvk+zkf6CUTC2vo4SlvnBknyC4nN8gsMAFKkyrVRrEJtTiCr/TcwkxB59JX9j6yiq6SjHZBivIdBGm5mxLSv2QAdkt9Z5UhRyiCZnNJ6LmJzUVjCMdDY67c35wB4GFfEg/oVZh2UGsMdx0Hn+Cn5GHhzb7psVFajB5utdCbPBBuhBDx8Gew+z6nJUTMcshZPE6xnBkII04OzX1PtCG+uPgeO1gOfbfGId8BEmjuoQjj51zhws2oCQ8dk3uql9pcK60CqqOQyMZsA4bW3iprJFRJ2t4KWAcXsB8mRWWk0JW0kECSHAHOYPY47p9Ej/TNSZe04bgYhlopswsJ4Js7xGx2+Z4kvKLeq6nU4S0TY9+lx4aawa4n3E/bdTSr5hSSmDIewCMGKAnyZq9Co+XfqRWBUDExHUz514O7yCHh2PH9+SvzHeysHo4r4y3TB+YwksUwH4lSVafBlOj9jv8xB0Rj7eCrBKbWNPLCDTkdatZhBky9lb/21x+7iOImM=" # production -DOTENV_VAULT_PRODUCTION="eAPpmIk1d1HWEthoyl/LYayruvbFk/uJ7uotJLFO+a5DsD6pm6jImtbHfVy7v2AZ2ts37H0CK0H+zUpKEKbkqTeCkFxup2ogmhN+/grERHrjdhajxzOHzD7mHGLgWtI2ZOcrZYbpeB6pzbK/a1HG/jLqgHld93oq2J354u6GVbZcjYNQIAfDntlqKmrAaXTh9t5HpwiXmuAueKqsjoH6DGKVXC7UNeenP0OTOCYpYUlJlONba9ebmNPYwmM7ppnwS4ccOvtDdB42Enfd73XtS/ZzW93NnPP2kabINt3TcZdQtKHEd+YHAuRW+50bu1Wgbj1kyeWGRBWVe59wm7C6rhrTBjBRDBjxX7QMhznCIaTUbHFdx6by/O2p5XGzWSpzOlJwFfE4jfHOroxWnVIwN4hFUVu6g3eU+rvKTMtFpOSZ3FJlRiZtvgD7HqoOngEykFNgEEE07UGoOz91nKHia3msD/gzbAadgILB6G/GtuCSlUjW/rQyi8ujVTNxR8I09EKsjiVzRwp0uLGfqgUWEQPSncdkkRS0+82PSKrQXbOoLS+5WvnN95kVFWuHus+5RRup8wnO8CfJIX0TPxxJ9qWy3okku+fIuLbbIxLlxz6DtypwqqthzjaI21Qx+6qjr4vTE0Wc+uWH1csxFNcoo+CzBCt5lbb+QHFjXfmhITXBVz6Bbpt3F0e/yyr/xDhpIp8jo+VxsmOO6jHZd2L2IdUU3SPk+1d1HW0OkocS3s6Iya9CHyDD6tMDUgSdTDVayab6B1DWQYNcTo6a1WMcV/oRtynJnnYEsIEvU/WRT59syMsuoPzDFHTxgow4q1icNCkUHcHBKNKxYdrlLmCLuUwp1lggDyrAzFqNjcYVb/73K3mphi+njtDJdBq8sWrMGtjOScnrJ1rHmdmhT0ub2Qgwxgg6jZ2aKlZC2TFr41IkAtqDAI1moaV/OEsgBfIiDUusn6xKKrDxLiGM7vcQI0szd7Vkr2mfPWiQLOmhxKj11c+7QkUNF6QLQxVYEzwvHcB+RTusSlvJTXN9YfVjqrxBdvuV2UHk85zOYOkBKVIZcj3xojgnDkWVhHGnhfi8nn8d+ROIQIMhQ5izgai5PVO51MOcmgevMYj7L8Jf1HEuwD2ykwaS8KeewvTihEflY8YjOA6fjY70Q4Uqa0LIjsTNegeUPvvQ3E8s1w+4xrgRkA4uW1wRRs7NfoEt02cq2/ZBckXTjdXuuS2Xcdr6LFWEjp5iPlccZV7qBW7+AteROIRjEc/uzvhII5cKRLhgv3y2sehUXEdv04hrO5pKGStrwySZ93P2pnUk9UOdoNtCH5HMZ4jLGnb2hFDoP2o6b57khJZcanjpRvvhkWjpn9eMwjxWK+CX6n/uDaXeYBA9FZtSJyUAniXxNFBz/Zurisl74Bjl8CRCVaqq7ATPXeR+IsVd6B8Cs1QPWWuxU5Z1PCiot6kWTp69p45nHQMmUEdl5eUSATaG4PgwLlZ1vysB/O4J6npmYHF4IFAE8yLNbiWg7IuhlEFTYk9UgvUC+gLaymDTTtr/DqwjU3F/oFYkjR3/Go7L2s03VU3pU5PShua+AWg8Wfli1NQ9n3/rbwXAnsrS2J0qV6n3oFm9yv/0g/+RiOIko39UgJ1syZzbTpDRMtqJOg==" +DOTENV_VAULT_PRODUCTION="oWrK1gJdJMqCg+x+RRncAXdyGKNYWo1CqZTYprv0TZX1LEQlyJh/PuhaSmmiagCyWQC1OwLRwz1Yox9ndTZn23pp1hbNVOZc1sv+y56Y1GJh3fC2FOy+u6cb0p743k+WqMVakGbeC8aAXAgwS6CoRy+xanswjcIekoYx9ZuBe2n7sOwTOCzt0IH4UFQ7rdu5f4nPix7Nt0NUnLJO2EYQ93jZvXZg4NhLbkPmqs0b/P4x14BjQlUBSGHjb7kqYmiRhunO2+HynfGLGypiSCVV1RgfDBF7R4jiwvt3kCzMDsKuw4Os2SOb5zJ2ezcv92f+PqeVNgFctFkXBvDsY9AMr0BeB7jz8CkpQvfUtKB6OVneRt3V4lZ0Jjn4Os/swkQStuJQn4H1aoBOZ3uFG399R4FAKz5bNqdmZuxk7ljHelSjjWhjR7qeQevsfA04ZH97WwyWoksI9uF1v8yEz4iBNGmUEomZS2LOdU9jhuuDmZiSb5r057ZbCTFNI0HwSTvFV2U6T2bf3ISlbwoTHrAeKJGjZGNs+mRFx+eVMkjVtpmPXAgUbfkIU/n1/ytHuX8xVvq3n9zj1hZFPDLUTRMRRXlG540tpb5FppEaetglZKEfrJJXzHYQ2/rLX6o2ro8J78qqkD9+E4vMiU+e10oGO1aDcQt7JYSrbB7gY6Pb5zFt7xo90fedeeDWrsQJBrQ2L6VRRIxFGA+45wpyMmAAMoMUNaoJ03sjWK4qobT0/0qmE0KKTO9H36Qxymo9rWFefIoJ9S7wU9r8fCqPeTvnQbKzw6BpxNa4fT3bevza93i8gmzBArC2lL4At0EVVAOCtu9wkSae9Si3NFqGHeBVum/db12xCwQh9USarwbOtRDCp/Z6xhH5QrwkvhOv44zvoDAOhwlQR8RUVYjmx1nE7TdSeGLI4xodeuWsZZHlTWXgx+Ga2oKqST4bK4wWdWDVfY33FNBlZCD9p+VWg6y9vP5tGHxDbWj9ViSSPsTQnz2p/AD6ktmHlo1Tg0DeQerZ8mJTavW6a1X9go+F5cTkaLtSZ0XDdHvg5mghir5ZmonyYJ/uLQAavY+QujKO3g0/LedvIzXpSVCXSquEiLMZIQpg/Z7tuYs3Tb4cM55i+rwz/cBtVE1Mb18ITPn3fWlGGud7uOzeCibb5HN9zXCHWDgyTqUbp1u0bd6INp8v5LjfHU7Bxh8KROS1BnOAYXE8FbQRbmkrxF7AATDfYWhvzIcPQWfbGr9BT8n+n3klBqDuYtl///PHul4ghHOaBrMzLE+d5Iz2fH51gEwbTD+QZtfvnKML+NK8LYXBwE17Jo/4kHeJ8sFUwCY0qD7KWBWieWf8Zen31Mxtg+dLnFd4Sn7/YT9uAkmUGqhjW9f2WEtuvP/SX3SmAZjdR3apU2Cv3VK738UlX7z9uiaYKbZSOHH7dX+WOfCVebZIakBiY/ljnc4sblXUrWq/P1MLo1wlLUdYit18JTRkk8WLhi5z25hJY8AnQ2QR4kHIYLXJa5j30IGz8qV6o6Y9NoChdeqh6J9ZaW0UThkgl8yszwM6fz3wSjsmL/IS2U5Y98+eftfdk8Ws2MigGeF+FdTJcoFquceQZ8ezYQUny8htTHCXdBrY9Fczqi1IYF1CqbAUJLS/sLsyrNSbeg==" + +# test +DOTENV_VAULT_TEST="BXB3Ba35Ou7y/DX3gWH/BtaC5QL2VLY1/ZUpZp4AgvCgQEnADiwYvCeaWJ039VZGeY915MKldYf0VCmDOdTixdeG4xWd8c+TvjvG22l/TIzYkvsjzqF90tRwrQjpFdi+s+z6q8PlDGDoyoHtfUeBfxHk/c3Q7QckZC0im9UO2JLvOLNux9SFk0zvc8ov36fIxKcniUwH6ctPo4CKhVt1eT6r9fPt4HS8hEFYpQ7kbs+tKfL4htk94HcXu+aRony5fn3cawg/6+akMG8eF8jhrrvbJWlCR2W3krb6ApY3dbD9Ve9IGRTyM7yfQ3xjey97hEMLf7rEGtoO5a/ywPfOmMUAQcTSuE4a12jRXflFXbbfjarM+oUTbMTVi6hSEgY7V4yQouer5U3VVyCYJudzEgfWFFZdLBEhb+FGsCzSUxIwO/5fUg2E982ZUkd6Oz/77fT2/8oywkFZkAFJV9A9WWFOoM+2fvMLd2XbGnRq3zOMYjj+H16u1IBh31VnMuKFLBwGUSLjTGtDLR3VgMBWJCWGPto7yUUHCtQA5eBzgYL/QEEKM2gmpnBryPB/V7p3YTAQELlQWhhnTNDhXs9lt3mmhl9FP1LURHY4lgpRulFDpFdCKujLOfir87WhF53YnPGkODS/+Zywk1GC2hY2+nmUhwhClqRw9+mYcPFhK9ACdwPCTdK8Vs4I6lTsQMFXKLJL96V1bbes7fspfSrB2f5mZbrMN1B+GOU2OvkA1W7+rFDFVJxDWjV4rjVHlEFX8H1IVcNm0D45F1F5dAgMGiwo7RXka3rM/SWxiWkOINIFraeFYP4wf5mJC806i+3NNOx5wROve9XP2Z88/+Ol5vm0hu41Qdry3dYg7lTp1+RX5wavIxDSSgF9e5VZLTTj9WcZ8/r04nWTvRG5D1DFcznoPUTB3APhphE/b/wTuRz4uM+g2q0SrVt7UE/NYnQw2XGOaTu8MtFibwhvXZ//iLnChVhMMRVB6m54GMCr3YcUiOyNceqFTzx80+5W2MruuCEc/m3RBEzxzjttYHpPPxm/NY+Qmb9X1jwVeWUJkKE9fiKlCzWx3lEgpnWemB+JZUKvG1cbV/OgZDBIuHvx8aTYg7gMG3V0Do4tXQBHoPaHvomesp4efTppcYB2gpsFkZpRhjrCBjo5STfNUkFO6RuBi8y9VbeDXdtcbFwNptKDr3zqOGHK5KFhtSMEYxcA0E9CdGEznEMt1klW9QkDCNxD5EqCqX/IVUxhd9q2RIwb0HmUF3Qh/CMCTyZIPN2JYHcZRCPc8uCiET9i7jW++YnICKvt0X55CpWJgLdldtvn69slB8w++DSlIliWBDJG0MNNWrF84jOQY6DEMW/cigoBaQPgl/al8L02zq1q5pughZGZ+zLVrkUqQNTL3cK2KKf22UcfwwLy7uor6CorA7m96JSlwHVBqGjwYG/5LqPZ1C46sxkWrSMKbkKcd23AH+Jla/Xrz9tW5Erdc4iym2iQqZHIPTqRbXoVskzMuQ9pS8NS1pSflztpFy31+vo5idw7SlxISQ4bE1bKTsKCO+hCkGTMF2659Kh4yUwuZzfN0BzmCF8JQ0eFj3L1ejJX+D2Tq9jelqPNYD/j0306YnXNbyjH0/57DX5Cdul6hIWz9bWGaDMZi6V6xUz4dwCDfe4AOP/vpVjoIX2X7IFachUTyXjCR5Q34A==" diff --git a/NodeApp/.eslintignore b/NodeApp/.eslintignore new file mode 100644 index 0000000000000000000000000000000000000000..ecded56c0bd829718e46ffea13b1e3b6791c794e --- /dev/null +++ b/NodeApp/.eslintignore @@ -0,0 +1,3 @@ +dist +node_modules +.gitlab-ci \ No newline at end of file diff --git a/NodeApp/.eslintrc.json b/NodeApp/.eslintrc.json new file mode 100644 index 0000000000000000000000000000000000000000..be8c02d07111eec0c73437a65326e56150fda24d --- /dev/null +++ b/NodeApp/.eslintrc.json @@ -0,0 +1,11 @@ +{ + "root" : true, + "parser" : "@typescript-eslint/parser", + "plugins": [ + "@typescript-eslint" + ], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ] +} \ No newline at end of file diff --git a/NodeApp/.gitlab-ci/00_vars.yml b/NodeApp/.gitlab-ci/00_vars.yml index b2f058ad22a29824086741b5e0199b107a698ee7..642e2de4b7e2ad37e4cdb90bab91aa7676f34cf3 100644 --- a/NodeApp/.gitlab-ci/00_vars.yml +++ b/NodeApp/.gitlab-ci/00_vars.yml @@ -13,11 +13,7 @@ variables: PKG_EXTENSION_DEBIAN: '.deb' PKG_EXTENSION_MACOS: '.pkg' - PKG_BIN_NAME_DEBIAN: "${BIN_NAME}${PKG_EXTENSION_DEBIAN}" - PKG_BIN_NAME_MACOS: "${BIN_NAME}${PKG_EXTENSION_MACOS}" - BIN_EXTENSION_WINDOWS: '.exe' - BIN_NAME_WINDOWS: "${BIN_NAME}${BIN_EXTENSION_WINDOWS}" ARTIFACTS_FOLDER: /artifacts @@ -34,21 +30,8 @@ variables: BIN_FOLDER_WINDOWS_ARM64: $BIN_FOLDER_WINDOWS/arm64 BIN_FOLDER_WINDOWS_X64: $BIN_FOLDER_WINDOWS/x64 - BIN_FILE_MACOS_ARM64: $BIN_FOLDER_MACOS_ARM64/$BIN_NAME - BIN_FILE_MACOS_X64: $BIN_FOLDER_MACOS_X64/$BIN_NAME - BIN_FILE_LINUX_ARM64: $BIN_FOLDER_LINUX_ARM64/$BIN_NAME - BIN_FILE_LINUX_X64: $BIN_FOLDER_LINUX_X64/$BIN_NAME - BIN_FILE_WINDOWS_ARM64: $BIN_FOLDER_WINDOWS_ARM64/$BIN_NAME_WINDOWS - BIN_FILE_WINDOWS_X64: $BIN_FOLDER_WINDOWS_X64/$BIN_NAME_WINDOWS - - BIN_PKG_FILE_DEBIAN_ARM64: $BIN_FOLDER_LINUX_ARM64/$PKG_BIN_NAME_DEBIAN - BIN_PKG_FILE_DEBIAN_X64: $BIN_FOLDER_LINUX_X64/$PKG_BIN_NAME_DEBIAN - BIN_PKG_FILE_MACOS_ARM64: $BIN_FOLDER_MACOS_ARM64/$PKG_BIN_NAME_MACOS - BIN_PKG_FILE_MACOS_X64: $BIN_FOLDER_MACOS_X64/$PKG_BIN_NAME_MACOS - VERSION_FILE: $ARTIFACTS_FOLDER/VERSION VERSION_DEV_SUFFIX: '-dev' - - PACKAGE_REGISTRY_URL: "${GITLAB_API_PROJECT_URL}/packages/generic/${BIN_NAME}" + VERSION_TEST_SUFFIX: '-test' WIKI_FOLDER: Wiki \ No newline at end of file diff --git a/NodeApp/.gitlab-ci/01_functions.yml b/NodeApp/.gitlab-ci/01_functions.yml index 57b72e642b5194d76bb1a6176bd6a48ec9872b7f..b2c4f6185cde7e8074ef4c4c04f4798600f8e148 100644 --- a/NodeApp/.gitlab-ci/01_functions.yml +++ b/NodeApp/.gitlab-ci/01_functions.yml @@ -1,7 +1,39 @@ +.global_before_script: + script: + - !reference [ .get_vars, script ] + + +.get_vars: + script: + - IS_DEV=$([[ $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_COMMIT_BRANCH != "test" ]] && echo true || echo false) + - IS_TEST=$([[ $CI_COMMIT_BRANCH == "test" ]] && echo true || echo false) + - | + if [[ $IS_TEST == true ]]; then + BIN_NAME="dojo-test" + DOTENV_PROD_KEY=$DOTENV_TEST_KEY + fi + - PKG_BIN_NAME_DEBIAN="${BIN_NAME}${PKG_EXTENSION_DEBIAN}" + - PKG_BIN_NAME_MACOS="${BIN_NAME}${PKG_EXTENSION_MACOS}" + - BIN_NAME_WINDOWS="${BIN_NAME}${BIN_EXTENSION_WINDOWS}" + + - BIN_FILE_MACOS_ARM64=$BIN_FOLDER_MACOS_ARM64/$BIN_NAME + - BIN_FILE_MACOS_X64=$BIN_FOLDER_MACOS_X64/$BIN_NAME + - BIN_FILE_LINUX_ARM64=$BIN_FOLDER_LINUX_ARM64/$BIN_NAME + - BIN_FILE_LINUX_X64=$BIN_FOLDER_LINUX_X64/$BIN_NAME + - BIN_FILE_WINDOWS_ARM64=$BIN_FOLDER_WINDOWS_ARM64/$BIN_NAME_WINDOWS + - BIN_FILE_WINDOWS_X64=$BIN_FOLDER_WINDOWS_X64/$BIN_NAME_WINDOWS + + - BIN_PKG_FILE_DEBIAN_ARM64=$BIN_FOLDER_LINUX_ARM64/$PKG_BIN_NAME_DEBIAN + - BIN_PKG_FILE_DEBIAN_X64=$BIN_FOLDER_LINUX_X64/$PKG_BIN_NAME_DEBIAN + - BIN_PKG_FILE_MACOS_ARM64=$BIN_FOLDER_MACOS_ARM64/$PKG_BIN_NAME_MACOS + - BIN_PKG_FILE_MACOS_X64=$BIN_FOLDER_MACOS_X64/$PKG_BIN_NAME_MACOS + + - PACKAGE_REGISTRY_URL="${GITLAB_API_PROJECT_URL}/packages/generic/${BIN_NAME}" + + .get_version: script: - - IS_DEV=$([[ $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH ]] && echo false || echo true) - - VERSION=$(jq -r .version $PROJECT_FOLDER/package.json)$([[ $IS_DEV == true ]] && echo $VERSION_DEV_SUFFIX || echo '') + - VERSION=$(jq -r .version $PROJECT_FOLDER/package.json)$([[ $IS_TEST == true ]] && echo $VERSION_TEST_SUFFIX || echo '' )$([[ $IS_DEV == true ]] && echo $VERSION_DEV_SUFFIX || echo '') .get_last_stable_version: @@ -46,7 +78,7 @@ # Decrypt env vars for production - | - if [ $CI_COMMIT_REF_PROTECTED == "true" ]; then + if [ $CI_COMMIT_REF_PROTECTED == "true" || $IS_TEST == true ]; then echo "Decrypt production env vars" sed -i -r "s/(DOTENV_KEY[ ]*:[ ]*[\'\"\`])[^'\"\`]*([\'\"\`])([ ]*\,)?//g" src/app.ts sed -i -r "s/,[\ \n]*\}/\}/g" src/app.ts diff --git a/NodeApp/.gitlab-ci/03_stages.yml b/NodeApp/.gitlab-ci/03_stages.yml index c459c1651b62a43f93c894fd8b640bb8df071386..a4f35c98e9996baac154ed4eb7e62acb0c8ca65d 100644 --- a/NodeApp/.gitlab-ci/03_stages.yml +++ b/NodeApp/.gitlab-ci/03_stages.yml @@ -1,7 +1,11 @@ stages: + - code_quality - test - build - pkg_and_sign - clean - upload - - release \ No newline at end of file + - release + +before_script: + - !reference [ .global_before_script, script ] \ No newline at end of file diff --git a/NodeApp/.gitlab-ci/04_stageCodeQuality.yml b/NodeApp/.gitlab-ci/04_stageCodeQuality.yml new file mode 100644 index 0000000000000000000000000000000000000000..34da3c81104d02864ec17037861763c402d4fcf2 --- /dev/null +++ b/NodeApp/.gitlab-ci/04_stageCodeQuality.yml @@ -0,0 +1,12 @@ +code_quality:lint: + stage: code_quality + tags: + - code_quality + image: node:latest + script: + - cd "${PROJECT_FOLDER}" + + - npm install + - npm run lint + rules: + - if: '$CI_COMMIT_TAG =~ "/^$/"' \ No newline at end of file diff --git a/NodeApp/.gitlab-ci/04_stageTest.yml b/NodeApp/.gitlab-ci/05_stageTest.yml similarity index 69% rename from NodeApp/.gitlab-ci/04_stageTest.yml rename to NodeApp/.gitlab-ci/05_stageTest.yml index 6c87377ea87becfa1b5404aae476a1cc981c85a0..4ad14ed93070394c518b813fe93a51b7b71efa78 100644 --- a/NodeApp/.gitlab-ci/04_stageTest.yml +++ b/NodeApp/.gitlab-ci/05_stageTest.yml @@ -11,4 +11,4 @@ test:build: # Build - !reference [ .build_cli, script ] rules: - - if: '$CI_COMMIT_REF_PROTECTED != "true"' + - if: '$CI_COMMIT_TAG =~ "/^$/" && $CI_COMMIT_REF_PROTECTED != "true" && $CI_COMMIT_BRANCH != "test"' diff --git a/NodeApp/.gitlab-ci/05_stageBuild.yml b/NodeApp/.gitlab-ci/06_stageBuild.yml similarity index 84% rename from NodeApp/.gitlab-ci/05_stageBuild.yml rename to NodeApp/.gitlab-ci/06_stageBuild.yml index 2771ad328154f051d2b2356ce86715ff6b3e0f05..99e3dcf832b262481c11b17f3e34094bf0535f31 100644 --- a/NodeApp/.gitlab-ci/05_stageBuild.yml +++ b/NodeApp/.gitlab-ci/06_stageBuild.yml @@ -18,4 +18,4 @@ build:version: - $ARTIFACTS_FOLDER/* expire_in: 10 mins rules: - - if: '$CI_COMMIT_REF_PROTECTED == "true"' + - if: '$CI_COMMIT_REF_PROTECTED == "true" || $CI_COMMIT_BRANCH == "test"' diff --git a/NodeApp/.gitlab-ci/06_stagePkgAndSign.yml b/NodeApp/.gitlab-ci/06_stagePkgAndSign.yml deleted file mode 100644 index dfdc2bd0004724db8d53b42484432f7d5adadead..0000000000000000000000000000000000000000 --- a/NodeApp/.gitlab-ci/06_stagePkgAndSign.yml +++ /dev/null @@ -1,14 +0,0 @@ -pkg_and_sign:debian: - parallel: - matrix: - - ARCH: [ "arm64", "amd64" ] - before_script: - - BIN_FOLDER_DEBIAN_PKG_AND_SIGN=$([[ $ARCH == "arm64" ]] && echo ${BIN_FOLDER_LINUX_ARM64} || echo ${BIN_FOLDER_LINUX_X64}) - extends: .pkg_and_sign:debian - - -pkg_and_sign:macos: - parallel: - matrix: - - BIN_FOLDER_MACOS_PKG_AND_SIGN: [ "$BIN_FOLDER_MACOS_ARM64", "$BIN_FOLDER_MACOS_X64" ] - extends: .pkg_and_sign:macos \ No newline at end of file diff --git a/NodeApp/.gitlab-ci/07_stagePkgAndSign.yml b/NodeApp/.gitlab-ci/07_stagePkgAndSign.yml new file mode 100644 index 0000000000000000000000000000000000000000..64032c58e7903c16aba5c9564f0b1ae57ee7df3c --- /dev/null +++ b/NodeApp/.gitlab-ci/07_stagePkgAndSign.yml @@ -0,0 +1,48 @@ +pkg_and_sign:debian: + parallel: + matrix: + - ARCH: [ "arm64", "amd64" ] + before_script: + - !reference [ .global_before_script, script ] + - BIN_FOLDER_DEBIAN_PKG_AND_SIGN=$([[ $ARCH == "arm64" ]] && echo ${BIN_FOLDER_LINUX_ARM64} || echo ${BIN_FOLDER_LINUX_X64}) + extends: .pkg_and_sign:debian + + +pkg_and_sign:debian-test: + parallel: + matrix: + - ARCH: [ "arm64", "amd64" ] + before_script: + - !reference [ .global_before_script, script ] + - BIN_FOLDER_DEBIAN_PKG_AND_SIGN=$([[ $ARCH == "arm64" ]] && echo ${BIN_FOLDER_LINUX_ARM64} || echo ${BIN_FOLDER_LINUX_X64}) + extends: .pkg_and_sign:debian + artifacts: + expire_in: 2 weeks + rules: + - if: '$CI_COMMIT_BRANCH == "test"' + + +pkg_and_sign:macos: + parallel: + matrix: + - BIN_FOLDER_MACOS_PKG_AND_SIGN: [ "$BIN_FOLDER_MACOS_ARM64", "$BIN_FOLDER_MACOS_X64" ] + extends: .pkg_and_sign:macos + + +pkg_and_sign:macos-test: + parallel: + matrix: + - BIN_FOLDER_MACOS_PKG_AND_SIGN: [ "$BIN_FOLDER_MACOS_ARM64", "$BIN_FOLDER_MACOS_X64" ] + extends: .pkg_and_sign:macos + artifacts: + expire_in: 2 weeks + rules: + - if: '$CI_COMMIT_BRANCH == "test"' + + + + + + + + diff --git a/NodeApp/.gitlab-ci/07_stageClean.yml b/NodeApp/.gitlab-ci/08_stageClean.yml similarity index 100% rename from NodeApp/.gitlab-ci/07_stageClean.yml rename to NodeApp/.gitlab-ci/08_stageClean.yml diff --git a/NodeApp/.gitlab-ci/08_stageUpload.yml b/NodeApp/.gitlab-ci/09_stageUpload.yml similarity index 100% rename from NodeApp/.gitlab-ci/08_stageUpload.yml rename to NodeApp/.gitlab-ci/09_stageUpload.yml diff --git a/NodeApp/.gitlab-ci/09_stageRelease.yml b/NodeApp/.gitlab-ci/10_stageRelease.yml similarity index 100% rename from NodeApp/.gitlab-ci/09_stageRelease.yml rename to NodeApp/.gitlab-ci/10_stageRelease.yml diff --git a/NodeApp/.idea/jetbrainsConfiguration b/NodeApp/.idea/jetbrainsConfiguration index 4d703a2dd39ec0c2b71bbbbda8900588c4e360bd..ffc5d65f9f0f0e825688177425e526131aa84631 160000 --- a/NodeApp/.idea/jetbrainsConfiguration +++ b/NodeApp/.idea/jetbrainsConfiguration @@ -1 +1 @@ -Subproject commit 4d703a2dd39ec0c2b71bbbbda8900588c4e360bd +Subproject commit ffc5d65f9f0f0e825688177425e526131aa84631 diff --git a/NodeApp/.idea/jsLinters/eslint.xml b/NodeApp/.idea/jsLinters/eslint.xml new file mode 100644 index 0000000000000000000000000000000000000000..541945bb0819b8ff4a3dae9431632ebd10e6f98b --- /dev/null +++ b/NodeApp/.idea/jsLinters/eslint.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="EslintConfiguration"> + <option name="fix-on-save" value="true" /> + </component> +</project> \ No newline at end of file diff --git a/NodeApp/.idea/jsLinters/jshint.xml b/NodeApp/.idea/jsLinters/jshint.xml new file mode 100644 index 0000000000000000000000000000000000000000..93655fde02e4d1d5e76b1661cb2e59eaebe9c2bd --- /dev/null +++ b/NodeApp/.idea/jsLinters/jshint.xml @@ -0,0 +1,85 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="JSHintConfiguration" version="2.13.6" use-config-file="false"> + <option asi="false" /> + <option bitwise="true" /> + <option boss="false" /> + <option browser="true" /> + <option browserify="false" /> + <option camelcase="false" /> + <option couch="false" /> + <option curly="true" /> + <option debug="false" /> + <option devel="false" /> + <option dojo="false" /> + <option elision="false" /> + <option enforceall="false" /> + <option eqeqeq="true" /> + <option eqnull="false" /> + <option es3="false" /> + <option es5="false" /> + <option esnext="false" /> + <option evil="false" /> + <option expr="false" /> + <option forin="true" /> + <option freeze="false" /> + <option funcscope="false" /> + <option futurehostile="false" /> + <option gcl="false" /> + <option globalstrict="false" /> + <option immed="false" /> + <option iterator="false" /> + <option jasmine="false" /> + <option jquery="false" /> + <option lastsemic="false" /> + <option latedef="false" /> + <option laxbreak="false" /> + <option laxcomma="false" /> + <option loopfunc="false" /> + <option maxerr="50" /> + <option mocha="false" /> + <option module="false" /> + <option mootools="false" /> + <option moz="false" /> + <option multistr="false" /> + <option newcap="false" /> + <option noarg="true" /> + <option nocomma="false" /> + <option node="true" /> + <option noempty="true" /> + <option nomen="false" /> + <option nonbsp="false" /> + <option nonew="true" /> + <option nonstandard="false" /> + <option notypeof="false" /> + <option noyield="false" /> + <option onevar="false" /> + <option passfail="false" /> + <option phantom="false" /> + <option plusplus="false" /> + <option proto="false" /> + <option prototypejs="false" /> + <option qunit="false" /> + <option quotmark="false" /> + <option rhino="false" /> + <option scripturl="false" /> + <option shadow="false" /> + <option shelljs="false" /> + <option singleGroups="false" /> + <option smarttabs="false" /> + <option strict="true" /> + <option sub="false" /> + <option supernew="false" /> + <option trailing="false" /> + <option typed="false" /> + <option undef="true" /> + <option unused="false" /> + <option validthis="false" /> + <option varstmt="false" /> + <option white="false" /> + <option withstmt="false" /> + <option worker="false" /> + <option wsh="false" /> + <option yui="false" /> + </component> +</project> \ No newline at end of file diff --git a/NodeApp/package-lock.json b/NodeApp/package-lock.json index bed60a32df6a7f752acf5f8c5e5d9541ad70c8b2..ed153abcf0d2bf7fc6adaac6804de00f39edb7a4 100644 --- a/NodeApp/package-lock.json +++ b/NodeApp/package-lock.json @@ -1,49 +1,61 @@ { "name": "dojo_cli", - "version": "3.0.0", + "version": "3.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "dojo_cli", - "version": "3.0.0", + "version": "3.1.0", "license": "AGPLv3", "dependencies": { "ajv": "^8.12.0", "appdata-path": "^1.0.0", - "axios": "^1.4.0", + "axios": "^1.6.2", "boxen": "^5.1.2", "chalk": "^4.1.2", - "commander": "^11.0.0", + "commander": "^11.1.0", "dotenv": "^16.3.1", "dotenv-expand": "^10.0.0", - "fs-extra": "^11.1.1", - "http-status-codes": "^2.2.0", - "inquirer": "^8.2.5", + "fs-extra": "^11.2.0", + "http-status-codes": "^2.3.0", + "inquirer": "^8.2.6", "json5": "^2.2.3", "jsonwebtoken": "^8.5.1", "openurl": "^1.1.1", "ora": "^5.4.1", "tar-stream": "^3.1.6", - "winston": "^3.10.0", - "yaml": "^2.3.2" + "winston": "^3.11.0", + "yaml": "^2.3.4" }, "bin": { "dojo": "dist/app.js" }, "devDependencies": { - "@types/fs-extra": "^11.0.1", - "@types/inquirer": "^8.2.6", + "@types/fs-extra": "^11.0.4", + "@types/inquirer": "^8.2.10", "@types/jsonwebtoken": "^8.5.9", - "@types/node": "^18.17.2", - "@types/openurl": "^1.0.1", - "@types/tar-stream": "^2.2.2", + "@types/node": "^18.19.2", + "@types/openurl": "^1.0.3", + "@types/tar-stream": "^3.1.3", + "@typescript-eslint/eslint-plugin": "^6.13.2", + "@typescript-eslint/parser": "^6.13.2", "dotenv-vault": "^1.25.0", "genversion": "^3.1.1", "pkg": "^5.8.1", "tiny-typed-emitter": "^2.1.0", "ts-node": "^10.9.1", - "typescript": "^5.1.6" + "typescript": "^5.3.2" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/@babel/generator": { @@ -144,6 +156,157 @@ "kuler": "^2.0.0" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "dev": true, + "peer": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "peer": true + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "peer": true + }, + "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", + "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", + "dev": true, + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "peer": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true, + "peer": true + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -642,9 +805,9 @@ } }, "node_modules/@types/fs-extra": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.2.tgz", - "integrity": "sha512-c0hrgAOVYr21EX8J0jBMXGLMgJqVf/v6yxi0dLaJboW9aQPh16Id+z6w2Tx1hm+piJOLv8xPfVKZCLfjPw/IMQ==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", "dev": true, "dependencies": { "@types/jsonfile": "*", @@ -652,15 +815,21 @@ } }, "node_modules/@types/inquirer": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.6.tgz", - "integrity": "sha512-3uT88kxg8lNzY8ay2ZjP44DKcRaTGztqeIvN2zHvhzIBH/uAPaL75aBtdNRKbA7xXoMbBt5kX0M00VKAnfOYlA==", + "version": "8.2.10", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.10.tgz", + "integrity": "sha512-IdD5NmHyVjWM8SHWo/kPBgtzXatwPkfwzyP3fN1jF2g9BWt5WO+8hL2F4o2GKIYsU40PpqeevuUWvkS/roXJkA==", "dev": true, "dependencies": { "@types/through": "*", "rxjs": "^7.2.0" } }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, "node_modules/@types/jsonfile": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.2.tgz", @@ -680,24 +849,33 @@ } }, "node_modules/@types/node": { - "version": "18.18.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.3.tgz", - "integrity": "sha512-0OVfGupTl3NBFr8+iXpfZ8NR7jfFO+P1Q+IO/q0wbo02wYkP5gy36phojeYWpLQ6WAMjl+VfmqUk2YbUfp0irA==", - "dev": true + "version": "18.19.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.2.tgz", + "integrity": "sha512-6wzfBdbWpe8QykUkXBjtmO3zITA0A3FIjoy+in0Y2K4KrCiRhNYJIdwAPDffZ3G6GnaKaSLSEa9ZuORLfEoiwg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/openurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/openurl/-/openurl-1.0.1.tgz", - "integrity": "sha512-1XWIANTcgHenp3tboMdCiyzc2hBFfhf7Us2LHJ7X+kPiw648trTuV+lMsd0NUG3hv/44VM38r2vLYvtFpbc9sw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/openurl/-/openurl-1.0.3.tgz", + "integrity": "sha512-rdWpxNve8iUBizep3BwjGzcdfk2XeXeeFiMwIgLN6dAKxCusfFC6H9XVvfPeNObRFpSgqI+HVmoG7UOB9HEnBQ==", "dev": true, "dependencies": { "@types/node": "*" } }, + "node_modules/@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true + }, "node_modules/@types/tar-stream": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/tar-stream/-/tar-stream-2.2.3.tgz", - "integrity": "sha512-if3mugZfjVkXOMZdFjIHySxY13r6GXPpyOlsDmLffvyI7tLz9wXE8BFjNivXsvUeyJ1KNlOpfLnag+ISmxgxPw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/tar-stream/-/tar-stream-3.1.3.tgz", + "integrity": "sha512-Zbnx4wpkWBMBSu5CytMbrT5ZpMiF55qgM+EpHzR4yIDu7mv52cej8hTkOc6K+LzpkOAbxwn/m7j3iO+/l42YkQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -717,6 +895,202 @@ "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.3.tgz", "integrity": "sha512-6tOUG+nVHn0cJbVp25JFayS5UE6+xlbcNF9Lo9mU7U0zk3zeUShZied4YEQZjy1JBF043FSkdXw8YkUJuVtB5g==" }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.2.tgz", + "integrity": "sha512-3+9OGAWHhk4O1LlcwLBONbdXsAhLjyCFogJY/cWy2lxdVJ2JrcTF2pTGMaLl2AE7U1l31n8Py4a8bx5DLf/0dQ==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/type-utils": "6.13.2", + "@typescript-eslint/utils": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.2.tgz", + "integrity": "sha512-MUkcC+7Wt/QOGeVlM8aGGJZy1XV5YKjTpq9jK6r6/iLsGXhBVaGP5N0UYvFsu9BFlSpwY9kMretzdBH01rkRXg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/typescript-estree": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.2.tgz", + "integrity": "sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.2.tgz", + "integrity": "sha512-Qr6ssS1GFongzH2qfnWKkAQmMUyZSyOr0W54nZNU1MDfo+U4Mv3XveeLZzadc/yq8iYhQZHYT+eoXJqnACM1tw==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.13.2", + "@typescript-eslint/utils": "6.13.2", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.2.tgz", + "integrity": "sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.2.tgz", + "integrity": "sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.2.tgz", + "integrity": "sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/typescript-estree": "6.13.2", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.2.tgz", + "integrity": "sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.13.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "peer": true + }, "node_modules/acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", @@ -729,6 +1103,16 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -884,9 +1268,9 @@ } }, "node_modules/axios": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", - "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -1013,6 +1397,16 @@ "node": ">=0.10.0" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -1218,9 +1612,9 @@ } }, "node_modules/commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "engines": { "node": ">=16" } @@ -1307,6 +1701,13 @@ "node": ">=4.0.0" } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "peer": true + }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -1356,6 +1757,19 @@ "node": ">=8" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "peer": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dotenv": { "version": "16.3.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", @@ -1467,16 +1881,176 @@ "node": ">=6" } }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", + "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", + "dev": true, + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.53.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "peer": true + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "peer": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, + "peer": true + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "peer": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -1492,6 +2066,52 @@ "node": ">=4" } }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -1540,6 +2160,13 @@ "node": ">=8.6.0" } }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "peer": true + }, "node_modules/fast-levenshtein": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", @@ -1594,6 +2221,19 @@ "node": ">=0.8.0" } }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "peer": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -1654,6 +2294,45 @@ "parents": "^1.0.1" } }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "peer": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "dev": true, + "peer": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true, + "peer": true + }, "node_modules/fn.name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", @@ -1738,9 +2417,9 @@ "dev": true }, "node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -1750,6 +2429,13 @@ "node": ">=14.14" } }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "peer": true + }, "node_modules/genversion": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/genversion/-/genversion-3.1.1.tgz", @@ -1799,6 +2485,27 @@ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", "dev": true }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -1811,6 +2518,22 @@ "node": ">= 6" } }, + "node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -1836,6 +2559,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, + "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/has": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", @@ -1936,6 +2665,33 @@ "node": ">= 4" } }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "peer": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.19" + } + }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -1945,6 +2701,17 @@ "node": ">=8" } }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "peer": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -2089,6 +2856,16 @@ "node": ">=0.12.0" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-retry-allowed": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", @@ -2187,6 +2964,13 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "peer": true + }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -2198,6 +2982,13 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "peer": true + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -2268,11 +3059,51 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "peer": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "peer": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -2314,6 +3145,13 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "peer": true + }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -2530,6 +3368,12 @@ "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", "dev": true }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "node_modules/natural-orderby": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", @@ -2616,6 +3460,31 @@ "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==" }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "peer": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/optionator/node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "peer": true + }, "node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -2655,6 +3524,51 @@ "node": ">=8" } }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "peer": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "peer": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "peer": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parents": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", @@ -2687,6 +3601,26 @@ "cross-spawn": "^7.0.3" } }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -2840,6 +3774,16 @@ "node": ">=10" } }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -2974,6 +3918,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/resolve/node_modules/is-core-module": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", @@ -3008,6 +3962,22 @@ "node": ">=0.10.0" } }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -3386,6 +4356,13 @@ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "peer": true + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -3443,6 +4420,18 @@ "node": ">= 14.0.0" } }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -3503,6 +4492,19 @@ "node": "*" } }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -3515,9 +4517,9 @@ } }, "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -3527,6 +4529,12 @@ "node": ">=14.17" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -3605,11 +4613,11 @@ } }, "node_modules/winston": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.10.0.tgz", - "integrity": "sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz", + "integrity": "sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==", "dependencies": { - "@colors/colors": "1.5.0", + "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", "async": "^3.2.3", "is-stream": "^2.0.0", @@ -3638,6 +4646,14 @@ "node": ">= 6.4.0" } }, + "node_modules/winston/node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -3682,9 +4698,9 @@ "dev": true }, "node_modules/yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", "engines": { "node": ">= 14" } @@ -3724,6 +4740,19 @@ "engines": { "node": ">=6" } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/NodeApp/package.json b/NodeApp/package.json index ca7bf2f6e131618151c92063463583787f191a0a..7c04d071fb003ddb325faf249f38a7505e388bcc 100644 --- a/NodeApp/package.json +++ b/NodeApp/package.json @@ -1,7 +1,7 @@ { "name" : "dojo_cli", "description" : "CLI of the Dojo project", - "version" : "3.0.1", + "version" : "3.1.0", "license" : "AGPLv3", "author" : "Michaël Minelli <dojo@minelli.me>", "main" : "dist/app.js", @@ -26,43 +26,46 @@ }, "scripts" : { "dotenv:build": "npx dotenv-vault local build", + "lint" : "npx eslint .", "genversion" : "npx genversion -s -e src/config/Version.ts", "build" : "npm run genversion; npx tsc", - "start:dev" : "npm run genversion; npx ts-node src/app.ts", + "start:dev" : "npm run genversion; npm run lint; npx ts-node src/app.ts", "test" : "echo \"Error: no test specified\" && exit 1" }, "dependencies" : { "ajv" : "^8.12.0", "appdata-path" : "^1.0.0", - "axios" : "^1.4.0", + "axios" : "^1.6.2", "boxen" : "^5.1.2", "chalk" : "^4.1.2", - "commander" : "^11.0.0", + "commander" : "^11.1.0", "dotenv" : "^16.3.1", "dotenv-expand" : "^10.0.0", - "fs-extra" : "^11.1.1", - "http-status-codes": "^2.2.0", - "inquirer" : "^8.2.5", + "fs-extra" : "^11.2.0", + "http-status-codes": "^2.3.0", + "inquirer" : "^8.2.6", "json5" : "^2.2.3", "jsonwebtoken" : "^8.5.1", "openurl" : "^1.1.1", "ora" : "^5.4.1", "tar-stream" : "^3.1.6", - "winston" : "^3.10.0", - "yaml" : "^2.3.2" + "winston" : "^3.11.0", + "yaml" : "^2.3.4" }, "devDependencies": { - "@types/fs-extra" : "^11.0.1", - "@types/inquirer" : "^8.2.6", - "@types/jsonwebtoken": "^8.5.9", - "@types/node" : "^18.17.2", - "@types/openurl" : "^1.0.1", - "@types/tar-stream" : "^2.2.2", - "dotenv-vault" : "^1.25.0", - "genversion" : "^3.1.1", - "pkg" : "^5.8.1", - "tiny-typed-emitter" : "^2.1.0", - "ts-node" : "^10.9.1", - "typescript" : "^5.1.6" + "@types/fs-extra" : "^11.0.4", + "@types/inquirer" : "^8.2.10", + "@types/jsonwebtoken" : "^8.5.9", + "@types/node" : "^18.19.2", + "@types/openurl" : "^1.0.3", + "@types/tar-stream" : "^3.1.3", + "@typescript-eslint/eslint-plugin": "^6.13.2", + "@typescript-eslint/parser" : "^6.13.2", + "dotenv-vault" : "^1.25.0", + "genversion" : "^3.1.1", + "pkg" : "^5.8.1", + "tiny-typed-emitter" : "^2.1.0", + "ts-node" : "^10.9.1", + "typescript" : "^5.3.2" } } diff --git a/NodeApp/src/app.ts b/NodeApp/src/app.ts index 236e2d79bff4df0a07333e01c129ca008994c0cc..be01e40ef06b23244940be8b6e228a38344a74d3 100644 --- a/NodeApp/src/app.ts +++ b/NodeApp/src/app.ts @@ -1,11 +1,15 @@ // Read from the .env file -// ATTENTION : This lines MUST be the first of this file (except for the path import) -const path = require('node:path'); -const myEnv = require('dotenv').config({ - path : path.join(__dirname, '../.env'), - DOTENV_KEY: 'dotenv://:key_fc323d8e0a02349342f1c6a119bb38495958ce3a43a87d19a3f674b7e2896dcb@dotenv.local/vault/.env.vault?environment=development' - }); -require('dotenv-expand').expand(myEnv); +// ATTENTION : These lines MUST be the first of this file (except for the path import) +import path = require('node:path'); +import myEnv = require('dotenv'); +import dotenvExpand = require('dotenv-expand'); + + +dotenvExpand.expand(myEnv.config({ + path : path.join(__dirname, '../.env'), + DOTENV_KEY: 'dotenv://:key_fc323d8e0a02349342f1c6a119bb38495958ce3a43a87d19a3f674b7e2896dcb@dotenv.local/vault/.env.vault?environment=development' + })); + require('./shared/helpers/TypeScriptExtensions'); // ATTENTION : This line MUST be the second of this file @@ -15,4 +19,5 @@ import HttpManager from './managers/HttpManager'; HttpManager.registerAxiosInterceptor(); + new CommanderApp(); \ No newline at end of file diff --git a/NodeApp/src/commander/CommanderCommand.ts b/NodeApp/src/commander/CommanderCommand.ts index 7d2c2ccb1e9dd7be9ad3478f79664f08b848c4e7..b5fd5e7d363c8d9d8d16e6022b8529397685a4af 100644 --- a/NodeApp/src/commander/CommanderCommand.ts +++ b/NodeApp/src/commander/CommanderCommand.ts @@ -10,13 +10,13 @@ abstract class CommanderCommand { this.defineCommand(); this.defineSubCommands(); - }; + } protected abstract defineCommand(): void; protected defineSubCommands() {} - protected abstract commandAction(...args: Array<any>): Promise<void>; + protected abstract commandAction(...args: Array<unknown>): Promise<void>; } diff --git a/NodeApp/src/commander/assignment/AssignmentCommand.ts b/NodeApp/src/commander/assignment/AssignmentCommand.ts index d78a64aa54d0920f49377a029e7de78806b338d1..70f09e2ff18e17774067e71a3d6e773dbf201f18 100644 --- a/NodeApp/src/commander/assignment/AssignmentCommand.ts +++ b/NodeApp/src/commander/assignment/AssignmentCommand.ts @@ -20,7 +20,7 @@ class AssignmentCommand extends CommanderCommand { AssignmentUnpublishCommand.registerOnCommand(this.command); } - protected async commandAction(options: any): Promise<void> { } + protected async commandAction(): Promise<void> { } } diff --git a/NodeApp/src/commander/assignment/subcommands/AssignmentCheckCommand.ts b/NodeApp/src/commander/assignment/subcommands/AssignmentCheckCommand.ts index d46efaa66632054313f3bf246b419c280841287e..718b7b97d11a74390d2de9e53753566f8f8565b1 100644 --- a/NodeApp/src/commander/assignment/subcommands/AssignmentCheckCommand.ts +++ b/NodeApp/src/commander/assignment/subcommands/AssignmentCheckCommand.ts @@ -1,16 +1,11 @@ import CommanderCommand from '../../CommanderCommand'; import Config from '../../../config/Config'; import ora from 'ora'; -import util from 'util'; -import { exec } from 'child_process'; import chalk from 'chalk'; import AssignmentValidator from '../../../sharedByClients/helpers/Dojo/AssignmentValidator'; import ClientsSharedAssignmentHelper from '../../../sharedByClients/helpers/Dojo/ClientsSharedAssignmentHelper'; -const execAsync = util.promisify(exec); - - class AssignmentCheckCommand extends CommanderCommand { protected commandName: string = 'check'; @@ -76,13 +71,13 @@ class AssignmentCheckCommand extends CommanderCommand { } }); - assignmentValidator.events.on('finished', (success: boolean, exitCode: number) => { + assignmentValidator.events.on('finished', (success: boolean) => { success ? resolve() : reject(); }); assignmentValidator.run(true); }); - } catch ( error ) { } + } catch ( error ) { /* empty */ } ClientsSharedAssignmentHelper.displayExecutionResults(assignmentValidator, `The assignment is ready to be pushed.`, { INFO : chalk.bold, diff --git a/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts b/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts index 7a5bea4403c7e963a948ccc04c945ee17e35fa4d..623f9b64116a5229814aa481de7087914ed7b82d 100644 --- a/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts +++ b/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts @@ -22,7 +22,7 @@ class AssignmentCreateCommand extends CommanderCommand { .action(this.commandAction.bind(this)); } - protected async commandAction(options: any): Promise<void> { + protected async commandAction(options: { name: string, template?: string, members_id?: Array<number>, members_username?: Array<string> }): Promise<void> { let members!: Array<GitlabUser> | false; let templateIdOrNamespace: string | null = null; diff --git a/NodeApp/src/commander/exercise/ExerciseCommand.ts b/NodeApp/src/commander/exercise/ExerciseCommand.ts index bc122a864f7cc7fd9b32c00879b4427cdaae67e6..a475d4f91bf8d7a39bf74acc7c131cf32b7564f4 100644 --- a/NodeApp/src/commander/exercise/ExerciseCommand.ts +++ b/NodeApp/src/commander/exercise/ExerciseCommand.ts @@ -16,7 +16,7 @@ class ExerciseCommand extends CommanderCommand { ExerciseRunCommand.registerOnCommand(this.command); } - protected async commandAction(options: any): Promise<void> { } + protected async commandAction(): Promise<void> { } } diff --git a/NodeApp/src/commander/exercise/subcommands/ExerciseCreateCommand.ts b/NodeApp/src/commander/exercise/subcommands/ExerciseCreateCommand.ts index 5b547df82b9c26433806d861a5ae5f7da581a8c7..9660a3e753c67c3e2c590c39cef4adae763a3e9f 100644 --- a/NodeApp/src/commander/exercise/subcommands/ExerciseCreateCommand.ts +++ b/NodeApp/src/commander/exercise/subcommands/ExerciseCreateCommand.ts @@ -21,7 +21,7 @@ class ExerciseCreateCommand extends CommanderCommand { .action(this.commandAction.bind(this)); } - protected async commandAction(options: any): Promise<void> { + protected async commandAction(options: { assignment: string, members_id?: Array<number>, members_username?: Array<string> }): Promise<void> { let members!: Array<GitlabUser> | false; let assignment!: Assignment | undefined; diff --git a/NodeApp/src/commander/exercise/subcommands/ExerciseRunCommand.ts b/NodeApp/src/commander/exercise/subcommands/ExerciseRunCommand.ts index e10f030ee540b0170c11113ad5c231566dc1c99f..cc139fe0a399909a51bee3a976d2d8debf2d5fce 100644 --- a/NodeApp/src/commander/exercise/subcommands/ExerciseRunCommand.ts +++ b/NodeApp/src/commander/exercise/subcommands/ExerciseRunCommand.ts @@ -188,13 +188,13 @@ class ExerciseRunCommand extends CommanderCommand { } }); - exerciseDockerCompose.events.on('finished', (success: boolean, exitCode: number) => { + exerciseDockerCompose.events.on('finished', (success: boolean) => { success ? resolve() : reject(); }); exerciseDockerCompose.run(true); }); - } catch ( error ) { } + } catch ( error ) { /* empty */ } fs.rmSync(composeOverridePath, { force: true }); fs.writeFileSync(this.fileComposeLogs, exerciseDockerCompose.allLogs); diff --git a/NodeApp/src/commander/session/SessionCommand.ts b/NodeApp/src/commander/session/SessionCommand.ts index bbf0374ee9617ccc44e4463bd84554db2f8d4aa7..6dff026f2eae88717b4ca3bebe53f2db8025e749 100644 --- a/NodeApp/src/commander/session/SessionCommand.ts +++ b/NodeApp/src/commander/session/SessionCommand.ts @@ -18,7 +18,7 @@ class SessionCommand extends CommanderCommand { SessionTestCommand.registerOnCommand(this.command); } - protected async commandAction(options: any): Promise<void> { } + protected async commandAction(): Promise<void> { } } diff --git a/NodeApp/src/commander/session/subcommands/SessionLoginCommand.ts b/NodeApp/src/commander/session/subcommands/SessionLoginCommand.ts index 53610a2fab179d5577f373cce51f3633209464df..d9061e261f67f35104d1836d75cc78adea55dbc1 100644 --- a/NodeApp/src/commander/session/subcommands/SessionLoginCommand.ts +++ b/NodeApp/src/commander/session/subcommands/SessionLoginCommand.ts @@ -17,9 +17,7 @@ class SessionLoginCommand extends CommanderCommand { try { console.log(chalk.cyan('Please wait while we login you into Dojo...')); await SessionManager.login(options.cli); - } catch ( error ) { - - } + } catch ( error ) { /* empty */ } } } diff --git a/NodeApp/src/commander/session/subcommands/SessionLogoutCommand.ts b/NodeApp/src/commander/session/subcommands/SessionLogoutCommand.ts index e0c7bb374c5138cd01ee3fd08db04d38e1e6472c..e71d882d4935b8b3f8cc1b4f248a2a3d9ae6ab33 100644 --- a/NodeApp/src/commander/session/subcommands/SessionLogoutCommand.ts +++ b/NodeApp/src/commander/session/subcommands/SessionLogoutCommand.ts @@ -14,7 +14,7 @@ class SessionLogoutCommand extends CommanderCommand { .action(this.commandAction.bind(this)); } - protected async commandAction(options: any): Promise<void> { + protected async commandAction(options: { force: boolean }): Promise<void> { if ( !options.force ) { const confirm: boolean = (await inquirer.prompt({ name : 'confirm', diff --git a/NodeApp/src/config/LocalConfigFile.ts b/NodeApp/src/config/LocalConfigFile.ts index 33cabe255728f5c990ceab23a4143fb0271877ed..c69c89c71a67fc2ff100c28c6e8b38987c0686a2 100644 --- a/NodeApp/src/config/LocalConfigFile.ts +++ b/NodeApp/src/config/LocalConfigFile.ts @@ -10,7 +10,7 @@ class LocalConfigFile { return `${ Config.localConfig.folder }/${ this.filename }`; } - private _config: { [key: string]: any } = {}; + private _config: { [key: string]: unknown } = {}; loadConfig() { if ( !fs.existsSync(this.configPath) ) { @@ -26,7 +26,7 @@ class LocalConfigFile { } } - getParam(key: string): any | null { + getParam(key: string): unknown | null { const value = key in this._config ? this._config[key] : null; if ( value === null ) { return null; @@ -37,8 +37,8 @@ class LocalConfigFile { } } - setParam(key: string, value: any): void { - let previousValue = this.getParam(key); + setParam(key: string, value: unknown): void { + const previousValue = this.getParam(key); if ( JSON5.stringify(previousValue) === JSON5.stringify(value) ) { return; } diff --git a/NodeApp/src/helpers/AccessesHelper.ts b/NodeApp/src/helpers/AccessesHelper.ts index 0327ed2ddc644e485460ec3903df3d74219ba70b..e49e5819e59c74042fb5f23f79ace5587ae128c3 100644 --- a/NodeApp/src/helpers/AccessesHelper.ts +++ b/NodeApp/src/helpers/AccessesHelper.ts @@ -4,7 +4,7 @@ import GitlabManager from '../managers/GitlabManager'; class AccessesHelper { async checkStudent(): Promise<boolean> { - let sessionResult = await SessionManager.testSession(true, [ 'student' ]); + const sessionResult = await SessionManager.testSession(true, [ 'student' ]); if ( !sessionResult ) { return false; @@ -14,7 +14,7 @@ class AccessesHelper { } async checkTeachingStaff(): Promise<boolean> { - let sessionResult = await SessionManager.testSession(true, [ 'teachingStaff' ]); + const sessionResult = await SessionManager.testSession(true, [ 'teachingStaff' ]); if ( !sessionResult || !sessionResult.teachingStaff ) { return false; @@ -22,6 +22,6 @@ class AccessesHelper { return (await GitlabManager.testToken(true)).every(result => result); } -}; +} export default new AccessesHelper(); \ No newline at end of file diff --git a/NodeApp/src/managers/DojoBackendManager.ts b/NodeApp/src/managers/DojoBackendManager.ts index 42bda3fa67ec31b4f9be6bba3e5da406c8f8224e..d3711009cf433867a339eb495161397d895a0fd4 100644 --- a/NodeApp/src/managers/DojoBackendManager.ts +++ b/NodeApp/src/managers/DojoBackendManager.ts @@ -107,7 +107,7 @@ class DojoBackendManager { if ( error.response.status === StatusCodes.CONFLICT ) { spinner.fail(`The assignment name is already used. Please choose another one.`); } else { - if ( (error.response.data as DojoBackendResponse<any>).code === DojoStatusCode.ASSIGNMENT_CREATION_GITLAB_ERROR ) { + if ( (error.response.data as DojoBackendResponse<unknown>).code === DojoStatusCode.ASSIGNMENT_CREATION_GITLAB_ERROR ) { spinner.fail(`Assignment creation error: An unknown error occurred while creating the assignment on Gitlab. Please try again later or contact an administrator.`); } else { spinner.fail(`Assignment creation error: An unknown error occurred while creating the assignment on Dojo server. Please try again later or contact an administrator.`); @@ -145,7 +145,7 @@ class DojoBackendManager { if ( error.response.status === StatusCodes.CONFLICT ) { spinner.fail(`You've already reached the max number of exercise of this assignment.`); } else { - if ( (error.response.data as DojoBackendResponse<any>).code === DojoStatusCode.EXERCISE_CREATION_GITLAB_ERROR ) { + if ( (error.response.data as DojoBackendResponse<unknown>).code === DojoStatusCode.EXERCISE_CREATION_GITLAB_ERROR ) { spinner.fail(`Exercise creation error: An unknown error occurred while creating the exercise on Gitlab. Please try again later or contact an administrator.`); } else { spinner.fail(`Exercise creation error: An unknown error occurred while creating the exercise on Dojo server. Please try again later or contact an administrator.`); diff --git a/NodeApp/src/managers/GitlabManager.ts b/NodeApp/src/managers/GitlabManager.ts index 6562ad9980914e02cb7ef3b67b96cd85342e0748..67de5c9dad4cfe101e7c270410bd80448b9e727e 100644 --- a/NodeApp/src/managers/GitlabManager.ts +++ b/NodeApp/src/managers/GitlabManager.ts @@ -1,8 +1,9 @@ -import axios from 'axios'; -import ora from 'ora'; -import GitlabUser from '../shared/types/Gitlab/GitlabUser'; -import GitlabRoute from '../shared/types/Gitlab/GitlabRoute'; -import SharedConfig from '../shared/config/SharedConfig'; +import axios from 'axios'; +import ora from 'ora'; +import GitlabUser from '../shared/types/Gitlab/GitlabUser'; +import GitlabRoute from '../shared/types/Gitlab/GitlabRoute'; +import SharedConfig from '../shared/config/SharedConfig'; +import GitlabRepository from '../shared/types/Gitlab/GitlabRepository'; class GitlabManager { @@ -15,7 +16,7 @@ class GitlabManager { ora('Checking Gitlab token: ').start().info(); } - let result: [ boolean, boolean ] = [ false, false ]; + const result: [ boolean, boolean ] = [ false, false ]; type NotificationSettings = { level: string } @@ -84,7 +85,7 @@ class GitlabManager { return axios.get(this.getApiUrl(GitlabRoute.NOTIFICATION_SETTINGS)); } - public setNotificationSettings(newSettings: any) { + public setNotificationSettings(newSettings: Record<string, string>) { return axios.put(this.getApiUrl(GitlabRoute.NOTIFICATION_SETTINGS), { params: new URLSearchParams(newSettings) }); } @@ -98,7 +99,7 @@ class GitlabManager { if ( verbose ) { spinner.start(); } - const params: any = {}; + const params: { [key: string]: unknown } = {}; params[paramName] = param; const user = await axios.get<Array<GitlabUser>>(this.getApiUrl(GitlabRoute.USERS_GET), { params: params }); @@ -128,19 +129,19 @@ class GitlabManager { return await this.getGitlabUsers(usernames, 'search', verbose, verboseIndent); } - public async getRepository(repoId: number): Promise<any> { + public async getRepository(repoId: number): Promise<GitlabRepository> { return await axios.get(this.getApiUrl(GitlabRoute.REPOSITORY_GET).replace('{{id}}', repoId.toString())); } - public async fetchMembers(options: any): Promise<Array<GitlabUser> | false> { + public async fetchMembers(options: { members_id?: Array<number>, members_username?: Array<string> }): Promise<Array<GitlabUser> | false> { if ( options.members_id || options.members_username ) { ora('Checking Gitlab members:').start().info(); } let members: Array<GitlabUser> = []; - async function getMembers<T>(context: any, functionName: string, paramsToSearch: Array<T>): Promise<boolean> { - const result = await (context[functionName] as (arg: Array<T>, verbose: boolean, verboseIndent: number) => Promise<Array<GitlabUser | undefined>>)(paramsToSearch, true, 8); + async function getMembers<T>(context: unknown, functionName: string, paramsToSearch: Array<T>): Promise<boolean> { + const result = await ((context as { [functionName: string]: (arg: Array<T>, verbose: boolean, verboseIndent: number) => Promise<Array<GitlabUser | undefined>> })[functionName])(paramsToSearch, true, 8); if ( result.every(user => user) ) { members = members.concat(result as Array<GitlabUser>); diff --git a/NodeApp/src/managers/HttpManager.ts b/NodeApp/src/managers/HttpManager.ts index e90f666c4967739d857af9a604a39ca0e82fad34..a0f54387fe3c53b166aa9b8a14f8c44a0071edcd 100644 --- a/NodeApp/src/managers/HttpManager.ts +++ b/NodeApp/src/managers/HttpManager.ts @@ -1,14 +1,14 @@ -import axios, { AxiosRequestHeaders } from 'axios'; -import SessionManager from './SessionManager'; -import FormData from 'form-data'; -import { StatusCodes } from 'http-status-codes'; -import ClientsSharedConfig from '../sharedByClients/config/ClientsSharedConfig'; -import { version } from '../config/Version'; -import DojoBackendResponse from '../shared/types/Dojo/DojoBackendResponse'; -import DojoStatusCode from '../shared/types/Dojo/DojoStatusCode'; -import boxen from 'boxen'; -import Config from '../config/Config'; -import SharedConfig from '../shared/config/SharedConfig'; +import axios, { AxiosError, AxiosRequestHeaders } from 'axios'; +import SessionManager from './SessionManager'; +import FormData from 'form-data'; +import { StatusCodes } from 'http-status-codes'; +import ClientsSharedConfig from '../sharedByClients/config/ClientsSharedConfig'; +import { version } from '../config/Version'; +import DojoBackendResponse from '../shared/types/Dojo/DojoBackendResponse'; +import DojoStatusCode from '../shared/types/Dojo/DojoStatusCode'; +import boxen from 'boxen'; +import Config from '../config/Config'; +import SharedConfig from '../shared/config/SharedConfig'; class HttpManager { @@ -84,17 +84,19 @@ class HttpManager { await SessionManager.refreshTokens(); return axios(originalConfig); - } catch ( _error: any ) { - if ( _error.response && _error.response.data ) { - return Promise.reject(_error.response.data); + } catch ( error: unknown ) { + if ( error instanceof AxiosError ) { + if ( error.response && error.response.data ) { + return Promise.reject(error.response.data); + } } - return Promise.reject(_error); + return Promise.reject(error); } } if ( error.response.status === StatusCodes.METHOD_NOT_ALLOWED && isFromApi && error.response.data ) { - const data: DojoBackendResponse<{}> = error.response.data; + const data: DojoBackendResponse<void> = error.response.data; switch ( data.code ) { case DojoStatusCode.CLIENT_NOT_SUPPORTED: diff --git a/NodeApp/src/managers/SessionManager.ts b/NodeApp/src/managers/SessionManager.ts index 580b6d854da7fa201243682ee8cd126aff84e8af..9bbd640f523b04e530b5fcaadf591ee2b208e6e0 100644 --- a/NodeApp/src/managers/SessionManager.ts +++ b/NodeApp/src/managers/SessionManager.ts @@ -36,7 +36,7 @@ class LoginServer { }; if ( req.url?.match(Config.login.server.route) ) { - let urlParts = req.url.split('='); + const urlParts = req.url.split('='); if ( urlParts.length > 0 ) { this.events.emit('code', urlParts[1]); @@ -84,7 +84,7 @@ class SessionManager { } get apiToken(): string { - const apisToken = this.configFile.getParam(LocalConfigKeys.APIS_TOKEN); + const apisToken = this.configFile.getParam(LocalConfigKeys.APIS_TOKEN) as null | { [key: string]: string }; if ( apisToken !== null && ClientsSharedConfig.apiURL in apisToken ) { return apisToken[ClientsSharedConfig.apiURL]; @@ -94,7 +94,7 @@ class SessionManager { } set apiToken(token: string) { - let apisToken = this.configFile.getParam(LocalConfigKeys.APIS_TOKEN); + let apisToken = this.configFile.getParam(LocalConfigKeys.APIS_TOKEN) as null | { [key: string]: string }; if ( apisToken === null ) { apisToken = {}; } @@ -113,7 +113,7 @@ class SessionManager { } get gitlabCredentials(): DojoGitlabCredentials { - return this.configFile.getParam(LocalConfigKeys.GITLAB); + return this.configFile.getParam(LocalConfigKeys.GITLAB) as DojoGitlabCredentials; } set gitlabCredentials(credentials: DojoGitlabCredentials) { @@ -216,10 +216,10 @@ class SessionManager { gitlabCode = await this.getGitlabCodeFromHeadlessEnvironment(); } - let gitlabTokensSpinner = ora({ - text : 'Retrieving gitlab tokens', - indent: 4 - }).start(); + const gitlabTokensSpinner = ora({ + text : 'Retrieving gitlab tokens', + indent: 4 + }).start(); let gitlabTokens: GitlabToken; try { gitlabTokens = await SharedGitlabManager.getTokens(gitlabCode); @@ -239,10 +239,10 @@ class SessionManager { } ora(`Login to Dojo backend:`).start().info(); - let dojoLoginSpinner = ora({ - text : 'Login to Dojo backend', - indent: 4 - }).start(); + const dojoLoginSpinner = ora({ + text : 'Login to Dojo backend', + indent: 4 + }).start(); try { await DojoBackendManager.login(gitlabTokens); @@ -256,7 +256,7 @@ class SessionManager { } async refreshTokens() { - let gitlabTokens = await DojoBackendManager.refreshTokens(this.gitlabCredentials.refreshToken!); + const gitlabTokens = await DojoBackendManager.refreshTokens(this.gitlabCredentials.refreshToken!); this.gitlabCredentials = { refreshToken: gitlabTokens.refresh_token, @@ -274,7 +274,7 @@ class SessionManager { checkPermissions(verbose: boolean = true, indent: number = 8, checkPermissions: Array<string> | null = []): Permissions { const hasPermission = (permissionPredicate: () => boolean, verboseText: string): boolean => { - let isAllowed: boolean = this.profile !== undefined && permissionPredicate(); + const isAllowed: boolean = this.profile !== undefined && permissionPredicate(); if ( verbose ) { const spinner: ora.Ora = ora({ diff --git a/NodeApp/src/shared b/NodeApp/src/shared index 4a5eb68209ae9204b6d4cc8020bd62cf6a5be989..101cc26895eb0b5fe97e03bb96039e0cddd94391 160000 --- a/NodeApp/src/shared +++ b/NodeApp/src/shared @@ -1 +1 @@ -Subproject commit 4a5eb68209ae9204b6d4cc8020bd62cf6a5be989 +Subproject commit 101cc26895eb0b5fe97e03bb96039e0cddd94391