diff --git a/CHANGELOG.md b/CHANGELOG.md index e50720ff721a8d8944a84da86489a0e3c3497cb6..1fdfe2d6bc24e1244fd7c367172db7e2267a1e1f 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.2.0 (???) + +## 3.3.0 (???) + +### ✨ Feature +- **CLI**: Show an information message when a new version of the CLI is available (and not required) + +### 🐛 Bugfix +- Fix an error when providing template for assignment creation + + +## 3.2.0 (2023-12-19) ### 🤏 Minor change - **Exercices**: Set names of students in exercise name in alphabetical order diff --git a/ExpressAPI/.env.vault b/ExpressAPI/.env.vault index 5d19782892be2d4b206459481dc142f69aebb60d..310bae9422161a920952c84428b8aa8ef0e432ab 100644 --- a/ExpressAPI/.env.vault +++ b/ExpressAPI/.env.vault @@ -4,11 +4,11 @@ #/--------------------------------------------------/ # development -DOTENV_VAULT_DEVELOPMENT="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" +DOTENV_VAULT_DEVELOPMENT="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" # production -DOTENV_VAULT_PRODUCTION="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" +DOTENV_VAULT_PRODUCTION="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" # test -DOTENV_VAULT_TEST="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" +DOTENV_VAULT_TEST="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" diff --git a/ExpressAPI/assets/OpenAPI/OpenAPI.yaml b/ExpressAPI/assets/OpenAPI/OpenAPI.yaml index 06c62978c2208dbe211875b1eba9227f3808a4ef..11dfb660040c8790d33da706ee86b3ea635a6aad 100644 --- a/ExpressAPI/assets/OpenAPI/OpenAPI.yaml +++ b/ExpressAPI/assets/OpenAPI/OpenAPI.yaml @@ -1,7 +1,7 @@ openapi: 3.1.0 info: title: Dojo API - version: 3.2.0 + version: 3.3.0 description: | **Backend API of the Dojo project.** diff --git a/ExpressAPI/assets/assignment_gitlab_ci.yml b/ExpressAPI/assets/assignment_gitlab_ci.yml index ad20a046e037406773064a11f934ebcf69e42f77..523f7c5f731e63540d3d1a928625600b3e56796f 100644 --- a/ExpressAPI/assets/assignment_gitlab_ci.yml +++ b/ExpressAPI/assets/assignment_gitlab_ci.yml @@ -18,7 +18,7 @@ dojo: tags: - dojo_assignment services: - - docker:dind + - docker:docker:24.0.6-dind image: name: dojohesso/dojo_assignment_checker:latest script: diff --git a/ExpressAPI/assets/exercise_gitlab_ci.yml b/ExpressAPI/assets/exercise_gitlab_ci.yml index f658fa51d5b7dd40f4506c417c52da0e6acef99d..27c2bd7e0042707a78822c7815ac2e1cd42dfdf0 100644 --- a/ExpressAPI/assets/exercise_gitlab_ci.yml +++ b/ExpressAPI/assets/exercise_gitlab_ci.yml @@ -18,7 +18,7 @@ dojo: tags: - dojo_exercise services: - - docker:dind + - docker:24.0.6-dind image: name: dojohesso/dojo_exercise_checker:latest script: diff --git a/ExpressAPI/package-lock.json b/ExpressAPI/package-lock.json index 7f4321f0646fcdf72220861400cb3bf2dc221dc2..1366d30570499f2c7d25230f52d9dedd9ed7c78b 100644 --- a/ExpressAPI/package-lock.json +++ b/ExpressAPI/package-lock.json @@ -1,17 +1,16 @@ { "name": "dojo_backend_api", - "version": "3.2.0", + "version": "3.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "dojo_backend_api", - "version": "3.2.0", + "version": "3.3.0", "license": "AGPLv3", "dependencies": { - "@prisma/client": "^5.6.0", - "ajv": "^8.12.0", - "axios": "^1.6.2", + "@prisma/client": "^5.8.1", + "axios": "^1.6.5", "compression": "^1.7.4", "cors": "^2.8.5", "dotenv": "^16.3.1", @@ -32,32 +31,34 @@ "swagger-ui-express": "^5.0.0", "tar-stream": "^3.1.6", "uuid": "^9.0.1", - "winston": "^3.11.0" + "winston": "^3.11.0", + "zod": "^3.22.4", + "zod-validation-error": "^3.0.0" }, "devDependencies": { - "@redocly/cli": "^1.5.0", + "@redocly/cli": "^1.6.0", "@types/compression": "^1.7.5", "@types/cors": "^2.8.17", "@types/express": "^4.17.21", "@types/jsonwebtoken": "^9.0.5", "@types/morgan": "^1.9.9", "@types/multer": "^1.4.11", - "@types/node": "^20.10.3", + "@types/node": "^20.11.5", "@types/parse-link-header": "^2.0.3", "@types/semver": "^7.5.6", "@types/swagger-ui-express": "^4.1.6", "@types/tar-stream": "^3.1.3", "@types/uuid": "^9.0.7", - "@typescript-eslint/eslint-plugin": "^6.13.2", - "@typescript-eslint/parser": "^6.13.2", + "@typescript-eslint/eslint-plugin": "^6.18.1", + "@typescript-eslint/parser": "^6.18.1", "dotenv-cli": "^7.3.0", "dotenv-vault": "^1.25.0", - "genversion": "^3.1.1", - "nodemon": "^3.0.2", - "npm": "^10.2.4", - "prisma": "^5.6.0", - "ts-node": "^10.9.1", - "typescript": "^5.3.2" + "genversion": "^3.2.0", + "nodemon": "^3.0.3", + "npm": "^10.3.0", + "prisma": "^5.8.1", + "ts-node": "^10.9.2", + "typescript": "^5.3.3" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -71,9 +72,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz", - "integrity": "sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", + "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -128,9 +129,9 @@ "dev": true }, "node_modules/@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", + "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==", "dev": true }, "node_modules/@eslint-community/eslint-utils": { @@ -181,23 +182,6 @@ "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/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -209,13 +193,6 @@ "concat-map": "0.0.1" } }, - "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/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -230,9 +207,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", - "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true, "peer": true, "engines": { @@ -246,14 +223,14 @@ "dev": true }, "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==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "peer": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -299,9 +276,9 @@ } }, "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==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true, "peer": true }, @@ -752,13 +729,10 @@ } }, "node_modules/@prisma/client": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.6.0.tgz", - "integrity": "sha512-mUDefQFa1wWqk4+JhKPYq8BdVoFk9NFMBXUI8jAkBfQTtgx8WPx02U2HB/XbAz3GSUJpeJOKJQtNvaAIDs6sug==", + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.8.1.tgz", + "integrity": "sha512-xQtMPfbIwLlbm0VVIVQY2yqQVOxPwRQhvIp7Z3m2900g1bu/zRHKhYZJQWELqmjl6d8YwBy0K2NvMqh47v1ubw==", "hasInstallScript": true, - "dependencies": { - "@prisma/engines-version": "5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee" - }, "engines": { "node": ">=16.13" }, @@ -771,17 +745,50 @@ } } }, + "node_modules/@prisma/debug": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.8.1.tgz", + "integrity": "sha512-tjuw7eA0Us3T42jx9AmAgL58rzwzpFGYc3R7Y4Ip75EBYrKMBA1YihuWMcBC92ILmjlQ/u3p8VxcIE0hr+fZfg==", + "devOptional": true + }, "node_modules/@prisma/engines": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.6.0.tgz", - "integrity": "sha512-Mt2q+GNJpU2vFn6kif24oRSBQv1KOkYaterQsi0k2/lA+dLvhRX6Lm26gon6PYHwUM8/h8KRgXIUMU0PCLB6bw==", + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.8.1.tgz", + "integrity": "sha512-TJgYLRrZr56uhqcXO4GmP5be+zjCIHtLDK20Cnfg+o9d905hsN065QOL+3Z0zQAy6YD31Ol4u2kzSfRmbJv/uA==", "devOptional": true, - "hasInstallScript": true + "hasInstallScript": true, + "dependencies": { + "@prisma/debug": "5.8.1", + "@prisma/engines-version": "5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2", + "@prisma/fetch-engine": "5.8.1", + "@prisma/get-platform": "5.8.1" + } }, "node_modules/@prisma/engines-version": { - "version": "5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee.tgz", - "integrity": "sha512-UoFgbV1awGL/3wXuUK3GDaX2SolqczeeJ5b4FVec9tzeGbSWJboPSbT0psSrmgYAKiKnkOPFSLlH6+b+IyOwAw==" + "version": "5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2.tgz", + "integrity": "sha512-f5C3JM3l9yhGr3cr4FMqWloFaSCpNpMi58Om22rjD2DOz3owci2mFdFXMgnAGazFPKrCbbEhcxdsRfspEYRoFQ==", + "devOptional": true + }, + "node_modules/@prisma/fetch-engine": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.8.1.tgz", + "integrity": "sha512-+bgjjoSFa6uYEbAPlklfoVSStOEfcpheOjoBoNsNNSQdSzcwE2nM4Q0prun0+P8/0sCHo18JZ9xqa8gObvgOUw==", + "devOptional": true, + "dependencies": { + "@prisma/debug": "5.8.1", + "@prisma/engines-version": "5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2", + "@prisma/get-platform": "5.8.1" + } + }, + "node_modules/@prisma/get-platform": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.8.1.tgz", + "integrity": "sha512-wnA+6HTFcY+tkykMokix9GiAkaauPC5W/gg0O5JB0J8tCTNWrqpnQ7AsaGRfkYUbeOIioh6woDjQrGTTRf1Zag==", + "devOptional": true, + "dependencies": { + "@prisma/debug": "5.8.1" + } }, "node_modules/@redocly/ajv": { "version": "8.11.0", @@ -800,12 +807,12 @@ } }, "node_modules/@redocly/cli": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@redocly/cli/-/cli-1.5.0.tgz", - "integrity": "sha512-2E6yhYIs/dj6pFM9ahzuyI4AzFOjmOK1dkwYCtTWT1w5kROlW4HVVgHrxnOIUupRDTD5TdScWSH28n2U1VivWQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@redocly/cli/-/cli-1.6.0.tgz", + "integrity": "sha512-0naVFJGR2tVcpMIHSFRr2HAoyy70qMqDAP6kXcnOdkGkwLRJ8s/5n1STwsym/yZwNkhrt2M0cKT6KAMlTUeCeg==", "dev": true, "dependencies": { - "@redocly/openapi-core": "1.5.0", + "@redocly/openapi-core": "1.6.0", "chokidar": "^3.5.1", "colorette": "^1.2.0", "core-js": "^3.32.1", @@ -832,9 +839,9 @@ } }, "node_modules/@redocly/openapi-core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.5.0.tgz", - "integrity": "sha512-AnDLoDl1+a7mZO4+lx0KG8zH04BQx4ez6yh403PuNl9/0ygbicPPc9QG/y0/0OImChOA+knKLpJazNFjzhOAeg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.6.0.tgz", + "integrity": "sha512-oao6Aey4peLKfagzWGb6N7OBI6CoDWEP4ka/XjrUNZw+UoKVVg3hVBXW4Vr3CJ2O8j6wEa2i+Lbb92VQQsoxwg==", "dev": true, "dependencies": { "@redocly/ajv": "^8.11.0", @@ -999,9 +1006,9 @@ } }, "node_modules/@types/node": { - "version": "20.10.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.3.tgz", - "integrity": "sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg==", + "version": "20.11.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.5.tgz", + "integrity": "sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -1014,9 +1021,9 @@ "dev": true }, "node_modules/@types/qs": { - "version": "6.9.10", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", - "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", "dev": true }, "node_modules/@types/range-parser": { @@ -1053,9 +1060,9 @@ } }, "node_modules/@types/stylis": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.4.tgz", - "integrity": "sha512-36ZrGJ8fgtBr6nwNnuJ9jXIj+bn/pF6UoqmrQT7+Y99+tFFeHHsoR54+194dHdyhPjgbeoNz3Qru0oRt0l6ASQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==", "dev": true }, "node_modules/@types/swagger-ui-express": { @@ -1089,16 +1096,16 @@ "dev": true }, "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==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.19.0.tgz", + "integrity": "sha512-DUCUkQNklCQYnrBSSikjVChdc84/vMPDQSgJTHBZ64G9bA9w0Crc0rd2diujKbTdp6w2J47qkeHQLoi0rpLCdg==", "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", + "@typescript-eslint/scope-manager": "6.19.0", + "@typescript-eslint/type-utils": "6.19.0", + "@typescript-eslint/utils": "6.19.0", + "@typescript-eslint/visitor-keys": "6.19.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1124,15 +1131,15 @@ } }, "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==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.19.0.tgz", + "integrity": "sha512-1DyBLG5SH7PYCd00QlroiW60YJ4rWMuUGa/JBV0iZuqi4l4IK3twKPq5ZkEebmGqRjXWVgsUzfd3+nZveewgow==", "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", + "@typescript-eslint/scope-manager": "6.19.0", + "@typescript-eslint/types": "6.19.0", + "@typescript-eslint/typescript-estree": "6.19.0", + "@typescript-eslint/visitor-keys": "6.19.0", "debug": "^4.3.4" }, "engines": { @@ -1152,13 +1159,13 @@ } }, "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==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.19.0.tgz", + "integrity": "sha512-dO1XMhV2ehBI6QN8Ufi7I10wmUovmLU0Oru3n5LVlM2JuzB4M+dVphCPLkVpKvGij2j/pHBWuJ9piuXx+BhzxQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/visitor-keys": "6.13.2" + "@typescript-eslint/types": "6.19.0", + "@typescript-eslint/visitor-keys": "6.19.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1169,13 +1176,13 @@ } }, "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==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.19.0.tgz", + "integrity": "sha512-mcvS6WSWbjiSxKCwBcXtOM5pRkPQ6kcDds/juxcy/727IQr3xMEcwr/YLHW2A2+Fp5ql6khjbKBzOyjuPqGi/w==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.13.2", - "@typescript-eslint/utils": "6.13.2", + "@typescript-eslint/typescript-estree": "6.19.0", + "@typescript-eslint/utils": "6.19.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1196,9 +1203,9 @@ } }, "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==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.0.tgz", + "integrity": "sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1209,16 +1216,17 @@ } }, "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==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.0.tgz", + "integrity": "sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/visitor-keys": "6.13.2", + "@typescript-eslint/types": "6.19.0", + "@typescript-eslint/visitor-keys": "6.19.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", + "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, @@ -1235,18 +1243,33 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "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==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.19.0.tgz", + "integrity": "sha512-QR41YXySiuN++/dC9UArYOg4X86OAYP83OWTewpVx5ct1IZhjjgTLocj7QNxGhWoTqknsgpl7L+hGygCO+sdYw==", "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", + "@typescript-eslint/scope-manager": "6.19.0", + "@typescript-eslint/types": "6.19.0", + "@typescript-eslint/typescript-estree": "6.19.0", "semver": "^7.5.4" }, "engines": { @@ -1261,12 +1284,12 @@ } }, "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==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.0.tgz", + "integrity": "sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/types": "6.19.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1303,9 +1326,9 @@ } }, "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1325,22 +1348,24 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", - "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "dev": true, "engines": { "node": ">=0.4.0" } }, "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "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", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" }, "funding": { @@ -1348,6 +1373,13 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv/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/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -1466,11 +1498,11 @@ } }, "node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", + "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -1805,9 +1837,9 @@ "dev": true }, "node_modules/classnames": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", "dev": true }, "node_modules/clean-stack": { @@ -2095,9 +2127,9 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/core-js": { - "version": "3.33.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.3.tgz", - "integrity": "sha512-lo0kOocUlLKmm6kv/FswQL8zbkH7mVsLJ/FULClOhv8WRVmKLVcs6XPNQAzstfeJTCHMyButEwG+z1kHxHoDZw==", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.35.0.tgz", + "integrity": "sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg==", "dev": true, "hasInstallScript": true, "funding": { @@ -2452,16 +2484,16 @@ } }, "node_modules/eslint": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", - "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.55.0", + "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -2536,23 +2568,6 @@ "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/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2577,13 +2592,6 @@ "node": ">=10.13.0" } }, - "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/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2790,7 +2798,8 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/fast-fifo": { "version": "1.3.2", @@ -2845,9 +2854,9 @@ } }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -3009,9 +3018,9 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", "funding": [ { "type": "individual", @@ -3112,12 +3121,13 @@ } }, "node_modules/genversion": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/genversion/-/genversion-3.1.1.tgz", - "integrity": "sha512-/H861PMsihhjgX2qqhTN8egM11V04imhA+3JRFY3jjPua2Sy1NqaqqQPjSP8rdM9jZoKpFhVj9g3Fs9XPCjBYQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/genversion/-/genversion-3.2.0.tgz", + "integrity": "sha512-OIYSX6XYA8PHecLDCTri30hadSZfAjZ8Iq1+BBDXqLWP4dRLuJNLoNjsSWtTpw97IccK2LDWzkEstxAB8GdN7g==", "dev": true, "dependencies": { "commander": "^7.2.0", + "ejs": "^3.1.9", "find-package": "^1.0.0" }, "bin": { @@ -3160,9 +3170,9 @@ } }, "node_modules/get-port-please": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.1.tgz", - "integrity": "sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.2.tgz", + "integrity": "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==", "dev": true }, "node_modules/glob": { @@ -3220,9 +3230,9 @@ } }, "node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "peer": true, "dependencies": { @@ -3808,7 +3818,8 @@ "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -4486,9 +4497,9 @@ } }, "node_modules/nodemon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.2.tgz", - "integrity": "sha512-9qIN2LNTrEzpOPBaWHTm4Asy1LxXLSickZStAQ4IZe7zsoIpD/A7LWxhZV3t4Zu352uBcqVnRsDXSMR2Sc3lTA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.3.tgz", + "integrity": "sha512-7jH/NXbFPxVaMwmBCC2B9F/V6X1VkEdNgx3iu9jji8WxWcvhMWkmhNWhI5077zknOnZnBzba9hZP6bCPJLSReQ==", "dev": true, "dependencies": { "chokidar": "^3.5.2", @@ -4581,9 +4592,9 @@ } }, "node_modules/npm": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.2.4.tgz", - "integrity": "sha512-umEuYneVEYO9KoEEI8n2sSGmNQeqco/3BSeacRlqIkCzw4E7XGtYSWMeJobxzr6hZ2n9cM+u5TsMTcC5bAgoWA==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.3.0.tgz", + "integrity": "sha512-9u5GFc1UqI2DLlGI7QdjkpIaBs3UhTtY8KoCqYJK24gV/j/tByaI4BA4R7RkOc+ASqZMzFPKt4Pj2Z8JcGo//A==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -4665,12 +4676,12 @@ "@npmcli/fs": "^3.1.0", "@npmcli/map-workspaces": "^3.0.4", "@npmcli/package-json": "^5.0.0", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^7.0.2", + "@npmcli/promise-spawn": "^7.0.1", + "@npmcli/run-script": "^7.0.3", "@sigstore/tuf": "^2.2.0", "abbrev": "^2.0.0", "archy": "~1.0.0", - "cacache": "^18.0.0", + "cacache": "^18.0.2", "chalk": "^5.3.0", "ci-info": "^4.0.0", "cli-columns": "^4.0.0", @@ -4684,7 +4695,7 @@ "ini": "^4.1.1", "init-package-json": "^6.0.0", "is-cidr": "^5.0.3", - "json-parse-even-better-errors": "^3.0.0", + "json-parse-even-better-errors": "^3.0.1", "libnpmaccess": "^8.0.1", "libnpmdiff": "^6.0.3", "libnpmexec": "^7.0.4", @@ -4713,7 +4724,7 @@ "npm-user-validate": "^2.0.0", "npmlog": "^7.0.1", "p-map": "^4.0.0", - "pacote": "^17.0.4", + "pacote": "^17.0.5", "parse-conflict-json": "^3.0.1", "proc-log": "^3.0.0", "qrcode-terminal": "^0.12.0", @@ -4812,7 +4823,7 @@ } }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "7.2.1", + "version": "7.3.0", "dev": true, "inBundle": true, "license": "ISC", @@ -4859,7 +4870,7 @@ } }, "node_modules/npm/node_modules/@npmcli/config": { - "version": "8.0.2", + "version": "8.1.0", "dev": true, "inBundle": true, "license": "ISC", @@ -4917,7 +4928,7 @@ } }, "node_modules/npm/node_modules/@npmcli/git": { - "version": "5.0.3", + "version": "5.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -5018,7 +5029,7 @@ } }, "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "7.0.0", + "version": "7.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -5042,7 +5053,7 @@ } }, "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "7.0.2", + "version": "7.0.3", "dev": true, "inBundle": true, "license": "ISC", @@ -5146,18 +5157,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/abort-controller": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/npm/node_modules/agent-base": { "version": "7.1.0", "dev": true, @@ -5220,14 +5219,10 @@ "license": "MIT" }, "node_modules/npm/node_modules/are-we-there-yet": { - "version": "4.0.1", + "version": "4.0.2", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -5238,26 +5233,6 @@ "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/base64-js": { - "version": "1.5.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/bin-links": { "version": "4.0.3", "dev": true, @@ -5291,30 +5266,6 @@ "balanced-match": "^1.0.0" } }, - "node_modules/npm/node_modules/buffer": { - "version": "6.0.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/npm/node_modules/builtins": { "version": "5.0.1", "dev": true, @@ -5325,7 +5276,7 @@ } }, "node_modules/npm/node_modules/cacache": { - "version": "18.0.0", + "version": "18.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -5335,7 +5286,7 @@ "glob": "^10.2.2", "lru-cache": "^10.0.1", "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", + "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", @@ -5620,12 +5571,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/diff": { "version": "5.1.0", "dev": true, @@ -5672,24 +5617,6 @@ "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/event-target-shim": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/events": { - "version": "3.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/npm/node_modules/exponential-backoff": { "version": "3.1.1", "dev": true, @@ -5885,28 +5812,8 @@ "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/ieee754": { - "version": "1.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "BSD-3-Clause" - }, "node_modules/npm/node_modules/ignore-walk": { - "version": "6.0.3", + "version": "6.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -6044,7 +5951,7 @@ } }, "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", + "version": "3.0.1", "dev": true, "inBundle": true, "license": "MIT", @@ -6083,7 +5990,7 @@ "license": "MIT" }, "node_modules/npm/node_modules/libnpmaccess": { - "version": "8.0.1", + "version": "8.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -6096,7 +6003,7 @@ } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "6.0.3", + "version": "6.0.5", "dev": true, "inBundle": true, "license": "ISC", @@ -6116,7 +6023,7 @@ } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "7.0.4", + "version": "7.0.6", "dev": true, "inBundle": true, "license": "ISC", @@ -6138,7 +6045,7 @@ } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "5.0.1", + "version": "5.0.3", "dev": true, "inBundle": true, "license": "ISC", @@ -6150,7 +6057,7 @@ } }, "node_modules/npm/node_modules/libnpmhook": { - "version": "10.0.0", + "version": "10.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -6163,7 +6070,7 @@ } }, "node_modules/npm/node_modules/libnpmorg": { - "version": "6.0.1", + "version": "6.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -6176,7 +6083,7 @@ } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "6.0.3", + "version": "6.0.5", "dev": true, "inBundle": true, "license": "ISC", @@ -6191,7 +6098,7 @@ } }, "node_modules/npm/node_modules/libnpmpublish": { - "version": "9.0.2", + "version": "9.0.3", "dev": true, "inBundle": true, "license": "ISC", @@ -6210,7 +6117,7 @@ } }, "node_modules/npm/node_modules/libnpmsearch": { - "version": "7.0.0", + "version": "7.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -6222,7 +6129,7 @@ } }, "node_modules/npm/node_modules/libnpmteam": { - "version": "6.0.0", + "version": "6.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -6235,7 +6142,7 @@ } }, "node_modules/npm/node_modules/libnpmversion": { - "version": "5.0.1", + "version": "5.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -6251,13 +6158,10 @@ } }, "node_modules/npm/node_modules/lru-cache": { - "version": "10.0.2", + "version": "10.1.0", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, "engines": { "node": "14 || >=16.14" } @@ -6309,27 +6213,15 @@ } }, "node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", + "version": "2.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/npm/node_modules/minipass-fetch": { @@ -6616,12 +6508,12 @@ } }, "node_modules/npm/node_modules/npm-packlist": { - "version": "8.0.0", + "version": "8.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "ignore-walk": "^6.0.0" + "ignore-walk": "^6.0.4" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -6713,7 +6605,7 @@ } }, "node_modules/npm/node_modules/pacote": { - "version": "17.0.4", + "version": "17.0.5", "dev": true, "inBundle": true, "license": "ISC", @@ -6784,7 +6676,7 @@ } }, "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.13", + "version": "6.0.15", "dev": true, "inBundle": true, "license": "MIT", @@ -6805,15 +6697,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/process": { - "version": "0.11.10", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/npm/node_modules/promise-all-reject-late": { "version": "1.0.1", "dev": true, @@ -6920,22 +6803,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/readable-stream": { - "version": "4.4.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/npm/node_modules/retry": { "version": "0.12.0", "dev": true, @@ -6945,26 +6812,6 @@ "node": ">= 4" } }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/safer-buffer": { "version": "2.1.2", "dev": true, @@ -7135,15 +6982,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/npm/node_modules/string-width": { "version": "4.2.3", "dev": true, @@ -7971,9 +7809,9 @@ } }, "node_modules/postcss": { - "version": "8.4.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", - "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "funding": [ { @@ -7990,7 +7828,7 @@ } ], "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -8015,13 +7853,13 @@ } }, "node_modules/prisma": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.6.0.tgz", - "integrity": "sha512-EEaccku4ZGshdr2cthYHhf7iyvCcXqwJDvnoQRAJg5ge2Tzpv0e2BaMCp+CbbDUwoVTzwgOap9Zp+d4jFa2O9A==", + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.8.1.tgz", + "integrity": "sha512-N6CpjzECnUHZ5beeYpDzkt2rYpEdAeqXX2dweu6BoQaeYkNZrC/WJHM+5MO/uidFHTak8QhkPKBWck1o/4MD4A==", "devOptional": true, "hasInstallScript": true, "dependencies": { - "@prisma/engines": "5.6.0" + "@prisma/engines": "5.8.1" }, "bin": { "prisma": "build/index.js" @@ -8092,6 +7930,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "engines": { "node": ">=6" } @@ -8303,9 +8142,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "dev": true }, "node_modules/require-directory": { @@ -8321,6 +8160,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -8512,14 +8352,15 @@ } }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", "dependencies": { "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -8794,9 +8635,9 @@ } }, "node_modules/streamx": { - "version": "2.15.5", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.5.tgz", - "integrity": "sha512-9thPGMkKC2GctCzyCUjME3yR03x2xNo0GPKGkRw2UMYN+gqWa9uqpyNWhmsNCutU5zHmkUum0LsCRQTXUgUCAg==", + "version": "2.15.6", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.6.tgz", + "integrity": "sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==", "dependencies": { "fast-fifo": "^1.1.0", "queue-tick": "^1.0.1" @@ -8850,20 +8691,20 @@ } }, "node_modules/styled-components": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.1.tgz", - "integrity": "sha512-cpZZP5RrKRIClBW5Eby4JM1wElLVP4NQrJbJ0h10TidTyJf4SIIwa3zLXOoPb4gJi8MsJ8mjq5mu2IrEhZIAcQ==", + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.8.tgz", + "integrity": "sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw==", "dev": true, "dependencies": { - "@emotion/is-prop-valid": "^1.2.1", - "@emotion/unitless": "^0.8.0", - "@types/stylis": "^4.0.2", - "css-to-react-native": "^3.2.0", - "csstype": "^3.1.2", - "postcss": "^8.4.31", - "shallowequal": "^1.1.0", - "stylis": "^4.3.0", - "tslib": "^2.5.0" + "@emotion/is-prop-valid": "1.2.1", + "@emotion/unitless": "0.8.0", + "@types/stylis": "4.2.0", + "css-to-react-native": "3.2.0", + "csstype": "3.1.2", + "postcss": "8.4.31", + "shallowequal": "1.1.0", + "stylis": "4.3.1", + "tslib": "2.5.0" }, "engines": { "node": ">= 16" @@ -8877,10 +8718,16 @@ "react-dom": ">= 16.8.0" } }, + "node_modules/styled-components/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/stylis": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz", - "integrity": "sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.1.tgz", + "integrity": "sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==", "dev": true }, "node_modules/supports-color": { @@ -8924,9 +8771,9 @@ } }, "node_modules/swagger-ui-dist": { - "version": "5.10.3", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.10.3.tgz", - "integrity": "sha512-fu3aozjxFWsmcO1vyt1q1Ji2kN7KlTd1vHy27E9WgPyXo9nrEzhQPqgxaAjbMsOmb8XFKNGo4Sa3Q+84Fh+pFw==" + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.11.0.tgz", + "integrity": "sha512-j0PIATqQSEFGOLmiJOJZj1X1Jt6bFIur3JpY7+ghliUnfZs0fpWDdHEkn9q7QUlBtKbkn6TepvSxTqnE8l3s0A==" }, "node_modules/swagger-ui-express": { "version": "5.0.0", @@ -9030,8 +8877,7 @@ "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 + "dev": true }, "node_modules/through": { "version": "2.3.8", @@ -9110,9 +8956,9 @@ } }, "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -9213,9 +9059,9 @@ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typescript": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", - "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -9271,6 +9117,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -9575,6 +9422,25 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-3.0.0.tgz", + "integrity": "sha512-x+agsJJG9rvC7axF0xqTEdZhJkLHyIZkdOAWDJSmwGPzxNHMHwtU6w2yDOAAP6yuSfTAUhAMJRBfhVGY64ySEQ==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.18.0" + } } } } diff --git a/ExpressAPI/package.json b/ExpressAPI/package.json index d2e1db43a36aac6028c8580257ede4a577cbb5cb..87fcbb9bf61cb2177f6b855c86df49a122713fbe 100644 --- a/ExpressAPI/package.json +++ b/ExpressAPI/package.json @@ -1,7 +1,7 @@ { "name" : "dojo_backend_api", "description" : "Backend API of the Dojo project", - "version" : "3.2.0", + "version" : "3.3.0", "license" : "AGPLv3", "author" : "Michaël Minelli <dojo@minelli.me>", "main" : "dist/src/app.js", @@ -28,54 +28,55 @@ "seed": "node dist/prisma/seed" }, "dependencies" : { - "@prisma/client" : "^5.6.0", - "ajv" : "^8.12.0", - "axios" : "^1.6.2", - "compression" : "^1.7.4", - "cors" : "^2.8.5", - "dotenv" : "^16.3.1", - "dotenv-expand" : "^10.0.0", - "express" : "^4.18.2", - "express-validator" : "^7.0.1", - "form-data" : "^4.0.0", - "helmet" : "^7.1.0", - "http-status-codes" : "^2.3.0", - "json5" : "^2.2.3", - "jsonwebtoken" : "^9.0.2", - "morgan" : "^1.10.0", - "multer" : "^1.4.5-lts.1", - "mysql" : "^2.18.1", - "node" : "^20.10.0", - "parse-link-header" : "^2.0.0", - "semver" : "^7.5.4", - "swagger-ui-express": "^5.0.0", - "tar-stream" : "^3.1.6", - "uuid" : "^9.0.1", - "winston" : "^3.11.0" + "@prisma/client" : "^5.8.1", + "axios" : "^1.6.5", + "compression" : "^1.7.4", + "cors" : "^2.8.5", + "dotenv" : "^16.3.1", + "dotenv-expand" : "^10.0.0", + "express" : "^4.18.2", + "express-validator" : "^7.0.1", + "form-data" : "^4.0.0", + "helmet" : "^7.1.0", + "http-status-codes" : "^2.3.0", + "json5" : "^2.2.3", + "jsonwebtoken" : "^9.0.2", + "morgan" : "^1.10.0", + "multer" : "^1.4.5-lts.1", + "mysql" : "^2.18.1", + "node" : "^20.10.0", + "parse-link-header" : "^2.0.0", + "semver" : "^7.5.4", + "swagger-ui-express" : "^5.0.0", + "tar-stream" : "^3.1.6", + "uuid" : "^9.0.1", + "winston" : "^3.11.0", + "zod" : "^3.22.4", + "zod-validation-error": "^3.0.0" }, "devDependencies": { - "@redocly/cli" : "^1.5.0", + "@redocly/cli" : "^1.6.0", "@types/compression" : "^1.7.5", "@types/cors" : "^2.8.17", "@types/express" : "^4.17.21", "@types/jsonwebtoken" : "^9.0.5", "@types/morgan" : "^1.9.9", "@types/multer" : "^1.4.11", - "@types/node" : "^20.10.3", + "@types/node" : "^20.11.5", "@types/parse-link-header" : "^2.0.3", "@types/semver" : "^7.5.6", "@types/swagger-ui-express" : "^4.1.6", "@types/tar-stream" : "^3.1.3", "@types/uuid" : "^9.0.7", - "@typescript-eslint/eslint-plugin": "^6.13.2", - "@typescript-eslint/parser" : "^6.13.2", + "@typescript-eslint/eslint-plugin": "^6.18.1", + "@typescript-eslint/parser" : "^6.18.1", "dotenv-cli" : "^7.3.0", "dotenv-vault" : "^1.25.0", - "genversion" : "^3.1.1", - "nodemon" : "^3.0.2", - "npm" : "^10.2.4", - "prisma" : "^5.6.0", - "ts-node" : "^10.9.1", - "typescript" : "^5.3.2" + "genversion" : "^3.2.0", + "nodemon" : "^3.0.3", + "npm" : "^10.3.0", + "prisma" : "^5.8.1", + "ts-node" : "^10.9.2", + "typescript" : "^5.3.3" } } diff --git a/ExpressAPI/src/config/Config.ts b/ExpressAPI/src/config/Config.ts index e3a1b78e2926f988b8a6d61675ea78f570987bc3..ebbad6729d8b9c8c420a7455a42218cd28421a2c 100644 --- a/ExpressAPI/src/config/Config.ts +++ b/ExpressAPI/src/config/Config.ts @@ -21,6 +21,11 @@ class Config { } }; // { version: { CLIENT: CONDITION } } + public readonly dojoCLI: { + versionUpdatePeriodMs: number + repositoryId: number + }; + public readonly jwtConfig: { secret: string; expiresIn: number; }; @@ -64,6 +69,11 @@ class Config { this.requestClientValidation = JSON5.parse(process.env.REQUEST_CLIENT_VALIDATION || '{"version": {}}'); + this.dojoCLI = { + versionUpdatePeriodMs: Number(process.env.DOJO_CLI_VERSION_UPDATE_PERIOD_MS || 3600), + repositoryId : Number(process.env.DOJO_CLI_GITLAB_REPOSITORY_ID || 0) + }; + this.jwtConfig = { secret : process.env.JWT_SECRET_KEY || '', expiresIn: Number(process.env.SESSION_TIMEOUT || 0) diff --git a/ExpressAPI/src/express/API.ts b/ExpressAPI/src/express/API.ts index dcc801cee1bbfd160e60d0f3d8f7f63e70e25acf..0d61b88e4f9d007c26b7d1ef13f98a4fa5ae3e85 100644 --- a/ExpressAPI/src/express/API.ts +++ b/ExpressAPI/src/express/API.ts @@ -16,6 +16,7 @@ import compression from 'compression'; import ClientVersionCheckerMiddleware from '../middlewares/ClientVersionCheckerMiddleware'; import swaggerUi from 'swagger-ui-express'; import path from 'path'; +import DojoCliVersionHelper from '../helpers/DojoCliVersionHelper'; class API implements WorkerTask { @@ -25,7 +26,7 @@ class API implements WorkerTask { constructor() { this.backend = express(); - this.initSwagger(); + this.initOpenAPI(); this.initBaseMiddlewares(); this.backend.use(ClientVersionCheckerMiddleware.register()); @@ -43,9 +44,14 @@ class API implements WorkerTask { this.backend.use(helmet()); //Help to secure express, https://helmetjs.github.io/ this.backend.use(cors()); //Allow CORS requests this.backend.use(compression()); //Compress responses + + this.backend.use(async (req, res, next) => { + res.header('dojocli-latest-version', await DojoCliVersionHelper.getLatestVersion()); + next(); + }); } - private initSwagger() { + private initOpenAPI() { const options = { customSiteTitle: 'Dojo API', explorer : false, diff --git a/ExpressAPI/src/helpers/DojoCliVersionHelper.ts b/ExpressAPI/src/helpers/DojoCliVersionHelper.ts new file mode 100644 index 0000000000000000000000000000000000000000..a44e1ec54ed64170f491339b5d91f39423372ba6 --- /dev/null +++ b/ExpressAPI/src/helpers/DojoCliVersionHelper.ts @@ -0,0 +1,33 @@ +import Config from '../config/Config'; +import GitlabRelease from '../shared/types/Gitlab/GitlabRelease'; +import GitlabManager from '../managers/GitlabManager'; + + +class DojoCliVersionHelper { + private latestUpdate: Date | undefined; + private latestVersion: string | undefined; + + constructor() { } + + private async updateVersion(): Promise<void> { + const releases: Array<GitlabRelease> = await GitlabManager.getRepositoryReleases(Config.dojoCLI.repositoryId); + for ( const release of releases ) { + if ( !isNaN(+release.tag_name.replace('.', '')) ) { + this.latestVersion = release.tag_name; + this.latestUpdate = new Date(); + return; + } + } + } + + public async getLatestVersion(): Promise<string> { + if ( !this.latestVersion || !this.latestUpdate || (new Date()).getTime() - this.latestUpdate.getTime() >= Config.dojoCLI.versionUpdatePeriodMs ) { + await this.updateVersion(); + } + + return this.latestVersion!; + } +} + + +export default new DojoCliVersionHelper(); \ No newline at end of file diff --git a/ExpressAPI/src/helpers/DojoValidators.ts b/ExpressAPI/src/helpers/DojoValidators.ts index 0293660deb7449cc45f47366e7fac2868c801f2e..98a28252c6bca786fe23ad6b08e56db54c33aca0 100644 --- a/ExpressAPI/src/helpers/DojoValidators.ts +++ b/ExpressAPI/src/helpers/DojoValidators.ts @@ -4,8 +4,9 @@ import { CustomValidator, ErrorMessage, FieldMessageFactory, Meta } from 'expres import { BailOptions, ValidationChain } from 'express-validator/src/chain'; import GitlabManager from '../managers/GitlabManager'; import express from 'express'; -import SharedExerciseHelper from '../shared/helpers/Dojo/SharedExerciseHelper'; import logger from '../shared/logging/WinstonLogger'; +import Json5FileValidator from '../shared/helpers/Json5FileValidator'; +import ExerciseResultsFile from '../shared/types/Dojo/ExerciseResultsFile'; declare type DojoMeta = Meta & { @@ -98,7 +99,7 @@ class DojoValidators { return new Promise((resolve, reject) => { const results = this.getParamValue(req, path) as string; if ( results ) { - SharedExerciseHelper.validateResultFile(results, false).isValid ? resolve(true) : reject(); + Json5FileValidator.validateFile(ExerciseResultsFile, results, false).isValid ? resolve(true) : reject(); } else { reject(); } diff --git a/ExpressAPI/src/managers/GitlabManager.ts b/ExpressAPI/src/managers/GitlabManager.ts index 3fe6f6710cec46bf38f4270b0d83c05c9d076392..390fba57640e11b4514caa37df8131a4b9622886 100644 --- a/ExpressAPI/src/managers/GitlabManager.ts +++ b/ExpressAPI/src/managers/GitlabManager.ts @@ -13,6 +13,7 @@ import express from 'express'; import GitlabRoute from '../shared/types/Gitlab/GitlabRoute'; import SharedConfig from '../shared/config/SharedConfig'; import GitlabProfile from '../shared/types/Gitlab/GitlabProfile'; +import GitlabRelease from '../shared/types/Gitlab/GitlabRelease'; class GitlabManager { @@ -68,6 +69,12 @@ class GitlabManager { return response.data; } + async getRepositoryReleases(repoId: number): Promise<Array<GitlabRelease>> { + const response = await axios.get<Array<GitlabRelease>>(this.getApiUrl(GitlabRoute.REPOSITORY_RELEASES_GET).replace('{{id}}', String(repoId))); + + return response.data; + } + async createRepository(name: string, description: string, visibility: string, initializeWithReadme: boolean, namespace: number, sharedRunnersEnabled: boolean, wikiEnabled: boolean, import_url: string): Promise<GitlabRepository> { const response = await axios.post<GitlabRepository>(this.getApiUrl(GitlabRoute.REPOSITORY_CREATE), { name : name, @@ -241,6 +248,18 @@ class GitlabManager { async updateFile(repoId: number, filePath: string, fileBase64: string, commitMessage: string, branch: string = 'main', authorName: string = 'Dojo', authorMail: string | undefined = undefined) { return this.createUpdateFile(false, repoId, filePath, fileBase64, commitMessage, branch, authorName, authorMail); } + + async deleteFile(repoId: number, filePath: string, commitMessage: string, branch: string = 'main', authorName: string = 'Dojo', authorMail: string | undefined = undefined) { + await axios.delete(this.getApiUrl(GitlabRoute.REPOSITORY_FILE).replace('{{id}}', String(repoId)).replace('{{filePath}}', encodeURIComponent(filePath)), { + data: { + branch : branch, + commit_message: commitMessage, + author_name : authorName, + author_email : authorMail + } + }); + + } } diff --git a/ExpressAPI/src/routes/AssignmentRoutes.ts b/ExpressAPI/src/routes/AssignmentRoutes.ts index 645104b41c1ff85f3c9e1609922529a01f6027b2..ab2bd23456d446fd6a23a64e2bd9db7383b9b05c 100644 --- a/ExpressAPI/src/routes/AssignmentRoutes.ts +++ b/ExpressAPI/src/routes/AssignmentRoutes.ts @@ -120,6 +120,10 @@ class AssignmentRoutes implements RoutesManager { return GlobalHelper.repositoryCreationError('Repo params error', error, req, res, DojoStatusCode.ASSIGNMENT_CREATION_GITLAB_ERROR, DojoStatusCode.ASSIGNMENT_CREATION_INTERNAL_ERROR, repository); } + try { + await GitlabManager.deleteFile(repository.id, '.gitlab-ci.yml', 'Remove .gitlab-ci.yml'); + } catch ( error ) { /* empty */ } + try { await GitlabManager.createFile(repository.id, '.gitlab-ci.yml', fs.readFileSync(path.join(__dirname, '../../assets/assignment_gitlab_ci.yml'), 'base64'), 'Add .gitlab-ci.yml (DO NOT MODIFY THIS FILE)'); } catch ( error ) { diff --git a/ExpressAPI/src/shared b/ExpressAPI/src/shared index 101cc26895eb0b5fe97e03bb96039e0cddd94391..89f3579ca9009f793742170928d808ab4c35d931 160000 --- a/ExpressAPI/src/shared +++ b/ExpressAPI/src/shared @@ -1 +1 @@ -Subproject commit 101cc26895eb0b5fe97e03bb96039e0cddd94391 +Subproject commit 89f3579ca9009f793742170928d808ab4c35d931 diff --git a/ExpressAPI/tsconfig.json b/ExpressAPI/tsconfig.json index 63535307023b70888360cf0d89065d9f844e823f..3f3b0b260d612c2899d7c8fc7903f59bd2a55c66 100644 --- a/ExpressAPI/tsconfig.json +++ b/ExpressAPI/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "outDir" : "dist", "strict" : true, - "target" : "es6", + "target" : "ES2022", "module" : "commonjs", "sourceMap" : true, "esModuleInterop" : true,