From d0d59fc6b25c56ecbc867f8a50bbb01874fe2fce Mon Sep 17 00:00:00 2001 From: Abelangel <abelange.burgosdi@hes-so.ch> Date: Sat, 8 Mar 2025 15:42:09 +0100 Subject: [PATCH] rajout des bons routes aux microservices et redirections des requetes avec nginx. Probleme avec cors lors des requetes --- microservices/auth/src/express/Server.ts | 71 +- microservices/auth/src/routes/Auth.ts | 74 + .../auth/src/routes/RoutesQuestions.ts | 252 - .../correction_qcm/src/express/Server.ts | 6 +- .../src/routes/CorrectionQcm.ts | 144 + .../src/routes/RoutesResponses.ts | 211 - .../creation_qcm/src/express/Server.ts | 6 +- .../creation_qcm/src/routes/CreationQcm.ts | 110 + microservices/docker-compose.yml | 116 +- .../helloworld/src/express/Server.ts | 4 +- microservices/navigation_qcm/.env | 6 - microservices/navigation_qcm/.env.keys | 5 - microservices/navigation_qcm/.env.vault | 8 - microservices/navigation_qcm/.gitkeep | 0 microservices/navigation_qcm/.idea/.gitignore | 7 - microservices/navigation_qcm/.idea/TP.iml | 16 - .../.idea/codeStyles/Project.xml | 230 - .../.idea/codeStyles/codeStyleConfig.xml | 5 - .../navigation_qcm/.idea/modules.xml | 8 - .../.idea/saveactions_settings.xml | 12 - .../navigation_qcm/.idea/sonarlint.xml | 8 - microservices/navigation_qcm/.idea/vcs.xml | 6 - microservices/navigation_qcm/assets/.gitkeep | 0 microservices/navigation_qcm/dockerfile | 25 - microservices/navigation_qcm/jest.config.js | 6 - microservices/navigation_qcm/nodemon.json | 13 - .../navigation_qcm/package-lock.json | 6871 ----------------- microservices/navigation_qcm/package.json | 64 - .../navigation_qcm/prisma/database.db | Bin 81920 -> 0 bytes .../migration.sql | 1 - .../migration.sql | 14 - .../migration.sql | 48 - .../20240530082347_update_db/migration.sql | 30 - .../20240530082946_add_champs/migration.sql | 24 - .../20240530151620_update/migration.sql | 20 - .../migrations/20240530161440_/migration.sql | 53 - .../20240530162619_test/migration.sql | 53 - .../migrations/20240606084017_c/migration.sql | 37 - .../migration.sql | 40 - .../migrations/20240606094407_v/migration.sql | 1 - .../migration.sql | 24 - .../migration.sql | 22 - .../migration.sql | 19 - .../migration.sql | 26 - .../20240613130357_test/migration.sql | 1 - .../migrations/20240613135314_/migration.sql | 25 - .../20240613135344_test2/migration.sql | 1 - .../20240613145516_test3/migration.sql | 25 - .../20240613150814_es/migration.sql | 1 - .../migration.sql | 30 - .../20240613195132_database/migration.sql | 1 - .../migrations/20240615191543_/migration.sql | 26 - .../migrations/20240615192133_/migration.sql | 20 - .../migrations/20240615194339_/migration.sql | 26 - .../20240615194422_add_score/migration.sql | 1 - .../20240615195336_regle_erreur/migration.sql | 1 - .../migration.sql | 27 - .../20240615235741_addorder/migration.sql | 1 - .../migrations/20240616122454_/migration.sql | 27 - .../migration.sql | 1 - .../20240616125927_new_mig/migration.sql | 27 - .../prisma/migrations/migration_lock.toml | 3 - .../navigation_qcm/prisma/schema.prisma | 94 - microservices/navigation_qcm/prisma/seed.ts | 66 - .../navigation_qcm/src/Middlewares.ts | 29 - microservices/navigation_qcm/src/app.ts | 4 - .../navigation_qcm/src/calcFunctions.ts | 48 - .../navigation_qcm/src/config/Config.ts | 27 - .../navigation_qcm/src/express/Server.ts | 120 - .../src/helpers/DatabaseHelper.ts | 29 - .../src/logging/MorganMiddleware.ts | 19 - .../src/logging/WinstonLogger.ts | 47 - .../navigation_qcm/src/routes/MessageRoute.ts | 8 - .../src/routes/RoutesAccesQCMs.ts | 275 - .../navigation_qcm/src/routes/reqGetDB.ts | 21 - .../studentHellQCM.postman_collection.json | 1452 ---- .../navigation_qcm/tests/index.test.ts | 11 - microservices/navigation_qcm/tsconfig.json | 26 - microservices/nginx.conf | 187 + .../realise_qcm/src/express/Server.ts | 6 +- .../realise_qcm/src/routes/RealiseQcm.ts | 609 ++ .../realise_qcm/src/routes/RoutesQuestions.ts | 252 - microservices/search_qcm/package.json | 4 +- .../search_qcm/src/express/Server.ts | 7 +- .../search_qcm/src/routes/RoutesQuestions.ts | 252 - .../src/routes/SearchQcm.ts} | 344 +- 86 files changed, 1319 insertions(+), 11558 deletions(-) create mode 100644 microservices/auth/src/routes/Auth.ts delete mode 100644 microservices/auth/src/routes/RoutesQuestions.ts create mode 100644 microservices/correction_qcm/src/routes/CorrectionQcm.ts delete mode 100644 microservices/correction_qcm/src/routes/RoutesResponses.ts create mode 100644 microservices/creation_qcm/src/routes/CreationQcm.ts delete mode 100644 microservices/navigation_qcm/.env delete mode 100644 microservices/navigation_qcm/.env.keys delete mode 100644 microservices/navigation_qcm/.env.vault delete mode 100644 microservices/navigation_qcm/.gitkeep delete mode 100644 microservices/navigation_qcm/.idea/.gitignore delete mode 100644 microservices/navigation_qcm/.idea/TP.iml delete mode 100644 microservices/navigation_qcm/.idea/codeStyles/Project.xml delete mode 100644 microservices/navigation_qcm/.idea/codeStyles/codeStyleConfig.xml delete mode 100644 microservices/navigation_qcm/.idea/modules.xml delete mode 100644 microservices/navigation_qcm/.idea/saveactions_settings.xml delete mode 100644 microservices/navigation_qcm/.idea/sonarlint.xml delete mode 100644 microservices/navigation_qcm/.idea/vcs.xml delete mode 100644 microservices/navigation_qcm/assets/.gitkeep delete mode 100644 microservices/navigation_qcm/dockerfile delete mode 100644 microservices/navigation_qcm/jest.config.js delete mode 100644 microservices/navigation_qcm/nodemon.json delete mode 100644 microservices/navigation_qcm/package-lock.json delete mode 100644 microservices/navigation_qcm/package.json delete mode 100644 microservices/navigation_qcm/prisma/database.db delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240417125028_database_creation/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240417125048_add_user_schema/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240523145021_create_complete_database/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240530082347_update_db/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240530082946_add_champs/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240530151620_update/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240530161440_/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240530162619_test/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240606084017_c/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240606093824_relation_added/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240606094407_v/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240612164927_change_date_type/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240612180153_change_temps_type/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240613090400_add_has_finished/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240613125037_change_numeric_type/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240613130357_test/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240613135314_/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240613135344_test2/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240613145516_test3/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240613150814_es/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240613154612_add_some_action/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240613195132_database/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240615191543_/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240615192133_/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240615194339_/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240615194422_add_score/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240615195336_regle_erreur/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240615235649_add_random_order_choix/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240615235741_addorder/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240616122454_/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240616122525_change_type_numeric_question/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/20240616125927_new_mig/migration.sql delete mode 100644 microservices/navigation_qcm/prisma/migrations/migration_lock.toml delete mode 100644 microservices/navigation_qcm/prisma/schema.prisma delete mode 100644 microservices/navigation_qcm/prisma/seed.ts delete mode 100644 microservices/navigation_qcm/src/Middlewares.ts delete mode 100644 microservices/navigation_qcm/src/app.ts delete mode 100644 microservices/navigation_qcm/src/calcFunctions.ts delete mode 100644 microservices/navigation_qcm/src/config/Config.ts delete mode 100644 microservices/navigation_qcm/src/express/Server.ts delete mode 100644 microservices/navigation_qcm/src/helpers/DatabaseHelper.ts delete mode 100644 microservices/navigation_qcm/src/logging/MorganMiddleware.ts delete mode 100644 microservices/navigation_qcm/src/logging/WinstonLogger.ts delete mode 100644 microservices/navigation_qcm/src/routes/MessageRoute.ts delete mode 100644 microservices/navigation_qcm/src/routes/RoutesAccesQCMs.ts delete mode 100644 microservices/navigation_qcm/src/routes/reqGetDB.ts delete mode 100644 microservices/navigation_qcm/src/studentHellQCM.postman_collection.json delete mode 100644 microservices/navigation_qcm/tests/index.test.ts delete mode 100644 microservices/navigation_qcm/tsconfig.json create mode 100644 microservices/nginx.conf create mode 100644 microservices/realise_qcm/src/routes/RealiseQcm.ts delete mode 100644 microservices/realise_qcm/src/routes/RoutesQuestions.ts delete mode 100644 microservices/search_qcm/src/routes/RoutesQuestions.ts rename microservices/{creation_qcm/src/routes/RoutesQCMs.ts => search_qcm/src/routes/SearchQcm.ts} (61%) diff --git a/microservices/auth/src/express/Server.ts b/microservices/auth/src/express/Server.ts index 4542e740..d59d2a2b 100644 --- a/microservices/auth/src/express/Server.ts +++ b/microservices/auth/src/express/Server.ts @@ -8,16 +8,15 @@ import helmet from 'helmet'; import express from 'express'; import multer from 'multer'; import Config from '../config/Config'; -import questions_routes from '../routes/RoutesQuestions'; +import questions_routes from '../routes/Auth'; import db from '../helpers/DatabaseHelper.js'; import bodyParser from 'body-parser'; -import jwt from 'jsonwebtoken'; -import axios from 'axios'; + export class Server { private readonly backend: Express; private readonly server: http.Server; - private readonly redirectUri = 'http://localhost:4200'; + constructor() { this.backend = express(); @@ -31,7 +30,9 @@ export class Server { this.backend.use(helmet()); //Help to secure express, https://helmetjs.github.io/ this.backend.use(bodyParser.json()); this.backend.use(cors({ - origin: 'http://localhost:4200' + origin: '*' , + methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], + allowedHeaders: ['Authorization', 'Content-Type'] })); //Allow CORS requests @@ -40,65 +41,7 @@ export class Server { this.backend.use(express.json()); - this.backend.post('/auth/jwt', async (req, res) => { - const { code } = req.body; - if (!code) { - res.status(400).send('Code is required'); - } - try { - //Demande access_token user avec le code - const response = await axios.post('https://githepia.hesge.ch/oauth/token', { - client_id: String(process.env.CLIENTID), - client_secret: String(process.env.CLIENTSECRET), - code: code, - grant_type: 'authorization_code', - redirect_uri: this.redirectUri, - }); - - const { access_token } = response.data; - - //Demande du name et de l'email utilisateur - const userResponse = await axios.get('https://githepia.hesge.ch/api/v4/user', { - headers: { Authorization: `Bearer ${access_token}` } - }); - - const { id, name, email } = userResponse.data; - console.log(id, name, email) - if(name || email || id){ - //erreur - } - const infoQcm = await db.user.findFirst({ - where: { - name: name, - mail: email - } - }); - // Génération d'un token JWT personnalisé - if(!infoQcm){ - const createUser = await db.user.create({ - data: { - id: id, - gitlabUsername: name, - mail: email, - deleted: false, - name: name, - } - }); - if(!createUser){ - res.status(500).send({error: 'Error create user'}); - } - } - const jwtToken = jwt.sign({ id }, String(process.env.SECRET_JWT), {expiresIn: '1h'}); - - res.json({ - token: jwtToken, - idUser: id - }); - - } catch (error) { - res.status(500).send('Error exchanging code for token'); - } - }); + this.server = http.createServer(this.backend); } diff --git a/microservices/auth/src/routes/Auth.ts b/microservices/auth/src/routes/Auth.ts new file mode 100644 index 00000000..13490f75 --- /dev/null +++ b/microservices/auth/src/routes/Auth.ts @@ -0,0 +1,74 @@ +import express from 'express'; + +import db from '../helpers/DatabaseHelper.js'; +import { verifyJWT } from '../Middlewares.js'; +import { checkUser } from "../calcFunctions.js" +import { MessageRoute } from './MessageRoute.js'; + +import axios from 'axios'; +import jwt from 'jsonwebtoken'; + +const router: express.Router = express.Router(); +const redirectUri = 'http://localhost:4200'; +router.post('/auth/jwt', async (req, res) => { + const { code } = req.body; + if (!code) { + res.status(400).send('Code is required'); + } + try { + //Demande access_token user avec le code + const response = await axios.post('https://githepia.hesge.ch/oauth/token', { + client_id: String(process.env.CLIENTID), + client_secret: String(process.env.CLIENTSECRET), + code: code, + grant_type: 'authorization_code', + redirect_uri: redirectUri, + }); + + const { access_token } = response.data; + + //Demande du name et de l'email utilisateur + const userResponse = await axios.get('https://githepia.hesge.ch/api/v4/user', { + headers: { Authorization: `Bearer ${access_token}` } + }); + + const { id, name, email } = userResponse.data; + console.log(id, name, email) + if(name || email || id){ + //erreur + } + const infoQcm = await db.user.findFirst({ + where: { + name: name, + mail: email + } + }); + // Génération d'un token JWT personnalisé + if(!infoQcm){ + const createUser = await db.user.create({ + data: { + id: id, + gitlabUsername: name, + mail: email, + deleted: false, + name: name, + } + }); + if(!createUser){ + res.status(500).send({error: 'Error create user'}); + } + } + const jwtToken = jwt.sign({ id }, String(process.env.SECRET_JWT), {expiresIn: '1h'}); + + res.json({ + token: jwtToken, + idUser: id + }); + + } catch (error) { + res.status(500).send('Error exchanging code for token'); + } +}); + + +export default router; diff --git a/microservices/auth/src/routes/RoutesQuestions.ts b/microservices/auth/src/routes/RoutesQuestions.ts deleted file mode 100644 index 476cb928..00000000 --- a/microservices/auth/src/routes/RoutesQuestions.ts +++ /dev/null @@ -1,252 +0,0 @@ -import express from 'express'; - -import db from '../helpers/DatabaseHelper.js'; -import { verifyJWT } from '../Middlewares.js'; -import { checkUser } from "../calcFunctions.js" -import { MessageRoute } from './MessageRoute.js'; - - -const router: express.Router = express.Router(); - - - -router.post('/numeric_question', verifyJWT, async (req: express.Request, res: express.Response) => { - const { question, idQcm } = req.body; - console.log(question, idQcm); - if (!idQcm || !question || !question["question"] || question["nbPtsNegatif"] === undefined || question["nbPtsPositif"] === undefined || question["valNum"] === undefined || question["position"] === undefined) - { - res.status(400).send({ error: MessageRoute.misPara }); - return - } - const infoQcm = await db.qcmTable.findFirst({ - where: { - idQCM: idQcm - } - }); - if(!infoQcm) - { - res.status(404).send({ error: MessageRoute.qcmDoesntExist }); - return - } - checkUser(req, res, infoQcm.idUserCreator, MessageRoute.cantCreate); - const type = await db.type.findFirst({ - where: { - nomType: "numerique" - }, - }); - if(!type) - { - res.status(500).send({ error: 'Server error' }); - return - } - const qcmCreate = await db.question.create({ - data: { - nbPtsNegatif: question["nbPtsNegatif"], - nbPtsPositif: question["nbPtsPositif"], - position: question["position"], - isMultiple: false, - question: question["question"], - idQCM: idQcm, - idType: type["idType"], - numeric: question["valNum"], - randomOrder: false, - } - }); - res.status(200).send({id: qcmCreate.idQuestion}); -}); - -router.post('/text_question', verifyJWT, async (req: express.Request, res: express.Response) => { - const { question, idQcm } = req.body; - console.log(question, idQcm); - if (!idQcm || !question || !question["question"] || question["nbPtsNegatif"] === undefined || question["nbPtsPositif"] === undefined || question["isMultiple"] === undefined || question["position"] === undefined || question["choix"] === undefined || question["randomOrder"] === undefined) - { - res.status(400).send({ error: MessageRoute.misPara }); - return - } - let minOneCorrectChoice: boolean = false; - let minOneFalseChoice: boolean = false; - - for (const choix of question["choix"]) { - if (choix["isCorrect"]) { - minOneCorrectChoice = true; - } - if (!choix["isCorrect"]) { - minOneFalseChoice = true; - } - } - if (!minOneCorrectChoice) - { - res.status(409).send({ error: 'Missing a correct choice' }); - return - } - if (!minOneFalseChoice) - { - res.status(409).send({ error: 'Missing a false choice' }); - return - } - const infoQcm = await db.qcmTable.findFirst({ - where: { - idQCM: idQcm, - } - }); - if(!infoQcm){ - res.status(404).send({ error: MessageRoute.qcmDoesntExist }); - return - } - checkUser(req, res, infoQcm.idUserCreator, MessageRoute.cantCreate); - const type = await db.type.findFirst({ - where: { - nomType: "text" - }, - }); - if(!type){ - res.status(500).send({ error: MessageRoute.serverError }); - return - } - const questionCreate = await db.question.create({ - data: { - nbPtsNegatif:question["nbPtsNegatif"], - nbPtsPositif: question["nbPtsPositif"], - position: question["position"], - isMultiple: question["isMultiple"], - question: question["question"], - idQCM: idQcm, - idType: type["idType"], - randomOrder: question["randomOrder"], - } - }); - console.log(questionCreate) - if(!questionCreate){ - res.status(500).send({ error: MessageRoute.serverError}); - return - } - const idQuestion = questionCreate["idQuestion"]; - for(let i = 0; i < question["choix"].length; i++){ - if(!question["choix"][i]["text"] || question["choix"][i]["isCorrect"] === undefined){ - res.status(500).send({ error: 'Server error' }); - return - } - const choixCreate = await db.choix.create({ - data: { - nomChoix: question["choix"][i]["text"], - isCorrect: question["choix"][i]["isCorrect"], - idQuestion: idQuestion, - position: i, - } - }); - if(!choixCreate){ - res.status(500).send({ error: MessageRoute.serverError }); - return - } - } - res.status(200).send({id: idQuestion}); -}); - -router.post('/true_false_question', verifyJWT, async (req: express.Request, res: express.Response) => { - try { - const { question, idQcm } = req.body; - console.table(req.body) - console.log(question, idQcm) - if (!idQcm || !question || !question["question"] || !question["nbPtsNegatif"] === undefined || !question["nbPtsPositif"] === undefined || question["isVraiFaux"] === undefined || question["valVraiFaux"] === undefined) { - res.status(400).send({ error: MessageRoute.misPara }); - return - } - - const infoQcm = await db.qcmTable.findFirst({ - where: { - idQCM: idQcm - } - }); - - if (!infoQcm) { - res.status(400).send({ error:MessageRoute.qcmDoesntExist}); - return - } - checkUser(req, res, infoQcm.idUserCreator, MessageRoute.cantCreate); - - const type = await db.type.findFirst({ - where: { - nomType: "vraiFaux" - } - }); - - if (!type) { - res.status(500).send({ error: 'Server Problem: Type not found' }); - return - } - - - const questionCreate = await db.question.create({ - data: { - nbPtsNegatif: question["nbPtsNegatif"], - nbPtsPositif: question["nbPtsPositif"], - position: 0, - isMultiple: false, - question: question["question"], - idQCM: idQcm, - idType: type["idType"], - randomOrder: question["randomOrder"], - } - }); - - - if (!questionCreate) { - res.status(500).send({ error: 'Server Problem: Question creation failed' }); - return - } - - const idQuestion = questionCreate.idQuestion; - - const choixData = [ - { nomChoix: "Vrai", isCorrect: question.valVraiFaux, idQuestion: idQuestion, position: 0 }, - { nomChoix: "Faux", isCorrect: !question.valVraiFaux, idQuestion: idQuestion, position: 1 } - ]; - - const choixCreate = await db.choix.createMany({ - data: choixData - }); - if(!choixCreate){ - res.status(500).send({ error: MessageRoute.serverError }); - return - } - - res.status(200).send({id: idQuestion}); - } catch (error) { - res.status(500).send({ error: MessageRoute.serverError }); - } -}); - -router.delete('/question/:QUESTION_ID', verifyJWT, async (req: express.Request, res: express.Response) => { - const QUESTION_ID: number = parseInt(req.params.QUESTION_ID, 10); - console.log(QUESTION_ID); - const questionExist = await db.question.findFirst({ - where: { - idQuestion: QUESTION_ID - }, - include: { - qcm: true - } - }); - - if (!questionExist) - { - res.status(404).send({ error: "This response doesn't exist and canno't be deleted" }); - return - } - checkUser(req, res, questionExist.qcm.idUserCreator, "You can't delete a question in this QCM."); - - try { - console.log(QUESTION_ID) - const reponse = await db.question.delete({ - where: { - idQuestion: QUESTION_ID - }, - }); - res.status(200).send(reponse); - } catch (error) { - console.error(error); - res.status(500).send({ error: 'Server error while answering to the question' }); - } -}); - -export default router; diff --git a/microservices/correction_qcm/src/express/Server.ts b/microservices/correction_qcm/src/express/Server.ts index a80ad4c8..a8f8cf66 100644 --- a/microservices/correction_qcm/src/express/Server.ts +++ b/microservices/correction_qcm/src/express/Server.ts @@ -8,7 +8,7 @@ import helmet from 'helmet'; import express from 'express'; import multer from 'multer'; import Config from '../config/Config'; -import response_routes from '../routes/RoutesResponses'; +import response_routes from '../routes/CorrectionQcm'; import db from '../helpers/DatabaseHelper.js'; import bodyParser from 'body-parser'; @@ -31,7 +31,9 @@ export class Server { this.backend.use(helmet()); //Help to secure express, https://helmetjs.github.io/ this.backend.use(bodyParser.json()); this.backend.use(cors({ - origin: 'http://localhost:4200' + origin: '*' , + methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], + allowedHeaders: ['Authorization', 'Content-Type'] })); //Allow CORS requests diff --git a/microservices/correction_qcm/src/routes/CorrectionQcm.ts b/microservices/correction_qcm/src/routes/CorrectionQcm.ts new file mode 100644 index 00000000..9a356ada --- /dev/null +++ b/microservices/correction_qcm/src/routes/CorrectionQcm.ts @@ -0,0 +1,144 @@ +import express from 'express'; +import db from '../helpers/DatabaseHelper.js'; +import reqGetDB from './reqGetDB.js'; +import { verifyJWT } from '../Middlewares.js'; +import { checkUser, calcNbPtsTotalQCM } from "../calcFunctions.js" +import { MessageRoute } from './MessageRoute.js'; + + +const router: express.Router = express.Router(); +async function getResponsesQCM(QCM_ID: number, USER_ID: number) +{ + return db.qcmTable.findUnique({ + where: { idQCM: QCM_ID }, + select: { + questions: { + select: { + idQuestion: true, + reponses: { + where: { idUser: USER_ID }, + select: { + idChoix: true, + idReponse: true, + numeric: true + } + } + } + } + } + }); +} + +router.get('/reponseCorrect/:QCM_ID', async (req: express.Request, res: express.Response) => { + const QCM_ID: number = parseInt(req.params.QCM_ID, 10); + const questions = await db.question.findMany({ + where: { + idQCM: QCM_ID + }, + include: { + choix: true + } + }); + if(!questions){ + res.status(500).send({ error: MessageRoute.qcmDoesntExist }); + } + const reponsesCorrect: number[][] = []; + for (const question of questions) { + const reponse: number[] = []; + const correctChoices = question.choix.filter(choice => choice.isCorrect); + if (question.numeric) { + reponse.push(question.numeric); + } else { + correctChoices.forEach(choice => { + reponse.push(choice.idChoix); + }); + } + reponsesCorrect.push(reponse); + } + res.status(200).send(reponsesCorrect); +}); + +router.get('/responses_QCM/:QCM_ID/:USER_ID', verifyJWT, async (req: express.Request, res: express.Response) => { + const QCM_ID: number = parseInt(req.params.QCM_ID, 10); + const USER_ID: number = parseInt(req.params.USER_ID, 10); + const results = await reqGetDB(() => getResponsesQCM(QCM_ID, USER_ID)); + res.send(results); +}); + +router.put('/feedback', verifyJWT, async (req: express.Request, res: express.Response) => { + const { idQCM, idUser, note, feedback } = req.body; + console.log(idQCM, idUser, note, feedback) + if (!idQCM || note === undefined || feedback === undefined || idUser === undefined) + { + res.status(400).send({ error: MessageRoute.misPara }); + return + } + const infoQcm = await db.participer.findFirst({ + where: { + AND: { + idQCM: idQCM, + idUser: idUser, + } + }, + include: { + qcm: true + } + }); + if(!infoQcm) + { + res.status(404).send({ error: MessageRoute.qcmDoesntExist }); + return + } + checkUser(req, res, infoQcm.qcm.idUserCreator, "You can't access this ressource"); + const updateFeddback = await db.participer.update({ + where: { + idUser_idQCM: { + idQCM: idQCM, + idUser: idUser + } + + }, + data: { + feedback: feedback, + note: note, + }, + }); + if(!updateFeddback){ + res.status(500).send({ error: 'Error FeedBack' }); + return + } + res.status(200).send(); +}); + +router.get('/results/:QCM_ID', verifyJWT, async (req: express.Request, res: express.Response) => { + const QCM_ID: number = parseInt(req.params.QCM_ID, 10); + + // Fetch QCM details + const qcm = await db.qcmTable.findUnique({ + where: { + idQCM: QCM_ID, + }, + include: { + participer: { + include: { + user: true, + }, + }, + questions:true + }, + }); + + let moy = 1; + let cmp = 0; + if(qcm?.participer){ + qcm.participer.forEach(part => cmp += part.note) + moy = cmp / qcm.participer.length; + } + const nbPoint: number = await calcNbPtsTotalQCM(QCM_ID); + res.send({ + qcm : qcm, + moyClasse : moy, + scoreMax : nbPoint, + }); +}); +export default router; diff --git a/microservices/correction_qcm/src/routes/RoutesResponses.ts b/microservices/correction_qcm/src/routes/RoutesResponses.ts deleted file mode 100644 index 0a1daaeb..00000000 --- a/microservices/correction_qcm/src/routes/RoutesResponses.ts +++ /dev/null @@ -1,211 +0,0 @@ -import express from 'express'; -import db from '../helpers/DatabaseHelper.js'; -import reqGetDB from './reqGetDB.js'; -import { verifyJWT } from '../Middlewares.js'; -import { checkUser } from "../calcFunctions.js" -import { MessageRoute } from './MessageRoute.js'; - - -const router: express.Router = express.Router(); - -router.get('/responses_QCM/:QCM_ID/:USER_ID', verifyJWT, async (req: express.Request, res: express.Response) => { - const QCM_ID: number = parseInt(req.params.QCM_ID, 10); - const USER_ID: number = parseInt(req.params.USER_ID, 10); - const results = await reqGetDB(() => getResponsesQCM(QCM_ID, USER_ID)); - res.send(results); -}); - -router.post('/response', verifyJWT, async (req: express.Request, res: express.Response) => { - const { idQuestion, idChoix, idUser } = req.body; - if (!idQuestion || !idChoix || !idUser) - { - res.status(400).send({ error: MessageRoute.misPara}); - return - } - checkUser(req, res, idUser, "You can't create a response in this QCM."); - - const infosQuestion = await db.choix.findFirst({ - where: { - idQuestion: idQuestion - }, - select: { - idQuestion: true, - idChoix: true - } - }); - - if (infosQuestion) - { - const infosReponse = await db.reponse.findFirst({ - where: { - AND: { - idQuestion: idQuestion, - idUser: idUser, - idChoix: idChoix - } - } - }); - if (infosReponse?.idChoix) - { - res.status(200).send({ error: "This choice has already been chosen"}); - return - } - } - else { - res.status(404).send({ error: MessageRoute.questionDoesntExiste}); - return - } - - try { - const reponse = await db.reponse.create({ - data: { - idQuestion: idQuestion, - idChoix: idChoix, - idUser: idUser, - } - }); - res.status(201).send(reponse); - } catch (error) { - res.status(500).send({ error: MessageRoute.serverErrorAnswering }); - } -}); - -router.delete('/response/:ANSWER_ID',verifyJWT, async (req: express.Request, res: express.Response) => { - const ANSWER_ID: number = parseInt(req.params.ANSWER_ID, 10); - if (!ANSWER_ID) - { - res.status(400).send({ error: MessageRoute.misPara }); - return - } - const responseExist = await db.reponse.findFirst({ - where: { - idReponse: ANSWER_ID - }, - }); - - console.log(responseExist); - if (!responseExist) - { - res.status(404).send({ error: "This response doesn't exist and canno't be deleted" }); - return - } - checkUser(req, res, responseExist.idUser, "You can't delete a response in this QCM."); - - try { - const reponse = await db.reponse.deleteMany({ - where: { - idReponse: ANSWER_ID - }, - }); - res.status(200).send(reponse); - } catch (error) { - res.status(500).send({ error: MessageRoute.serverErrorAnswering }); - } -}); - -router.post('/numeric_response',verifyJWT, async (req: express.Request, res: express.Response) => { - const { idQuestion, answer, idUser } = req.body; - if (!idQuestion || !answer || !idUser) - { - res.status(400).send({ error: MessageRoute.misPara }); - return - } - checkUser(req, res, idUser, "You can't create a response in this QCM."); - - const infosQuestion = await db.question.findFirst({ - where: { - idQuestion: idQuestion - } - }); - - if (infosQuestion) - { - const infosReponse = await db.reponse.findFirst({ - where: { - AND: { - idQuestion: idQuestion, - idUser: idUser, - numeric: { - not: null - } - } - } - }); - if (infosReponse) - { - res.status(200).send({ error: "User already answered this question" }); - return - } - } - else { - res.status(404).send({ error: MessageRoute.questionDoesntExiste}); - return - } - - try { - const reponse = await db.reponse.create({ - data: { - idQuestion: idQuestion, - idUser: idUser, - numeric: answer - } - }); - res.status(201).send(reponse); - } catch (error) { - res.status(500).send({ error: MessageRoute.serverErrorAnswering }); - } -}); - -router.delete('/numeric_response/:ANSWER_ID', verifyJWT,async (req: express.Request, res: express.Response) => { - const ANSWER_ID: number = parseInt(req.params.ANSWER_ID, 10); - console.log(ANSWER_ID); - const responseExist = await db.reponse.findFirst({ - where: { - idReponse: ANSWER_ID - } - }); - - console.log(responseExist); - - if (!responseExist) - { - res.status(404).send({ error: "This response doesn't exist and canno't be deleted" }); - return - } - checkUser(req, res, responseExist.idUser, MessageRoute.serverErrorAnswering); - - try { - const reponse = await db.reponse.delete({ - where: { - idReponse: ANSWER_ID - }, - }); - res.status(200).send(reponse); - } catch (error) { - res.status(500).send({ error: MessageRoute.serverErrorAnswering }); - } -}); - -async function getResponsesQCM(QCM_ID: number, USER_ID: number) -{ - return db.qcmTable.findUnique({ - where: { idQCM: QCM_ID }, - select: { - questions: { - select: { - idQuestion: true, - reponses: { - where: { idUser: USER_ID }, - select: { - idChoix: true, - idReponse: true, - numeric: true - } - } - } - } - } - }); -} - -export default router; diff --git a/microservices/creation_qcm/src/express/Server.ts b/microservices/creation_qcm/src/express/Server.ts index 5c2e09e6..24e6bee2 100644 --- a/microservices/creation_qcm/src/express/Server.ts +++ b/microservices/creation_qcm/src/express/Server.ts @@ -8,7 +8,7 @@ import helmet from 'helmet'; import express from 'express'; import multer from 'multer'; import Config from '../config/Config'; -import qcm_routes from '../routes/RoutesQCMs'; +import qcm_routes from '../routes/CreationQcm'; import db from '../helpers/DatabaseHelper.js'; import bodyParser from 'body-parser'; import jwt from 'jsonwebtoken'; @@ -30,7 +30,9 @@ export class Server { this.backend.use(helmet()); //Help to secure express, https://helmetjs.github.io/ this.backend.use(bodyParser.json()); this.backend.use(cors({ - origin: 'http://localhost:4200' + origin: '*' , + methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], + allowedHeaders: ['Authorization', 'Content-Type'] })); //Allow CORS requests diff --git a/microservices/creation_qcm/src/routes/CreationQcm.ts b/microservices/creation_qcm/src/routes/CreationQcm.ts new file mode 100644 index 00000000..708fd5df --- /dev/null +++ b/microservices/creation_qcm/src/routes/CreationQcm.ts @@ -0,0 +1,110 @@ +import express from 'express'; +import db from '../helpers/DatabaseHelper.js'; +import reqGetDB from './reqGetDB.js'; +import { calcNbPtsTotalQCM, getRandomNumber, checkUser } from "../calcFunctions.js" +import { verifyJWT } from '../Middlewares.js'; +import { randomInt } from 'crypto'; +import { MessageRoute } from './MessageRoute.js'; + +const router: express.Router = express.Router(); +// router.use(verifyJWT) + +router.post('/QCM', verifyJWT, async (req: express.Request, res: express.Response) => { + const { qcm, idUser } = req.body; + console.log(qcm, idUser, qcm["nomQcm"], qcm["randomQuestion"], qcm["tempsMax"]) + if (!qcm || !idUser || !qcm["nomQcm"] || qcm["randomQuestion"] === undefined || qcm["tempsMax"] === undefined) + { + res.status(400).send({ error: MessageRoute.misPara }); + return + } + const codeAcces: number = getRandomNumber(1000, 9999); + const qcmCreate = await db.qcmTable.create({ + data: { + nomQCM : qcm["nomQcm"], + codeAcces : codeAcces, + randomOrder : qcm["randomQuestion"], + temps : qcm["tempsMax"], + idUserCreator : idUser, + } + }); + res.status(200).send({id: qcmCreate.idQCM}); +}); +router.post('/numeric_question', verifyJWT, async (req: express.Request, res: express.Response) => { + const { question, idQcm } = req.body; + console.log(question, idQcm); + if (!idQcm || !question || !question["question"] || question["nbPtsNegatif"] === undefined || question["nbPtsPositif"] === undefined || question["valNum"] === undefined || question["position"] === undefined) + { + res.status(400).send({ error: MessageRoute.misPara }); + return + } + const infoQcm = await db.qcmTable.findFirst({ + where: { + idQCM: idQcm + } + }); + if(!infoQcm) + { + res.status(404).send({ error: MessageRoute.qcmDoesntExist }); + return + } + checkUser(req, res, infoQcm.idUserCreator, MessageRoute.cantCreate); + const type = await db.type.findFirst({ + where: { + nomType: "numerique" + }, + }); + if(!type) + { + res.status(500).send({ error: 'Server error' }); + return + } + const qcmCreate = await db.question.create({ + data: { + nbPtsNegatif: question["nbPtsNegatif"], + nbPtsPositif: question["nbPtsPositif"], + position: question["position"], + isMultiple: false, + question: question["question"], + idQCM: idQcm, + idType: type["idType"], + numeric: question["valNum"], + randomOrder: false, + } + }); + res.status(200).send({id: qcmCreate.idQuestion}); +}); + +router.put('/QCM', verifyJWT, async (req: express.Request, res: express.Response) => { + const { qcm } = req.body; + console.table(qcm) + if (!qcm || !qcm["nomQcm"] || qcm["randomQuestion"] === undefined || qcm["tempsMax"] === undefined || qcm["idQcm"] === undefined) + { + res.status(400).send({ error: MessageRoute.misPara }); + return + } + const infoQcm = await db.qcmTable.findFirst({ + where: { + idQCM: qcm["idQcm"], + } + }); + + if(!infoQcm) + { + res.status(404).send({ error: MessageRoute.qcmDoesntExist }); + return + } + checkUser(req, res, infoQcm?.idUserCreator, "This is not your QCM"); + const qcmCreate = await db.qcmTable.update({ + where: { + idQCM: qcm["idQcm"] + }, + data: { + nomQCM : qcm["nomQcm"], + randomOrder : qcm["randomQuestion"], + temps : qcm["tempsMax"], + }, + }); + res.status(200).send(qcmCreate); +}); + +export default router; diff --git a/microservices/docker-compose.yml b/microservices/docker-compose.yml index 944cfe12..729e26dc 100644 --- a/microservices/docker-compose.yml +++ b/microservices/docker-compose.yml @@ -1,8 +1,33 @@ +version: '3.8' + services: + service-frontend: + image: service-frontend + build: ./frontend + ports: + - "4200:4200" + + + nginx: + image: nginx:latest + container_name: nginx-proxy + ports: + - "30992:30992" # 🚀 Le frontend appelle toujours 30992, donc on l'expose + volumes: + - ./nginx.conf:/etc/nginx/nginx.conf:ro + - ./cors.conf:/etc/nginx/cors.conf:ro + depends_on: + - service-helloworld + - service-auth + - service-correction-qcm + - service-realise-qcm + - service-search-qcm + - service-creation-qcm + networks: + - backend_network + service-database: - image: service-database - build: ./database # Utilise le Dockerfile dans le dossier database - restart: always + image: postgres:latest environment: POSTGRES_USER: user POSTGRES_PASSWORD: super @@ -11,85 +36,60 @@ services: - "5432:5432" volumes: - pgdata:/var/lib/postgresql/data + networks: + - backend_network service-helloworld: - image: service-helloworld # routes de base et migrations + image: service-helloworld build: ./helloworld - ports: - - "8001:30992" - env_file: - - ./helloworld/.env - depends_on: - - service-database + expose: + - "8002" # 🚀 Utilisé par Nginx + networks: + - backend_network service-auth: image: service-auth build: ./auth - ports: - - "8008:30992" - env_file: - - ./auth/.env - depends_on: - - service-helloworld - - service-frontend: - image: service-frontend - build: ./frontend - ports: - - "4200:4200" - - depends_on: - - service-helloworld + expose: + - "8001" + networks: + - backend_network service-correction-qcm: image: service-correction-qcm build: ./correction_qcm - ports: - - "8006:30992" - env_file: - - ./correction_qcm/.env - depends_on: - - service-helloworld + expose: + - "8003" + networks: + - backend_network service-realise-qcm: image: service-realise-qcm build: ./realise_qcm - ports: - - "8005:30992" - env_file: - - ./realise_qcm/.env - depends_on: - - service-helloworld + expose: + - "8005" + networks: + - backend_network service-search-qcm: image: service-search-qcm build: ./search_qcm - ports: - - "8004:30992" - env_file: - - ./search_qcm/.env - depends_on: - - service-helloworld + expose: + - "8006" + networks: + - backend_network service-creation-qcm: image: service-creation-qcm build: ./creation_qcm - ports: - - "8003:30992" - env_file: - - ./creation_qcm/.env - depends_on: - - service-helloworld + expose: + - "8004" + networks: + - backend_network - service-navigation-qcm: - image: service-navigation-qcm - build: ./navigation_qcm - ports: - - "8002:30992" - env_file: - - ./navigation_qcm/.env - depends_on: - - service-helloworld +networks: + backend_network: + driver: bridge volumes: pgdata: diff --git a/microservices/helloworld/src/express/Server.ts b/microservices/helloworld/src/express/Server.ts index dbfbd279..abda115d 100644 --- a/microservices/helloworld/src/express/Server.ts +++ b/microservices/helloworld/src/express/Server.ts @@ -31,7 +31,9 @@ export class Server { this.backend.use(helmet()); //Help to secure express, https://helmetjs.github.io/ this.backend.use(bodyParser.json()); this.backend.use(cors({ - origin: '*' + origin: '*' , + methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], + allowedHeaders: ['Authorization', 'Content-Type'] })); //Allow CORS requests diff --git a/microservices/navigation_qcm/.env b/microservices/navigation_qcm/.env deleted file mode 100644 index f27ae780..00000000 --- a/microservices/navigation_qcm/.env +++ /dev/null @@ -1,6 +0,0 @@ -########################### Server env vars -API_PORT=30992 -SECRET_JWT="JECROISQUECEMESSAGEESTSECRET" -CLIENTID = 'f8b0e14f7eee1a718ad0b3f32c52fe34813d56e9052976f076e039d006e24000' -CLIENTSECRET = 'gloas-1451c5f206cb04b6b300e6dcbf19a01f1a44bff5e8562741a7efd0ec27eb0855' -DATABASE_URL="postgresql://user:super@service-database/dbqcm?schema=public" diff --git a/microservices/navigation_qcm/.env.keys b/microservices/navigation_qcm/.env.keys deleted file mode 100644 index c8e92349..00000000 --- a/microservices/navigation_qcm/.env.keys +++ /dev/null @@ -1,5 +0,0 @@ -#/!!!!!!!!!!!!!!!!!!!.env.keys!!!!!!!!!!!!!!!!!!!!!!/ -#/ DOTENV_KEYs. DO NOT commit to source control / -#/ [how it works](https://dotenvx.com/env-keys) / -#/--------------------------------------------------/ -DOTENV_KEY_DEVELOPMENT="dotenv://:key_0c7d3c878ca159886f78155a2682c880aac6c19bc97bac68be59851d5c0b19c9@dotenvx.com/vault/.env.vault?environment=development" diff --git a/microservices/navigation_qcm/.env.vault b/microservices/navigation_qcm/.env.vault deleted file mode 100644 index d82f96d9..00000000 --- a/microservices/navigation_qcm/.env.vault +++ /dev/null @@ -1,8 +0,0 @@ -#/-------------------.env.vault---------------------/ -#/ cloud-agnostic vaulting standard / -#/ [how it works](https://dotenvx.com/env-vault) / -#/--------------------------------------------------/ - -# development -DOTENV_VAULT_DEVELOPMENT="VOnZRpidaeiufZEY+ykm1UPI1SVJpTeMfIeQ7f2gBkH8DeAF50zqbDiJPd/JIg+lcIR0MFwtCjBEiGC8gXbi94P7BKN4t55vv/8yUJNJhCWzTv82P7uLigizHNOVfA6EDYXVSB9AGzQOP3VGMT4uW5Hqk28mztKBA35fGRyX8ioj8Kulsf8WsD/1hv5/CtTOSAl3HOF8Wi1AOw+9GjxfAmE3YPJtlTpSvDUnFKdlAR3rbVnFMtXRUVq0i7L4J004IJWA1FOqNBmBCm2/q87uCRrBMvrtNDfY27e4iNLlK3fj8qY6lG5vs1l200hcBkWfO+fC2tVVOwbdAxdkgU5WSsmU2yl5Z9SMmG1q3IP+5eL92JwWcSx5/NrYhMezq8uOJsGvnlKSNE1Ay5UW" - diff --git a/microservices/navigation_qcm/.gitkeep b/microservices/navigation_qcm/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/microservices/navigation_qcm/.idea/.gitignore b/microservices/navigation_qcm/.idea/.gitignore deleted file mode 100644 index 7abb13d0..00000000 --- a/microservices/navigation_qcm/.idea/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# GitHub Copilot persisted chat sessions -/copilot/chatSessions diff --git a/microservices/navigation_qcm/.idea/TP.iml b/microservices/navigation_qcm/.idea/TP.iml deleted file mode 100644 index 10d6d0fe..00000000 --- a/microservices/navigation_qcm/.idea/TP.iml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<module type="WEB_MODULE" version="4"> - <component name="NewModuleRootManager"> - <content url="file://$MODULE_DIR$"> - <excludeFolder url="file://$MODULE_DIR$/temp" /> - <excludeFolder url="file://$MODULE_DIR$/.tmp" /> - <excludeFolder url="file://$MODULE_DIR$/tmp" /> - <excludeFolder url="file://$MODULE_DIR$/.idea/copilot/chatSessions" /> - </content> - <orderEntry type="inheritedJdk" /> - <orderEntry type="sourceFolder" forTests="false" /> - </component> - <component name="SonarLintModuleSettings"> - <option name="uniqueId" value="67d3ddf7-0683-484f-98df-6929218e64a1" /> - </component> -</module> \ No newline at end of file diff --git a/microservices/navigation_qcm/.idea/codeStyles/Project.xml b/microservices/navigation_qcm/.idea/codeStyles/Project.xml deleted file mode 100644 index 6b0a72fe..00000000 --- a/microservices/navigation_qcm/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,230 +0,0 @@ -<component name="ProjectCodeStyleConfiguration"> - <code_scheme name="Project" version="173"> - <option name="AUTODETECT_INDENTS" value="false" /> - <option name="RIGHT_MARGIN" value="0" /> - <Angular2HtmlCodeStyleSettings> - <option name="INTERPOLATION_NEW_LINE_AFTER_START_DELIMITER" value="false" /> - <option name="INTERPOLATION_NEW_LINE_BEFORE_END_DELIMITER" value="false" /> - </Angular2HtmlCodeStyleSettings> - <CssCodeStyleSettings> - <option name="HEX_COLOR_UPPER_CASE" value="true" /> - <option name="HEX_COLOR_LONG_FORMAT" value="true" /> - <option name="VALUE_ALIGNMENT" value="1" /> - <option name="USE_DOUBLE_QUOTES" value="false" /> - <option name="ENFORCE_QUOTES_ON_FORMAT" value="true" /> - </CssCodeStyleSettings> - <HTMLCodeStyleSettings> - <option name="HTML_ATTRIBUTE_WRAP" value="0" /> - <option name="HTML_TEXT_WRAP" value="0" /> - <option name="HTML_KEEP_LINE_BREAKS" value="false" /> - <option name="HTML_ALIGN_TEXT" value="true" /> - <option name="HTML_SPACE_INSIDE_EMPTY_TAG" value="true" /> - <option name="HTML_DO_NOT_INDENT_CHILDREN_OF" value="" /> - <option name="HTML_ENFORCE_QUOTES" value="true" /> - </HTMLCodeStyleSettings> - <JSCodeStyleSettings version="0"> - <option name="SPACE_WITHIN_ARRAY_INITIALIZER_BRACKETS" value="true" /> - <option name="REFORMAT_C_STYLE_COMMENTS" value="true" /> - <option name="USE_DOUBLE_QUOTES" value="false" /> - <option name="FORCE_QUOTE_STYlE" value="true" /> - <option name="ENFORCE_TRAILING_COMMA" value="Remove" /> - <option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" /> - <option name="SPACES_WITHIN_IMPORTS" value="true" /> - <option name="SPACES_WITHIN_INTERPOLATION_EXPRESSIONS" value="true" /> - </JSCodeStyleSettings> - <JSON> - <option name="PROPERTY_ALIGNMENT" value="2" /> - </JSON> - <LessCodeStyleSettings> - <option name="HEX_COLOR_UPPER_CASE" value="true" /> - <option name="HEX_COLOR_LONG_FORMAT" value="true" /> - <option name="VALUE_ALIGNMENT" value="1" /> - <option name="USE_DOUBLE_QUOTES" value="false" /> - <option name="ENFORCE_QUOTES_ON_FORMAT" value="true" /> - </LessCodeStyleSettings> - <Markdown> - <option name="MIN_LINES_AROUND_HEADER" value="2" /> - <option name="KEEP_LINE_BREAKS_INSIDE_TEXT_BLOCKS" value="false" /> - <option name="WRAP_TEXT_INSIDE_BLOCKQUOTES" value="false" /> - </Markdown> - <Python> - <option name="SPACE_WITHIN_BRACES" value="true" /> - <option name="SPACE_AROUND_EQ_IN_NAMED_PARAMETER" value="true" /> - <option name="SPACE_AROUND_EQ_IN_KEYWORD_ARGUMENT" value="true" /> - <option name="NEW_LINE_AFTER_COLON" value="true" /> - <option name="DICT_WRAPPING" value="2" /> - <option name="BLANK_LINES_AFTER_LOCAL_IMPORTS" value="1" /> - <option name="OPTIMIZE_IMPORTS_SORT_IMPORTS" value="false" /> - <option name="OPTIMIZE_IMPORTS_SORT_BY_TYPE_FIRST" value="false" /> - <option name="FROM_IMPORT_WRAPPING" value="0" /> - <option name="FROM_IMPORT_PARENTHESES_FORCE_IF_MULTILINE" value="true" /> - </Python> - <ScssCodeStyleSettings> - <option name="HEX_COLOR_UPPER_CASE" value="true" /> - <option name="HEX_COLOR_LONG_FORMAT" value="true" /> - <option name="VALUE_ALIGNMENT" value="1" /> - <option name="USE_DOUBLE_QUOTES" value="false" /> - <option name="ENFORCE_QUOTES_ON_FORMAT" value="true" /> - </ScssCodeStyleSettings> - <SqlCodeStyleSettings version="7"> - <option name="KEYWORD_CASE" value="2" /> - <option name="TYPE_CASE" value="3" /> - <option name="CUSTOM_TYPE_CASE" value="3" /> - <option name="BUILT_IN_CASE" value="2" /> - <option name="QUOTE_IDENTIFIER" value="1" /> - <option name="QUERY_EL_COMMA" value="2" /> - <option name="QUERY_IN_ONE_STRING" value="3" /> - <option name="INSERT_INTO_NL" value="2" /> - <option name="INSERT_EL_WRAP" value="1" /> - <option name="INSERT_EL_COMMA" value="2" /> - <option name="INSERT_SPACE_WITHIN_PARENTHESES" value="true" /> - <option name="SET_EL_WRAP" value="0" /> - <option name="SET_EL_COMMA" value="2" /> - <option name="SELECT_EL_LINE" value="1" /> - <option name="SELECT_EL_COMMA" value="2" /> - <option name="FROM_EL_COMMA" value="2" /> - <option name="FROM_INDENT_JOIN" value="false" /> - <option name="WHERE_EL_LINE" value="1" /> - <option name="ORDER_EL_LINE" value="1" /> - <option name="ORDER_EL_WRAP" value="1" /> - <option name="ORDER_EL_COMMA" value="2" /> - <option name="ORDER_ALIGN_ASC_DESC" value="true" /> - <option name="IMP_IF_THEN_WRAP_THEN" value="true" /> - <option name="CORTEGE_SPACE_WITHIN_PARENTHESES" value="true" /> - <option name="EXPR_SPACE_WITHIN_PARENTHESES" value="true" /> - <option name="EXPR_CALL_SPACE_INSIDE_PARENTHESES" value="true" /> - </SqlCodeStyleSettings> - <TypeScriptCodeStyleSettings version="0"> - <option name="FORCE_SEMICOLON_STYLE" value="true" /> - <option name="FILE_NAME_STYLE" value="CAMEL_CASE" /> - <option name="ALIGN_OBJECT_PROPERTIES" value="2" /> - <option name="ALIGN_VAR_STATEMENTS" value="1" /> - <option name="SPACE_WITHIN_ARRAY_INITIALIZER_BRACKETS" value="true" /> - <option name="USE_PUBLIC_MODIFIER" value="true" /> - <option name="USE_DOUBLE_QUOTES" value="false" /> - <option name="FORCE_QUOTE_STYlE" value="true" /> - <option name="PREFER_EXPLICIT_TYPES_VARS_FIELDS" value="true" /> - <option name="PREFER_EXPLICIT_TYPES_FUNCTION_RETURNS" value="true" /> - <option name="PREFER_EXPLICIT_TYPES_FUNCTION_EXPRESSION_RETURNS" value="true" /> - <option name="ENFORCE_TRAILING_COMMA" value="Remove" /> - <option name="USE_EXPLICIT_JS_EXTENSION" value="TRUE" /> - <option name="VAR_DECLARATION_WRAP" value="2" /> - <option name="OBJECT_LITERAL_WRAP" value="2" /> - <option name="IMPORTS_WRAP" value="0" /> - <option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" /> - <option name="SPACES_WITHIN_IMPORTS" value="true" /> - <option name="ALIGN_IMPORTS" value="true" /> - <option name="ALIGN_UNION_TYPES" value="true" /> - <option name="SPACES_WITHIN_INTERPOLATION_EXPRESSIONS" value="true" /> - <option name="BLACKLIST_IMPORTS" value="rxjs/Rx" /> - </TypeScriptCodeStyleSettings> - <XML> - <option name="XML_ATTRIBUTE_WRAP" value="0" /> - <option name="XML_KEEP_LINE_BREAKS" value="false" /> - <option name="XML_KEEP_LINE_BREAKS_IN_TEXT" value="false" /> - <option name="XML_SPACE_INSIDE_EMPTY_TAG" value="true" /> - </XML> - <codeStyleSettings language="HTML"> - <option name="RIGHT_MARGIN" value="1000" /> - <option name="WRAP_ON_TYPING" value="0" /> - <option name="SOFT_MARGINS" value="1000" /> - </codeStyleSettings> - <codeStyleSettings language="JSON"> - <option name="RIGHT_MARGIN" value="999" /> - <option name="WRAP_ON_TYPING" value="0" /> - <indentOptions> - <option name="INDENT_SIZE" value="4" /> - </indentOptions> - </codeStyleSettings> - <codeStyleSettings language="JavaScript"> - <option name="RIGHT_MARGIN" value="999" /> - <option name="KEEP_LINE_BREAKS" value="false" /> - <option name="BLANK_LINES_AFTER_IMPORTS" value="2" /> - <option name="BLANK_LINES_AROUND_CLASS" value="2" /> - <option name="ALIGN_MULTILINE_PARAMETERS_IN_CALLS" value="true" /> - <option name="ALIGN_MULTILINE_ARRAY_INITIALIZER_EXPRESSION" value="true" /> - <option name="SPACE_BEFORE_SEMICOLON" value="true" /> - <option name="SPACE_WITHIN_IF_PARENTHESES" value="true" /> - <option name="SPACE_WITHIN_WHILE_PARENTHESES" value="true" /> - <option name="SPACE_WITHIN_FOR_PARENTHESES" value="true" /> - <option name="SPACE_WITHIN_CATCH_PARENTHESES" value="true" /> - <option name="SPACE_WITHIN_SWITCH_PARENTHESES" value="true" /> - <option name="CALL_PARAMETERS_WRAP" value="5" /> - <option name="CALL_PARAMETERS_RPAREN_ON_NEXT_LINE" value="true" /> - <option name="KEEP_SIMPLE_BLOCKS_IN_ONE_LINE" value="true" /> - <option name="KEEP_SIMPLE_METHODS_IN_ONE_LINE" value="true" /> - <option name="ARRAY_INITIALIZER_WRAP" value="5" /> - <option name="IF_BRACE_FORCE" value="3" /> - <option name="DOWHILE_BRACE_FORCE" value="3" /> - <option name="WHILE_BRACE_FORCE" value="3" /> - <option name="FOR_BRACE_FORCE" value="3" /> - <option name="WRAP_ON_TYPING" value="0" /> - </codeStyleSettings> - <codeStyleSettings language="LESS"> - <indentOptions> - <option name="INDENT_SIZE" value="4" /> - </indentOptions> - </codeStyleSettings> - <codeStyleSettings language="Markdown"> - <option name="RIGHT_MARGIN" value="120" /> - <option name="WRAP_ON_TYPING" value="1" /> - <option name="SOFT_MARGINS" value="120" /> - </codeStyleSettings> - <codeStyleSettings language="Prisma"> - <indentOptions> - <option name="INDENT_SIZE" value="4" /> - <option name="TAB_SIZE" value="4" /> - </indentOptions> - </codeStyleSettings> - <codeStyleSettings language="SASS"> - <indentOptions> - <option name="INDENT_SIZE" value="4" /> - </indentOptions> - </codeStyleSettings> - <codeStyleSettings language="SCSS"> - <indentOptions> - <option name="INDENT_SIZE" value="4" /> - </indentOptions> - </codeStyleSettings> - <codeStyleSettings language="Shell Script"> - <indentOptions> - <option name="INDENT_SIZE" value="4" /> - <option name="TAB_SIZE" value="4" /> - </indentOptions> - </codeStyleSettings> - <codeStyleSettings language="TypeScript"> - <option name="RIGHT_MARGIN" value="999" /> - <option name="BLOCK_COMMENT_ADD_SPACE" value="true" /> - <option name="KEEP_LINE_BREAKS" value="false" /> - <option name="BLANK_LINES_AFTER_IMPORTS" value="2" /> - <option name="BLANK_LINES_AROUND_CLASS" value="2" /> - <option name="ALIGN_MULTILINE_PARAMETERS_IN_CALLS" value="true" /> - <option name="ALIGN_MULTILINE_ARRAY_INITIALIZER_EXPRESSION" value="true" /> - <option name="SPACE_BEFORE_SEMICOLON" value="true" /> - <option name="SPACE_WITHIN_IF_PARENTHESES" value="true" /> - <option name="SPACE_WITHIN_WHILE_PARENTHESES" value="true" /> - <option name="SPACE_WITHIN_FOR_PARENTHESES" value="true" /> - <option name="SPACE_WITHIN_CATCH_PARENTHESES" value="true" /> - <option name="SPACE_WITHIN_SWITCH_PARENTHESES" value="true" /> - <option name="CALL_PARAMETERS_WRAP" value="5" /> - <option name="CALL_PARAMETERS_RPAREN_ON_NEXT_LINE" value="true" /> - <option name="KEEP_SIMPLE_BLOCKS_IN_ONE_LINE" value="true" /> - <option name="KEEP_SIMPLE_METHODS_IN_ONE_LINE" value="true" /> - <option name="ARRAY_INITIALIZER_WRAP" value="5" /> - <option name="IF_BRACE_FORCE" value="3" /> - <option name="DOWHILE_BRACE_FORCE" value="3" /> - <option name="WHILE_BRACE_FORCE" value="3" /> - <option name="FOR_BRACE_FORCE" value="3" /> - <option name="ENUM_CONSTANTS_WRAP" value="2" /> - <option name="WRAP_ON_TYPING" value="0" /> - </codeStyleSettings> - <codeStyleSettings language="XML"> - <option name="WRAP_ON_TYPING" value="0" /> - </codeStyleSettings> - <codeStyleSettings language="yaml"> - <indentOptions> - <option name="INDENT_SIZE" value="4" /> - </indentOptions> - </codeStyleSettings> - </code_scheme> -</component> \ No newline at end of file diff --git a/microservices/navigation_qcm/.idea/codeStyles/codeStyleConfig.xml b/microservices/navigation_qcm/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index 79ee123c..00000000 --- a/microservices/navigation_qcm/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ -<component name="ProjectCodeStyleConfiguration"> - <state> - <option name="USE_PER_PROJECT_SETTINGS" value="true" /> - </state> -</component> \ No newline at end of file diff --git a/microservices/navigation_qcm/.idea/modules.xml b/microservices/navigation_qcm/.idea/modules.xml deleted file mode 100644 index 76d62f6c..00000000 --- a/microservices/navigation_qcm/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="ProjectModuleManager"> - <modules> - <module fileurl="file://$PROJECT_DIR$/.idea/TP.iml" filepath="$PROJECT_DIR$/.idea/TP.iml" /> - </modules> - </component> -</project> \ No newline at end of file diff --git a/microservices/navigation_qcm/.idea/saveactions_settings.xml b/microservices/navigation_qcm/.idea/saveactions_settings.xml deleted file mode 100644 index 7d357782..00000000 --- a/microservices/navigation_qcm/.idea/saveactions_settings.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="SaveActionSettings"> - <option name="actions"> - <set> - <option value="activate" /> - <option value="activateOnShortcut" /> - <option value="reformat" /> - </set> - </option> - </component> -</project> \ No newline at end of file diff --git a/microservices/navigation_qcm/.idea/sonarlint.xml b/microservices/navigation_qcm/.idea/sonarlint.xml deleted file mode 100644 index 084d7bb2..00000000 --- a/microservices/navigation_qcm/.idea/sonarlint.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="SonarLintProjectSettings"> - <option name="bindingEnabled" value="true" /> - <option name="projectKey" value="Minelli_Malandain-Arch-Web-24-TP1" /> - <option name="serverId" value="HEPIA" /> - </component> -</project> \ No newline at end of file diff --git a/microservices/navigation_qcm/.idea/vcs.xml b/microservices/navigation_qcm/.idea/vcs.xml deleted file mode 100644 index 6c0b8635..00000000 --- a/microservices/navigation_qcm/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="VcsDirectoryMappings"> - <mapping directory="$PROJECT_DIR$/.." vcs="Git" /> - </component> -</project> \ No newline at end of file diff --git a/microservices/navigation_qcm/assets/.gitkeep b/microservices/navigation_qcm/assets/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/microservices/navigation_qcm/dockerfile b/microservices/navigation_qcm/dockerfile deleted file mode 100644 index 548d9151..00000000 --- a/microservices/navigation_qcm/dockerfile +++ /dev/null @@ -1,25 +0,0 @@ -# Étape 1 : Construction de l'application -FROM node:18 AS builder - -WORKDIR /app - -# Copier tout le projet depuis ta machine (y compris tsconfig.json) -COPY . . - -# Installer les dépendances -RUN npm install - -# Compiler TypeScript -RUN npm run build - -# Étape 2 : Image de production -FROM node:18 - -WORKDIR /app - -# Copier les fichiers de production depuis le builder -COPY --from=builder /app . - -EXPOSE 30992 - -CMD ["npm", "run", "start:dev"] \ No newline at end of file diff --git a/microservices/navigation_qcm/jest.config.js b/microservices/navigation_qcm/jest.config.js deleted file mode 100644 index da0ba537..00000000 --- a/microservices/navigation_qcm/jest.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - transform: {'^.+\\.ts?$': 'ts-jest'}, - testEnvironment: 'node', - testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', - moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] -}; \ No newline at end of file diff --git a/microservices/navigation_qcm/nodemon.json b/microservices/navigation_qcm/nodemon.json deleted file mode 100644 index c07d9105..00000000 --- a/microservices/navigation_qcm/nodemon.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "watch" : [ - "nodemon.json", - "node_modules", - "prisma", - "src", - ".env.vault" - ], - "verbose": true, - "ext" : ".ts,.js", - "ignore" : [], - "exec" : "tsc --noEmit && npx tsx src/app.ts" -} diff --git a/microservices/navigation_qcm/package-lock.json b/microservices/navigation_qcm/package-lock.json deleted file mode 100644 index 82d32791..00000000 --- a/microservices/navigation_qcm/package-lock.json +++ /dev/null @@ -1,6871 +0,0 @@ -{ - "name": "architecture_web_tp", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "architecture_web_tp", - "version": "1.0.0", - "dependencies": { - "@dotenvx/dotenvx": "^0.34.0", - "@prisma/client": "^6.3.1", - "axios": "^1.7.2", - "bcryptjs": "^2.4.3", - "body-parser": "^1.20.2", - "cors": "^2.8.5", - "express": "^4.19.2", - "express-validator": "^7.0.1", - "form-data": "^4.0.0", - "helmet": "^7.1.0", - "http-status-codes": "^2.3.0", - "jsonwebtoken": "^9.0.2", - "morgan": "^1.10.0", - "multer": "^1.4.5-lts.1", - "winston": "^3.13.0" - }, - "devDependencies": { - "@types/bcryptjs": "^2.4.6", - "@types/cors": "^2.8.17", - "@types/express": "^4.17.21", - "@types/jsonwebtoken": "^9.0.6", - "@types/morgan": "^1.9.9", - "@types/multer": "^1.4.11", - "@types/node": "^20.12.7", - "node": "^20.12.2", - "nodemon": "^3.1.0", - "npm": "^10.5.2", - "prisma": "^6.3.1", - "ts-node": "^10.9.2", - "tsx": "^4.7.2", - "typescript": "^5.4.5" - } - }, - "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/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@dotenvx/dotenvx": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-0.34.0.tgz", - "integrity": "sha512-0PiQUTGicI9M+pl9/GJpmzwa6E/MU0SI+K8JLTlplPIfeRv471Nd8qPBdBujCBH4kPt5maXvV5hCtdq+gV0pJw==", - "dependencies": { - "@inquirer/confirm": "^2.0.17", - "arch": "^2.1.1", - "chalk": "^4.1.2", - "commander": "^11.1.0", - "conf": "^10.2.0", - "dotenv": "^16.4.5", - "dotenv-expand": "^11.0.6", - "execa": "^5.1.1", - "glob": "^10.3.10", - "ignore": "^5.3.0", - "is-wsl": "^2.1.1", - "object-treeify": "1.1.33", - "open": "^8.4.2", - "ora": "^5.4.1", - "semver": "^7.3.4", - "undici": "^5.28.3", - "which": "^4.0.0", - "winston": "^3.11.0", - "xxhashjs": "^0.2.2" - }, - "bin": { - "dotenvx": "src/cli/dotenvx.js", - "git-dotenvx": "src/cli/dotenvx.js" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@fastify/busboy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@inquirer/confirm": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-2.0.17.tgz", - "integrity": "sha512-EqzhGryzmGpy2aJf6LxJVhndxYmFs+m8cxXzf8nejb1DE3sabf6mUgBcp4J0jAUEiAcYzqmkqRr7LPFh/WdnXA==", - "dependencies": { - "@inquirer/core": "^6.0.0", - "@inquirer/type": "^1.1.6", - "chalk": "^4.1.2" - }, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/@inquirer/core": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-6.0.0.tgz", - "integrity": "sha512-fKi63Khkisgda3ohnskNf5uZJj+zXOaBvOllHsOkdsXRA/ubQLJQrZchFFi57NKbZzkTunXiBMdvWOv71alonw==", - "dependencies": { - "@inquirer/type": "^1.1.6", - "@types/mute-stream": "^0.0.4", - "@types/node": "^20.10.7", - "@types/wrap-ansi": "^3.0.0", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "cli-spinners": "^2.9.2", - "cli-width": "^4.1.0", - "figures": "^3.2.0", - "mute-stream": "^1.0.0", - "run-async": "^3.0.0", - "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/@inquirer/type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.3.0.tgz", - "integrity": "sha512-RW4Zf6RCTnInRaOZuRHTqAUl+v6VJuQGglir7nW2BkT3OXOphMhkIFhvFRjorBx2l0VwtC/M4No8vYR65TdN9Q==", - "engines": { - "node": ">=18" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@prisma/client": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.3.1.tgz", - "integrity": "sha512-ARAJaPs+eBkemdky/XU3cvGRl+mIPHCN2lCXsl5Vlb0E2gV+R6IN7aCI8CisRGszEZondwIsW9Iz8EJkTdykyA==", - "hasInstallScript": true, - "engines": { - "node": ">=18.18" - }, - "peerDependencies": { - "prisma": "*", - "typescript": ">=5.1.0" - }, - "peerDependenciesMeta": { - "prisma": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/@prisma/debug": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.3.1.tgz", - "integrity": "sha512-RrEBkd+HLZx+ydfmYT0jUj7wjLiS95wfTOSQ+8FQbvb6vHh5AeKfEPt/XUQ5+Buljj8hltEfOslEW57/wQIVeA==", - "devOptional": true - }, - "node_modules/@prisma/engines": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.3.1.tgz", - "integrity": "sha512-sXdqEVLyGAJ5/iUoG/Ea5AdHMN71m6PzMBWRQnLmhhOejzqAaEr8rUd623ql6OJpED4s/U4vIn4dg1qkF7vGag==", - "devOptional": true, - "hasInstallScript": true, - "dependencies": { - "@prisma/debug": "6.3.1", - "@prisma/engines-version": "6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0", - "@prisma/fetch-engine": "6.3.1", - "@prisma/get-platform": "6.3.1" - } - }, - "node_modules/@prisma/engines-version": { - "version": "6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0.tgz", - "integrity": "sha512-R/ZcMuaWZT2UBmgX3Ko6PAV3f8//ZzsjRIG1eKqp3f2rqEqVtCv+mtzuH2rBPUC9ujJ5kCb9wwpxeyCkLcHVyA==", - "devOptional": true - }, - "node_modules/@prisma/fetch-engine": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.3.1.tgz", - "integrity": "sha512-HOf/0umOgt+/S2xtZze+FHKoxpVg4YpVxROr6g2YG09VsI3Ipyb+rGvD6QGbCqkq5NTWAAZoOGNL+oy7t+IhaQ==", - "devOptional": true, - "dependencies": { - "@prisma/debug": "6.3.1", - "@prisma/engines-version": "6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0", - "@prisma/get-platform": "6.3.1" - } - }, - "node_modules/@prisma/get-platform": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.3.1.tgz", - "integrity": "sha512-AYLq6Hk9xG73JdLWJ3Ip9Wg/vlP7xPvftGBalsPzKDOHr/ImhwJ09eS8xC2vNT12DlzGxhfk8BkL0ve2OriNhQ==", - "devOptional": true, - "dependencies": { - "@prisma/debug": "6.3.1" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@types/bcryptjs": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz", - "integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==", - "dev": true - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cors": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", - "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz", - "integrity": "sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true - }, - "node_modules/@types/morgan": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.9.tgz", - "integrity": "sha512-iRYSDKVaC6FkGSpEVVIvrRGw0DfJMiQzIn3qr2G5B3C//AWkulhXgaBd7tS9/J79GWSYMTHGs7PfI5b3Y8m+RQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/multer": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.11.tgz", - "integrity": "sha512-svK240gr6LVWvv3YGyhLlA+6LRRWA4mnGIU7RcNmgjBYFl6665wcXrRfxGp5tEPVHUNm5FMcmq7too9bxCwX/w==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/mute-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", - "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dev": true, - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" - }, - "node_modules/@types/wrap-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", - "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==" - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "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" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "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==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" - }, - "node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/atomically": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", - "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/basic-auth/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "engines": { - "node": ">=16" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/conf": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", - "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", - "dependencies": { - "ajv": "^8.6.3", - "ajv-formats": "^2.1.1", - "atomically": "^1.7.0", - "debounce-fn": "^4.0.0", - "dot-prop": "^6.0.1", - "env-paths": "^2.2.1", - "json-schema-typed": "^7.0.3", - "onetime": "^5.1.2", - "pkg-up": "^3.1.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cross-spawn/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cuint": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==" - }, - "node_modules/debounce-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", - "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", - "dependencies": { - "mimic-fn": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "engines": { - "node": ">=8" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-expand": { - "version": "11.0.6", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", - "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==", - "dependencies": { - "dotenv": "^16.4.4" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express-validator": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-7.0.1.tgz", - "integrity": "sha512-oB+z9QOzQIE8FnlINqyIFA8eIckahC6qc8KtqLdLJcU3/phVyuhXH3bA4qzcrhme+1RYaCSwrq+TlZ/kAKIARA==", - "dependencies": { - "lodash": "^4.17.21", - "validator": "^13.9.0" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "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==" - }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "function-bind": "^1.1.2", - "get-proto": "^1.0.0", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", - "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "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", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/helmet": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.1.0.tgz", - "integrity": "sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-status-codes": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", - "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==" - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "engines": { - "node": ">=16" - } - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "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==" - }, - "node_modules/json-schema-typed": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", - "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" - }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsonwebtoken/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.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/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "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.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/logform": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", - "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", - "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/logform/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", - "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/morgan/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/multer": { - "version": "1.4.5-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", - "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node": { - "version": "20.12.2", - "resolved": "https://registry.npmjs.org/node/-/node-20.12.2.tgz", - "integrity": "sha512-9cHolaEZHSU7/VY7ri0onA3o1sQbjDL/HbRO14CJKosSL7JMlkkCywQZj8Tn8p633fC+l8a4CrnzWiH2B339tw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-bin-setup": "^1.0.0" - }, - "bin": { - "node": "bin/node" - }, - "engines": { - "npm": ">=5.0.0" - } - }, - "node_modules/node-bin-setup": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", - "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==", - "dev": true - }, - "node_modules/nodemon": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz", - "integrity": "sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==", - "dev": true, - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^4", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/nodemon/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/nodemon/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/nodemon/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nodemon/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm": { - "version": "10.5.2", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.5.2.tgz", - "integrity": "sha512-cHVG7QEJwJdZyOrK0dKX5uf3R5Fd0E8AcmSES1jLtO52UT1enUKZ96Onw/xwq4CbrTZEnDuu2Vf9kCQh/Sd12w==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/config", - "@npmcli/fs", - "@npmcli/map-workspaces", - "@npmcli/package-json", - "@npmcli/promise-spawn", - "@npmcli/redact", - "@npmcli/run-script", - "@sigstore/tuf", - "abbrev", - "archy", - "cacache", - "chalk", - "ci-info", - "cli-columns", - "cli-table3", - "columnify", - "fastest-levenshtein", - "fs-minipass", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minimatch", - "minipass", - "minipass-pipeline", - "ms", - "node-gyp", - "nopt", - "normalize-package-data", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "npmlog", - "p-map", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "semver", - "spdx-expression-parse", - "ssri", - "supports-color", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], - "dev": true, - "workspaces": [ - "docs", - "smoke-tests", - "mock-globals", - "mock-registry", - "workspaces/*" - ], - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^7.2.1", - "@npmcli/config": "^8.0.2", - "@npmcli/fs": "^3.1.0", - "@npmcli/map-workspaces": "^3.0.6", - "@npmcli/package-json": "^5.0.2", - "@npmcli/promise-spawn": "^7.0.1", - "@npmcli/redact": "^1.1.0", - "@npmcli/run-script": "^7.0.4", - "@sigstore/tuf": "^2.3.2", - "abbrev": "^2.0.0", - "archy": "~1.0.0", - "cacache": "^18.0.2", - "chalk": "^5.3.0", - "ci-info": "^4.0.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.4", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.16", - "fs-minipass": "^3.0.3", - "glob": "^10.3.12", - "graceful-fs": "^4.2.11", - "hosted-git-info": "^7.0.1", - "ini": "^4.1.2", - "init-package-json": "^6.0.2", - "is-cidr": "^5.0.5", - "json-parse-even-better-errors": "^3.0.1", - "libnpmaccess": "^8.0.1", - "libnpmdiff": "^6.0.3", - "libnpmexec": "^7.0.4", - "libnpmfund": "^5.0.1", - "libnpmhook": "^10.0.0", - "libnpmorg": "^6.0.1", - "libnpmpack": "^6.0.3", - "libnpmpublish": "^9.0.2", - "libnpmsearch": "^7.0.0", - "libnpmteam": "^6.0.0", - "libnpmversion": "^5.0.1", - "make-fetch-happen": "^13.0.0", - "minimatch": "^9.0.4", - "minipass": "^7.0.4", - "minipass-pipeline": "^1.2.4", - "ms": "^2.1.2", - "node-gyp": "^10.1.0", - "nopt": "^7.2.0", - "normalize-package-data": "^6.0.0", - "npm-audit-report": "^5.0.0", - "npm-install-checks": "^6.3.0", - "npm-package-arg": "^11.0.1", - "npm-pick-manifest": "^9.0.0", - "npm-profile": "^9.0.0", - "npm-registry-fetch": "^16.2.0", - "npm-user-validate": "^2.0.0", - "npmlog": "^7.0.1", - "p-map": "^4.0.0", - "pacote": "^17.0.6", - "parse-conflict-json": "^3.0.1", - "proc-log": "^3.0.0", - "qrcode-terminal": "^0.12.0", - "read": "^3.0.1", - "semver": "^7.6.0", - "spdx-expression-parse": "^4.0.0", - "ssri": "^10.0.5", - "supports-color": "^9.4.0", - "tar": "^6.2.1", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^3.0.0", - "validate-npm-package-name": "^5.0.0", - "which": "^4.0.0", - "write-file-atomic": "^5.0.1" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/@colors/colors": { - "version": "1.5.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui": { - "version": "8.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/agent": { - "version": "2.2.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "7.4.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.0", - "@npmcli/installed-package-contents": "^2.0.2", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^7.0.0", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.0.0", - "@npmcli/query": "^3.1.0", - "@npmcli/redact": "^1.1.0", - "@npmcli/run-script": "^7.0.2", - "bin-links": "^4.0.1", - "cacache": "^18.0.0", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^7.0.1", - "json-parse-even-better-errors": "^3.0.0", - "json-stringify-nice": "^1.1.4", - "minimatch": "^9.0.4", - "nopt": "^7.0.0", - "npm-install-checks": "^6.2.0", - "npm-package-arg": "^11.0.1", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^16.2.0", - "npmlog": "^7.0.1", - "pacote": "^17.0.4", - "parse-conflict-json": "^3.0.0", - "proc-log": "^3.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^3.0.1", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^10.0.5", - "treeverse": "^3.0.0", - "walk-up-path": "^3.0.1" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "8.2.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/map-workspaces": "^3.0.2", - "ci-info": "^4.0.0", - "ini": "^4.1.2", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.5", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "ansi-styles": "^4.3.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/disparity-colors/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "5.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^7.0.0", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^9.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "lib/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "3.0.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/name-from-folder": "^2.0.0", - "glob": "^10.2.2", - "minimatch": "^9.0.0", - "read-package-json-fast": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "cacache": "^18.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^17.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "5.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^5.0.0", - "glob": "^10.2.2", - "hosted-git-info": "^7.0.0", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "7.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/query": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/redact": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "7.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.0.0", - "@npmcli/promise-spawn": "^7.0.0", - "node-gyp": "^10.0.0", - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/npm/node_modules/@sigstore/bundle": { - "version": "2.3.1", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.3.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/core": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.3.1", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/sign": { - "version": "2.3.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^2.3.0", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.1", - "make-fetch-happen": "^13.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "2.3.2", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.3.0", - "tuf-js": "^2.2.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/verify": { - "version": "1.2.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^2.3.1", - "@sigstore/core": "^1.1.0", - "@sigstore/protobuf-specs": "^0.3.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@tufjs/canonical-json": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@tufjs/models": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/abbrev": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/agent-base": { - "version": "7.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "6.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/are-we-there-yet": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/bin-links": { - "version": "4.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "2.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm/node_modules/builtins": { - "version": "5.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/npm/node_modules/cacache": { - "version": "18.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm/node_modules/chownr": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ci-info": { - "version": "4.0.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "4.0.5", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "ip-regex": "^5.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/cli-table3": { - "version": "0.6.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/npm/node_modules/columnify": { - "version": "1.6.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/cross-spawn": { - "version": "7.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/cssesc": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/debug": { - "version": "4.3.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/defaults": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/diff": { - "version": "5.2.0", - "dev": true, - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/npm/node_modules/eastasianwidth": { - "version": "0.2.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/exponential-backoff": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "Apache-2.0" - }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.16", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/npm/node_modules/foreground-child": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "3.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/gauge": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^4.0.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/glob": { - "version": "10.3.12", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.11", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/hasown": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "7.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.1.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "7.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "7.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "6.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ini": { - "version": "4.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/init-package-json": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/package-json": "^5.0.0", - "npm-package-arg": "^11.0.0", - "promzard": "^1.0.0", - "read": "^3.0.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/ip-address": { - "version": "9.0.5", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/npm/node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "BSD-3-Clause" - }, - "node_modules/npm/node_modules/ip-regex": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/is-cidr": { - "version": "5.0.5", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "cidr-regex": "^4.0.4" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.13.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/jackspeak": { - "version": "2.3.6", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/npm/node_modules/jsbn": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "5.5.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "8.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^11.0.1", - "npm-registry-fetch": "^16.2.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "6.0.9", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^7.2.1", - "@npmcli/disparity-colors": "^3.0.0", - "@npmcli/installed-package-contents": "^2.0.2", - "binary-extensions": "^2.3.0", - "diff": "^5.1.0", - "minimatch": "^9.0.4", - "npm-package-arg": "^11.0.1", - "pacote": "^17.0.4", - "tar": "^6.2.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "7.0.10", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^7.2.1", - "@npmcli/run-script": "^7.0.2", - "ci-info": "^4.0.0", - "npm-package-arg": "^11.0.1", - "npmlog": "^7.0.1", - "pacote": "^17.0.4", - "proc-log": "^3.0.0", - "read": "^3.0.1", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "5.0.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^7.2.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "10.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^16.2.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "6.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^16.2.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "6.0.9", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^7.2.1", - "@npmcli/run-script": "^7.0.2", - "npm-package-arg": "^11.0.1", - "pacote": "^17.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "9.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "ci-info": "^4.0.0", - "normalize-package-data": "^6.0.0", - "npm-package-arg": "^11.0.1", - "npm-registry-fetch": "^16.2.0", - "proc-log": "^3.0.0", - "semver": "^7.3.7", - "sigstore": "^2.2.0", - "ssri": "^10.0.5" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "7.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^16.2.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^16.2.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "5.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^5.0.3", - "@npmcli/run-script": "^7.0.2", - "json-parse-even-better-errors": "^3.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/lru-cache": { - "version": "10.2.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "13.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/minimatch": { - "version": "9.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/minipass": { - "version": "7.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "3.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/node-gyp": { - "version": "10.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^4.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/nopt": { - "version": "7.2.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "6.3.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "11.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "8.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "ignore-walk": "^6.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "9.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^11.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-profile": { - "version": "9.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^16.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "16.2.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/redact": "^1.1.0", - "make-fetch-happen": "^13.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^11.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npmlog": { - "version": "7.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^4.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^5.0.0", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/p-map": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/pacote": { - "version": "17.0.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^5.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^7.0.0", - "cacache": "^18.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^11.0.0", - "npm-packlist": "^8.0.0", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^16.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^7.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^2.2.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/path-key": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/path-scurry": { - "version": "1.10.2", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.16", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/proc-log": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/promzard": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "read": "^3.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/npm/node_modules/read": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "mute-stream": "^1.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json": { - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json-fast": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/npm/node_modules/semver": { - "version": "7.6.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/shebang-command": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/shebang-regex": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "4.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/sigstore": { - "version": "2.3.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^2.3.1", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.1", - "@sigstore/sign": "^2.3.0", - "@sigstore/tuf": "^2.3.1", - "@sigstore/verify": "^1.2.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks": { - "version": "2.8.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "8.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.2.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.5.0", - "dev": true, - "inBundle": true, - "license": "CC-BY-3.0" - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.17", - "dev": true, - "inBundle": true, - "license": "CC0-1.0" - }, - "node_modules/npm/node_modules/ssri": { - "version": "10.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/supports-color": { - "version": "9.4.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/npm/node_modules/tar": { - "version": "6.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/treeverse": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/tuf-js": { - "version": "2.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/models": "2.0.0", - "debug": "^4.3.4", - "make-fetch-happen": "^13.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/unique-filename": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/unique-slug": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/npm/node_modules/which": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/which/node_modules/isexe": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/npm/node_modules/wide-align": { - "version": "1.1.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/npm/node_modules/wrap-ansi": { - "version": "8.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-treeify": { - "version": "1.1.33", - "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", - "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "dependencies": { - "fn.name": "1.x.x" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/onetime/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/prisma": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.3.1.tgz", - "integrity": "sha512-JKCZWvBC3enxk51tY4TWzS4b5iRt4sSU1uHn2I183giZTvonXaQonzVtjLzpOHE7qu9MxY510kAtFGJwryKe3Q==", - "devOptional": true, - "hasInstallScript": true, - "dependencies": { - "@prisma/engines": "6.3.1" - }, - "bin": { - "prisma": "build/index.js" - }, - "engines": { - "node": ">=18.18" - }, - "optionalDependencies": { - "fsevents": "2.3.3" - }, - "peerDependencies": { - "typescript": ">=5.1.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/require-from-string": { - "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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", - "engines": { - "node": ">=10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "engines": { - "node": "*" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/ts-node": { - "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", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tsx": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.2.tgz", - "integrity": "sha512-BCNd4kz6fz12fyrgCTEdZHGJ9fWTGeUzXmQysh0RVocDY3h4frk05ZNCXSy4kIenF7y/QnrdiVpTsyNRn6vlAw==", - "dev": true, - "dependencies": { - "esbuild": "~0.19.10", - "get-tsconfig": "^4.7.2" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, - "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "devOptional": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "node_modules/undici": { - "version": "5.28.5", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.5.tgz", - "integrity": "sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==", - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, - "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==" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/validator": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", - "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/winston": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz", - "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==", - "dependencies": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.4.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.7.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", - "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", - "dependencies": { - "logform": "^2.3.2", - "readable-stream": "^3.6.0", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/winston/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/xxhashjs": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", - "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", - "dependencies": { - "cuint": "^0.2.2" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - } - } -} diff --git a/microservices/navigation_qcm/package.json b/microservices/navigation_qcm/package.json deleted file mode 100644 index 53a72526..00000000 --- a/microservices/navigation_qcm/package.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "name": "navigation_qcm", - "description": "Template du projet d'architecture web", - "version": "1.0.0", - "license": "", - "author": "Michaël Minelli <michael-jean.minelli@hesge.ch>", - "main": "dist/src/app.js", - "scripts": { - "env:decrypt": "npx dotenvx decrypt", - "env:update": "npx dotenvx encrypt", - "prisma:generate": "npx prisma generate", - "build:project": "npm run prisma:generate && npx tsc --project ./ && cp -R assets dist/assets", - "build": "npm run build:project", - "database:migrate:create": "npx dotenvx run -- npx prisma migrate dev --create-only", - "database:migrate:deploy": "npx dotenvx run -- npx prisma migrate deploy", - "database:seed:dev": "npm run build; npx dotenvx run -- npx prisma db seed", - "database:seed:prod": "npm run build; npx dotenvx run -- NODE_ENV=production npx prisma db seed", - "database:deploy:dev": "npm run database:migrate:deploy && npm run database:seed:dev", - "database:deploy:prod": "npm run database:migrate:deploy && npm run database:seed:prod", - "start:dev": "npm run prisma:generate && npx dotenvx run -- npx nodemon src/app.ts", - "start:prod": "npm run build && npx dotenvx run -- NODE_ENV=production npx node dist/src/app.js", - "clean": "rm -R dist/*", - "test": "jest" - }, - "prisma": { - "seed": "node dist/prisma/seed" - }, - "dependencies": { - "@dotenvx/dotenvx": "^0.34.0", - "@prisma/client": "^6.3.1", - "axios": "^1.7.2", - "bcryptjs": "^2.4.3", - "body-parser": "^1.20.2", - "cors": "^2.8.5", - "express": "^4.19.2", - "express-validator": "^7.0.1", - "form-data": "^4.0.0", - "helmet": "^7.1.0", - "http-status-codes": "^2.3.0", - "jsonwebtoken": "^9.0.2", - "morgan": "^1.10.0", - "multer": "^1.4.5-lts.1", - "winston": "^3.13.0" - }, - "devDependencies": { - "@types/bcryptjs": "^2.4.6", - "@types/cors": "^2.8.17", - "@types/express": "^4.17.21", - "@types/jest": "^29.5.14", - "@types/jsonwebtoken": "^9.0.6", - "@types/morgan": "^1.9.9", - "@types/multer": "^1.4.11", - "@types/node": "^20.12.7", - "jest": "^29.7.0", - "node": "^20.12.2", - "nodemon": "^3.1.0", - "npm": "^10.5.2", - "prisma": "^6.3.1", - "ts-jest": "^29.2.6", - "ts-node": "^10.9.2", - "tsx": "^4.7.2", - "typescript": "^5.4.5" - } -} diff --git a/microservices/navigation_qcm/prisma/database.db b/microservices/navigation_qcm/prisma/database.db deleted file mode 100644 index d43cbe19ddee87ab6f09e2644d0559a1d0a36e4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81920 zcmWFz^vNtqRY=P(%1ta$FlG>7U}R))P*7lCV3cNHU=U$oVBlb2U|?imV2EL0U|?ZD z0FW4hhn2-B&7fD-!3r{f|2Ig5ApdWktvrd`@3^x#-*Nb`NwYp<&SPZcwq{tsy%3}T z9dlbVID0BHGGykZq*fFc=46(n#wV7R<b(O~d8y^`L8%4#dBv&mhDaPiZfgdfmP9pn zab;!3mPj>racODBPR^3Vq@2{C)B*+urb-3|rc$tMmL^128zu`f4Qi;6bC9cJh^s<~ zqmz%Tf)Z3zNkM~4K|w)5DKiBw;^`OS>h2n(;O8Hr;1}xSqYx0}>FXF2so?Dzso)qI z;_vC_9OUZj>KCE|(;HZtT3nKupQogNt{JYxIU_%_0xl014lPbCf{Vhfgi7a?=B5^9 zCMzifxjOnl#GL*8f<uBFJ^e!9eu&RZf!QCQmYrIuq~PWs<m&0}2X?TA5<*%@Qz6LJ z%{9o?&)GFtK?$ZyNdZlfzn_AOtB-4lt3r@#a7d7+bBKb!pF(JW3n&1c9fO@6U0m@w z2kciIZUM`oIRqjGb_Il~39=9BgkV=_G?3&3P`Ki70Z0nX0bn7p{YuDI<Mut5W=p9m zySS_@W2Y@RvBAO;MsuJhH<&O|dP4}Irx}6?t`MHwLR=$4&{Iu8esLz=#F&>9P*NNK zR+WZ3?ST~erKTsAWa3c-OQ29MKoSKg#X0-pG&wURq_Q9tw{)>@X--LIK~AcYf|I|$ zkE^2}nh%ll04x+inZVf>M~nwL`=Uj7U~+B<s04u~eXu-vsUFDzAaCJt0Z0nX31A^` zngg?lO?SpBY~t>UxJuE0#G;bS<jjK9qIg3DTew9}nO$5_k+DM^oLCVu2o@J=f<;Im zC0R%|fyOmjq!5VowA9p;q{QTGB?W9rHZQ*<6;jHfo0^eYT9oRNnp9eXGr?pe7Q1EU zWfo_oreLNR1s7L0$55XTg|x(+;#3_jaEXmvpo5A&u)lObl>j)U=ztX=r!qun#Al{} zRO5(dkQ7=pgN4A+Ok~kQ!1h2oq;f9JW_cxW>DDF)PB5_S0;9Q66AMfjDXD-05~DIC zSg_^g=Yln2OCu$zxdp{I6G2g8UP^whe^CmkI>laWC?)5oq&g-ir{XpR61mPrsfi`| zIICskgaPw8G+97(;z=D)6_h3tF3qM&S$1)8amLm_a14R#O)w#V8aH4uq=<p?(K9i@ zsL3pL&MzuTO)kOAV~`XJDgfa161wqFC3*R|Q2VjPFrkVIIpD#@fC_!6l{kVNRyw1F zH(VH;G2uL7%iu;v4t8--QO3qpaM**&ZxH504SA3dQouvF=mA48-1G8tAv#e)j7zhS zja}SYl(A7B+<XR=GV$q|B{_*nAZA`-ZfbmXY9)xx4s}(ipJ!mGtAeMWi)(~}5=aJ% z1|?9#3oNOmp@eFll4cMqo4C3tV>!ac+{DZrm_2N`?SUynF&!kRq#3}%Ca$f`7zqwY zXs4h!wXifbFF6&B%L=ss(t<~m)Bt%|r#Q7xvoVAj968P0U^77;1z{Ex-4HJ#8vmH( z3gL)J%uR*VX3)e9_7J#wg9@O9A6N>#eoINsNi88<adBxnGqH(>8{(?>;|q#1i*pm> zb2HP65<!i>;&?+$G3MqdMs{&SL&mmvaM)m~z!YIZ4L3{$NJ(4?)RjWV;B<>z<HGt? z&`?UwNKMWzF3m;L4AzFGG!0tK$0wE`s|IyTLOgw;T@odD7{r6p1Y99D19S4zi{T0o z4hJcPx~?ccCnq%}9@KO}wiV6F;*!LolGGGr6(G}Ks^F0hZ;d3E78RxDmBg21=B5^x zB<2=CtxGH@$jMAii7zfmEhvsp&M(aa`xI7cg!%=0y8F4hpc}}*z`&=B)HfIA|IORa z^OGl?`!=^X*FG*4&gmS#IpWw4u`9DpW@Be9V|mIF&b)_NgJ}+v0AmZodxmiI-a4G$ zC@Rer+Q`f5%)r3PX<%w>W?_+Pq?=-9VWMl2W|^jIVUS{^n`&X1mSSvTXqjZ0XlP`V zVs2ubXkcPsoN8{Km|~u4keXs?Vq%_Vnq*;NWR_->mXwl|Y-(y|Xp~}UY?hjqW?*2F zl459_Y?PXs%s4?&v1z}Nfsu)UnW3qnrKz#8S$t7ydQNJ5YEe;YX%Se#nnochu)AzQ z?n*H=N;Wi1HrF+^NH*3rF*Y~QwM<S+(oIZDvaql)Pcb$zH>ZlbmLS|^Vq#<zpO}&o zU!0s@lnQp#<VH?Ou%ooWjxsPYG)XZ{(@iw7u+TLzGBVapGBLH(HB3ygG_kZuF)=eV zwn#Bevq(-#vP?5GGB>a=GfXl|OtQ2vOEWVvNK68Sq?wt4S(>SVfuXUHfw`%HVUm%# zp^>SHiKU4_Qj$5?+8!iF85>*1g9VctIVBKoF*h|zO)^e0)lEuCw$wFAO}5lcG%_^Q zHBL=7N=-7bFfcH;w6rueNHa4xGdDIhF;7WNv@l9eOHMIMOfyQcNJ=s?GfcBIO0lps zF*P+zv#>BRH#0CuHa0gkG&4#~OHDR20$Ur6aEp<lu`$Fgrj4B92)7uS8yP1V8W`#t zC8s3onxq=1>RP6nr|71pn5Lu|7#o_U7#W(FT9_soTACXrn;V;^m>HUx8yTe-S{SAz znwc3H85$W|rWzU<8yTA?8m5^WSsI!c8K#*V7#LU@rKTDfCMSa3qK|Nkp{WVfEu4*l zVqmvegW@RF$TH0&&BRjIB-zvg<Q7xiB+HZ}T?0cCLz6UvG)t3IW2z(^MyOki4J}O# zjg8_{5=#=35{tp<rtw3ggecfeo**|Fq#7C+B^w#&CMO%2>6)0BC+jAenHcJ(C8Zf! zCL1Q18ycmWnj|JA8=09}S|%nXCMB6ATBI48SQr_b7#o`#n<knknwXiJq?j2PS{kP% zB^etVm>L?GrY0sOnHn3V874ujeF=Aysfn2(G%@Grrp6~GgX$1a7&cC5<Q4%tO&{bm z6GM|kQzP?K-IQcQb6pcN0}EYCa}zV&q$K0yl;lJM6SJf=Y6Mqf2f}Fv7KSGAsl{N| zR5tPngI!|^a*cUfTB=!6sxc^o8R(jrnV9HWCYq$`ni?1<rkJIq8X21<nkAYUrx+O; zm>L@xq^25M8YG#drWu);7?`D+85kL-nJ1>DnwXgzB^xBCSemDr8k(3HCK{QUSelp_ zB&Qe~fUPZty9Si_&EiW^i%X2bGOmq$LI?+$8JeV;nHZ+(TACP{>YA8aChI1p87Ar) znxrKeTN;`eCYl&fC3x)N4l*`1HZcJ^2%P^KbsISa!43i!K}N}mX=&!ENxDhqsV2H6 z#%U(HiAjl;x@M`#2FV5%hDPRwmPSb_spdwehK2?vDQ3p0W+p}kmIkJlDHh3z#ui5A zmPu&_Nrr|-CaEUomIjF_Nv26=MwSLf7G_CCsmUp+Cg5;TMs|>)2{_v~JZ$6@0K3H) z6kA3qCYA<<X{NfV#^#2)CT12Xx|U|i$+}7AmgYvrrbZTKCMMJfoQ9hSw-^|knu7xe z<j96ojWYaT_XL961IqU%riQ7y=BCMsx+dl+M!JcXsV2H9NomGu7AeL_Cg4)n!qhY| zInl_})G*Q1&@#;;#mpczCCwrkl)EfbP0b7p(h}253=J)l%`Ht#l9DWplG4mmQc_LL z5{<yAr{OT%Jw~Pm#^&+K8Hsu6sqxU!-T0Eq0&sS0nBFMK2X>w}$a%&o7HLVwMv1!S zNybLHCg!OYx)zoONxF#^NvUb(X-THZNy(;WDQ4!z<|&q-@JmfLH%l}!PBt<~OEWVx zH8QeHO-o5LNl8vhNizmTs*#CBnx$p3NwS5Zp`mG#xw#oQR3^flXJBbyVqgHS(lQc@ z<6*5Wu%g07DPFMKe8Fx@PBTj~H!;^uH8eEPH8Dv|(M>c-HPJOQHAzi0wlGXePE9p6 zPE1ZVNlY^|HBL54G*3-RHZd?UH%d$~Fif*FOfoc1Nl8vIFiAEyO0h6aOii*hut+sE zGc+(ZF-<c~H3z5Wh8(Edj0`Od3{8z;K?fcSKm?p~qa+X5ao~VUNi;GyGfy+rO-VIL z(KSi6FxO2qNlDW+v^2LgHa0M_Ff}$YGD<N^O*Kq0OG-2`F*UVJO)@Y{F*QlHFtSXx zOfoSwPO?l(GBh?bGBHguH?v4GNKG^}PEN73NHH}xHBCwbhlwrRab_l#M(}t|Ni0c4 zxJ|N=iyQ1VT~NR!rWu)7q@<ebCR>2qmS$|Gn`oS7p_^!EX>M$3XlapTW<ixaAOLZj zfti7&iHU)Ed>P2a^?w@0xxkKb2RX*V&;(SM80lIV7=Y@&R8w7xq?9CGGjqdalN2Lk z%ar7_l;l)PbBi=X(^Nx?L_=^R#oW+1IW;ZC(mXlYILXA^*wD-(#WKw>$spCp#5~Cy zWT<JHfn{>CnTdG{*xJts#~51}nZy^R=72jXprn=xQ8KfUixccJa4;nqfpburu7#12 zrLIY0T9R&3N=mY>sX?NVahgersi}dvxrw2vnW<@_frXiog++2wiji@OiGih|X<AZR zTB4D;d5U4GS(1fOs<DZ&p<#-dd8%m|sP$lxWMpQUnhY+!>nFioW?^DrXdVx4eAc@+ z@^XM311`6cQjJm*lg(3fO-#)|i9Inz*D}d85!6^PFf}qrHA+cMNj0!cO*1gDFi%TL zHZcXc#?sir$jsOx#n{jyImsZ|EG^Z-GBqtN*)S<7*(}K{G1c7Cz&JI@Fx4{2%p78^ z1K2U9#s-FFMrMYV@N%o}ej_J4*gfDfJtZmCILRc{P&X;rI8E2Y+$>4g!qC`U*A$ew z%nj1aEfbSX&5VrAEsa6VHj894%S59@P=N)a)69~SjMI!#%@a*hk`gUUjm%6;O;XKG z5<$(tq*P<0lr#$iuzTvRBHUwWVqyR;)9b<-`Psm3F$X1~q$DE~QzP>v-L#Zc16`BE zlq6jX)5Ij*WHU44q?AOHRC6=)#1w;6lN94bOLG$gLr|;H+$<&8!qmtzIms|J#oQv* z*v!-*)xtd4%-FybTr!v@rWlx-B^#zDrWl!<f|5|358N%F_NGC6X#pskfu#f+g;~Ka zvIn^+(bzaO(ag|L*T5ptRM*5P(L^`N!V;8zlFZCf%@R$Lj8oInEK@8~(u`Bh6U|f7 z%uQ2F%*_%L%}rC24HFZSjFVDL5=~Q#3@t5Fjf^eQj4TX|EKQ9p%uUUb4AM-DEx|=o z9S6)s1{Ow^CT5_t3@V;-3&1Uv+RKeXEMQlG`zPk+iKd3ei6*)hrm1GSCZ@(Fx)w=B zNxEi+rip15W(GzEX^Ez31}0|4X@=&B=1C@I7A7ecCTZpdsfo$S<|(NL<|d}bW+`c@ zN#>R*2IhvQiK%IcrWR(&mKKSYCYH$tmf$j}_BfKOj7`j;;S`^e1PZF!ibh3du%n_u zL1kf<Y+__?Y^0l#l9sG%l4fY3YiVqns+*W<YG7$@o@iofWSW+iY+`7ZYG{^bVQ67$ zW@M6@mXefcnq-k?ZkT9hYM7XkXk?L;WMYwIVwPl@YHnefXpov}n3QN}Xq1!+X=m2v zK^$ddY-nO?U}PAd3>sifjZe<cEdY&vptOZ+wHhUuz-|P$g)Nhf4bv=540J6G%#(FZ zjEzCPsT4z93sb{HOJfrQQ#13VG-GoE6N6-<#FXSz1B*1%ltiOs1A~+#6T=jvRLeB; z<m9x(G&8eAqa;&<WK#nRQ&V#ba|`n%19OwK6bl1zEm*4rcB6?QsB>jtVgZiM(&E&j z_~PV@)Ld|XqULj>6eHMa;7Tyf+{if5JlRm!A~`8h*TllyOxH5SAXPWf+#t!qz}UpX z*esPAWqHjjWTzQfz=I1Cj+yy+py_)qX)Xo^1_iE%4BYE@mT*1f3F7tOE#!{jeZza0 z=Pa*0cPo!3e=N^8zI6UJ{`LGOe0F>j___IZa&z%8a9`&W<$J_a%{z<#2DdT1=Re9A z4S~@R7!85Z5Eu=C(GVC7fzc2c4S|6S0S)F*Mk52$WD^S$Gu>1}^CVppgH$u!q%>ng zU2}7bq(n1I<0O;BBn6PdWV6InV*?8#T|;97b5Q5TNH-}tB~=&HVM??}HcCuOO_2vF z1dU`ESs0}0nj|Nu=$a&%8tWz*CMW9}B_&%Jn420ICnuW9ffO1Wnwc6Vn<eXlhN*N- zOpH@?lgup5buEp}QcNr@(k#skEM!3n&63TMl9Q9obwPvkx+W$@X1a-Hh8DWX24<ki zvb02VGXoirLSkmqq(KUanck8DD<opdNfM-xnE4<HkV0Z6Ys5hciJ3_e11ThCdP5YX zkeJB^5s*S+<^hC33W*t?7Xm3HX53s5tdNL7Z2^!%Vn&<!K?;c(_vHgCBw`Sj7o?Dw z0Z|^1LSjZIxj_nv89C$vDI{hfj}xqrh(R_EkV0Zczt}+vi5Z$=11ThC#E2E7keERn z7LY<>23D9s3W*urU{Yre<s@dTffux>pWljs{|5g){uX|#fh?*=?H&z*(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~TI0`BepYz+F|`W#8Ad0C0MnR$ANc_kV7d71eb z0#y#FC8c^9sm1B3ddV3W(&p{<Yz(UQsvJ4_naO%NiDmgksX54O6z#|o;w`*v3=9nV z9H6ED8HstRdbx=?iFqlBnW~L^Yz(>#+8n-_$r*`<SLZ1BX6B{l<YeZ8_^CO1xezWd z{{;p%{sm0@Yx(c+FW~>gf0Tds;0x<f7mbF%Xb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQRO+0d5{<X-4QNbMibK%(9HI(_=(91erw{LC1VBa|$qvGJ(#kU_Q_Pl7WX4 zs-BaZS)37k=7~v8Dgy%pCnxC85*~h#A<z?0BtYx`S@<_F@c-if!oPw4>hKQDQQwV* zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2C_2muvlZzhZd1gPr^n9s{G+cP0A z6F^x%z`UQ8nSqIk7eq4jLHhrz8TeQ8AL4(_e`RQd!l)}pLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(*oJ@@vp#0mpZUBXvnonwpLst>A;yLPCSDO{Z6>tU{|tS@ zHnc`PHW~t>Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@S4*}5mf6V-M82G>Q zzvRCI7anDdhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb23E5a4EJW{@o_ zO3ZXiEUn;SVrGzs+#Xz5n##_|%ph8lT2TV(|4TE3Gw>(#o#0d9?dSQ)lg@pc+nZ}2 zmkQ@}j^7+{?1$Ku*(S5GvzD<uWeI2A!>qwHhe?33h2cFzIL?4*6qN?wdFTwfGLo1Z zOQ><@Vbgx_orh+IriPZL#>QsxMXBjIsqv{rMX9AlpsOsK)-(!9f!zhZUz3;%QmEpt zB?xz!m>5B?Oi#`)0^i`=G`W#e66`3*MXf|!#$u6Tnr4xllw=9MTGztNFv%=2$<o3s z&CJLkG0Dg%#oWxyz$^`X6Sa|nxv7C+k`d^NN)r=H6N98Ab8uMnAUVp|*b;nEYg2L~ zrv$<+#N78{X=!SZW@c_?Zft5|o|2kqVU(PfoMM)kW|RWDNY>0S&C)2v!V+`^dYXj= z=q6W#WMgyCeXOZzsmW$WV7Ejg++t*CYz%RWX(OjN!Y#yHDPv-4VVY!UX>OEkZfu%j zW@u(^WRzlPVF<dx*T~4w$k;N~(8$=x*gVlN&D_Y+(8S0v&D_Aiz|tr+)xa<rd|zji zKEf@ArY2Cga5f5xf!$&aO3=jIT0@nD!w7YYv7x1@p|KJC5>HT|HGXK65CyvleCH`K z7vz|lBqk*rnVEvF7)ne^GE1~bGc>U<GBz<bHa9j+G*2`!GY8#JZfI$omXu^{Y+!0= zV49kklw@jblx7IIm$mUF+)bt?W`@wjoS&N-pO{<%x>j_8qGIEOMs5+X)AT{XMa-2v z)CjJ|4usPTEDTNJQ^B|DHdZ$B34>i@3UUoG_x_kAni;1U85)=x8yKXf8e1A9nWUx} znVA@vrJ5NS8K;>irlp#gnHwb=B&S%Kr<xj?m>DJ-nVDFcm>DFe7=v$cZ!Ctp29)^C zz&A64FOY6@ZR8U|IEa}0g{Trd_HYLon;M&#fE@(Re~r40oPuBnfr}tw?lCe-N=Y?0 zGBq?bFi9~pPBjBv6>nf_nPQQgXl!9*Zkd#3kYs3RWRhxPZfTI1l4P1>W@Kq#WMP(M zl$xB9Y64Ed%E%5fGy!M(hKG&30${g*@6k3Q;;JNS1Wv<Egj)=ZP0hi919D`;sYV%o zuzLbQsfU;wnG6h#Elf=llM{_hO$`%G4K33wQp^leQ_?`!X`2~Xrka`=7^EepnHU;c zCYxKDm?R}x7$v2FZ!b4XGy<odhQo087?~Ov!|#cQ)Zod8tKz3OO7el72foIhn0ug1 z%~H(Fjm=Xmjf_o=Qj^Wi5{-<LjSSM#%nVJ9j4V^rQqoLPl9N)>j6soVWMYwKX_;)2 zY+-0<Xqseh4!-%gVIs_V29^dU1_t1pk24aB<I^(pGK(`H_p>(?HcIh=-3Gq;*qDf` zr%a6#laoyn(+o|GlZ_J1Q<IWS3`{^*lp7ePfp7UvNl8vIFiAEyO0h6aOii*humD}G zW?*b$nr5164o=MtIZ(G58Cn<^ni_*H*v?B&jW0>fEht6=oO7cj57=?wfFtI*D<h*6 zv(!|>6tkp66BAQY%hV(T!xU4KWD6t9WXmKIQ{yDdv?N1gGb0nzBy%&1B!kpML*wKW zON$g!b5qkK@Lk&tws6OpnOGXZ;}vu<Il^s{ja=Mdw}CIVC+3DNs^kFyh}#Uz3@lAd z49w%pKpCL^Pop>&*fH*)3_#2+UMb0`mgW{|hNh{87Kw)7MvA$iadIl?*1Y6o<0KPv zV?#5G6w5TjB!g5V6Z0f<Lz5(P(=-Fi<YY4w^AxbPpAn8RwlFe@FG|fx1XVDgqy|Y} z^)nl}IKeIh2NN;ZhMAifnwpuKCK_0n8Ch5)C#4t}r<fR68k(jhrKKernVY8=rkW*L z7^NDU7#kX<n3<=Vrh!@y7D+~CmZ{0$;=6tl++`Lf28QPG$zb=oH}Z0T9Rn`6l8CsP zEY-j=HO;`p!aOZ0*~Ap&8cSmfBQs-*6k|h+<RpV+v$RwT%ha^AWW%JSWV0l*#8h)j z1LM>r!&J*8GjoWw4q(Ta8XFjz8JQVc!pp6?`;DCJVE2H_bYgBmGc_|ZHn%heHQOwb z%`6j*5<vwPh)y$0PBKn2N;OY3Nl8kyFf}qWF*QjwH%T-~O)^MIH8x5~voHX=r|v4k zJ%%PG2H-NiF07HC4eS<kP!b~MlC{JXgH)3g<3vky69Yp~tI^ynCE3E%$TB&}Fg3;8 zBGuT;)F9QuJlV|Hz!Y3Em?owen3^RUrY5EsnVW*5q|OKK7EpWB0D7-ISW2)_m=)|I zdytEWxy>yt%`(L@CCxb1JkdNQ&D=D_#M~?~(cCmO*)TCN$v7$1B+)d*$k5U<)yUW) z&B(&g$kNov!ras>$so<d*b-bc)p5XFWME-rX<`OS%b?;Zw*cHyslD7N!~%8|xPL;- z)p4e21}0|4X@=&B=1C@I7A7ecCTZpdsfo$S<|(NL<|d}bW+`c@N#>R*2IhvQiK%Ic zrWR(P>ntrzERzi^!DUkIaU@q6o0vnxDLy3$6jZepjf%`*M@55zikNHa($bPm49!vv z&C)CkElkafOj6TQk`hgmEYi#k6U|Hw6H^k6ERvE;ERsyjl1x+0Ei4laQd13+5)BQF zl2Re<%-TGNql}CVO-v1p3?cW{r^YAe=N9ComZYMzg=@7MC78f&1h<8Wxgjsj*xbOx zAlWD}B{|i=BF!`<(J0x#ASKDfFvTd<GR-_WIV~~G%q-C;$<!d()WE{j)ZD_{!aT{q z+$1f<!T?+g)+&MBXkrNJTp5^HfTOdtIJGFgI5{IV7u=ty`P?YQ2zDB{5+vqMK5CTZ zHLsAJW@G^mE=V{+8|pPzK>dGqen$rWcl<Z`xA6D#XYq&gJL2ruk4lV&z-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2CF41tftx?0tigM*35H$RVofdRq}PfbzqDisl7 zXOL#%WMT?-a#1MBEnse8f5^OFP?()ToDnK&WW&<HykA*}odIk{NNK8qS81Mtp@jmd zkFH>3WMyh#Wn#i9!MtBt5SJoDD+3cNLo)?w=Kab7I20LLS{a#HnV2c>Vcsvy&(0tT zbC;19>mB)C=KTVE><q$CLDoBBo0#{5&i`ZMKfu8MmH##WDgFceSNR|CpMpVR17}p- zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjD`S_Ay7f2IuvD`tc*+yjN;7u z<+)fHnHU+xnD-mVL6{QE`;BDbOk){{Qeo!((hxxb=KU&?p!t7h{^<<-Z~6D|Pe(C& zlrtIvqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsK-&;dX69gGRAgsj;bh(~ z5>k{}tdNwMn#biJJ`n^aF+WQy`p2iw#KFYq$;b#&Bpi@hs*szRT3VrymY7+Ts-UQ- zP@JEskegqUS$23O6MI_WR~bP@4kkukhz5Q(rnJIC@w}Yx7&th582FTV@A0zpY~@Mh ze#f1~;ln1)Ce8YcIggQ%A&Mc0dm%ROa$7Svdnz+BWag!$RumWJWR|4HCzdiWFmOOr zvmO)=mu75C2FnMf7Ubs@r^aWd1eT^2gEw+zri6m_N@S)uXXIyA#Al~gLKX2i2e~?i zxGIGDc?O2MDtP+2xJD=_K_&5<prqjM2Un`3p@gtbNk>5mVk3kFwp2;8B}<cCTw0p3 zQ@bQFDJK<b36v6oIwZu=$;TC8tbzuYf`S6bIH)=$1y8>aS9jMS1wa1~1;0=qABBJ* zPhZENNCj`#NCn5x5PwfU=O9;KSHBP)m|j>oU}}adfw&Q7I9wPMY&do0mFA`vWhN^r z1i3o;K(sjf`vr#tIePkq!2N(6ifP%Yl}ZY3{z0yu?tWkgqlBBLLXfMQYmlp-vum(| z62jGJiv0Z)TwHxzLtGVtT!TY`Je@;8Q4t#80*Xmz$6#ki7gv1F0sA!`yIa6=N~jKj zh$(<v0by!_?1MTX*cBQL{(cI?I{_4~I9vddLURCE2yDL+vemeK&!yQ?s>&`dE6dnv z3r=jXu!PYZsL2f`tb|B!2qBUaTp={uDJg`wMufl<DkMsj3i69HL75VFvPudlDGmUu zO2e<nFEu@}BomJ!SOSH50qTOxlt5=+oF-?cgj5!!;+8J<EzK#(EXYY!QgHJ3_i=Uf zL-QeW9)N`+C=)pQ;)rpOYfw{MU~+B<sEkkoM><5Fyi||m0FbwExBw)Dmgc}hVC%sw zV$+?m3Y)mQB6>+(k`FGK;{y_lN-~o(3sQ^X4H0Z%&UZ|P;);rl9qQo3ijYCDxKI-; zLINqtLb3@ouF)a|R6OH}^t9B}l%&MuZ0t!kFTW%eQp%y5nvq&sl<Jb2R9b>F!DJ*B zyFs_AW2P7d7gsmOP@fQmw8Wg^R2?pGiH%&Kg9;t6zrb}0I3?(S6(OfGL}<iA>Kz=> z3^oWgrGbUO(M)8~LcsPwI;3(g&1QKeaOu`22u?7t>;j{?Q4<SH7%8cM0uol)!Q+%* zO`4aV3)YCOSOf3*$C(I<67y2>bN!1_Qj0JX0VGJ3lJiqi9g~w&i*cF)iCpKR)Wnkf zB3!DF69&xZ&}0GCi6?bHRiKpxBqtIsO$G+W8gX%P#@0Y^41w!SFd={%H()WOh=KCa zGcm!a$t-rxFDgn+F2NbRNbNI>n1{wdUVbjrerz#JsNzBnc(5^`LLXWc;s|nB>5LZM zaA9!9g!70kgBuw+*u_Of85>i<VGk<5L6{RY<UvA60T1Dl9PWAfxe%QwA;zUy$i^;i zEy~y^4=(sY2`D~2vm_@m3B=4x%uNL~!a;0ysH;$0;2;?+8X#?Mkff4^5~_JhnnA2= z;_9M|<p>*d6EkyQ_ORi$2c`_gbdaEuW&jJDxVAQ9Bsd_U9gpJF!qU{d<Ww{+E7Sr= z3m#2U1LS3$;?zRT#t>$3<TP`G%>?-cgjrB@D}jWNA_p_C6U-1G3n8@`G;xDH1a6T* z1<=9|ECnwMp=wf6K|A16Ff$cu#l@xR%)}-hZiuVik1r_7EY3}g&&^CP0w1kW9B+sz z#@rmm$S!VZ$k-MS4jW7rm?BK5;fARIB@{t@DKrdDx5zavtX~BUf#i(T<m}?oTqRU} zU~OnhVJFhWCzc?q26an9Jbj^E5+!&T#6zM8YA!YdbMn)RkxfEU3UyskeojtmN<66P zf@~|AmBl5AMJ1^z$SOca!BoK`9UiI4rA0-lc_r~BnYpROC5gEOQ0o#43UV@2Q{q8) z{uRe3=a=SzeF`fzLj8h0-Tho$Fby=|(ge-_^YZ&K@PFoi#($mv82=9bRs3`LC-67( zm+@!v$ME~{{KpR=ef?2#Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^D~<eF!i!4tgh! zI&i3j0FMb911F;>qeMztVlfl9F&hI1qbR3DT4Heuw-H#1Ln0-uIFZ{BA|nPmnV;JL zA|n=7l$gn_3y~24%jiI4L_jh;+F%Z&P-1af3Nw!uSRJEKaY|Yu6Tc>iC(9|62;vr} zr15Hi6iaeI1-Ml~@}isqU{h5<a-tjpAX7p8e>VOd4E$gCU+~}IzrcTle+PdJ3=WlW zA9d$w2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-R~z>JVrl*L7U-Yz&MHOrV|r zDqM1G42+CS3}Ob%`?+KxYzZUg{ai9owlVX5E@_B*VdnjkT#^uR0Tt%`ylj>XY|O71 zIgW5W=dx#h#nI23&gjZ!Nv^v_o<259CN@i^rQ)ipj9u*D6*76L<?*oPVaRL|)KxLa zQb_AzU^>ZIT}0s$Z(^21=23qcIAWgyf#txXYrw%fFd!@YKueIpEMnImw)hyagO_tB zgA*xYbuxm*i<&?Y5=hAtvIY*ewg_#l75+8+<Syqf23?hjnH`|3pGFsZD<~mi3beYF zE{nZ+gPFqoHE}I11eI+_jxt2$3-O<3@&nZrEzSmzGznRcjL?B#4bm+JsA+OEDZ=-c zA!3e{q{wE*21*YM#>S*?R1s>b&}Ij(YWD}1Y~WSiV1ggDJOhg%6=hI9dRazr5${M_ z)ehaf2ijhTx|fbivr$EteF$vwWNgXQf$Z|s1Sb*bwoNF7w)p`nij+{`BBUo3_-<F6 z^%r#eD_kC0mOyruz(wJUccIdwyF5c&6>ug@NFX6^{eVUxbjuBnjUV8)4TU?gK$~nB zM8KOoTNO=O<;>VYJ%d&;Gw{}^&U$eAgSGKtG+NI9CXAE>5ke%V!O>p9=+00a`?0w+ zLFfN7^FL$Y|H1#B{~5Rr9wkOYU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1cqb?aIi2jGBWQMVTLk<nb=vF7&)2u^Mls^v+^=C@W=6;;<MwO#>+e;Jvi#<(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2kCIlJ<6u3egd08zP7+5)t3`~<vEKJOFQw`0N zbWIFW&2*E}j16_o%`K7=%`A<ROcImKElezvlMIav%@Yj_jSMX;jV;nlEi4n0Q%zHi zEKDuU&5{!hjm^z0EE6qF3=9p7Q<4(R43kn)EG#SxQ_U<GCnzdzISIP^-N4My%+Scx z(#Sj>v_dX7GaW29vr$zZ?4)FnlakF6Q;iKQjC2i+4a{{-(hQAslaf<Xb(1YE5)&<w zjS|yRQw)uaQp`<^6AerZj8o0c6I0An4N_AqO-#(wOp`1ujLg!E(vnh=l1)v`42@DO zjm=Wi(hLktQc?_!lZ{eSlR?%t2OykeWNKs@pPZ4Hm!2A5Qdy814_$8(4_izC)?nYr zDF=3^Hprc6DVF9&76xg$CdtVux+Y1c#=1#{$;rA#Ny!!l=B7r*$%&?>2FYnAh9+sL z#wkWAmdS=D$%zIgrUs^_sg{<BCaGy=smVr(rY6RQCWfhoM&`zrrbb4oCgzD2hG~|D zsphF*Yb}u6X<}*;4;JKV6qE(K#Tw)mV?#4j!(_8$-BeRELtPUS<5b-wGfQ(_OJlPX z6HALUOEUuts)QLU)Gek)#-`>bhVh9hDfyuDWI=9f`q3ya19nq5$W3O+W=YA($>zG2 zmWfHaCMHH^x`}3n7P`p>W)=o1Mrn!WW(KK-X(p+bN#;i8mZqu61}O$6Ddr}oX3558 zmPy7IiKc00NlD2@DaPjJsi~$0DQ1ajNv38dNyf=W=1FOZ7DixeKOwov%)}Dprg+HO z?s%}<;*&w=?Sqvb2lf9s_;nfhU-4h%-^4$Mzl}eV--%zBFBk-g$v&fMMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3O$2r#Z4o?aK0;ARkK<YeSvVC3XXOG!*AX5tbN z73XFU=j31n0S?f)e`#Dyx*|;4V%!Xl9Gpx{42+B%uE8O?$*Bs3rKt*_A(b43;?m?) z@RfedFBndUFpG$AGe~l9Fmi$vrz94q6{m;@Gm8jAOy*={WCWX>!X+upq$tGAV9deE z$Ov+Tvxj4df_p%S0>}nW9|dQBKQ1O=VF7LiQHT;oj+ElGL?#)2W)XgnAk>|y<%LC( ItRj3&05&u^*Z=?k diff --git a/microservices/navigation_qcm/prisma/migrations/20240417125028_database_creation/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240417125028_database_creation/migration.sql deleted file mode 100644 index af5102c8..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240417125028_database_creation/migration.sql +++ /dev/null @@ -1 +0,0 @@ --- This is an empty migration. \ No newline at end of file diff --git a/microservices/navigation_qcm/prisma/migrations/20240417125048_add_user_schema/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240417125048_add_user_schema/migration.sql deleted file mode 100644 index d8030354..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240417125048_add_user_schema/migration.sql +++ /dev/null @@ -1,14 +0,0 @@ --- CreateTable -CREATE TABLE "User" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "name" TEXT, - "mail" TEXT, - "gitlabUsername" TEXT NOT NULL, - "deleted" BOOLEAN NOT NULL DEFAULT false -); - --- CreateIndex -CREATE UNIQUE INDEX "User_mail_key" ON "User"("mail"); - --- CreateIndex -CREATE UNIQUE INDEX "User_gitlabUsername_key" ON "User"("gitlabUsername"); diff --git a/microservices/navigation_qcm/prisma/migrations/20240523145021_create_complete_database/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240523145021_create_complete_database/migration.sql deleted file mode 100644 index b6a8b802..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240523145021_create_complete_database/migration.sql +++ /dev/null @@ -1,48 +0,0 @@ --- CreateTable -CREATE TABLE "QCM" ( - "idQCM" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "nomQCM" TEXT NOT NULL, - "temps" TEXT NOT NULL, - "randomOrder" BOOLEAN NOT NULL -); - --- CreateTable -CREATE TABLE "Type" ( - "idType" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "nomType" TEXT NOT NULL -); - --- CreateTable -CREATE TABLE "Choix" ( - "idChoix" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "isCorrect" BOOLEAN NOT NULL, - "idQuestion" INTEGER NOT NULL, - CONSTRAINT "Choix_idQuestion_fkey" FOREIGN KEY ("idQuestion") REFERENCES "Question" ("idQuestion") ON DELETE RESTRICT ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "Question" ( - "idQuestion" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "question" TEXT NOT NULL, - "position" INTEGER NOT NULL, - "nbPtsPositif" INTEGER NOT NULL, - "nbPtsNegatif" INTEGER NOT NULL, - "numeric" BOOLEAN, - "idQCM" INTEGER NOT NULL, - "idType" INTEGER NOT NULL, - CONSTRAINT "Question_idQCM_fkey" FOREIGN KEY ("idQCM") REFERENCES "QCM" ("idQCM") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Question_idType_fkey" FOREIGN KEY ("idType") REFERENCES "Type" ("idType") ON DELETE RESTRICT ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "Reponse" ( - "idQuestion" INTEGER NOT NULL, - "idChoix" INTEGER NOT NULL, - "idUser" INTEGER NOT NULL, - "numeric" REAL, - - PRIMARY KEY ("idQuestion", "idChoix", "idUser"), - CONSTRAINT "Reponse_idQuestion_fkey" FOREIGN KEY ("idQuestion") REFERENCES "Question" ("idQuestion") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Reponse_idChoix_fkey" FOREIGN KEY ("idChoix") REFERENCES "Choix" ("idChoix") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Reponse_idUser_fkey" FOREIGN KEY ("idUser") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE -); diff --git a/microservices/navigation_qcm/prisma/migrations/20240530082347_update_db/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240530082347_update_db/migration.sql deleted file mode 100644 index 60c86e8c..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240530082347_update_db/migration.sql +++ /dev/null @@ -1,30 +0,0 @@ -/* - Warnings: - - - Added the required column `codeAcces` to the `QCM` table without a default value. This is not possible if the table is not empty. - -*/ --- CreateTable -CREATE TABLE "Participer" ( - "idUser" INTEGER NOT NULL, - "idQCM" INTEGER NOT NULL, - - PRIMARY KEY ("idUser", "idQCM"), - CONSTRAINT "Participer_idUser_fkey" FOREIGN KEY ("idUser") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Participer_idQCM_fkey" FOREIGN KEY ("idQCM") REFERENCES "QCM" ("idQCM") ON DELETE RESTRICT ON UPDATE CASCADE -); - --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_QCM" ( - "idQCM" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "nomQCM" TEXT NOT NULL, - "temps" TEXT NOT NULL, - "randomOrder" BOOLEAN NOT NULL, - "codeAcces" INTEGER NOT NULL -); -INSERT INTO "new_QCM" ("idQCM", "nomQCM", "randomOrder", "temps") SELECT "idQCM", "nomQCM", "randomOrder", "temps" FROM "QCM"; -DROP TABLE "QCM"; -ALTER TABLE "new_QCM" RENAME TO "QCM"; -PRAGMA foreign_key_check("QCM"); -PRAGMA foreign_keys=ON; diff --git a/microservices/navigation_qcm/prisma/migrations/20240530082946_add_champs/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240530082946_add_champs/migration.sql deleted file mode 100644 index 2eb101b8..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240530082946_add_champs/migration.sql +++ /dev/null @@ -1,24 +0,0 @@ -/* - Warnings: - - - Added the required column `feedback` to the `Participer` table without a default value. This is not possible if the table is not empty. - - Added the required column `note` to the `Participer` table without a default value. This is not possible if the table is not empty. - -*/ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Participer" ( - "idUser" INTEGER NOT NULL, - "idQCM" INTEGER NOT NULL, - "feedback" TEXT NOT NULL, - "note" REAL NOT NULL, - - PRIMARY KEY ("idUser", "idQCM"), - CONSTRAINT "Participer_idUser_fkey" FOREIGN KEY ("idUser") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Participer_idQCM_fkey" FOREIGN KEY ("idQCM") REFERENCES "QCM" ("idQCM") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Participer" ("idQCM", "idUser") SELECT "idQCM", "idUser" FROM "Participer"; -DROP TABLE "Participer"; -ALTER TABLE "new_Participer" RENAME TO "Participer"; -PRAGMA foreign_key_check("Participer"); -PRAGMA foreign_keys=ON; diff --git a/microservices/navigation_qcm/prisma/migrations/20240530151620_update/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240530151620_update/migration.sql deleted file mode 100644 index cd6e8980..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240530151620_update/migration.sql +++ /dev/null @@ -1,20 +0,0 @@ -/* - Warnings: - - - Added the required column `nomChoix` to the `Choix` table without a default value. This is not possible if the table is not empty. - -*/ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Choix" ( - "idChoix" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "isCorrect" BOOLEAN NOT NULL, - "idQuestion" INTEGER NOT NULL, - "nomChoix" TEXT NOT NULL, - CONSTRAINT "Choix_idQuestion_fkey" FOREIGN KEY ("idQuestion") REFERENCES "Question" ("idQuestion") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Choix" ("idChoix", "idQuestion", "isCorrect") SELECT "idChoix", "idQuestion", "isCorrect" FROM "Choix"; -DROP TABLE "Choix"; -ALTER TABLE "new_Choix" RENAME TO "Choix"; -PRAGMA foreign_key_check("Choix"); -PRAGMA foreign_keys=ON; diff --git a/microservices/navigation_qcm/prisma/migrations/20240530161440_/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240530161440_/migration.sql deleted file mode 100644 index ac44a9b4..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240530161440_/migration.sql +++ /dev/null @@ -1,53 +0,0 @@ -/* - Warnings: - - - You are about to drop the `QCM` table. If the table is not empty, all the data it contains will be lost. - -*/ --- DropTable -PRAGMA foreign_keys=off; -DROP TABLE "QCM"; -PRAGMA foreign_keys=on; - --- CreateTable -CREATE TABLE "Qcm" ( - "idQCM" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "nomQCM" TEXT NOT NULL, - "temps" TEXT NOT NULL, - "randomOrder" BOOLEAN NOT NULL, - "codeAcces" INTEGER NOT NULL -); - --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Question" ( - "idQuestion" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "question" TEXT NOT NULL, - "position" INTEGER NOT NULL, - "nbPtsPositif" INTEGER NOT NULL, - "nbPtsNegatif" INTEGER NOT NULL, - "numeric" BOOLEAN, - "idQCM" INTEGER NOT NULL, - "idType" INTEGER NOT NULL, - CONSTRAINT "Question_idQCM_fkey" FOREIGN KEY ("idQCM") REFERENCES "Qcm" ("idQCM") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Question_idType_fkey" FOREIGN KEY ("idType") REFERENCES "Type" ("idType") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Question" ("idQCM", "idQuestion", "idType", "nbPtsNegatif", "nbPtsPositif", "numeric", "position", "question") SELECT "idQCM", "idQuestion", "idType", "nbPtsNegatif", "nbPtsPositif", "numeric", "position", "question" FROM "Question"; -DROP TABLE "Question"; -ALTER TABLE "new_Question" RENAME TO "Question"; -CREATE TABLE "new_Participer" ( - "idUser" INTEGER NOT NULL, - "idQCM" INTEGER NOT NULL, - "feedback" TEXT NOT NULL, - "note" REAL NOT NULL, - - PRIMARY KEY ("idUser", "idQCM"), - CONSTRAINT "Participer_idUser_fkey" FOREIGN KEY ("idUser") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Participer_idQCM_fkey" FOREIGN KEY ("idQCM") REFERENCES "Qcm" ("idQCM") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Participer" ("feedback", "idQCM", "idUser", "note") SELECT "feedback", "idQCM", "idUser", "note" FROM "Participer"; -DROP TABLE "Participer"; -ALTER TABLE "new_Participer" RENAME TO "Participer"; -PRAGMA foreign_key_check("Question"); -PRAGMA foreign_key_check("Participer"); -PRAGMA foreign_keys=ON; diff --git a/microservices/navigation_qcm/prisma/migrations/20240530162619_test/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240530162619_test/migration.sql deleted file mode 100644 index aa822b84..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240530162619_test/migration.sql +++ /dev/null @@ -1,53 +0,0 @@ -/* - Warnings: - - - You are about to drop the `Qcm` table. If the table is not empty, all the data it contains will be lost. - -*/ --- DropTable -PRAGMA foreign_keys=off; -DROP TABLE "Qcm"; -PRAGMA foreign_keys=on; - --- CreateTable -CREATE TABLE "QcmTable" ( - "idQCM" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "nomQCM" TEXT NOT NULL, - "temps" TEXT NOT NULL, - "randomOrder" BOOLEAN NOT NULL, - "codeAcces" INTEGER NOT NULL -); - --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Question" ( - "idQuestion" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "question" TEXT NOT NULL, - "position" INTEGER NOT NULL, - "nbPtsPositif" INTEGER NOT NULL, - "nbPtsNegatif" INTEGER NOT NULL, - "numeric" BOOLEAN, - "idQCM" INTEGER NOT NULL, - "idType" INTEGER NOT NULL, - CONSTRAINT "Question_idQCM_fkey" FOREIGN KEY ("idQCM") REFERENCES "QcmTable" ("idQCM") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Question_idType_fkey" FOREIGN KEY ("idType") REFERENCES "Type" ("idType") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Question" ("idQCM", "idQuestion", "idType", "nbPtsNegatif", "nbPtsPositif", "numeric", "position", "question") SELECT "idQCM", "idQuestion", "idType", "nbPtsNegatif", "nbPtsPositif", "numeric", "position", "question" FROM "Question"; -DROP TABLE "Question"; -ALTER TABLE "new_Question" RENAME TO "Question"; -CREATE TABLE "new_Participer" ( - "idUser" INTEGER NOT NULL, - "idQCM" INTEGER NOT NULL, - "feedback" TEXT NOT NULL, - "note" REAL NOT NULL, - - PRIMARY KEY ("idUser", "idQCM"), - CONSTRAINT "Participer_idUser_fkey" FOREIGN KEY ("idUser") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Participer_idQCM_fkey" FOREIGN KEY ("idQCM") REFERENCES "QcmTable" ("idQCM") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Participer" ("feedback", "idQCM", "idUser", "note") SELECT "feedback", "idQCM", "idUser", "note" FROM "Participer"; -DROP TABLE "Participer"; -ALTER TABLE "new_Participer" RENAME TO "Participer"; -PRAGMA foreign_key_check("Question"); -PRAGMA foreign_key_check("Participer"); -PRAGMA foreign_keys=ON; diff --git a/microservices/navigation_qcm/prisma/migrations/20240606084017_c/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240606084017_c/migration.sql deleted file mode 100644 index dfcc3f54..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240606084017_c/migration.sql +++ /dev/null @@ -1,37 +0,0 @@ -/* - Warnings: - - - Added the required column `heureDebut` to the `Participer` table without a default value. This is not possible if the table is not empty. - - Added the required column `position` to the `Choix` table without a default value. This is not possible if the table is not empty. - -*/ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Participer" ( - "idUser" INTEGER NOT NULL, - "idQCM" INTEGER NOT NULL, - "feedback" TEXT NOT NULL, - "note" REAL NOT NULL, - "heureDebut" TEXT NOT NULL, - - PRIMARY KEY ("idUser", "idQCM"), - CONSTRAINT "Participer_idUser_fkey" FOREIGN KEY ("idUser") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Participer_idQCM_fkey" FOREIGN KEY ("idQCM") REFERENCES "QcmTable" ("idQCM") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Participer" ("feedback", "idQCM", "idUser", "note") SELECT "feedback", "idQCM", "idUser", "note" FROM "Participer"; -DROP TABLE "Participer"; -ALTER TABLE "new_Participer" RENAME TO "Participer"; -CREATE TABLE "new_Choix" ( - "idChoix" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "isCorrect" BOOLEAN NOT NULL, - "idQuestion" INTEGER NOT NULL, - "nomChoix" TEXT NOT NULL, - "position" INTEGER NOT NULL, - CONSTRAINT "Choix_idQuestion_fkey" FOREIGN KEY ("idQuestion") REFERENCES "Question" ("idQuestion") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Choix" ("idChoix", "idQuestion", "isCorrect", "nomChoix") SELECT "idChoix", "idQuestion", "isCorrect", "nomChoix" FROM "Choix"; -DROP TABLE "Choix"; -ALTER TABLE "new_Choix" RENAME TO "Choix"; -PRAGMA foreign_key_check("Participer"); -PRAGMA foreign_key_check("Choix"); -PRAGMA foreign_keys=ON; diff --git a/microservices/navigation_qcm/prisma/migrations/20240606093824_relation_added/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240606093824_relation_added/migration.sql deleted file mode 100644 index 3419aa37..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240606093824_relation_added/migration.sql +++ /dev/null @@ -1,40 +0,0 @@ -/* - Warnings: - - - Added the required column `isMultiple` to the `Question` table without a default value. This is not possible if the table is not empty. - - Added the required column `idUserCreator` to the `QcmTable` table without a default value. This is not possible if the table is not empty. - -*/ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Question" ( - "idQuestion" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "question" TEXT NOT NULL, - "position" INTEGER NOT NULL, - "nbPtsPositif" INTEGER NOT NULL, - "nbPtsNegatif" INTEGER NOT NULL, - "numeric" BOOLEAN, - "idQCM" INTEGER NOT NULL, - "idType" INTEGER NOT NULL, - "isMultiple" BOOLEAN NOT NULL, - CONSTRAINT "Question_idQCM_fkey" FOREIGN KEY ("idQCM") REFERENCES "QcmTable" ("idQCM") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Question_idType_fkey" FOREIGN KEY ("idType") REFERENCES "Type" ("idType") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Question" ("idQCM", "idQuestion", "idType", "nbPtsNegatif", "nbPtsPositif", "numeric", "position", "question") SELECT "idQCM", "idQuestion", "idType", "nbPtsNegatif", "nbPtsPositif", "numeric", "position", "question" FROM "Question"; -DROP TABLE "Question"; -ALTER TABLE "new_Question" RENAME TO "Question"; -CREATE TABLE "new_QcmTable" ( - "idQCM" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "nomQCM" TEXT NOT NULL, - "temps" TEXT NOT NULL, - "randomOrder" BOOLEAN NOT NULL, - "codeAcces" INTEGER NOT NULL, - "idUserCreator" INTEGER NOT NULL, - CONSTRAINT "QcmTable_idUserCreator_fkey" FOREIGN KEY ("idUserCreator") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_QcmTable" ("codeAcces", "idQCM", "nomQCM", "randomOrder", "temps") SELECT "codeAcces", "idQCM", "nomQCM", "randomOrder", "temps" FROM "QcmTable"; -DROP TABLE "QcmTable"; -ALTER TABLE "new_QcmTable" RENAME TO "QcmTable"; -PRAGMA foreign_key_check("Question"); -PRAGMA foreign_key_check("QcmTable"); -PRAGMA foreign_keys=ON; diff --git a/microservices/navigation_qcm/prisma/migrations/20240606094407_v/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240606094407_v/migration.sql deleted file mode 100644 index af5102c8..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240606094407_v/migration.sql +++ /dev/null @@ -1 +0,0 @@ --- This is an empty migration. \ No newline at end of file diff --git a/microservices/navigation_qcm/prisma/migrations/20240612164927_change_date_type/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240612164927_change_date_type/migration.sql deleted file mode 100644 index fa2acb9a..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240612164927_change_date_type/migration.sql +++ /dev/null @@ -1,24 +0,0 @@ -/* - Warnings: - - - You are about to alter the column `heureDebut` on the `Participer` table. The data in that column could be lost. The data in that column will be cast from `String` to `Int`. - -*/ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Participer" ( - "idUser" INTEGER NOT NULL, - "idQCM" INTEGER NOT NULL, - "feedback" TEXT NOT NULL, - "note" REAL NOT NULL, - "heureDebut" INTEGER NOT NULL, - - PRIMARY KEY ("idUser", "idQCM"), - CONSTRAINT "Participer_idUser_fkey" FOREIGN KEY ("idUser") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Participer_idQCM_fkey" FOREIGN KEY ("idQCM") REFERENCES "QcmTable" ("idQCM") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Participer" ("feedback", "heureDebut", "idQCM", "idUser", "note") SELECT "feedback", "heureDebut", "idQCM", "idUser", "note" FROM "Participer"; -DROP TABLE "Participer"; -ALTER TABLE "new_Participer" RENAME TO "Participer"; -PRAGMA foreign_key_check("Participer"); -PRAGMA foreign_keys=ON; diff --git a/microservices/navigation_qcm/prisma/migrations/20240612180153_change_temps_type/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240612180153_change_temps_type/migration.sql deleted file mode 100644 index 5e75a88d..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240612180153_change_temps_type/migration.sql +++ /dev/null @@ -1,22 +0,0 @@ -/* - Warnings: - - - You are about to alter the column `temps` on the `QcmTable` table. The data in that column could be lost. The data in that column will be cast from `String` to `Int`. - -*/ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_QcmTable" ( - "idQCM" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "nomQCM" TEXT NOT NULL, - "temps" INTEGER NOT NULL, - "randomOrder" BOOLEAN NOT NULL, - "codeAcces" INTEGER NOT NULL, - "idUserCreator" INTEGER NOT NULL, - CONSTRAINT "QcmTable_idUserCreator_fkey" FOREIGN KEY ("idUserCreator") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_QcmTable" ("codeAcces", "idQCM", "idUserCreator", "nomQCM", "randomOrder", "temps") SELECT "codeAcces", "idQCM", "idUserCreator", "nomQCM", "randomOrder", "temps" FROM "QcmTable"; -DROP TABLE "QcmTable"; -ALTER TABLE "new_QcmTable" RENAME TO "QcmTable"; -PRAGMA foreign_key_check("QcmTable"); -PRAGMA foreign_keys=ON; diff --git a/microservices/navigation_qcm/prisma/migrations/20240613090400_add_has_finished/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240613090400_add_has_finished/migration.sql deleted file mode 100644 index 192dde74..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240613090400_add_has_finished/migration.sql +++ /dev/null @@ -1,19 +0,0 @@ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Participer" ( - "idUser" INTEGER NOT NULL, - "idQCM" INTEGER NOT NULL, - "feedback" TEXT NOT NULL, - "note" REAL NOT NULL, - "heureDebut" INTEGER NOT NULL, - "hasFinished" BOOLEAN NOT NULL DEFAULT false, - - PRIMARY KEY ("idUser", "idQCM"), - CONSTRAINT "Participer_idUser_fkey" FOREIGN KEY ("idUser") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Participer_idQCM_fkey" FOREIGN KEY ("idQCM") REFERENCES "QcmTable" ("idQCM") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Participer" ("feedback", "heureDebut", "idQCM", "idUser", "note") SELECT "feedback", "heureDebut", "idQCM", "idUser", "note" FROM "Participer"; -DROP TABLE "Participer"; -ALTER TABLE "new_Participer" RENAME TO "Participer"; -PRAGMA foreign_key_check("Participer"); -PRAGMA foreign_keys=ON; diff --git a/microservices/navigation_qcm/prisma/migrations/20240613125037_change_numeric_type/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240613125037_change_numeric_type/migration.sql deleted file mode 100644 index db70c6b0..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240613125037_change_numeric_type/migration.sql +++ /dev/null @@ -1,26 +0,0 @@ -/* - Warnings: - - - You are about to alter the column `numeric` on the `Question` table. The data in that column could be lost. The data in that column will be cast from `Boolean` to `Int`. - -*/ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Question" ( - "idQuestion" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "question" TEXT NOT NULL, - "position" INTEGER NOT NULL, - "nbPtsPositif" INTEGER NOT NULL, - "nbPtsNegatif" INTEGER NOT NULL, - "numeric" INTEGER, - "idQCM" INTEGER NOT NULL, - "idType" INTEGER NOT NULL, - "isMultiple" BOOLEAN NOT NULL, - CONSTRAINT "Question_idQCM_fkey" FOREIGN KEY ("idQCM") REFERENCES "QcmTable" ("idQCM") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Question_idType_fkey" FOREIGN KEY ("idType") REFERENCES "Type" ("idType") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Question" ("idQCM", "idQuestion", "idType", "isMultiple", "nbPtsNegatif", "nbPtsPositif", "numeric", "position", "question") SELECT "idQCM", "idQuestion", "idType", "isMultiple", "nbPtsNegatif", "nbPtsPositif", "numeric", "position", "question" FROM "Question"; -DROP TABLE "Question"; -ALTER TABLE "new_Question" RENAME TO "Question"; -PRAGMA foreign_key_check("Question"); -PRAGMA foreign_keys=ON; diff --git a/microservices/navigation_qcm/prisma/migrations/20240613130357_test/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240613130357_test/migration.sql deleted file mode 100644 index af5102c8..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240613130357_test/migration.sql +++ /dev/null @@ -1 +0,0 @@ --- This is an empty migration. \ No newline at end of file diff --git a/microservices/navigation_qcm/prisma/migrations/20240613135314_/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240613135314_/migration.sql deleted file mode 100644 index f0ced18d..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240613135314_/migration.sql +++ /dev/null @@ -1,25 +0,0 @@ -/* - Warnings: - - - The primary key for the `Reponse` table will be changed. If it partially fails, the table could be left without primary key constraint. - -*/ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Reponse" ( - "idQuestion" INTEGER NOT NULL, - "idChoix" INTEGER, - "idUser" INTEGER NOT NULL, - "numeric" REAL, - - PRIMARY KEY ("idQuestion", "idUser"), - CONSTRAINT "Reponse_idQuestion_fkey" FOREIGN KEY ("idQuestion") REFERENCES "Question" ("idQuestion") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Reponse_idChoix_fkey" FOREIGN KEY ("idChoix") REFERENCES "Choix" ("idChoix") ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT "Reponse_idUser_fkey" FOREIGN KEY ("idUser") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Reponse" ("idChoix", "idQuestion", "idUser", "numeric") SELECT "idChoix", "idQuestion", "idUser", "numeric" FROM "Reponse"; -DROP TABLE "Reponse"; -ALTER TABLE "new_Reponse" RENAME TO "Reponse"; -CREATE UNIQUE INDEX "Reponse_idQuestion_idUser_idChoix_key" ON "Reponse"("idQuestion", "idUser", "idChoix"); -PRAGMA foreign_key_check("Reponse"); -PRAGMA foreign_keys=ON; diff --git a/microservices/navigation_qcm/prisma/migrations/20240613135344_test2/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240613135344_test2/migration.sql deleted file mode 100644 index af5102c8..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240613135344_test2/migration.sql +++ /dev/null @@ -1 +0,0 @@ --- This is an empty migration. \ No newline at end of file diff --git a/microservices/navigation_qcm/prisma/migrations/20240613145516_test3/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240613145516_test3/migration.sql deleted file mode 100644 index 1ed20e0e..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240613145516_test3/migration.sql +++ /dev/null @@ -1,25 +0,0 @@ -/* - Warnings: - - - The primary key for the `Reponse` table will be changed. If it partially fails, the table could be left without primary key constraint. - - Added the required column `idReponse` to the `Reponse` table without a default value. This is not possible if the table is not empty. - -*/ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Reponse" ( - "idReponse" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "idQuestion" INTEGER NOT NULL, - "idChoix" INTEGER, - "idUser" INTEGER NOT NULL, - "numeric" REAL, - CONSTRAINT "Reponse_idQuestion_fkey" FOREIGN KEY ("idQuestion") REFERENCES "Question" ("idQuestion") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Reponse_idChoix_fkey" FOREIGN KEY ("idChoix") REFERENCES "Choix" ("idChoix") ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT "Reponse_idUser_fkey" FOREIGN KEY ("idUser") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Reponse" ("idChoix", "idQuestion", "idUser", "numeric") SELECT "idChoix", "idQuestion", "idUser", "numeric" FROM "Reponse"; -DROP TABLE "Reponse"; -ALTER TABLE "new_Reponse" RENAME TO "Reponse"; -CREATE UNIQUE INDEX "Reponse_idQuestion_idUser_idChoix_key" ON "Reponse"("idQuestion", "idUser", "idChoix"); -PRAGMA foreign_key_check("Reponse"); -PRAGMA foreign_keys=ON; diff --git a/microservices/navigation_qcm/prisma/migrations/20240613150814_es/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240613150814_es/migration.sql deleted file mode 100644 index af5102c8..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240613150814_es/migration.sql +++ /dev/null @@ -1 +0,0 @@ --- This is an empty migration. \ No newline at end of file diff --git a/microservices/navigation_qcm/prisma/migrations/20240613154612_add_some_action/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240613154612_add_some_action/migration.sql deleted file mode 100644 index 1e72d45c..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240613154612_add_some_action/migration.sql +++ /dev/null @@ -1,30 +0,0 @@ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Choix" ( - "idChoix" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "isCorrect" BOOLEAN NOT NULL, - "idQuestion" INTEGER NOT NULL, - "nomChoix" TEXT NOT NULL, - "position" INTEGER NOT NULL, - CONSTRAINT "Choix_idQuestion_fkey" FOREIGN KEY ("idQuestion") REFERENCES "Question" ("idQuestion") ON DELETE CASCADE ON UPDATE CASCADE -); -INSERT INTO "new_Choix" ("idChoix", "idQuestion", "isCorrect", "nomChoix", "position") SELECT "idChoix", "idQuestion", "isCorrect", "nomChoix", "position" FROM "Choix"; -DROP TABLE "Choix"; -ALTER TABLE "new_Choix" RENAME TO "Choix"; -CREATE TABLE "new_Reponse" ( - "idReponse" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "idQuestion" INTEGER NOT NULL, - "idChoix" INTEGER, - "idUser" INTEGER NOT NULL, - "numeric" REAL, - CONSTRAINT "Reponse_idQuestion_fkey" FOREIGN KEY ("idQuestion") REFERENCES "Question" ("idQuestion") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Reponse_idChoix_fkey" FOREIGN KEY ("idChoix") REFERENCES "Choix" ("idChoix") ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT "Reponse_idUser_fkey" FOREIGN KEY ("idUser") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Reponse" ("idChoix", "idQuestion", "idReponse", "idUser", "numeric") SELECT "idChoix", "idQuestion", "idReponse", "idUser", "numeric" FROM "Reponse"; -DROP TABLE "Reponse"; -ALTER TABLE "new_Reponse" RENAME TO "Reponse"; -CREATE UNIQUE INDEX "Reponse_idQuestion_idUser_idChoix_key" ON "Reponse"("idQuestion", "idUser", "idChoix"); -PRAGMA foreign_key_check("Choix"); -PRAGMA foreign_key_check("Reponse"); -PRAGMA foreign_keys=ON; diff --git a/microservices/navigation_qcm/prisma/migrations/20240613195132_database/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240613195132_database/migration.sql deleted file mode 100644 index af5102c8..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240613195132_database/migration.sql +++ /dev/null @@ -1 +0,0 @@ --- This is an empty migration. \ No newline at end of file diff --git a/microservices/navigation_qcm/prisma/migrations/20240615191543_/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240615191543_/migration.sql deleted file mode 100644 index 83a47a17..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240615191543_/migration.sql +++ /dev/null @@ -1,26 +0,0 @@ -/* - Warnings: - - - Added the required column `score` to the `Participer` table without a default value. This is not possible if the table is not empty. - -*/ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Participer" ( - "idUser" INTEGER NOT NULL, - "idQCM" INTEGER NOT NULL, - "feedback" TEXT NOT NULL, - "note" REAL NOT NULL, - "score" INTEGER NOT NULL, - "heureDebut" INTEGER NOT NULL, - "hasFinished" BOOLEAN NOT NULL DEFAULT false, - - PRIMARY KEY ("idUser", "idQCM"), - CONSTRAINT "Participer_idUser_fkey" FOREIGN KEY ("idUser") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Participer_idQCM_fkey" FOREIGN KEY ("idQCM") REFERENCES "QcmTable" ("idQCM") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Participer" ("feedback", "hasFinished", "heureDebut", "idQCM", "idUser", "note") SELECT "feedback", "hasFinished", "heureDebut", "idQCM", "idUser", "note" FROM "Participer"; -DROP TABLE "Participer"; -ALTER TABLE "new_Participer" RENAME TO "Participer"; -PRAGMA foreign_key_check("Participer"); -PRAGMA foreign_keys=ON; diff --git a/microservices/navigation_qcm/prisma/migrations/20240615192133_/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240615192133_/migration.sql deleted file mode 100644 index 9be8341d..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240615192133_/migration.sql +++ /dev/null @@ -1,20 +0,0 @@ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Participer" ( - "idUser" INTEGER NOT NULL, - "idQCM" INTEGER NOT NULL, - "feedback" TEXT NOT NULL, - "note" REAL NOT NULL, - "score" INTEGER, - "heureDebut" INTEGER NOT NULL, - "hasFinished" BOOLEAN NOT NULL DEFAULT false, - - PRIMARY KEY ("idUser", "idQCM"), - CONSTRAINT "Participer_idUser_fkey" FOREIGN KEY ("idUser") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Participer_idQCM_fkey" FOREIGN KEY ("idQCM") REFERENCES "QcmTable" ("idQCM") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Participer" ("feedback", "hasFinished", "heureDebut", "idQCM", "idUser", "note", "score") SELECT "feedback", "hasFinished", "heureDebut", "idQCM", "idUser", "note", "score" FROM "Participer"; -DROP TABLE "Participer"; -ALTER TABLE "new_Participer" RENAME TO "Participer"; -PRAGMA foreign_key_check("Participer"); -PRAGMA foreign_keys=ON; diff --git a/microservices/navigation_qcm/prisma/migrations/20240615194339_/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240615194339_/migration.sql deleted file mode 100644 index a1699f14..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240615194339_/migration.sql +++ /dev/null @@ -1,26 +0,0 @@ -/* - Warnings: - - - Made the column `score` on table `Participer` required. This step will fail if there are existing NULL values in that column. - -*/ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Participer" ( - "idUser" INTEGER NOT NULL, - "idQCM" INTEGER NOT NULL, - "feedback" TEXT NOT NULL, - "note" REAL NOT NULL, - "score" INTEGER NOT NULL, - "heureDebut" INTEGER NOT NULL, - "hasFinished" BOOLEAN NOT NULL DEFAULT false, - - PRIMARY KEY ("idUser", "idQCM"), - CONSTRAINT "Participer_idUser_fkey" FOREIGN KEY ("idUser") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Participer_idQCM_fkey" FOREIGN KEY ("idQCM") REFERENCES "QcmTable" ("idQCM") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Participer" ("feedback", "hasFinished", "heureDebut", "idQCM", "idUser", "note", "score") SELECT "feedback", "hasFinished", "heureDebut", "idQCM", "idUser", "note", "score" FROM "Participer"; -DROP TABLE "Participer"; -ALTER TABLE "new_Participer" RENAME TO "Participer"; -PRAGMA foreign_key_check("Participer"); -PRAGMA foreign_keys=ON; diff --git a/microservices/navigation_qcm/prisma/migrations/20240615194422_add_score/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240615194422_add_score/migration.sql deleted file mode 100644 index af5102c8..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240615194422_add_score/migration.sql +++ /dev/null @@ -1 +0,0 @@ --- This is an empty migration. \ No newline at end of file diff --git a/microservices/navigation_qcm/prisma/migrations/20240615195336_regle_erreur/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240615195336_regle_erreur/migration.sql deleted file mode 100644 index af5102c8..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240615195336_regle_erreur/migration.sql +++ /dev/null @@ -1 +0,0 @@ --- This is an empty migration. \ No newline at end of file diff --git a/microservices/navigation_qcm/prisma/migrations/20240615235649_add_random_order_choix/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240615235649_add_random_order_choix/migration.sql deleted file mode 100644 index 4e5fbeea..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240615235649_add_random_order_choix/migration.sql +++ /dev/null @@ -1,27 +0,0 @@ -/* - Warnings: - - - Added the required column `randomOrder` to the `Question` table without a default value. This is not possible if the table is not empty. - -*/ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Question" ( - "idQuestion" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "question" TEXT NOT NULL, - "position" INTEGER NOT NULL, - "randomOrder" BOOLEAN NOT NULL, - "nbPtsPositif" INTEGER NOT NULL, - "nbPtsNegatif" INTEGER NOT NULL, - "numeric" INTEGER, - "idQCM" INTEGER NOT NULL, - "idType" INTEGER NOT NULL, - "isMultiple" BOOLEAN NOT NULL, - CONSTRAINT "Question_idQCM_fkey" FOREIGN KEY ("idQCM") REFERENCES "QcmTable" ("idQCM") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Question_idType_fkey" FOREIGN KEY ("idType") REFERENCES "Type" ("idType") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Question" ("idQCM", "idQuestion", "idType", "isMultiple", "nbPtsNegatif", "nbPtsPositif", "numeric", "position", "question") SELECT "idQCM", "idQuestion", "idType", "isMultiple", "nbPtsNegatif", "nbPtsPositif", "numeric", "position", "question" FROM "Question"; -DROP TABLE "Question"; -ALTER TABLE "new_Question" RENAME TO "Question"; -PRAGMA foreign_key_check("Question"); -PRAGMA foreign_keys=ON; diff --git a/microservices/navigation_qcm/prisma/migrations/20240615235741_addorder/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240615235741_addorder/migration.sql deleted file mode 100644 index af5102c8..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240615235741_addorder/migration.sql +++ /dev/null @@ -1 +0,0 @@ --- This is an empty migration. \ No newline at end of file diff --git a/microservices/navigation_qcm/prisma/migrations/20240616122454_/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240616122454_/migration.sql deleted file mode 100644 index e0ece44a..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240616122454_/migration.sql +++ /dev/null @@ -1,27 +0,0 @@ -/* - Warnings: - - - You are about to alter the column `numeric` on the `Question` table. The data in that column could be lost. The data in that column will be cast from `Int` to `Float`. - -*/ --- RedefineTables -PRAGMA defer_foreign_keys=ON; -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Question" ( - "idQuestion" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "question" TEXT NOT NULL, - "position" INTEGER NOT NULL, - "nbPtsPositif" INTEGER NOT NULL, - "nbPtsNegatif" INTEGER NOT NULL, - "numeric" REAL, - "idQCM" INTEGER NOT NULL, - "idType" INTEGER NOT NULL, - "isMultiple" BOOLEAN NOT NULL, - CONSTRAINT "Question_idQCM_fkey" FOREIGN KEY ("idQCM") REFERENCES "QcmTable" ("idQCM") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Question_idType_fkey" FOREIGN KEY ("idType") REFERENCES "Type" ("idType") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Question" ("idQCM", "idQuestion", "idType", "isMultiple", "nbPtsNegatif", "nbPtsPositif", "numeric", "position", "question") SELECT "idQCM", "idQuestion", "idType", "isMultiple", "nbPtsNegatif", "nbPtsPositif", "numeric", "position", "question" FROM "Question"; -DROP TABLE "Question"; -ALTER TABLE "new_Question" RENAME TO "Question"; -PRAGMA foreign_keys=ON; -PRAGMA defer_foreign_keys=OFF; diff --git a/microservices/navigation_qcm/prisma/migrations/20240616122525_change_type_numeric_question/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240616122525_change_type_numeric_question/migration.sql deleted file mode 100644 index af5102c8..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240616122525_change_type_numeric_question/migration.sql +++ /dev/null @@ -1 +0,0 @@ --- This is an empty migration. \ No newline at end of file diff --git a/microservices/navigation_qcm/prisma/migrations/20240616125927_new_mig/migration.sql b/microservices/navigation_qcm/prisma/migrations/20240616125927_new_mig/migration.sql deleted file mode 100644 index d0391af0..00000000 --- a/microservices/navigation_qcm/prisma/migrations/20240616125927_new_mig/migration.sql +++ /dev/null @@ -1,27 +0,0 @@ -/* - Warnings: - - - Added the required column `randomOrder` to the `Question` table without a default value. This is not possible if the table is not empty. - -*/ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Question" ( - "idQuestion" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "question" TEXT NOT NULL, - "position" INTEGER NOT NULL, - "randomOrder" BOOLEAN NOT NULL, - "nbPtsPositif" INTEGER NOT NULL, - "nbPtsNegatif" INTEGER NOT NULL, - "numeric" REAL, - "idQCM" INTEGER NOT NULL, - "idType" INTEGER NOT NULL, - "isMultiple" BOOLEAN NOT NULL, - CONSTRAINT "Question_idQCM_fkey" FOREIGN KEY ("idQCM") REFERENCES "QcmTable" ("idQCM") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "Question_idType_fkey" FOREIGN KEY ("idType") REFERENCES "Type" ("idType") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Question" ("idQCM", "idQuestion", "idType", "isMultiple", "nbPtsNegatif", "nbPtsPositif", "numeric", "position", "question") SELECT "idQCM", "idQuestion", "idType", "isMultiple", "nbPtsNegatif", "nbPtsPositif", "numeric", "position", "question" FROM "Question"; -DROP TABLE "Question"; -ALTER TABLE "new_Question" RENAME TO "Question"; -PRAGMA foreign_key_check("Question"); -PRAGMA foreign_keys=ON; diff --git a/microservices/navigation_qcm/prisma/migrations/migration_lock.toml b/microservices/navigation_qcm/prisma/migrations/migration_lock.toml deleted file mode 100644 index e5e5c470..00000000 --- a/microservices/navigation_qcm/prisma/migrations/migration_lock.toml +++ /dev/null @@ -1,3 +0,0 @@ -# Please do not edit this file manually -# It should be added in your version-control system (i.e. Git) -provider = "sqlite" \ No newline at end of file diff --git a/microservices/navigation_qcm/prisma/schema.prisma b/microservices/navigation_qcm/prisma/schema.prisma deleted file mode 100644 index 61e3d4e6..00000000 --- a/microservices/navigation_qcm/prisma/schema.prisma +++ /dev/null @@ -1,94 +0,0 @@ -generator client { - provider = "prisma-client-js" -} - -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} - -// This model is not complete. It's a base for you to start working with Prisma. -model User { - id Int @id /// The user's id is the same as their gitlab id - name String? - mail String? @unique - gitlabUsername String @unique - deleted Boolean @default(false) - reponses Reponse[] - participer Participer[] - qcmCree QcmTable[] -} - -model QcmTable { - idQCM Int @id @default(autoincrement()) - nomQCM String - temps Int - randomOrder Boolean - questions Question[] - codeAcces Int - participer Participer[] - idUserCreator Int - creator User @relation(fields: [idUserCreator], references: [id]) - -} - -model Type { - idType Int @id @default(autoincrement()) - nomType String - questions Question[] -} - -model Choix { - idChoix Int @id @default(autoincrement()) - isCorrect Boolean - idQuestion Int - question Question @relation(fields: [idQuestion], references: [idQuestion], onDelete: Cascade, onUpdate: Cascade) - reponses Reponse[] - nomChoix String - position Int -} - -model Question { - idQuestion Int @id @default(autoincrement()) - question String - position Int - randomOrder Boolean - nbPtsPositif Int - nbPtsNegatif Int - numeric Float? - idQCM Int - qcm QcmTable @relation(fields: [idQCM], references: [idQCM]) - idType Int - type Type @relation(fields: [idType], references: [idType]) - choix Choix[] - reponses Reponse[] - isMultiple Boolean -} - -model Reponse { - idReponse Int @id @default(autoincrement()) - idQuestion Int - question Question @relation(fields: [idQuestion], references: [idQuestion]) - idChoix Int? - choix Choix? @relation(fields: [idChoix], references: [idChoix], onDelete: Cascade, onUpdate: Cascade) - idUser Int - user User @relation(fields: [idUser], references: [id]) - numeric Float? - - @@unique([idQuestion, idUser, idChoix]) -} - -model Participer { - idUser Int - idQCM Int - user User @relation(fields: [idUser], references: [id]) - qcm QcmTable @relation(fields: [idQCM], references: [idQCM]) - feedback String - note Float - score Int - heureDebut Int - hasFinished Boolean @default(false) - - @@id([idUser, idQCM]) -} - diff --git a/microservices/navigation_qcm/prisma/seed.ts b/microservices/navigation_qcm/prisma/seed.ts deleted file mode 100644 index 7d08e7c3..00000000 --- a/microservices/navigation_qcm/prisma/seed.ts +++ /dev/null @@ -1,66 +0,0 @@ -import process from 'process'; -import logger from '../src/logging/WinstonLogger.js'; -import db from '../src/helpers/DatabaseHelper.js'; -import Config from '../src/config/Config.js'; - - -async function main() { - await users(); -} - -main().then(async () => { - await db.$disconnect(); -}).catch(async e => { - logger.error(JSON.stringify(e)); - await db.$disconnect(); - process.exit(1); -}); - -//---------------------------------------------------------------------------------------------------------------------------------------------------------- - -async function users() { - await db.user.upsert({ - where : { id: 142 }, - update: { - name: 'Michaël Minelli' - }, - create: { - id : 142, - name : 'Michaël Minelli', - gitlabUsername: 'michael.minelli', - deleted : false - } - }); - - if ( !Config.production ) { - await db.user.upsert({ - where : { id: 525 }, - update: { - deleted: false - }, - create: { - id : 525, - gitlabUsername: 'stephane.malandai', - deleted : false - } - }); - } - await db.type.create({ - data: { - idType : 1, - nomType : 'text', - } - }); - await db.type.create({ - data: { - idType : 2, - nomType : 'numerique', - } - }); - await db.type.create({ - data: { - idType : 3, - nomType : 'vraiFaux', - } - }); -} \ No newline at end of file diff --git a/microservices/navigation_qcm/src/Middlewares.ts b/microservices/navigation_qcm/src/Middlewares.ts deleted file mode 100644 index 879e278a..00000000 --- a/microservices/navigation_qcm/src/Middlewares.ts +++ /dev/null @@ -1,29 +0,0 @@ -import express, { NextFunction } from 'express'; -import jwt from 'jsonwebtoken'; - -declare module 'express' { - export interface Request { - user?: { - id: number; - // Add other properties if needed - }; - } - } - -export const verifyJWT = (req: express.Request, res: express.Response, next: NextFunction) => { - const token = req.header('Authorization')?.split(' ')[1]; - if (!token) { - res.status(401).json({ message: 'No token, authorization denied' }); - } - else{ - try { - // Décoder et vérifier le token JWT - - const decoded = jwt.verify(token, String(process.env.SECRET_JWT)); - req.user = decoded as { id: number }; - next(); - } catch (err) { - res.status(401).json({ message: 'Token is not valid' }); - } - } -}; \ No newline at end of file diff --git a/microservices/navigation_qcm/src/app.ts b/microservices/navigation_qcm/src/app.ts deleted file mode 100644 index 0cfc19e9..00000000 --- a/microservices/navigation_qcm/src/app.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Server from './express/Server'; - - -new Server().run(); \ No newline at end of file diff --git a/microservices/navigation_qcm/src/calcFunctions.ts b/microservices/navigation_qcm/src/calcFunctions.ts deleted file mode 100644 index a8277f66..00000000 --- a/microservices/navigation_qcm/src/calcFunctions.ts +++ /dev/null @@ -1,48 +0,0 @@ - -import db from './helpers/DatabaseHelper.js'; -import { randomInt } from 'crypto'; -import express from 'express'; - -export function calcTempsRestant(heureDebut: number, tempsQCM: number) : number -{ - const deltaTemps = Math.floor(Date.now() / 1000) - heureDebut; - const tempsRestant = tempsQCM - deltaTemps; - return tempsRestant > 0 ? tempsRestant : -1; -} - -export async function calcNbPtsTotalQCM(idQCM: number) : Promise<number> -{ - const questions = await db.question.findMany({ - where: { - idQCM: idQCM - }, - select: { - nbPtsPositif: true - } - }); - return questions.reduce((total, question) => total + (question.nbPtsPositif || 0), 0); -} - -export function calcNoteBaremeFed(nbPtsObtenus: number, nbPtsTotal: number) : number -{ - return nbPtsObtenus / nbPtsTotal * 5 + 1; -} - -export function getRandomNumber(min: number, max: number): number { - return randomInt(min, max + 1); // `randomInt` génère un nombre entier aléatoire entre `min` (inclus) et `max` (exclus). -} - -export function checkUser(req: express.Request, res: express.Response, userId: number, errorMessage: string) -{ - if (req.user) { - const { id } = req.user; - if (id !== userId) - { - res.status(403).send(errorMessage); - } - } else { - res.status(401).send('Unauthorized'); - } - -} - diff --git a/microservices/navigation_qcm/src/config/Config.ts b/microservices/navigation_qcm/src/config/Config.ts deleted file mode 100644 index 40dfd9fd..00000000 --- a/microservices/navigation_qcm/src/config/Config.ts +++ /dev/null @@ -1,27 +0,0 @@ -class Config { - public readonly production: boolean; - public readonly api: { - port: number - }; - - private constructor() { - this.production = process.env.NODE_ENV === 'production'; - - this.api = { - port: Number(process.env.API_PORT) - }; - } - - private static _instance: Config; - - public static get instance(): Config { - if ( !Config._instance ) { - Config._instance = new Config(); - } - - return Config._instance; - } -} - - -export default Config.instance; diff --git a/microservices/navigation_qcm/src/express/Server.ts b/microservices/navigation_qcm/src/express/Server.ts deleted file mode 100644 index 04365f5c..00000000 --- a/microservices/navigation_qcm/src/express/Server.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { Express } from 'express-serve-static-core'; -import cors from 'cors'; -import morganMiddleware from '../logging/MorganMiddleware'; -import logger from '../logging/WinstonLogger'; -import { AddressInfo } from 'net'; -import http from 'http'; -import helmet from 'helmet'; -import express from 'express'; -import multer from 'multer'; -import Config from '../config/Config'; -import access_routes from '../routes/RoutesAccesQCMs'; -import db from '../helpers/DatabaseHelper.js'; -import bodyParser from 'body-parser'; -import jwt from 'jsonwebtoken'; -import axios from 'axios'; -export class Server { - private readonly backend: Express; - private readonly server: http.Server; - private readonly redirectUri = 'http://localhost:4200'; - - constructor() { - this.backend = express(); - - this.backend.use(multer({ - limits: { - fileSize: 8000000 - } - }).none()); //Used for extract params from body with format "form-data", The none is for say that we do not wait a file in params - this.backend.use(morganMiddleware); //Log API accesses - this.backend.use(helmet()); //Help to secure express, https://helmetjs.github.io/ - this.backend.use(bodyParser.json()); - this.backend.use(cors({ - origin: 'http://localhost:4200' - })); //Allow CORS requests - - - // Routes - this.backend.use('/', access_routes); - this.backend.use(express.json()); - - - this.backend.post('/auth/jwt', async (req, res) => { - const { code } = req.body; - if (!code) { - res.status(400).send('Code is required'); - } - try { - //Demande access_token user avec le code - const response = await axios.post('https://githepia.hesge.ch/oauth/token', { - client_id: String(process.env.CLIENTID), - client_secret: String(process.env.CLIENTSECRET), - code: code, - grant_type: 'authorization_code', - redirect_uri: this.redirectUri, - }); - - const { access_token } = response.data; - - //Demande du name et de l'email utilisateur - const userResponse = await axios.get('https://githepia.hesge.ch/api/v4/user', { - headers: { Authorization: `Bearer ${access_token}` } - }); - - const { id, name, email } = userResponse.data; - console.log(id, name, email) - if(name || email || id){ - //erreur - } - const infoQcm = await db.user.findFirst({ - where: { - name: name, - mail: email - } - }); - // Génération d'un token JWT personnalisé - if(!infoQcm){ - const createUser = await db.user.create({ - data: { - id: id, - gitlabUsername: name, - mail: email, - deleted: false, - name: name, - } - }); - if(!createUser){ - res.status(500).send({error: 'Error create user'}); - } - } - const jwtToken = jwt.sign({ id }, String(process.env.SECRET_JWT), {expiresIn: '1h'}); - - res.json({ - token: jwtToken, - idUser: id - }); - - } catch (error) { - res.status(500).send('Error exchanging code for token'); - } - }); - - this.server = http.createServer(this.backend); - } - - public get app() { - return this.backend; - } - - run() { - this.server.listen(Config.api.port, '0.0.0.0', () => { - const { - port, - address - } = this.server.address() as AddressInfo; - logger.info(`Server started on http://${ address }:${ port }`); - }); - } -} - -export default Server; diff --git a/microservices/navigation_qcm/src/helpers/DatabaseHelper.ts b/microservices/navigation_qcm/src/helpers/DatabaseHelper.ts deleted file mode 100644 index d3be6842..00000000 --- a/microservices/navigation_qcm/src/helpers/DatabaseHelper.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { PrismaClient } from '@prisma/client'; -import logger from '../logging/WinstonLogger.js'; - - -const prisma = new PrismaClient({ - log: [ { - emit : 'event', - level: 'query' - }, { - emit : 'event', - level: 'info' - }, { - emit : 'event', - level: 'warn' - }, { - emit : 'event', - level: 'error' - } ] - }); - -prisma.$on('query', e => { - logger.debug(`Prisma => Query (${ e.duration }ms): ${ e.query }`); - logger.debug(`Prisma => Params: ${ e.params }\n`); -}); -prisma.$on('info', e => logger.info(`Prisma => ${ e.message }`)); -prisma.$on('warn', e => logger.warn(`Prisma => ${ e.message }`)); -prisma.$on('error', e => logger.error(`Prisma => ${ e.message }`)); - -export default prisma; \ No newline at end of file diff --git a/microservices/navigation_qcm/src/logging/MorganMiddleware.ts b/microservices/navigation_qcm/src/logging/MorganMiddleware.ts deleted file mode 100644 index 9030416d..00000000 --- a/microservices/navigation_qcm/src/logging/MorganMiddleware.ts +++ /dev/null @@ -1,19 +0,0 @@ -import morgan, { StreamOptions } from 'morgan'; - -import logger from './WinstonLogger'; - - -const stream: StreamOptions = { - write: (message) => logger.http(message) -}; - -const skip = () => { - return false; -}; - -const morganMiddleware = morgan(':method :url :status :res[content-length] - :response-time ms', { - stream, - skip -}); - -export default morganMiddleware; diff --git a/microservices/navigation_qcm/src/logging/WinstonLogger.ts b/microservices/navigation_qcm/src/logging/WinstonLogger.ts deleted file mode 100644 index 6f6a2b1a..00000000 --- a/microservices/navigation_qcm/src/logging/WinstonLogger.ts +++ /dev/null @@ -1,47 +0,0 @@ -import winston from 'winston'; -import * as Transport from 'winston-transport'; -import Config from '../config/Config'; - - -const levels = { - error: 0, - warn : 1, - info : 2, - http : 3, - debug: 4 -}; - -const level = () => { - return Config.production ? 'warn' : 'debug'; -}; - -const colors = { - error: 'red', - warn : 'yellow', - info : 'green', - http : 'magenta', - debug: 'white' -}; -winston.addColors(colors); - -const format = winston.format.combine(winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss:ms' }), Config.production ? winston.format.uncolorize() : winston.format.colorize({ all: true }), winston.format.printf((info) => `${ info.timestamp } [${ process.pid }] ${ info.level }: ${ info.message }`)); - -// Set type of logs (console, file, etc.) -let transports: Array<Transport> = [ new winston.transports.Console() ]; - -if ( Config.production ) { - transports = transports.concat([ new winston.transports.File({ - filename: 'logs/error.log', - level : 'error' - }), new winston.transports.File({ filename: 'logs/all.log' }) ]); -} - -// Create logger instance -const logger = winston.createLogger({ - level: level(), - levels, - format, - transports - }); - -export default logger; diff --git a/microservices/navigation_qcm/src/routes/MessageRoute.ts b/microservices/navigation_qcm/src/routes/MessageRoute.ts deleted file mode 100644 index fe0dde4a..00000000 --- a/microservices/navigation_qcm/src/routes/MessageRoute.ts +++ /dev/null @@ -1,8 +0,0 @@ -export class MessageRoute{ - static misPara : string = "Missing parameters" - static serverError : string = "Internal Server Error" - static qcmDoesntExist : string = "QCM doesn\'t existe" - static questionDoesntExiste : string = "Question existe déja" - static cantCreate: string = "You can't create a question in this QCM." - static serverErrorAnswering: string = "Server error while answering to the question" -} \ No newline at end of file diff --git a/microservices/navigation_qcm/src/routes/RoutesAccesQCMs.ts b/microservices/navigation_qcm/src/routes/RoutesAccesQCMs.ts deleted file mode 100644 index e3f50eac..00000000 --- a/microservices/navigation_qcm/src/routes/RoutesAccesQCMs.ts +++ /dev/null @@ -1,275 +0,0 @@ -import express from 'express'; - -import db from '../helpers/DatabaseHelper.js'; -import { verifyJWT } from '../Middlewares.js'; - -import { calcNbPtsTotalQCM, calcTempsRestant, calcNoteBaremeFed, checkUser } from "../calcFunctions.js" -import { MessageRoute } from './MessageRoute.js'; - - -const router: express.Router = express.Router(); - -router.post('/join',verifyJWT, async (req: express.Request, res: express.Response) => { - const { codeAcces, idQCM, idUser } = req.body; - if (!codeAcces || !idQCM || !idUser) - { - res.status(400).send({ error: MessageRoute.misPara}); - return - } - try { - const userAlreadyJoin = await db.participer.findUnique({ - where: { - idUser_idQCM: { - idUser: idUser, - idQCM: idQCM - } - }, - select: { - heureDebut: true, - hasFinished: true - } - }); - - const infosQCM = await db.qcmTable.findUnique({ - where: { - idQCM: idQCM - }, - select: { - codeAcces: true, - temps: true, - questions: { - select :{ - idQCM: true, - } - } - } - }); - - if (infosQCM) - { - console.table(infosQCM.questions) - if(infosQCM.questions.length === 0){ - res.status(401).send({ error: "QCM don't have questions"}); - return - } - if (codeAcces !== infosQCM.codeAcces) - { - res.status(401).send({ error: "Wrong access code"}); - return - } - } - else { - res.status(404).send({ error: "QCM doesn't exist"}); - return - } - - // L'utilisateur à déjà rejoint le QCM - if (userAlreadyJoin) - { - // Vérifie le temps restant - if (await canAccessQCM(userAlreadyJoin.heureDebut, infosQCM.temps, userAlreadyJoin.hasFinished, idUser, idQCM)) - { - res.status(200).send({ hasParticipated: true, hasTime: true }); - return - } - else { - res.status(200).send({ hasParticipated: true, hasTime: false }); - return - } - } - const heureDebut: number = Math.floor(Date.now() / 1000); - - const participation = await db.participer.create({ - data: { - idUser: idUser, - idQCM: idQCM, - heureDebut: heureDebut, - feedback: "", - note: -1, - score: 0 - } - }); - res.status(201).send(participation); - return - } catch (error) { - res.status(500).send({ error: 'Server error while joining QCM' }); - return - } -}); - -router.get('/reponseCorrect/:QCM_ID', async (req: express.Request, res: express.Response) => { - const QCM_ID: number = parseInt(req.params.QCM_ID, 10); - const questions = await db.question.findMany({ - where: { - idQCM: QCM_ID - }, - include: { - choix: true - } - }); - if(!questions){ - res.status(500).send({ error: MessageRoute.qcmDoesntExist }); - } - const reponsesCorrect: number[][] = []; - for (const question of questions) { - const reponse: number[] = []; - const correctChoices = question.choix.filter(choice => choice.isCorrect); - if (question.numeric) { - reponse.push(question.numeric); - } else { - correctChoices.forEach(choice => { - reponse.push(choice.idChoix); - }); - } - reponsesCorrect.push(reponse); - } - res.status(200).send(reponsesCorrect); -}); - -router.put('/terminer/:USER_ID/:QCM_ID',verifyJWT, async (req: express.Request, res: express.Response) => { - const USER_ID: number = parseInt(req.params.USER_ID, 10); - const QCM_ID: number = parseInt(req.params.QCM_ID, 10); - checkUser(req, res, USER_ID, "This is not your QCM"); - try { - const participation = await db.participer.findUnique({ - where: { - idUser_idQCM: { - idUser: USER_ID, - idQCM: QCM_ID - } - } - }); - if (!participation) - { - res.status(404).send({ error: "This user didn't begin the QCM" }); - return - } - const questions = await db.question.findMany({ - where: { - idQCM: QCM_ID - }, - include: { - choix: true - } - }); - const responses = await db.reponse.findMany({ - where: { - idUser: USER_ID, - question: { - idQCM: QCM_ID - } - }, - include: { - choix: true, - question: { - include: { - choix: true - } - } - } - }); - - let nbPtsObtenus: number = 0; - - for (const question of questions) { - const userResponses = responses.filter(response => response.idQuestion === question.idQuestion); - const correctChoices = question.choix.filter(choice => choice.isCorrect); - - let isCorrect = true; - if(question.numeric){ - if(userResponses.length === 1){ - if (userResponses[0].numeric !== question.numeric ) - { - isCorrect = false - } - } - else{ - isCorrect = false - } - } - else{ - if (userResponses.length === correctChoices.length) - { - for (const correctChoice of correctChoices) { - if (!userResponses.some(response => response.idChoix === correctChoice.idChoix)) { - isCorrect = false; - break; - } - } - } - else { - isCorrect = false; - } - } - - - if (isCorrect) { - nbPtsObtenus += question.nbPtsPositif; - } - else { - nbPtsObtenus -= question.nbPtsNegatif; - } - } - if (nbPtsObtenus < 0) - { - nbPtsObtenus = 0; - } - const nbPtsTotal = await calcNbPtsTotalQCM(QCM_ID); - const noteTmp: number = calcNoteBaremeFed(nbPtsObtenus, nbPtsTotal); - const reponse = await db.participer.update({ - where: { - idUser_idQCM: { - idUser: USER_ID, - idQCM: QCM_ID - } - }, - data: { - hasFinished: true, - note: noteTmp, - score: nbPtsObtenus - }, - }); - res.status(200).send(reponse); - } catch (error) { - res.status(500).send({ error: 'Server error while answering to the question' }); - } -}); - - -async function canAccessQCM(heureDebut: number, tempsQCM: number, _hasFinished: boolean, idUser: number, idQCM: number) -{ - const tempsRestant = calcTempsRestant(heureDebut, tempsQCM); - console.log(tempsRestant); - if (tempsRestant <= 0) - { - await db.participer.update({ - where: { - idUser_idQCM: { - idUser: idUser, - idQCM: idQCM - } - }, - data: { - hasFinished: true, - }, - }); - return false; - } - else { - const hasFinished = await db.participer.findUnique({ - where: { - idUser_idQCM: { - idUser: idUser, - idQCM: idQCM - } - }, - select: { - hasFinished: true, - } - }); - console.table(hasFinished?.hasFinished); - return !hasFinished?.hasFinished; - } -} - -export default router; \ No newline at end of file diff --git a/microservices/navigation_qcm/src/routes/reqGetDB.ts b/microservices/navigation_qcm/src/routes/reqGetDB.ts deleted file mode 100644 index 9c35f9a9..00000000 --- a/microservices/navigation_qcm/src/routes/reqGetDB.ts +++ /dev/null @@ -1,21 +0,0 @@ -import express from 'express'; - - -import db from '../helpers/DatabaseHelper.js'; -import logger from '../logging/WinstonLogger.js'; - -const router: express.Router = express.Router(); - -async function reqGetDB<T>(getFunction: () => Promise<T>): Promise<T> { -try { - const data = await getFunction(); - await db.$disconnect(); - return data; -} catch (e) { - logger.error(JSON.stringify(e)); - await db.$disconnect(); - return Promise.reject(new Error('Process exited due to error')); -} -} - -export default reqGetDB; diff --git a/microservices/navigation_qcm/src/studentHellQCM.postman_collection.json b/microservices/navigation_qcm/src/studentHellQCM.postman_collection.json deleted file mode 100644 index 8a76529e..00000000 --- a/microservices/navigation_qcm/src/studentHellQCM.postman_collection.json +++ /dev/null @@ -1,1452 +0,0 @@ -{ - "info": { - "_postman_id": "5622b838-4f43-42a6-b1a7-f78459643158", - "name": "Architecture web : QCM (Student Hell)", - "description": "API permettant la gestion de QCMs", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", - "_exporter_id": "12262300" - }, - "item": [ - { - "name": "/results", - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OTU5LCJpYXQiOjE3MTg3MzMxOTl9.zWu2svH1I5vO7RWOShHyCedEJgnhJBZpxf_ziMv6N3U", - "type": "string" - } - ] - }, - "method": "GET", - "header": [], - "url": { - "raw": "http://0.0.0.0:30992/results/1", - "protocol": "http", - "host": [ - "0", - "0", - "0", - "0" - ], - "port": "30992", - "path": [ - "results", - "1" - ] - }, - "description": "Retoune le résultat pour le QCM donné" - }, - "response": [] - }, - { - "name": "/response", - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OTU5LCJpYXQiOjE3MTg3MzMxOTl9.zWu2svH1I5vO7RWOShHyCedEJgnhJBZpxf_ziMv6N3U", - "type": "string" - } - ] - }, - "method": "POST", - "header": [ - { - "key": "Cache-Control", - "value": "no-cache", - "name": "cache-control", - "type": "text" - }, - { - "key": "Postman-Token", - "value": "<calculated when request is sent>", - "name": "postman-token", - "type": "text" - }, - { - "key": "Content-Type", - "value": "multipart/form-data; boundary=<calculated when request is sent>", - "name": "content-type", - "type": "text", - "disabled": true - }, - { - "key": "Content-Length", - "value": "<calculated when request is sent>", - "name": "content-length", - "type": "text" - }, - { - "key": "Host", - "value": "<calculated when request is sent>", - "name": "host", - "type": "text" - }, - { - "key": "User-Agent", - "value": "PostmanRuntime/7.32.1", - "name": "user-agent", - "type": "text" - }, - { - "key": "Accept", - "value": "*/*", - "name": "accept", - "type": "text" - }, - { - "key": "Accept-Encoding", - "value": "gzip, deflate, br", - "name": "accept-encoding", - "type": "text" - }, - { - "key": "Connection", - "value": "keep-alive", - "name": "connection", - "type": "text" - }, - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\"idQuestion\": 1,\"idChoix\": 2,\"idUser\": 959}", - "options": { - "raw": { - "language": "text" - } - } - }, - "url": { - "raw": "http://0.0.0.0:30992/response", - "protocol": "http", - "host": [ - "0", - "0", - "0", - "0" - ], - "port": "30992", - "path": [ - "response" - ] - }, - "description": "Ajoute une nouvelle réponse" - }, - "response": [] - }, - { - "name": "/response", - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OTU5LCJpYXQiOjE3MTg3MzMxOTl9.zWu2svH1I5vO7RWOShHyCedEJgnhJBZpxf_ziMv6N3U", - "type": "string" - } - ] - }, - "method": "DELETE", - "header": [ - { - "key": "Cache-Control", - "value": "no-cache", - "name": "cache-control", - "type": "text" - }, - { - "key": "Postman-Token", - "value": "<calculated when request is sent>", - "name": "postman-token", - "type": "text" - }, - { - "key": "Content-Type", - "value": "text/plain", - "name": "content-type", - "type": "text" - }, - { - "key": "Content-Length", - "value": "<calculated when request is sent>", - "name": "content-length", - "type": "text" - }, - { - "key": "Host", - "value": "<calculated when request is sent>", - "name": "host", - "type": "text" - }, - { - "key": "User-Agent", - "value": "PostmanRuntime/7.32.1", - "name": "user-agent", - "type": "text" - }, - { - "key": "Accept", - "value": "*/*", - "name": "accept", - "type": "text" - }, - { - "key": "Accept-Encoding", - "value": "gzip, deflate, br", - "name": "accept-encoding", - "type": "text" - }, - { - "key": "Connection", - "value": "keep-alive", - "name": "connection", - "type": "text" - }, - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - } - ], - "url": { - "raw": "http://0.0.0.0:30992/response/3", - "protocol": "http", - "host": [ - "0", - "0", - "0", - "0" - ], - "port": "30992", - "path": [ - "response", - "3" - ] - }, - "description": "Supprime une réponse" - }, - "response": [] - }, - { - "name": "/created_QCMs", - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OTU5LCJpYXQiOjE3MTg3MzMxOTl9.zWu2svH1I5vO7RWOShHyCedEJgnhJBZpxf_ziMv6N3U", - "type": "string" - } - ] - }, - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OTU5LCJpYXQiOjE3MTg3MzMxOTl9.zWu2svH1I5vO7RWOShHyCedEJgnhJBZpxf_ziMv6N3U", - "name": "authorization", - "type": "text" - }, - { - "key": "Cache-Control", - "value": "no-cache", - "name": "cache-control", - "type": "text" - }, - { - "key": "Postman-Token", - "value": "<calculated when request is sent>", - "name": "postman-token", - "type": "text" - }, - { - "key": "Host", - "value": "<calculated when request is sent>", - "name": "host", - "type": "text" - }, - { - "key": "User-Agent", - "value": "PostmanRuntime/7.32.1", - "name": "user-agent", - "type": "text" - }, - { - "key": "Accept", - "value": "*/*", - "name": "accept", - "type": "text" - }, - { - "key": "Accept-Encoding", - "value": "gzip, deflate, br", - "name": "accept-encoding", - "type": "text" - }, - { - "key": "Connection", - "value": "keep-alive", - "name": "connection", - "type": "text" - } - ], - "body": { - "mode": "formdata", - "formdata": [] - }, - "url": { - "raw": "http://0.0.0.0:30992/created_QCMs/959", - "protocol": "http", - "host": [ - "0", - "0", - "0", - "0" - ], - "port": "30992", - "path": [ - "created_QCMs", - "959" - ] - }, - "description": "Récupère les QCM créés par un utilisateur" - }, - "response": [] - }, - { - "name": "/realised_QCMs", - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OTU5LCJpYXQiOjE3MTg3MzMxOTl9.zWu2svH1I5vO7RWOShHyCedEJgnhJBZpxf_ziMv6N3U", - "type": "string" - } - ] - }, - "method": "GET", - "header": [], - "url": { - "raw": "http://0.0.0.0:30992/realised_QCMs/959", - "protocol": "http", - "host": [ - "0", - "0", - "0", - "0" - ], - "port": "30992", - "path": [ - "realised_QCMs", - "959" - ] - }, - "description": "Récupère les QCM qu'un utilisateur a effectués" - }, - "response": [] - }, - { - "name": "/responses_QCM", - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OTU5LCJpYXQiOjE3MTg3MzMxOTl9.zWu2svH1I5vO7RWOShHyCedEJgnhJBZpxf_ziMv6N3U", - "type": "string" - } - ] - }, - "method": "GET", - "header": [], - "url": { - "raw": "http://0.0.0.0:30992/responses_QCM/8/959", - "protocol": "http", - "host": [ - "0", - "0", - "0", - "0" - ], - "port": "30992", - "path": [ - "responses_QCM", - "8", - "959" - ] - }, - "description": "Récupère les réponses d'un utilisateur à un QCM" - }, - "response": [] - }, - { - "name": "/examen_QCM", - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OTU5LCJpYXQiOjE3MTg3MzMxOTl9.zWu2svH1I5vO7RWOShHyCedEJgnhJBZpxf_ziMv6N3U", - "type": "string" - } - ] - }, - "method": "GET", - "header": [], - "url": { - "raw": "http://0.0.0.0:30992/examen_QCM/8", - "protocol": "http", - "host": [ - "0", - "0", - "0", - "0" - ], - "port": "30992", - "path": [ - "examen_QCM", - "8" - ] - }, - "description": "Récupère un QCM sans renvoyer les réponses correctes" - }, - "response": [] - }, - { - "name": "/terminer", - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OTU5LCJpYXQiOjE3MTg3MzMxOTl9.zWu2svH1I5vO7RWOShHyCedEJgnhJBZpxf_ziMv6N3U", - "type": "string" - } - ] - }, - "method": "PUT", - "header": [], - "body": { - "mode": "raw", - "raw": "", - "options": { - "raw": { - "language": "text" - } - } - }, - "url": { - "raw": "http://0.0.0.0:30992/terminer/959/1", - "protocol": "http", - "host": [ - "0", - "0", - "0", - "0" - ], - "port": "30992", - "path": [ - "terminer", - "959", - "1" - ] - }, - "description": "Termine le QCM d'un utilisateur" - }, - "response": [] - }, - { - "name": "/numeric_response", - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OTU5LCJpYXQiOjE3MTg3MzMxOTl9.zWu2svH1I5vO7RWOShHyCedEJgnhJBZpxf_ziMv6N3U", - "type": "string" - } - ] - }, - "method": "POST", - "header": [ - { - "key": "Cache-Control", - "value": "no-cache", - "name": "cache-control", - "type": "text" - }, - { - "key": "Postman-Token", - "value": "<calculated when request is sent>", - "name": "postman-token", - "type": "text" - }, - { - "key": "Content-Type", - "value": "text/plain", - "name": "content-type", - "type": "text", - "disabled": true - }, - { - "key": "Content-Length", - "value": "<calculated when request is sent>", - "name": "content-length", - "type": "text" - }, - { - "key": "Host", - "value": "<calculated when request is sent>", - "name": "host", - "type": "text" - }, - { - "key": "User-Agent", - "value": "PostmanRuntime/7.32.1", - "name": "user-agent", - "type": "text" - }, - { - "key": "Accept", - "value": "*/*", - "name": "accept", - "type": "text" - }, - { - "key": "Accept-Encoding", - "value": "gzip, deflate, br", - "name": "accept-encoding", - "type": "text" - }, - { - "key": "Connection", - "value": "keep-alive", - "name": "connection", - "type": "text" - }, - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\"idQuestion\": 2,\"answer\": 10,\"idUser\": 959}", - "options": { - "raw": { - "language": "text" - } - } - }, - "url": { - "raw": "http://0.0.0.0:30992/numeric_response", - "protocol": "http", - "host": [ - "0", - "0", - "0", - "0" - ], - "port": "30992", - "path": [ - "numeric_response" - ] - }, - "description": "Ajoute une réponse de type numérique d'un utilisateur" - }, - "response": [] - }, - { - "name": "/numeric_response", - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OTU5LCJpYXQiOjE3MTg3MzMxOTl9.zWu2svH1I5vO7RWOShHyCedEJgnhJBZpxf_ziMv6N3U", - "type": "string" - } - ] - }, - "method": "DELETE", - "header": [], - "url": { - "raw": "http://0.0.0.0:30992/numeric_response/5", - "protocol": "http", - "host": [ - "0", - "0", - "0", - "0" - ], - "port": "30992", - "path": [ - "numeric_response", - "5" - ] - }, - "description": "Supprime une réponse de type numérique d'un utilisateur" - }, - "response": [] - }, - { - "name": "/question", - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OTU5LCJpYXQiOjE3MTg3MzMxOTl9.zWu2svH1I5vO7RWOShHyCedEJgnhJBZpxf_ziMv6N3U", - "type": "string" - } - ] - }, - "method": "DELETE", - "header": [], - "url": { - "raw": "http://0.0.0.0:30992/question/9", - "protocol": "http", - "host": [ - "0", - "0", - "0", - "0" - ], - "port": "30992", - "path": [ - "question", - "9" - ] - }, - "description": "Supprime une question" - }, - "response": [] - }, - { - "name": "/infos_QCM", - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OTU5LCJpYXQiOjE3MTg3MzMxOTl9.zWu2svH1I5vO7RWOShHyCedEJgnhJBZpxf_ziMv6N3U", - "type": "string" - } - ] - }, - "method": "GET", - "header": [], - "url": { - "raw": "http://0.0.0.0:30992/infos_QCM/14", - "protocol": "http", - "host": [ - "0", - "0", - "0", - "0" - ], - "port": "30992", - "path": [ - "infos_QCM", - "14" - ] - }, - "description": "Récupère toutes les informations d'un QCM" - }, - "response": [] - }, - { - "name": "/QCM", - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OTU5LCJpYXQiOjE3MTg3MzMxOTl9.zWu2svH1I5vO7RWOShHyCedEJgnhJBZpxf_ziMv6N3U", - "type": "string" - } - ] - }, - "method": "PUT", - "header": [ - { - "key": "Cache-Control", - "value": "no-cache", - "name": "cache-control", - "type": "text" - }, - { - "key": "Postman-Token", - "value": "<calculated when request is sent>", - "name": "postman-token", - "type": "text" - }, - { - "key": "Content-Length", - "value": "0", - "name": "content-length", - "type": "text" - }, - { - "key": "Host", - "value": "<calculated when request is sent>", - "name": "host", - "type": "text" - }, - { - "key": "User-Agent", - "value": "PostmanRuntime/7.32.1", - "name": "user-agent", - "type": "text" - }, - { - "key": "Accept", - "value": "*/*", - "name": "accept", - "type": "text" - }, - { - "key": "Accept-Encoding", - "value": "gzip, deflate, br", - "name": "accept-encoding", - "type": "text" - }, - { - "key": "Connection", - "value": "keep-alive", - "name": "connection", - "type": "text" - }, - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n \"qcm\": {\"nomQcm\": \"SBD 2\", \"randomQuestion\": true, \"tempsMax\": 15000, \"idQcm\": 14}\n}", - "options": { - "raw": { - "language": "text" - } - } - }, - "url": { - "raw": "http://0.0.0.0:30992/QCM", - "protocol": "http", - "host": [ - "0", - "0", - "0", - "0" - ], - "port": "30992", - "path": [ - "QCM" - ] - }, - "description": "Met à jour les informations du QCM" - }, - "response": [] - }, - { - "name": "/feedback", - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OTU5LCJpYXQiOjE3MTg3MzMxOTl9.zWu2svH1I5vO7RWOShHyCedEJgnhJBZpxf_ziMv6N3U", - "type": "string" - } - ] - }, - "method": "PUT", - "header": [ - { - "key": "Cache-Control", - "value": "no-cache", - "name": "cache-control", - "type": "text" - }, - { - "key": "Postman-Token", - "value": "<calculated when request is sent>", - "name": "postman-token", - "type": "text" - }, - { - "key": "Content-Length", - "value": "0", - "name": "content-length", - "type": "text" - }, - { - "key": "Host", - "value": "<calculated when request is sent>", - "name": "host", - "type": "text" - }, - { - "key": "User-Agent", - "value": "PostmanRuntime/7.32.1", - "name": "user-agent", - "type": "text" - }, - { - "key": "Accept", - "value": "*/*", - "name": "accept", - "type": "text" - }, - { - "key": "Accept-Encoding", - "value": "gzip, deflate, br", - "name": "accept-encoding", - "type": "text" - }, - { - "key": "Connection", - "value": "keep-alive", - "name": "connection", - "type": "text" - }, - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\"idQCM\": 8, \"idUser\": 975, \"note\": 4.5, \"feedback\": \"Assez bien\"}", - "options": { - "raw": { - "language": "text" - } - } - }, - "url": { - "raw": "http://0.0.0.0:30992/feedback", - "protocol": "http", - "host": [ - "0", - "0", - "0", - "0" - ], - "port": "30992", - "path": [ - "feedback" - ] - }, - "description": "Met à jour le feedback et la note d'un utilisateur pour un QCM" - }, - "response": [] - }, - { - "name": "/QCM", - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OTU5LCJpYXQiOjE3MTg3MzMxOTl9.zWu2svH1I5vO7RWOShHyCedEJgnhJBZpxf_ziMv6N3U", - "type": "string" - } - ] - }, - "method": "POST", - "header": [ - { - "key": "Cache-Control", - "value": "no-cache", - "name": "cache-control", - "type": "text" - }, - { - "key": "Postman-Token", - "value": "<calculated when request is sent>", - "name": "postman-token", - "type": "text" - }, - { - "key": "Content-Length", - "value": "0", - "name": "content-length", - "type": "text" - }, - { - "key": "Host", - "value": "<calculated when request is sent>", - "name": "host", - "type": "text" - }, - { - "key": "User-Agent", - "value": "PostmanRuntime/7.32.1", - "name": "user-agent", - "type": "text" - }, - { - "key": "Accept", - "value": "*/*", - "name": "accept", - "type": "text" - }, - { - "key": "Accept-Encoding", - "value": "gzip, deflate, br", - "name": "accept-encoding", - "type": "text" - }, - { - "key": "Connection", - "value": "keep-alive", - "name": "connection", - "type": "text" - }, - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\"qcm\": {\"nomQcm\": \"Archi web\", \"randomQuestion\": false, \"tempsMax\": 1000}, \"idUser\": 959}", - "options": { - "raw": { - "language": "text" - } - } - }, - "url": { - "raw": "http://0.0.0.0:30992/QCM", - "protocol": "http", - "host": [ - "0", - "0", - "0", - "0" - ], - "port": "30992", - "path": [ - "QCM" - ] - }, - "description": "Créé un QCM" - }, - "response": [] - }, - { - "name": "/numeric_question", - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OTU5LCJpYXQiOjE3MTg3MzMxOTl9.zWu2svH1I5vO7RWOShHyCedEJgnhJBZpxf_ziMv6N3U", - "type": "string" - } - ] - }, - "method": "POST", - "header": [ - { - "key": "Cache-Control", - "value": "no-cache", - "name": "cache-control", - "type": "text" - }, - { - "key": "Postman-Token", - "value": "<calculated when request is sent>", - "name": "postman-token", - "type": "text" - }, - { - "key": "Content-Length", - "value": "0", - "name": "content-length", - "type": "text" - }, - { - "key": "Host", - "value": "<calculated when request is sent>", - "name": "host", - "type": "text" - }, - { - "key": "User-Agent", - "value": "PostmanRuntime/7.32.1", - "name": "user-agent", - "type": "text" - }, - { - "key": "Accept", - "value": "*/*", - "name": "accept", - "type": "text" - }, - { - "key": "Accept-Encoding", - "value": "gzip, deflate, br", - "name": "accept-encoding", - "type": "text" - }, - { - "key": "Connection", - "value": "keep-alive", - "name": "connection", - "type": "text" - }, - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\"question\": {\"question\": \"Combien font 10*5 ?\", \"nbPtsNegatif\": 2, \"nbPtsPositif\": 10, \"valNum\": 50, \"position\": 1}, \"idUser\": 959, \"idQcm\": 14}", - "options": { - "raw": { - "language": "text" - } - } - }, - "url": { - "raw": "http://0.0.0.0:30992/numeric_question", - "protocol": "http", - "host": [ - "0", - "0", - "0", - "0" - ], - "port": "30992", - "path": [ - "numeric_question" - ] - }, - "description": "Ajoute une question de type numérique à un QCM" - }, - "response": [] - }, - { - "name": "/text_question", - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OTU5LCJpYXQiOjE3MTg3MzMxOTl9.zWu2svH1I5vO7RWOShHyCedEJgnhJBZpxf_ziMv6N3U", - "type": "string" - } - ] - }, - "method": "POST", - "header": [ - { - "key": "Cache-Control", - "value": "no-cache", - "name": "cache-control", - "type": "text" - }, - { - "key": "Postman-Token", - "value": "<calculated when request is sent>", - "name": "postman-token", - "type": "text" - }, - { - "key": "Content-Length", - "value": "0", - "name": "content-length", - "type": "text" - }, - { - "key": "Host", - "value": "<calculated when request is sent>", - "name": "host", - "type": "text" - }, - { - "key": "User-Agent", - "value": "PostmanRuntime/7.32.1", - "name": "user-agent", - "type": "text" - }, - { - "key": "Accept", - "value": "*/*", - "name": "accept", - "type": "text" - }, - { - "key": "Accept-Encoding", - "value": "gzip, deflate, br", - "name": "accept-encoding", - "type": "text" - }, - { - "key": "Connection", - "value": "keep-alive", - "name": "connection", - "type": "text" - }, - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\"question\": {\"question\": \"Quel mois est-on ?\", \"nbPtsNegatif\": 2, \"nbPtsPositif\": 10, \"isMultiple\": false, \"position\": 2, \"randomOrder\": true, \"choix\": [{\"text\": \"Juin\", \"isCorrect\": true}, {\"text\": \"Juillet\", \"isCorrect\": false}]}, \"idQcm\": 14}", - "options": { - "raw": { - "language": "text" - } - } - }, - "url": { - "raw": "http://0.0.0.0:30992/text_question", - "protocol": "http", - "host": [ - "0", - "0", - "0", - "0" - ], - "port": "30992", - "path": [ - "text_question" - ] - }, - "description": "Ajoute un question de type texte à un QCM" - }, - "response": [] - }, - { - "name": "/true_false_question", - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OTU5LCJpYXQiOjE3MTg3MzMxOTl9.zWu2svH1I5vO7RWOShHyCedEJgnhJBZpxf_ziMv6N3U", - "type": "string" - } - ] - }, - "method": "POST", - "header": [ - { - "key": "Cache-Control", - "value": "no-cache", - "name": "cache-control", - "type": "text" - }, - { - "key": "Postman-Token", - "value": "<calculated when request is sent>", - "name": "postman-token", - "type": "text" - }, - { - "key": "Content-Length", - "value": "0", - "name": "content-length", - "type": "text" - }, - { - "key": "Host", - "value": "<calculated when request is sent>", - "name": "host", - "type": "text" - }, - { - "key": "User-Agent", - "value": "PostmanRuntime/7.32.1", - "name": "user-agent", - "type": "text" - }, - { - "key": "Accept", - "value": "*/*", - "name": "accept", - "type": "text" - }, - { - "key": "Accept-Encoding", - "value": "gzip, deflate, br", - "name": "accept-encoding", - "type": "text" - }, - { - "key": "Connection", - "value": "keep-alive", - "name": "connection", - "type": "text" - }, - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\"question\": {\"question\": \"Quel mois est-on ?\", \"nbPtsNegatif\": 2, \"nbPtsPositif\": 10, \"isVraiFaux\": true, \"valVraiFaux\": true, \"position\": 2, \"randomOrder\": false}, \"idQcm\": 14}", - "options": { - "raw": { - "language": "text" - } - } - }, - "url": { - "raw": "http://0.0.0.0:30992/true_false_question", - "protocol": "http", - "host": [ - "0", - "0", - "0", - "0" - ], - "port": "30992", - "path": [ - "true_false_question" - ] - }, - "description": "Ajoute une question de type Vrai/Faux à un QCM" - }, - "response": [] - }, - { - "name": "/join", - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OTU5LCJpYXQiOjE3MTg3MzMxOTl9.zWu2svH1I5vO7RWOShHyCedEJgnhJBZpxf_ziMv6N3U", - "type": "string" - } - ] - }, - "method": "POST", - "header": [ - { - "key": "Cache-Control", - "value": "no-cache", - "name": "cache-control", - "type": "text" - }, - { - "key": "Postman-Token", - "value": "<calculated when request is sent>", - "name": "postman-token", - "type": "text" - }, - { - "key": "Content-Length", - "value": "0", - "name": "content-length", - "type": "text" - }, - { - "key": "Host", - "value": "<calculated when request is sent>", - "name": "host", - "type": "text" - }, - { - "key": "User-Agent", - "value": "PostmanRuntime/7.32.1", - "name": "user-agent", - "type": "text" - }, - { - "key": "Accept", - "value": "*/*", - "name": "accept", - "type": "text" - }, - { - "key": "Accept-Encoding", - "value": "gzip, deflate, br", - "name": "accept-encoding", - "type": "text" - }, - { - "key": "Connection", - "value": "keep-alive", - "name": "connection", - "type": "text" - }, - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\"codeAcces\": 4398, \"idQCM\": 13, \"idUser\": 959}", - "options": { - "raw": { - "language": "text" - } - } - }, - "url": { - "raw": "http://0.0.0.0:30992/join", - "protocol": "http", - "host": [ - "0", - "0", - "0", - "0" - ], - "port": "30992", - "path": [ - "join" - ] - }, - "description": "Rejoint un QCM" - }, - "response": [] - }, - { - "name": "/auth/jwt", - "request": { - "auth": { - "type": "noauth" - }, - "method": "POST", - "header": [ - { - "key": "Cache-Control", - "value": "no-cache", - "name": "cache-control", - "type": "text" - }, - { - "key": "Postman-Token", - "value": "<calculated when request is sent>", - "name": "postman-token", - "type": "text" - }, - { - "key": "Content-Type", - "value": "text/plain", - "name": "content-type", - "type": "text" - }, - { - "key": "Content-Length", - "value": "<calculated when request is sent>", - "name": "content-length", - "type": "text" - }, - { - "key": "Host", - "value": "<calculated when request is sent>", - "name": "host", - "type": "text" - }, - { - "key": "User-Agent", - "value": "PostmanRuntime/7.32.1", - "name": "user-agent", - "type": "text" - }, - { - "key": "Accept", - "value": "*/*", - "name": "accept", - "type": "text" - }, - { - "key": "Accept-Encoding", - "value": "gzip, deflate, br", - "name": "accept-encoding", - "type": "text" - }, - { - "key": "Connection", - "value": "keep-alive", - "name": "connection", - "type": "text" - }, - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{ \"code\": 185fb9517156af142f481ffbb5c75857080cd4b01a48aa65373804e23ed63d5f }", - "options": { - "raw": { - "language": "text" - } - } - }, - "url": { - "raw": "http://0.0.0.0:30992/auth/jwt", - "protocol": "http", - "host": [ - "0", - "0", - "0", - "0" - ], - "port": "30992", - "path": [ - "auth", - "jwt" - ] - }, - "description": "Récupère les informations de l'utilisateur depuis gitlab et génère le token JWT" - }, - "response": [] - } - ] -} \ No newline at end of file diff --git a/microservices/navigation_qcm/tests/index.test.ts b/microservices/navigation_qcm/tests/index.test.ts deleted file mode 100644 index b202cac8..00000000 --- a/microservices/navigation_qcm/tests/index.test.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { describe } from 'node:test'; -import { expect, test } from '@jest/globals'; -import { calcNoteBaremeFed } from '../src/calcFunctions'; - -describe('testing index file', () => { - test('empty string should result in zero', () => { - expect(calcNoteBaremeFed(50, 50)).toBe(6); - expect(calcNoteBaremeFed(0, 50)).toBe(1); - expect(calcNoteBaremeFed(0, 50)).not.toBe(0); - }); -}); \ No newline at end of file diff --git a/microservices/navigation_qcm/tsconfig.json b/microservices/navigation_qcm/tsconfig.json deleted file mode 100644 index 0af92795..00000000 --- a/microservices/navigation_qcm/tsconfig.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "compilerOptions": { - "baseUrl" : ".", - "outDir" : "dist", - "strict" : true, - "target" : "ES2022", - "module" : "commonjs", - "sourceMap" : true, - "noImplicitAny" : true, - "esModuleInterop" : true, - "moduleResolution": "node", - "paths" : { - "*": [ - "node_modules/*" - ] - } - }, - "include" : [ - "src/**/*.ts", - "prisma/seed.ts" - ], - "exclude" : [ - "node_modules", - "assets/**/*" - ] -} diff --git a/microservices/nginx.conf b/microservices/nginx.conf new file mode 100644 index 00000000..cd002892 --- /dev/null +++ b/microservices/nginx.conf @@ -0,0 +1,187 @@ + +events { + worker_connections 1024; +} + +http { + include mime.types; + default_type application/octet-stream; + + sendfile on; + keepalive_timeout 65; + + server { + listen 80; + + # Redirection des services + + location /helloworld { + proxy_pass http://localhost:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /auth/jwt { + proxy_pass http://localhost:8001; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /reponseCorrect/:QCM_ID { + proxy_pass http://localhost:8002; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /responses_QCM/:QCM_ID/:USER_ID { + proxy_pass http://localhost:8002; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /feedback { + proxy_pass http://localhost:8002; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /results/:QCM_ID { + proxy_pass http://localhost:8002; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /QCM { + proxy_pass http://localhost:8003; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /numeric_question { + proxy_pass http://localhost:8003; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /response/:ANSWER_ID { + proxy_pass http://localhost:8005; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /response { + proxy_pass http://localhost:8005; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /numeric_response/:ANSWER_ID { + proxy_pass http://localhost:8005; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /terminer/:USER_ID/:QCM_ID { + proxy_pass http://localhost:8005; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /join { + proxy_pass http://localhost:8005; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /question/:QUESTION_ID { + proxy_pass http://localhost:8005; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /text_question { + proxy_pass http://localhost:8005; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /numeric_response { + proxy_pass http://localhost:8005; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /true_false_question { + proxy_pass http://localhost:8005; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /realised_QCMs/:USER_ID { + proxy_pass http://localhost:8006; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /created_QCMs/:USER_ID { + proxy_pass http://localhost:8006; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /examen_QCM/:QCM_ID { + proxy_pass http://localhost:8006; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /infos_QCM/:QCM_ID { + proxy_pass http://localhost:8006; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + } +} \ No newline at end of file diff --git a/microservices/realise_qcm/src/express/Server.ts b/microservices/realise_qcm/src/express/Server.ts index 4542e740..e178be3c 100644 --- a/microservices/realise_qcm/src/express/Server.ts +++ b/microservices/realise_qcm/src/express/Server.ts @@ -8,7 +8,7 @@ import helmet from 'helmet'; import express from 'express'; import multer from 'multer'; import Config from '../config/Config'; -import questions_routes from '../routes/RoutesQuestions'; +import questions_routes from '../routes/RealiseQcm'; import db from '../helpers/DatabaseHelper.js'; import bodyParser from 'body-parser'; @@ -31,7 +31,9 @@ export class Server { this.backend.use(helmet()); //Help to secure express, https://helmetjs.github.io/ this.backend.use(bodyParser.json()); this.backend.use(cors({ - origin: 'http://localhost:4200' + origin: '*' , + methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], + allowedHeaders: ['Authorization', 'Content-Type'] })); //Allow CORS requests diff --git a/microservices/realise_qcm/src/routes/RealiseQcm.ts b/microservices/realise_qcm/src/routes/RealiseQcm.ts new file mode 100644 index 00000000..a39a071d --- /dev/null +++ b/microservices/realise_qcm/src/routes/RealiseQcm.ts @@ -0,0 +1,609 @@ +import express from 'express'; + +import db from '../helpers/DatabaseHelper.js'; +import { verifyJWT } from '../Middlewares.js'; +import { MessageRoute } from './MessageRoute.js'; +import { calcNbPtsTotalQCM,calcNoteBaremeFed,checkUser,calcTempsRestant} from "../calcFunctions.js" + + +const router: express.Router = express.Router(); + + +router.delete('/response/:ANSWER_ID',verifyJWT, async (req: express.Request, res: express.Response) => { + const ANSWER_ID: number = parseInt(req.params.ANSWER_ID, 10); + if (!ANSWER_ID) + { + res.status(400).send({ error: MessageRoute.misPara }); + return + } + const responseExist = await db.reponse.findFirst({ + where: { + idReponse: ANSWER_ID + }, + }); + + console.log(responseExist); + if (!responseExist) + { + res.status(404).send({ error: "This response doesn't exist and canno't be deleted" }); + return + } + checkUser(req, res, responseExist.idUser, "You can't delete a response in this QCM."); + + try { + const reponse = await db.reponse.deleteMany({ + where: { + idReponse: ANSWER_ID + }, + }); + res.status(200).send(reponse); + } catch (error) { + res.status(500).send({ error: MessageRoute.serverErrorAnswering }); + } +}); + +router.post('/response', verifyJWT, async (req: express.Request, res: express.Response) => { + const { idQuestion, idChoix, idUser } = req.body; + if (!idQuestion || !idChoix || !idUser) + { + res.status(400).send({ error: MessageRoute.misPara}); + return + } + checkUser(req, res, idUser, "You can't create a response in this QCM."); + + const infosQuestion = await db.choix.findFirst({ + where: { + idQuestion: idQuestion + }, + select: { + idQuestion: true, + idChoix: true + } + }); + + if (infosQuestion) + { + const infosReponse = await db.reponse.findFirst({ + where: { + AND: { + idQuestion: idQuestion, + idUser: idUser, + idChoix: idChoix + } + } + }); + if (infosReponse?.idChoix) + { + res.status(200).send({ error: "This choice has already been chosen"}); + return + } + } + else { + res.status(404).send({ error: MessageRoute.questionDoesntExiste}); + return + } + + try { + const reponse = await db.reponse.create({ + data: { + idQuestion: idQuestion, + idChoix: idChoix, + idUser: idUser, + } + }); + res.status(201).send(reponse); + } catch (error) { + res.status(500).send({ error: MessageRoute.serverErrorAnswering }); + } +}); + +router.delete('/numeric_response/:ANSWER_ID', verifyJWT,async (req: express.Request, res: express.Response) => { + const ANSWER_ID: number = parseInt(req.params.ANSWER_ID, 10); + console.log(ANSWER_ID); + const responseExist = await db.reponse.findFirst({ + where: { + idReponse: ANSWER_ID + } + }); + + console.log(responseExist); + + if (!responseExist) + { + res.status(404).send({ error: "This response doesn't exist and canno't be deleted" }); + return + } + checkUser(req, res, responseExist.idUser, MessageRoute.serverErrorAnswering); + + try { + const reponse = await db.reponse.delete({ + where: { + idReponse: ANSWER_ID + }, + }); + res.status(200).send(reponse); + } catch (error) { + res.status(500).send({ error: MessageRoute.serverErrorAnswering }); + } +}); + + +router.put('/terminer/:USER_ID/:QCM_ID',verifyJWT, async (req: express.Request, res: express.Response) => { + const USER_ID: number = parseInt(req.params.USER_ID, 10); + const QCM_ID: number = parseInt(req.params.QCM_ID, 10); + checkUser(req, res, USER_ID, "This is not your QCM"); + try { + const participation = await db.participer.findUnique({ + where: { + idUser_idQCM: { + idUser: USER_ID, + idQCM: QCM_ID + } + } + }); + if (!participation) + { + res.status(404).send({ error: "This user didn't begin the QCM" }); + return + } + const questions = await db.question.findMany({ + where: { + idQCM: QCM_ID + }, + include: { + choix: true + } + }); + const responses = await db.reponse.findMany({ + where: { + idUser: USER_ID, + question: { + idQCM: QCM_ID + } + }, + include: { + choix: true, + question: { + include: { + choix: true + } + } + } + }); + + let nbPtsObtenus: number = 0; + + for (const question of questions) { + const userResponses = responses.filter(response => response.idQuestion === question.idQuestion); + const correctChoices = question.choix.filter(choice => choice.isCorrect); + + let isCorrect = true; + if(question.numeric){ + if(userResponses.length === 1){ + if (userResponses[0].numeric !== question.numeric ) + { + isCorrect = false + } + } + else{ + isCorrect = false + } + } + else{ + if (userResponses.length === correctChoices.length) + { + for (const correctChoice of correctChoices) { + if (!userResponses.some(response => response.idChoix === correctChoice.idChoix)) { + isCorrect = false; + break; + } + } + } + else { + isCorrect = false; + } + } + + + if (isCorrect) { + nbPtsObtenus += question.nbPtsPositif; + } + else { + nbPtsObtenus -= question.nbPtsNegatif; + } + } + if (nbPtsObtenus < 0) + { + nbPtsObtenus = 0; + } + const nbPtsTotal = await calcNbPtsTotalQCM(QCM_ID); + const noteTmp: number = calcNoteBaremeFed(nbPtsObtenus, nbPtsTotal); + const reponse = await db.participer.update({ + where: { + idUser_idQCM: { + idUser: USER_ID, + idQCM: QCM_ID + } + }, + data: { + hasFinished: true, + note: noteTmp, + score: nbPtsObtenus + }, + }); + res.status(200).send(reponse); + } catch (error) { + res.status(500).send({ error: 'Server error while answering to the question' }); + } +}); + +router.post('/join',verifyJWT, async (req: express.Request, res: express.Response) => { + const { codeAcces, idQCM, idUser } = req.body; + if (!codeAcces || !idQCM || !idUser) + { + res.status(400).send({ error: MessageRoute.misPara}); + return + } + try { + const userAlreadyJoin = await db.participer.findUnique({ + where: { + idUser_idQCM: { + idUser: idUser, + idQCM: idQCM + } + }, + select: { + heureDebut: true, + hasFinished: true + } + }); + + const infosQCM = await db.qcmTable.findUnique({ + where: { + idQCM: idQCM + }, + select: { + codeAcces: true, + temps: true, + questions: { + select :{ + idQCM: true, + } + } + } + }); + + if (infosQCM) + { + console.table(infosQCM.questions) + if(infosQCM.questions.length === 0){ + res.status(401).send({ error: "QCM don't have questions"}); + return + } + if (codeAcces !== infosQCM.codeAcces) + { + res.status(401).send({ error: "Wrong access code"}); + return + } + } + else { + res.status(404).send({ error: "QCM doesn't exist"}); + return + } + + // L'utilisateur à déjà rejoint le QCM + if (userAlreadyJoin) + { + // Vérifie le temps restant + if (await canAccessQCM(userAlreadyJoin.heureDebut, infosQCM.temps, userAlreadyJoin.hasFinished, idUser, idQCM)) + { + res.status(200).send({ hasParticipated: true, hasTime: true }); + return + } + else { + res.status(200).send({ hasParticipated: true, hasTime: false }); + return + } + } + const heureDebut: number = Math.floor(Date.now() / 1000); + + const participation = await db.participer.create({ + data: { + idUser: idUser, + idQCM: idQCM, + heureDebut: heureDebut, + feedback: "", + note: -1, + score: 0 + } + }); + res.status(201).send(participation); + return + } catch (error) { + res.status(500).send({ error: 'Server error while joining QCM' }); + return + } +}); + +async function canAccessQCM(heureDebut: number, tempsQCM: number, _hasFinished: boolean, idUser: number, idQCM: number) +{ + const tempsRestant = calcTempsRestant(heureDebut, tempsQCM); + console.log(tempsRestant); + if (tempsRestant <= 0) + { + await db.participer.update({ + where: { + idUser_idQCM: { + idUser: idUser, + idQCM: idQCM + } + }, + data: { + hasFinished: true, + }, + }); + return false; + } + else { + const hasFinished = await db.participer.findUnique({ + where: { + idUser_idQCM: { + idUser: idUser, + idQCM: idQCM + } + }, + select: { + hasFinished: true, + } + }); + console.table(hasFinished?.hasFinished); + return !hasFinished?.hasFinished; + } +} +router.delete('/question/:QUESTION_ID', verifyJWT, async (req: express.Request, res: express.Response) => { + const QUESTION_ID: number = parseInt(req.params.QUESTION_ID, 10); + console.log(QUESTION_ID); + const questionExist = await db.question.findFirst({ + where: { + idQuestion: QUESTION_ID + }, + include: { + qcm: true + } + }); + + if (!questionExist) + { + res.status(404).send({ error: "This response doesn't exist and canno't be deleted" }); + return + } + checkUser(req, res, questionExist.qcm.idUserCreator, "You can't delete a question in this QCM."); + + try { + console.log(QUESTION_ID) + const reponse = await db.question.delete({ + where: { + idQuestion: QUESTION_ID + }, + }); + res.status(200).send(reponse); + } catch (error) { + console.error(error); + res.status(500).send({ error: 'Server error while answering to the question' }); + } +}); + + +router.post('/text_question', verifyJWT, async (req: express.Request, res: express.Response) => { + const { question, idQcm } = req.body; + console.log(question, idQcm); + if (!idQcm || !question || !question["question"] || question["nbPtsNegatif"] === undefined || question["nbPtsPositif"] === undefined || question["isMultiple"] === undefined || question["position"] === undefined || question["choix"] === undefined || question["randomOrder"] === undefined) + { + res.status(400).send({ error: MessageRoute.misPara }); + return + } + let minOneCorrectChoice: boolean = false; + let minOneFalseChoice: boolean = false; + + for (const choix of question["choix"]) { + if (choix["isCorrect"]) { + minOneCorrectChoice = true; + } + if (!choix["isCorrect"]) { + minOneFalseChoice = true; + } + } + if (!minOneCorrectChoice) + { + res.status(409).send({ error: 'Missing a correct choice' }); + return + } + if (!minOneFalseChoice) + { + res.status(409).send({ error: 'Missing a false choice' }); + return + } + const infoQcm = await db.qcmTable.findFirst({ + where: { + idQCM: idQcm, + } + }); + if(!infoQcm){ + res.status(404).send({ error: MessageRoute.qcmDoesntExist }); + return + } + checkUser(req, res, infoQcm.idUserCreator, MessageRoute.cantCreate); + const type = await db.type.findFirst({ + where: { + nomType: "text" + }, + }); + if(!type){ + res.status(500).send({ error: MessageRoute.serverError }); + return + } + const questionCreate = await db.question.create({ + data: { + nbPtsNegatif:question["nbPtsNegatif"], + nbPtsPositif: question["nbPtsPositif"], + position: question["position"], + isMultiple: question["isMultiple"], + question: question["question"], + idQCM: idQcm, + idType: type["idType"], + randomOrder: question["randomOrder"], + } + }); + console.log(questionCreate) + if(!questionCreate){ + res.status(500).send({ error: MessageRoute.serverError}); + return + } + const idQuestion = questionCreate["idQuestion"]; + for(let i = 0; i < question["choix"].length; i++){ + if(!question["choix"][i]["text"] || question["choix"][i]["isCorrect"] === undefined){ + res.status(500).send({ error: 'Server error' }); + return + } + const choixCreate = await db.choix.create({ + data: { + nomChoix: question["choix"][i]["text"], + isCorrect: question["choix"][i]["isCorrect"], + idQuestion: idQuestion, + position: i, + } + }); + if(!choixCreate){ + res.status(500).send({ error: MessageRoute.serverError }); + return + } + } + res.status(200).send({id: idQuestion}); +}); +router.post('/numeric_response',verifyJWT, async (req: express.Request, res: express.Response) => { + const { idQuestion, answer, idUser } = req.body; + if (!idQuestion || !answer || !idUser) + { + res.status(400).send({ error: MessageRoute.misPara }); + return + } + checkUser(req, res, idUser, "You can't create a response in this QCM."); + + const infosQuestion = await db.question.findFirst({ + where: { + idQuestion: idQuestion + } + }); + + if (infosQuestion) + { + const infosReponse = await db.reponse.findFirst({ + where: { + AND: { + idQuestion: idQuestion, + idUser: idUser, + numeric: { + not: null + } + } + } + }); + if (infosReponse) + { + res.status(200).send({ error: "User already answered this question" }); + return + } + } + else { + res.status(404).send({ error: MessageRoute.questionDoesntExiste}); + return + } + + try { + const reponse = await db.reponse.create({ + data: { + idQuestion: idQuestion, + idUser: idUser, + numeric: answer + } + }); + res.status(201).send(reponse); + } catch (error) { + res.status(500).send({ error: MessageRoute.serverErrorAnswering }); + } +}); +router.post('/true_false_question', verifyJWT, async (req: express.Request, res: express.Response) => { + try { + const { question, idQcm } = req.body; + console.table(req.body) + console.log(question, idQcm) + if (!idQcm || !question || !question["question"] || !question["nbPtsNegatif"] === undefined || !question["nbPtsPositif"] === undefined || question["isVraiFaux"] === undefined || question["valVraiFaux"] === undefined) { + res.status(400).send({ error: MessageRoute.misPara }); + return + } + + const infoQcm = await db.qcmTable.findFirst({ + where: { + idQCM: idQcm + } + }); + + if (!infoQcm) { + res.status(400).send({ error:MessageRoute.qcmDoesntExist}); + return + } + checkUser(req, res, infoQcm.idUserCreator, MessageRoute.cantCreate); + + const type = await db.type.findFirst({ + where: { + nomType: "vraiFaux" + } + }); + + if (!type) { + res.status(500).send({ error: 'Server Problem: Type not found' }); + return + } + + + const questionCreate = await db.question.create({ + data: { + nbPtsNegatif: question["nbPtsNegatif"], + nbPtsPositif: question["nbPtsPositif"], + position: 0, + isMultiple: false, + question: question["question"], + idQCM: idQcm, + idType: type["idType"], + randomOrder: question["randomOrder"], + } + }); + + + if (!questionCreate) { + res.status(500).send({ error: 'Server Problem: Question creation failed' }); + return + } + + const idQuestion = questionCreate.idQuestion; + + const choixData = [ + { nomChoix: "Vrai", isCorrect: question.valVraiFaux, idQuestion: idQuestion, position: 0 }, + { nomChoix: "Faux", isCorrect: !question.valVraiFaux, idQuestion: idQuestion, position: 1 } + ]; + + const choixCreate = await db.choix.createMany({ + data: choixData + }); + if(!choixCreate){ + res.status(500).send({ error: MessageRoute.serverError }); + return + } + + res.status(200).send({id: idQuestion}); + } catch (error) { + res.status(500).send({ error: MessageRoute.serverError }); + } +}); + +export default router; diff --git a/microservices/realise_qcm/src/routes/RoutesQuestions.ts b/microservices/realise_qcm/src/routes/RoutesQuestions.ts deleted file mode 100644 index 476cb928..00000000 --- a/microservices/realise_qcm/src/routes/RoutesQuestions.ts +++ /dev/null @@ -1,252 +0,0 @@ -import express from 'express'; - -import db from '../helpers/DatabaseHelper.js'; -import { verifyJWT } from '../Middlewares.js'; -import { checkUser } from "../calcFunctions.js" -import { MessageRoute } from './MessageRoute.js'; - - -const router: express.Router = express.Router(); - - - -router.post('/numeric_question', verifyJWT, async (req: express.Request, res: express.Response) => { - const { question, idQcm } = req.body; - console.log(question, idQcm); - if (!idQcm || !question || !question["question"] || question["nbPtsNegatif"] === undefined || question["nbPtsPositif"] === undefined || question["valNum"] === undefined || question["position"] === undefined) - { - res.status(400).send({ error: MessageRoute.misPara }); - return - } - const infoQcm = await db.qcmTable.findFirst({ - where: { - idQCM: idQcm - } - }); - if(!infoQcm) - { - res.status(404).send({ error: MessageRoute.qcmDoesntExist }); - return - } - checkUser(req, res, infoQcm.idUserCreator, MessageRoute.cantCreate); - const type = await db.type.findFirst({ - where: { - nomType: "numerique" - }, - }); - if(!type) - { - res.status(500).send({ error: 'Server error' }); - return - } - const qcmCreate = await db.question.create({ - data: { - nbPtsNegatif: question["nbPtsNegatif"], - nbPtsPositif: question["nbPtsPositif"], - position: question["position"], - isMultiple: false, - question: question["question"], - idQCM: idQcm, - idType: type["idType"], - numeric: question["valNum"], - randomOrder: false, - } - }); - res.status(200).send({id: qcmCreate.idQuestion}); -}); - -router.post('/text_question', verifyJWT, async (req: express.Request, res: express.Response) => { - const { question, idQcm } = req.body; - console.log(question, idQcm); - if (!idQcm || !question || !question["question"] || question["nbPtsNegatif"] === undefined || question["nbPtsPositif"] === undefined || question["isMultiple"] === undefined || question["position"] === undefined || question["choix"] === undefined || question["randomOrder"] === undefined) - { - res.status(400).send({ error: MessageRoute.misPara }); - return - } - let minOneCorrectChoice: boolean = false; - let minOneFalseChoice: boolean = false; - - for (const choix of question["choix"]) { - if (choix["isCorrect"]) { - minOneCorrectChoice = true; - } - if (!choix["isCorrect"]) { - minOneFalseChoice = true; - } - } - if (!minOneCorrectChoice) - { - res.status(409).send({ error: 'Missing a correct choice' }); - return - } - if (!minOneFalseChoice) - { - res.status(409).send({ error: 'Missing a false choice' }); - return - } - const infoQcm = await db.qcmTable.findFirst({ - where: { - idQCM: idQcm, - } - }); - if(!infoQcm){ - res.status(404).send({ error: MessageRoute.qcmDoesntExist }); - return - } - checkUser(req, res, infoQcm.idUserCreator, MessageRoute.cantCreate); - const type = await db.type.findFirst({ - where: { - nomType: "text" - }, - }); - if(!type){ - res.status(500).send({ error: MessageRoute.serverError }); - return - } - const questionCreate = await db.question.create({ - data: { - nbPtsNegatif:question["nbPtsNegatif"], - nbPtsPositif: question["nbPtsPositif"], - position: question["position"], - isMultiple: question["isMultiple"], - question: question["question"], - idQCM: idQcm, - idType: type["idType"], - randomOrder: question["randomOrder"], - } - }); - console.log(questionCreate) - if(!questionCreate){ - res.status(500).send({ error: MessageRoute.serverError}); - return - } - const idQuestion = questionCreate["idQuestion"]; - for(let i = 0; i < question["choix"].length; i++){ - if(!question["choix"][i]["text"] || question["choix"][i]["isCorrect"] === undefined){ - res.status(500).send({ error: 'Server error' }); - return - } - const choixCreate = await db.choix.create({ - data: { - nomChoix: question["choix"][i]["text"], - isCorrect: question["choix"][i]["isCorrect"], - idQuestion: idQuestion, - position: i, - } - }); - if(!choixCreate){ - res.status(500).send({ error: MessageRoute.serverError }); - return - } - } - res.status(200).send({id: idQuestion}); -}); - -router.post('/true_false_question', verifyJWT, async (req: express.Request, res: express.Response) => { - try { - const { question, idQcm } = req.body; - console.table(req.body) - console.log(question, idQcm) - if (!idQcm || !question || !question["question"] || !question["nbPtsNegatif"] === undefined || !question["nbPtsPositif"] === undefined || question["isVraiFaux"] === undefined || question["valVraiFaux"] === undefined) { - res.status(400).send({ error: MessageRoute.misPara }); - return - } - - const infoQcm = await db.qcmTable.findFirst({ - where: { - idQCM: idQcm - } - }); - - if (!infoQcm) { - res.status(400).send({ error:MessageRoute.qcmDoesntExist}); - return - } - checkUser(req, res, infoQcm.idUserCreator, MessageRoute.cantCreate); - - const type = await db.type.findFirst({ - where: { - nomType: "vraiFaux" - } - }); - - if (!type) { - res.status(500).send({ error: 'Server Problem: Type not found' }); - return - } - - - const questionCreate = await db.question.create({ - data: { - nbPtsNegatif: question["nbPtsNegatif"], - nbPtsPositif: question["nbPtsPositif"], - position: 0, - isMultiple: false, - question: question["question"], - idQCM: idQcm, - idType: type["idType"], - randomOrder: question["randomOrder"], - } - }); - - - if (!questionCreate) { - res.status(500).send({ error: 'Server Problem: Question creation failed' }); - return - } - - const idQuestion = questionCreate.idQuestion; - - const choixData = [ - { nomChoix: "Vrai", isCorrect: question.valVraiFaux, idQuestion: idQuestion, position: 0 }, - { nomChoix: "Faux", isCorrect: !question.valVraiFaux, idQuestion: idQuestion, position: 1 } - ]; - - const choixCreate = await db.choix.createMany({ - data: choixData - }); - if(!choixCreate){ - res.status(500).send({ error: MessageRoute.serverError }); - return - } - - res.status(200).send({id: idQuestion}); - } catch (error) { - res.status(500).send({ error: MessageRoute.serverError }); - } -}); - -router.delete('/question/:QUESTION_ID', verifyJWT, async (req: express.Request, res: express.Response) => { - const QUESTION_ID: number = parseInt(req.params.QUESTION_ID, 10); - console.log(QUESTION_ID); - const questionExist = await db.question.findFirst({ - where: { - idQuestion: QUESTION_ID - }, - include: { - qcm: true - } - }); - - if (!questionExist) - { - res.status(404).send({ error: "This response doesn't exist and canno't be deleted" }); - return - } - checkUser(req, res, questionExist.qcm.idUserCreator, "You can't delete a question in this QCM."); - - try { - console.log(QUESTION_ID) - const reponse = await db.question.delete({ - where: { - idQuestion: QUESTION_ID - }, - }); - res.status(200).send(reponse); - } catch (error) { - console.error(error); - res.status(500).send({ error: 'Server error while answering to the question' }); - } -}); - -export default router; diff --git a/microservices/search_qcm/package.json b/microservices/search_qcm/package.json index 9c82424d..05f87944 100644 --- a/microservices/search_qcm/package.json +++ b/microservices/search_qcm/package.json @@ -26,7 +26,7 @@ }, "dependencies": { "@dotenvx/dotenvx": "^0.34.0", - "@prisma/client": "^6.3.1", + "@prisma/client": "^6.1.0", "axios": "^1.7.2", "bcryptjs": "^2.4.3", "body-parser": "^1.20.2", @@ -52,7 +52,7 @@ "node": "^20.12.2", "nodemon": "^3.1.0", "npm": "^10.5.2", - "prisma": "^6.3.1", + "prisma": "^6.1.0", "ts-node": "^10.9.2", "tsx": "^4.7.2", "typescript": "^5.4.5" diff --git a/microservices/search_qcm/src/express/Server.ts b/microservices/search_qcm/src/express/Server.ts index 4542e740..6a3fea76 100644 --- a/microservices/search_qcm/src/express/Server.ts +++ b/microservices/search_qcm/src/express/Server.ts @@ -8,7 +8,7 @@ import helmet from 'helmet'; import express from 'express'; import multer from 'multer'; import Config from '../config/Config'; -import questions_routes from '../routes/RoutesQuestions'; +import questions_routes from '../routes/SearchQcm'; import db from '../helpers/DatabaseHelper.js'; import bodyParser from 'body-parser'; @@ -31,10 +31,11 @@ export class Server { this.backend.use(helmet()); //Help to secure express, https://helmetjs.github.io/ this.backend.use(bodyParser.json()); this.backend.use(cors({ - origin: 'http://localhost:4200' + origin: '*' , + methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], + allowedHeaders: ['Authorization', 'Content-Type'] })); //Allow CORS requests - // Routes this.backend.use('/', questions_routes); this.backend.use(express.json()); diff --git a/microservices/search_qcm/src/routes/RoutesQuestions.ts b/microservices/search_qcm/src/routes/RoutesQuestions.ts deleted file mode 100644 index 476cb928..00000000 --- a/microservices/search_qcm/src/routes/RoutesQuestions.ts +++ /dev/null @@ -1,252 +0,0 @@ -import express from 'express'; - -import db from '../helpers/DatabaseHelper.js'; -import { verifyJWT } from '../Middlewares.js'; -import { checkUser } from "../calcFunctions.js" -import { MessageRoute } from './MessageRoute.js'; - - -const router: express.Router = express.Router(); - - - -router.post('/numeric_question', verifyJWT, async (req: express.Request, res: express.Response) => { - const { question, idQcm } = req.body; - console.log(question, idQcm); - if (!idQcm || !question || !question["question"] || question["nbPtsNegatif"] === undefined || question["nbPtsPositif"] === undefined || question["valNum"] === undefined || question["position"] === undefined) - { - res.status(400).send({ error: MessageRoute.misPara }); - return - } - const infoQcm = await db.qcmTable.findFirst({ - where: { - idQCM: idQcm - } - }); - if(!infoQcm) - { - res.status(404).send({ error: MessageRoute.qcmDoesntExist }); - return - } - checkUser(req, res, infoQcm.idUserCreator, MessageRoute.cantCreate); - const type = await db.type.findFirst({ - where: { - nomType: "numerique" - }, - }); - if(!type) - { - res.status(500).send({ error: 'Server error' }); - return - } - const qcmCreate = await db.question.create({ - data: { - nbPtsNegatif: question["nbPtsNegatif"], - nbPtsPositif: question["nbPtsPositif"], - position: question["position"], - isMultiple: false, - question: question["question"], - idQCM: idQcm, - idType: type["idType"], - numeric: question["valNum"], - randomOrder: false, - } - }); - res.status(200).send({id: qcmCreate.idQuestion}); -}); - -router.post('/text_question', verifyJWT, async (req: express.Request, res: express.Response) => { - const { question, idQcm } = req.body; - console.log(question, idQcm); - if (!idQcm || !question || !question["question"] || question["nbPtsNegatif"] === undefined || question["nbPtsPositif"] === undefined || question["isMultiple"] === undefined || question["position"] === undefined || question["choix"] === undefined || question["randomOrder"] === undefined) - { - res.status(400).send({ error: MessageRoute.misPara }); - return - } - let minOneCorrectChoice: boolean = false; - let minOneFalseChoice: boolean = false; - - for (const choix of question["choix"]) { - if (choix["isCorrect"]) { - minOneCorrectChoice = true; - } - if (!choix["isCorrect"]) { - minOneFalseChoice = true; - } - } - if (!minOneCorrectChoice) - { - res.status(409).send({ error: 'Missing a correct choice' }); - return - } - if (!minOneFalseChoice) - { - res.status(409).send({ error: 'Missing a false choice' }); - return - } - const infoQcm = await db.qcmTable.findFirst({ - where: { - idQCM: idQcm, - } - }); - if(!infoQcm){ - res.status(404).send({ error: MessageRoute.qcmDoesntExist }); - return - } - checkUser(req, res, infoQcm.idUserCreator, MessageRoute.cantCreate); - const type = await db.type.findFirst({ - where: { - nomType: "text" - }, - }); - if(!type){ - res.status(500).send({ error: MessageRoute.serverError }); - return - } - const questionCreate = await db.question.create({ - data: { - nbPtsNegatif:question["nbPtsNegatif"], - nbPtsPositif: question["nbPtsPositif"], - position: question["position"], - isMultiple: question["isMultiple"], - question: question["question"], - idQCM: idQcm, - idType: type["idType"], - randomOrder: question["randomOrder"], - } - }); - console.log(questionCreate) - if(!questionCreate){ - res.status(500).send({ error: MessageRoute.serverError}); - return - } - const idQuestion = questionCreate["idQuestion"]; - for(let i = 0; i < question["choix"].length; i++){ - if(!question["choix"][i]["text"] || question["choix"][i]["isCorrect"] === undefined){ - res.status(500).send({ error: 'Server error' }); - return - } - const choixCreate = await db.choix.create({ - data: { - nomChoix: question["choix"][i]["text"], - isCorrect: question["choix"][i]["isCorrect"], - idQuestion: idQuestion, - position: i, - } - }); - if(!choixCreate){ - res.status(500).send({ error: MessageRoute.serverError }); - return - } - } - res.status(200).send({id: idQuestion}); -}); - -router.post('/true_false_question', verifyJWT, async (req: express.Request, res: express.Response) => { - try { - const { question, idQcm } = req.body; - console.table(req.body) - console.log(question, idQcm) - if (!idQcm || !question || !question["question"] || !question["nbPtsNegatif"] === undefined || !question["nbPtsPositif"] === undefined || question["isVraiFaux"] === undefined || question["valVraiFaux"] === undefined) { - res.status(400).send({ error: MessageRoute.misPara }); - return - } - - const infoQcm = await db.qcmTable.findFirst({ - where: { - idQCM: idQcm - } - }); - - if (!infoQcm) { - res.status(400).send({ error:MessageRoute.qcmDoesntExist}); - return - } - checkUser(req, res, infoQcm.idUserCreator, MessageRoute.cantCreate); - - const type = await db.type.findFirst({ - where: { - nomType: "vraiFaux" - } - }); - - if (!type) { - res.status(500).send({ error: 'Server Problem: Type not found' }); - return - } - - - const questionCreate = await db.question.create({ - data: { - nbPtsNegatif: question["nbPtsNegatif"], - nbPtsPositif: question["nbPtsPositif"], - position: 0, - isMultiple: false, - question: question["question"], - idQCM: idQcm, - idType: type["idType"], - randomOrder: question["randomOrder"], - } - }); - - - if (!questionCreate) { - res.status(500).send({ error: 'Server Problem: Question creation failed' }); - return - } - - const idQuestion = questionCreate.idQuestion; - - const choixData = [ - { nomChoix: "Vrai", isCorrect: question.valVraiFaux, idQuestion: idQuestion, position: 0 }, - { nomChoix: "Faux", isCorrect: !question.valVraiFaux, idQuestion: idQuestion, position: 1 } - ]; - - const choixCreate = await db.choix.createMany({ - data: choixData - }); - if(!choixCreate){ - res.status(500).send({ error: MessageRoute.serverError }); - return - } - - res.status(200).send({id: idQuestion}); - } catch (error) { - res.status(500).send({ error: MessageRoute.serverError }); - } -}); - -router.delete('/question/:QUESTION_ID', verifyJWT, async (req: express.Request, res: express.Response) => { - const QUESTION_ID: number = parseInt(req.params.QUESTION_ID, 10); - console.log(QUESTION_ID); - const questionExist = await db.question.findFirst({ - where: { - idQuestion: QUESTION_ID - }, - include: { - qcm: true - } - }); - - if (!questionExist) - { - res.status(404).send({ error: "This response doesn't exist and canno't be deleted" }); - return - } - checkUser(req, res, questionExist.qcm.idUserCreator, "You can't delete a question in this QCM."); - - try { - console.log(QUESTION_ID) - const reponse = await db.question.delete({ - where: { - idQuestion: QUESTION_ID - }, - }); - res.status(200).send(reponse); - } catch (error) { - console.error(error); - res.status(500).send({ error: 'Server error while answering to the question' }); - } -}); - -export default router; diff --git a/microservices/creation_qcm/src/routes/RoutesQCMs.ts b/microservices/search_qcm/src/routes/SearchQcm.ts similarity index 61% rename from microservices/creation_qcm/src/routes/RoutesQCMs.ts rename to microservices/search_qcm/src/routes/SearchQcm.ts index d07bc40a..78aee761 100644 --- a/microservices/creation_qcm/src/routes/RoutesQCMs.ts +++ b/microservices/search_qcm/src/routes/SearchQcm.ts @@ -1,239 +1,22 @@ import express from 'express'; -import db from '../helpers/DatabaseHelper.js'; import reqGetDB from './reqGetDB.js'; -import { calcNbPtsTotalQCM, getRandomNumber, checkUser } from "../calcFunctions.js" +import db from '../helpers/DatabaseHelper.js'; import { verifyJWT } from '../Middlewares.js'; -import { randomInt } from 'crypto'; +import { checkUser } from "../calcFunctions.js" import { MessageRoute } from './MessageRoute.js'; +import { randomInt } from 'crypto'; +import { calcNbPtsTotalQCM } from "../calcFunctions.js" -const router: express.Router = express.Router(); -// router.use(verifyJWT) - -router.get('/realised_QCMs/:USER_ID',verifyJWT, async (req: express.Request, res: express.Response) => { - const USER_ID: number = parseInt(req.params.USER_ID, 10); - checkUser(req, res, USER_ID, "You can't acces this ressource."); - const qcms = await reqGetDB(() => getRealisedQCMs(USER_ID)); - res.send(qcms); -}); - -router.get('/created_QCMs/:USER_ID', verifyJWT, async (req: express.Request, res: express.Response) => { - const USER_ID: number = parseInt(req.params.USER_ID, 10); - checkUser(req, res, USER_ID, "You can't access this ressource."); - const qcms = await reqGetDB(() => getCreatedQCMs(USER_ID)); - res.send(qcms); -}); - -router.get('/examen_QCM/:QCM_ID', verifyJWT, async (req: express.Request, res: express.Response) => { - const QCM_ID: number = parseInt(req.params.QCM_ID, 10); - if (req.user) { - const { id } = req.user; - if (typeof id === 'number') { - try { - const qcm = await reqGetDB(() => getQCMExamen(QCM_ID, res)); - const qcmDetails = await db.participer.findUnique({ - where: { - idUser_idQCM: { - idUser:id, - idQCM: QCM_ID - } - }, - select: { - heureDebut: true - } - }); - - if (!qcmDetails) { - res.status(404).json({ error: 'QCM details not found' }); - } else { - res.json({ qcm: qcm, heureDebut: qcmDetails.heureDebut }); - } - } catch (error) { - console.error(error); - res.status(500).json({ error: 'Internal server error' }); - } - } - else { - res.status(400).json({ error: 'Invalid user ID' }); - } - } - else{ - res.status(401).send('Unauthorized'); - } -}); - -router.get('/infos_QCM/:QCM_ID', verifyJWT, async (req: express.Request, res: express.Response) => { - const QCM_ID: number = parseInt(req.params.QCM_ID, 10); - const results = await reqGetDB(() => getInfosQCM(QCM_ID)); - res.send(results); -}); - -router.get('/results/:QCM_ID', verifyJWT, async (req: express.Request, res: express.Response) => { - const QCM_ID: number = parseInt(req.params.QCM_ID, 10); - // Fetch QCM details - const qcm = await db.qcmTable.findUnique({ - where: { - idQCM: QCM_ID, - }, - include: { - participer: { - include: { - user: true, - }, - }, - questions:true - }, - }); +const router: express.Router = express.Router(); - let moy = 1; - let cmp = 0; - if(qcm?.participer){ - qcm.participer.forEach(part => cmp += part.note) - moy = cmp / qcm.participer.length; - } - const nbPoint: number = await calcNbPtsTotalQCM(QCM_ID); - res.send({ - qcm : qcm, - moyClasse : moy, - scoreMax : nbPoint, - }); -}); -router.post('/QCM', verifyJWT, async (req: express.Request, res: express.Response) => { - const { qcm, idUser } = req.body; - console.log(qcm, idUser, qcm["nomQcm"], qcm["randomQuestion"], qcm["tempsMax"]) - if (!qcm || !idUser || !qcm["nomQcm"] || qcm["randomQuestion"] === undefined || qcm["tempsMax"] === undefined) - { - res.status(400).send({ error: MessageRoute.misPara }); - return - } - const codeAcces: number = getRandomNumber(1000, 9999); - const qcmCreate = await db.qcmTable.create({ - data: { - nomQCM : qcm["nomQcm"], - codeAcces : codeAcces, - randomOrder : qcm["randomQuestion"], - temps : qcm["tempsMax"], - idUserCreator : idUser, - } - }); - res.status(200).send({id: qcmCreate.idQCM}); -}); -router.put('/QCM', verifyJWT, async (req: express.Request, res: express.Response) => { - const { qcm } = req.body; - console.table(qcm) - if (!qcm || !qcm["nomQcm"] || qcm["randomQuestion"] === undefined || qcm["tempsMax"] === undefined || qcm["idQcm"] === undefined) - { - res.status(400).send({ error: MessageRoute.misPara }); - return - } - const infoQcm = await db.qcmTable.findFirst({ - where: { - idQCM: qcm["idQcm"], - } - }); - - if(!infoQcm) - { - res.status(404).send({ error: MessageRoute.qcmDoesntExist }); - return - } - checkUser(req, res, infoQcm?.idUserCreator, "This is not your QCM"); - const qcmCreate = await db.qcmTable.update({ - where: { - idQCM: qcm["idQcm"] - }, - data: { - nomQCM : qcm["nomQcm"], - randomOrder : qcm["randomQuestion"], - temps : qcm["tempsMax"], - }, - }); - res.status(200).send(qcmCreate); -}); -router.put('/feedback', verifyJWT, async (req: express.Request, res: express.Response) => { - const { idQCM, idUser, note, feedback } = req.body; - console.log(idQCM, idUser, note, feedback) - if (!idQCM || note === undefined || feedback === undefined || idUser === undefined) - { - res.status(400).send({ error: MessageRoute.misPara }); - return - } - const infoQcm = await db.participer.findFirst({ - where: { - AND: { - idQCM: idQCM, - idUser: idUser, - } - }, - include: { - qcm: true - } - }); - if(!infoQcm) - { - res.status(404).send({ error: MessageRoute.qcmDoesntExist }); - return - } - checkUser(req, res, infoQcm.qcm.idUserCreator, "You can't access this ressource"); - const updateFeddback = await db.participer.update({ - where: { - idUser_idQCM: { - idQCM: idQCM, - idUser: idUser - } - - }, - data: { - feedback: feedback, - note: note, - }, - }); - if(!updateFeddback){ - res.status(500).send({ error: 'Error FeedBack' }); - return +function shuffleArray<T>(array: T[]): T[] { + for (let i = array.length - 1; i > 0; i--) { + const j = randomInt(0, i); + [array[i], array[j]] = [array[j], array[i]]; } - res.status(200).send(); -}); - -async function getRealisedQCMs(USER_ID: number) -{ - const participations = await db.participer.findMany({ - where: { - idUser: USER_ID, - hasFinished: true, - }, - select: { - idQCM: true, - feedback: true, - note: true, - score: true, - qcm: { - select: { - nomQCM: true, - idQCM: true, - questions: { - select: { - idQuestion: true, - } - }, - - }, - }, - - }, - }); - - const participationsWithScoreMax = await Promise.all(participations.map(async participation => { - const scoreMax = await calcNbPtsTotalQCM(participation.qcm.idQCM); - console.log(scoreMax) - return { - ...participation, - scoreMax, - }; - })); - console.table(participationsWithScoreMax) - return participationsWithScoreMax; + return array; } async function getCreatedQCMs(USER_ID: number) @@ -264,14 +47,6 @@ async function getCreatedQCMs(USER_ID: number) ); } -function shuffleArray<T>(array: T[]): T[] { - for (let i = array.length - 1; i > 0; i--) { - const j = randomInt(0, i); - [array[i], array[j]] = [array[j], array[i]]; - } - return array; -} - async function getQCMExamen(QCM_ID: number, res: express.Response) { const qcmDetails = await db.qcmTable.findUnique({ where: { idQCM: QCM_ID }, @@ -341,4 +116,103 @@ async function getInfosQCM(idQCM: number) return infosQCM; } +async function getRealisedQCMs(USER_ID: number) +{ + const participations = await db.participer.findMany({ + where: { + idUser: USER_ID, + hasFinished: true, + }, + select: { + idQCM: true, + feedback: true, + note: true, + score: true, + qcm: { + select: { + nomQCM: true, + idQCM: true, + questions: { + select: { + idQuestion: true, + } + }, + + }, + }, + + }, + }); + + const participationsWithScoreMax = await Promise.all(participations.map(async participation => { + const scoreMax = await calcNbPtsTotalQCM(participation.qcm.idQCM); + console.log(scoreMax) + return { + ...participation, + scoreMax, + }; + })); + console.table(participationsWithScoreMax) + return participationsWithScoreMax; +} + + +router.get('/realised_QCMs/:USER_ID',verifyJWT, async (req: express.Request, res: express.Response) => { + const USER_ID: number = parseInt(req.params.USER_ID, 10); + checkUser(req, res, USER_ID, "You can't acces this ressource."); + const qcms = await reqGetDB(() => getRealisedQCMs(USER_ID)); + res.send(qcms); +}); + +router.get('/created_QCMs/:USER_ID', verifyJWT, async (req: express.Request, res: express.Response) => { + const USER_ID: number = parseInt(req.params.USER_ID, 10); + checkUser(req, res, USER_ID, "You can't access this ressource."); + const qcms = await reqGetDB(() => getCreatedQCMs(USER_ID)); + res.send(qcms); +}); + +router.get('/examen_QCM/:QCM_ID', verifyJWT, async (req: express.Request, res: express.Response) => { + const QCM_ID: number = parseInt(req.params.QCM_ID, 10); + if (req.user) { + const { id } = req.user; + if (typeof id === 'number') { + try { + const qcm = await reqGetDB(() => getQCMExamen(QCM_ID, res)); + const qcmDetails = await db.participer.findUnique({ + where: { + idUser_idQCM: { + idUser:id, + idQCM: QCM_ID + } + }, + select: { + heureDebut: true + } + }); + + if (!qcmDetails) { + res.status(404).json({ error: 'QCM details not found' }); + } else { + res.json({ qcm: qcm, heureDebut: qcmDetails.heureDebut }); + } + } catch (error) { + console.error(error); + res.status(500).json({ error: 'Internal server error' }); + } + } + else { + res.status(400).json({ error: 'Invalid user ID' }); + } + } + else{ + res.status(401).send('Unauthorized'); + } +}); + +router.get('/infos_QCM/:QCM_ID', verifyJWT, async (req: express.Request, res: express.Response) => { + const QCM_ID: number = parseInt(req.params.QCM_ID, 10); + const results = await reqGetDB(() => getInfosQCM(QCM_ID)); + res.send(results); +}); + export default router; -- GitLab