diff --git a/microservices/auth/src/express/Server.ts b/microservices/auth/src/express/Server.ts index 4542e7409ad5dcc7f075cf24f4eb503bf0812632..d59d2a2bf154ca81f3daaa9754f99be6b9ed3ebe 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 0000000000000000000000000000000000000000..13490f754af31bcd382aed85e244114f34d47c84 --- /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 476cb9284b0f06ecb8db0ab4fdf7cdaa49938813..0000000000000000000000000000000000000000 --- 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 a80ad4c8ca06e85947353ffdb002577e35653749..a8f8cf667fedcb72892367499adbf9cce07c9478 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 0000000000000000000000000000000000000000..9a356ada83e86f76d94e10f666ef56213794f15d --- /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 0a1daaeb072b348bd474340cfd6e56673f9e68b7..0000000000000000000000000000000000000000 --- 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 5c2e09e60164d80cea37257c0b02a8c81c98bd1d..24e6bee25bc6533c3a4c23e94c806e64f139a68f 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 0000000000000000000000000000000000000000..708fd5df92a4813e72a404ec984420de66114d3c --- /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 944cfe12d588667dbe8f24b995b5523ecc05a4b2..729e26dcae118984a3be17116e9919fb03e48506 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 dbfbd2792e84bb2f7af9a7d4dc3b0f8e6c5e8938..abda115dfbe6082b360eb56c8f94909f0eecb110 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 f27ae780ba8fea91b6bd1473d58c7ac1fbbb3de1..0000000000000000000000000000000000000000 --- 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 c8e9234968f707a287ddb1658965cffa8b81f144..0000000000000000000000000000000000000000 --- 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 d82f96d9b44d7b6a4576a7c89b24049db7dad88d..0000000000000000000000000000000000000000 --- 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/microservices/navigation_qcm/.idea/.gitignore b/microservices/navigation_qcm/.idea/.gitignore deleted file mode 100644 index 7abb13d05034648aabf6dbf7ba699f481c86bf8c..0000000000000000000000000000000000000000 --- 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 10d6d0fe30b7ff46bd1f7ce3aff7e695b5e4846b..0000000000000000000000000000000000000000 --- 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 6b0a72fe93ea4f9981812ddf87b4c04513942c9a..0000000000000000000000000000000000000000 --- 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 79ee123c2b23e069e35ed634d687e17f731cc702..0000000000000000000000000000000000000000 --- 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 76d62f6c356f30d0a4ddd22a865255f7f3ffd6e5..0000000000000000000000000000000000000000 --- 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 7d357782bc1f888b0a3fb6c1ee0ba478938f2f72..0000000000000000000000000000000000000000 --- 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 084d7bb22b4219909ca4c93a28afb462e895deaf..0000000000000000000000000000000000000000 --- 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 6c0b8635858dc7ad44b93df54b762707ce49eefc..0000000000000000000000000000000000000000 --- 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/microservices/navigation_qcm/dockerfile b/microservices/navigation_qcm/dockerfile deleted file mode 100644 index 548d915111f6770e9b7065ddd55035d4c6c97bd2..0000000000000000000000000000000000000000 --- 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 da0ba537dd94fa7a8041b15ec2e009d9cab8af11..0000000000000000000000000000000000000000 --- 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 c07d9105a2bf63ef7e3700920c8d09c73d2ef0f8..0000000000000000000000000000000000000000 --- 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 82d3279161a0f1f53756948f99dc73d6ae4da5bc..0000000000000000000000000000000000000000 --- 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 53a72526f6baf8fd72b444d236fa7227fd80c63f..0000000000000000000000000000000000000000 --- 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 Binary files a/microservices/navigation_qcm/prisma/database.db and /dev/null differ 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 af5102c8ba20cc6051c01d3ca06b2e7f8d7e14d9..0000000000000000000000000000000000000000 --- 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 d8030354425fc9fc27d096fb567bcf6de66a85a2..0000000000000000000000000000000000000000 --- 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 b6a8b802e05baff59c9845d34305d7782806b55e..0000000000000000000000000000000000000000 --- 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 60c86e8c93bf3e342bed7b5cc39c4a7e653d4b67..0000000000000000000000000000000000000000 --- 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 2eb101b85823f301ea420072cfb0e4bdeae54b4d..0000000000000000000000000000000000000000 --- 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 cd6e8980aed9710df93d3c881ea7ee0e687034ec..0000000000000000000000000000000000000000 --- 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 ac44a9b444eac993806e94a4d9857f907108d419..0000000000000000000000000000000000000000 --- 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 aa822b847d196e0ae648747c4467cb178a7b66ed..0000000000000000000000000000000000000000 --- 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 dfcc3f5411436d2f59e98a1642390bc2d091f8dc..0000000000000000000000000000000000000000 --- 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 3419aa373f73c34a0ae0436d3fcbb56cd522840c..0000000000000000000000000000000000000000 --- 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 af5102c8ba20cc6051c01d3ca06b2e7f8d7e14d9..0000000000000000000000000000000000000000 --- 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 fa2acb9a6d9b15515be9fbda10eef0f74d217884..0000000000000000000000000000000000000000 --- 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 5e75a88d2d19a89b61a23bf1d15522f8157c83f8..0000000000000000000000000000000000000000 --- 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 192dde7424ce7e356bf0f97cc7a7d6ce1bdcc32b..0000000000000000000000000000000000000000 --- 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 db70c6b03e8f19f850bb3adfa4ec4cd8e659f5fd..0000000000000000000000000000000000000000 --- 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 af5102c8ba20cc6051c01d3ca06b2e7f8d7e14d9..0000000000000000000000000000000000000000 --- 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 f0ced18d1814307ba106a14d93c665c214a38188..0000000000000000000000000000000000000000 --- 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 af5102c8ba20cc6051c01d3ca06b2e7f8d7e14d9..0000000000000000000000000000000000000000 --- 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 1ed20e0ed62fa1741a19c806a5200a85d2a31155..0000000000000000000000000000000000000000 --- 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 af5102c8ba20cc6051c01d3ca06b2e7f8d7e14d9..0000000000000000000000000000000000000000 --- 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 1e72d45c59d5f3f7861d60a7687b13854297f001..0000000000000000000000000000000000000000 --- 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 af5102c8ba20cc6051c01d3ca06b2e7f8d7e14d9..0000000000000000000000000000000000000000 --- 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 83a47a170d186acdff08f8a62732daca9101b38c..0000000000000000000000000000000000000000 --- 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 9be8341dc8496f232a0d47197d53a2e9cee9a1ba..0000000000000000000000000000000000000000 --- 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 a1699f146a0ab8677b7898217e393da9462b81f5..0000000000000000000000000000000000000000 --- 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 af5102c8ba20cc6051c01d3ca06b2e7f8d7e14d9..0000000000000000000000000000000000000000 --- 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 af5102c8ba20cc6051c01d3ca06b2e7f8d7e14d9..0000000000000000000000000000000000000000 --- 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 4e5fbeeaabab3ab0b1062ed02df8884c4893fe69..0000000000000000000000000000000000000000 --- 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 af5102c8ba20cc6051c01d3ca06b2e7f8d7e14d9..0000000000000000000000000000000000000000 --- 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 e0ece44a633f8583f16222900e00656f9dbe4dcc..0000000000000000000000000000000000000000 --- 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 af5102c8ba20cc6051c01d3ca06b2e7f8d7e14d9..0000000000000000000000000000000000000000 --- 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 d0391af090793df9c3cef54babd70e35e0c9ce6c..0000000000000000000000000000000000000000 --- 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 e5e5c4705ab084270b7de6f45d5291ba01666948..0000000000000000000000000000000000000000 --- 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 61e3d4e68ce364138ff820f8a3b0080aace2ca24..0000000000000000000000000000000000000000 --- 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 7d08e7c3f6cb9eec34f9e9fdc890aec227f46d8d..0000000000000000000000000000000000000000 --- 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 879e278a8fec87ffe9431f98c17597e598c07664..0000000000000000000000000000000000000000 --- 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 0cfc19e9064b697069d545d48fda044c419861ab..0000000000000000000000000000000000000000 --- 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 a8277f66a12c3266d51df180cb6755aff393790b..0000000000000000000000000000000000000000 --- 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 40dfd9fd149b9c3a0988306938337cf9e0b1b8a8..0000000000000000000000000000000000000000 --- 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 04365f5c4864fcf6ed89f8a9f43ddf0420e2b892..0000000000000000000000000000000000000000 --- 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 d3be6842280d94277d97bf665f951336c6d13c9f..0000000000000000000000000000000000000000 --- 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 9030416de6eee704e4b54dd50e8f8286674e896f..0000000000000000000000000000000000000000 --- 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 6f6a2b1a8880e01d5de0fa8828efb144ecbb57fb..0000000000000000000000000000000000000000 --- 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 fe0dde4a7a3b657d5f497981726565b98475b2be..0000000000000000000000000000000000000000 --- 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 e3f50eac24d094c6d7aed3953beb80498cfccb06..0000000000000000000000000000000000000000 --- 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 9c35f9a92f4adb15e2ad1df2eede376d88dc821d..0000000000000000000000000000000000000000 --- 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 8a76529e979aced816a8047a002c6057638259f7..0000000000000000000000000000000000000000 --- 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 b202cac810fda04df4b7500b048812468fb0e615..0000000000000000000000000000000000000000 --- 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 0af92795eaf1680fb308c0b50a651e88b4741fe0..0000000000000000000000000000000000000000 --- 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 0000000000000000000000000000000000000000..cd00289265d3e8579f5b0684c25f79056839ec9c --- /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 4542e7409ad5dcc7f075cf24f4eb503bf0812632..e178be3c2a9e0742cddc89891ea0beb05e7555bc 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 0000000000000000000000000000000000000000..a39a071d6fa6d389b46b62eb66934243d1dd7870 --- /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 476cb9284b0f06ecb8db0ab4fdf7cdaa49938813..0000000000000000000000000000000000000000 --- 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 9c82424de1aef7902bb536ff6ce6a6b56f92fa61..05f87944277038ac4f227b28d61159d82baaaf54 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 4542e7409ad5dcc7f075cf24f4eb503bf0812632..6a3fea76cd7b0e93fe17ca20cb9f2e1a093c0618 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 476cb9284b0f06ecb8db0ab4fdf7cdaa49938813..0000000000000000000000000000000000000000 --- 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 d07bc40a63ede39e6e127c48d0274d6e329efe20..78aee7611d170c877811a75329243e61a704566d 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;