From ec5a938d947090d99fae06b16231dbf5e557b318 Mon Sep 17 00:00:00 2001 From: raimanta215 Date: Mon, 3 Mar 2025 18:35:26 +0100 Subject: [PATCH 01/22] =?UTF-8?q?Code=20pour=20contr=C3=B4ler=20les=20mote?= =?UTF-8?q?urs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Code qui défini les pins de chaque moteur pour les directions de chaque moteur (avant et arrière) , et pour les entrée PWM qui permettent de varier la puissance --- MicroPython/moteur.py | 116 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 MicroPython/moteur.py diff --git a/MicroPython/moteur.py b/MicroPython/moteur.py new file mode 100644 index 0000000000..c1eed99b24 --- /dev/null +++ b/MicroPython/moteur.py @@ -0,0 +1,116 @@ +from machine import Pin, PWM +import time + +# Définition des broches pour les moteurs +PWM_LEFT = 18 # Broche PWM pour le moteur gauche +DIR_LEFT = 19 # Direction pour le moteur gauche + +PWM_RIGHT = 20 # Broche PWM pour le moteur droit +DIR_RIGHT = 21 # Direction pour le moteur droit + +# Configuration des broches +pwm_left = PWM(Pin(PWM_LEFT)) +pwm_right = PWM(Pin(PWM_RIGHT)) + +pwm_left.freq(1000) # 1 kHz +pwm_right.freq(1000) # Même fréquence pour éviter les conflits + +dir_left = Pin(DIR_LEFT, Pin.OUT) +dir_right = Pin(DIR_RIGHT, Pin.OUT) + +from machine import Pin, PWM +import time + +# Configuration des broches pour les moteurs +PWM_A = PWM(Pin(18)) # Contrôle de vitesse moteur A +DIR_A = Pin(19, Pin.OUT) # Direction moteur A + +PWM_B = PWM(Pin(20)) # Contrôle de vitesse moteur B +DIR_B = Pin(21, Pin.OUT) # Direction moteur B + +# Définition de la fréquence PWM (1 kHz) +PWM_A.freq(1000) +PWM_B.freq(1000) + +def set_motor(motor, speed, direction): + """ + Contrôle un moteur donné. + - motor: 'A' ou 'B' + - speed: 0 à 100 (vitesse en %) + - direction: 1 = avant, 0 = arrière + """ + duty = int(speed * 65535 / 100) # Conversion en 16 bits (0-65535) + + if motor == 'A': + PWM_A.duty_u16(duty) + DIR_A.value(direction) + elif motor == 'B': + PWM_B.duty_u16(duty) + DIR_B.value(direction) + +def avancer(): + """ Fait avancer le robot en mettant les deux moteurs en marche avant. """ + set_motor('A', 70, 1) + set_motor('B', 70, 1) + +def reculer(): + """ Fait reculer le robot en mettant les deux moteurs en marche arrière. """ + set_motor('A', 70, 0) + set_motor('B', 70, 0) + +def tourner_gauche(): + """ Fait tourner le robot à gauche (moteur droit actif). """ + set_motor('A', 0, 1) + set_motor('B', 70, 1) + +def tourner_droite(): + """ Fait tourner le robot à droite (moteur gauche actif). """ + set_motor('A', 70, 1) + set_motor('B', 0, 1) + +def stop(): + """ Arrête les deux moteurs. """ + set_motor('A', 0, 0) + set_motor('B', 0, 0) + + +# Test des moteurs +avancer() +time.sleep(3) +stop() + +def set_motor(pwm, direction, direction_state, speed): + """ Active un moteur avec une direction et une vitesse donnée. """ + direction.value(direction_state) + duty_cycle = int(speed * 65535 / 100) # Conversion pour PWM 16 bits + pwm.duty_u16(duty_cycle) + +def avancer(): + """ Fait avancer les deux moteurs en même temps. """ + set_motor(pwm_left, dir_left, True, 50) + set_motor(pwm_right, dir_right, True, 50) + +def reculer(): + """ Fait reculer les deux moteurs en même temps. """ + set_motor(pwm_left, dir_left, False, 50) + set_motor(pwm_right, dir_right, False, 50) + +def tourner_droite(): + """ Tourne à droite (un moteur en avant, l'autre en arrière). """ + set_motor(pwm_left, dir_left, True, 50) + set_motor(pwm_right, dir_right, False, 50) + +def tourner_gauche(): + """ Tourne à gauche (un moteur en arrière, l'autre en avant). """ + set_motor(pwm_left, dir_left, False, 50) + set_motor(pwm_right, dir_right, True, 50) + +def stop(): + """ Arrête les moteurs. """ + pwm_left.duty_u16(0) + pwm_right.duty_u16(0) + +# Test : avancer pendant 3 secondes puis s'arrêter + + +stop() From 8dd229a3ba60e60c7579e6e12b83e94e629d6e36 Mon Sep 17 00:00:00 2001 From: Marry3005 Date: Thu, 13 Mar 2025 11:00:57 +0100 Subject: [PATCH 02/22] Add files via upload --- code_bouton.txt | 88 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 code_bouton.txt diff --git a/code_bouton.txt b/code_bouton.txt new file mode 100644 index 0000000000..d38b0b2f3d --- /dev/null +++ b/code_bouton.txt @@ -0,0 +1,88 @@ +import { useState } from "react"; + +export default function InspectionModes() { + const [mode, setMode] = useState("home"); // État pour stocker la page actuelle + + // Composants des différentes pages + const HomePage = () => ( +
+

+ Choisissez un mode d'inspection +

+
+ + + +
+
+ ); + + const AutonomiePage = () => ( +
+

Mode Autonomie

+

Le mode autonomie permet au robot de fonctionner sans intervention.

+ +
+ ); + + const ItinerairePage = () => ( +
+

+ Mode Suivi d'itinéraire +

+

+ Le mode suivi d'itinéraire permet au robot de suivre un trajet défini. +

+ +
+ ); + + const ControlePage = () => ( +
+

Mode Contrôle

+

+ Le mode contrôle permet une intervention humaine pour guider le robot. +

+ +
+ ); + + return ( +
+ {mode === "home" && } + {mode === "autonomie" && } + {mode === "itineraire" && } + {mode === "controle" && } +
+ ); +} From 214be3f2f462b3b227f6b20ff22687cb3a9276a7 Mon Sep 17 00:00:00 2001 From: Marry3005 Date: Wed, 19 Mar 2025 15:07:50 +0100 Subject: [PATCH 03/22] Update and rename code_bouton.txt to code_bouton.js --- code_bouton.txt => code_bouton.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename code_bouton.txt => code_bouton.js (100%) diff --git a/code_bouton.txt b/code_bouton.js similarity index 100% rename from code_bouton.txt rename to code_bouton.js From fea0a06b685266bf4bb0d04ab0fb89b7d73c3b62 Mon Sep 17 00:00:00 2001 From: raimanta215 Date: Tue, 25 Mar 2025 16:30:02 +0100 Subject: [PATCH 04/22] copie de la base de main pour travailler sur dev voir modele workflow --- .gitignore | 3 + api_backend/server.js | 29 + commandes_node | 24 + config/db.js | 14 + package-lock.json | 1425 +++++++++++++++++++++++++++++++++++++++++ package.json | 27 + 6 files changed, 1522 insertions(+) create mode 100644 .gitignore create mode 100644 api_backend/server.js create mode 100644 commandes_node create mode 100644 config/db.js create mode 100644 package-lock.json create mode 100644 package.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..be0e66756e --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.qodo +/node_modules +/config/.env \ No newline at end of file diff --git a/api_backend/server.js b/api_backend/server.js new file mode 100644 index 0000000000..c57c1095da --- /dev/null +++ b/api_backend/server.js @@ -0,0 +1,29 @@ +import express from "express" //version js const express = require('express'); +import dotenv from "dotenv"; +import { connectDB } from "../config/db.js"; + +import routesLocal from "../routes/routes.local.js"; + +dotenv.config(); +// get pour récupérer des infos +//post pour créer des nouvelles data +//put ou patch pour mettre à jour +//delete pour supprimer +const app = express(); + +app.use(express.json()); //permet d'accepeter du JSOn dans le req.body + +app.use("/api/locals", routesLocal); //origine des routes pour les locaux + +app.get("/", (req, res) => { + res.send("Server is ready"); + +}); + +console.log(process.env.MONGO_URI); + +app.listen(process.env.PORT, () => { + connectDB(); + console.log("serveur lancé sur http://localhost:5000 "); + +}); \ No newline at end of file diff --git a/commandes_node b/commandes_node new file mode 100644 index 0000000000..694750d8e3 --- /dev/null +++ b/commandes_node @@ -0,0 +1,24 @@ +npm init -y +npm install express mongoose dotenv nodemon + { + "type": "module", + + } + { "scripts": + "start": "nodemon ./api_backend/server.js"} + +nodemon start //redemarre automatiquement apres chaque mise à jour + + +```test requette API pour créer un local +{ + "nom": "local 203", + "tempMoy": "24", + "carte": "exemple.com/image" +}``` + +''' pour la mise à jour juste le champ modifié +{ + "nom": "local 203 up" +} +''' \ No newline at end of file diff --git a/config/db.js b/config/db.js new file mode 100644 index 0000000000..01cfda7490 --- /dev/null +++ b/config/db.js @@ -0,0 +1,14 @@ +import mongoose from "mongoose"; + + +export const connectDB = async () => { + try { + const conn = await mongoose.connect(process.env.MONGO_URI); // se connecte à la DB en asynchrone + console.log(`MongoDB connected: ${conn.connection.host}`); + } catch (error){ + console.error(`Error: ${error.message}`); + process.exit(1); // 1 c'est pour dire que y a eu erreur et 0 succès + } +} + +//NoSQL enrgistre dans des collections avec des documents \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..34720c3dca --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1425 @@ +{ + "name": "rdi25", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "rdi25", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "dotenv": "^16.4.7", + "express": "^4.21.2", + "mongoose": "^8.12.1", + "nodemon": "^3.1.9" + } + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.2.0.tgz", + "integrity": "sha512-+ywrb0AqkfaYuhHs6LxKWgqbh3I72EpEgESCw37o+9qPx9WTCkgDm2B+eMrwehGtHBWHFU4GXvnSCNiFhhausg==", + "license": "MIT", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", + "license": "MIT" + }, + "node_modules/@types/whatwg-url": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", + "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", + "license": "MIT", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "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": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bson": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.3.tgz", + "integrity": "sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.20.1" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "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/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.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==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "license": "BSD-2-Clause", + "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==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "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/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "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==", + "license": "MIT", + "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/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "hasInstallScript": true, + "license": "MIT", + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "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==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "ISC", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT", + "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/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/kareem": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", + "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mongodb": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.14.2.tgz", + "integrity": "sha512-kMEHNo0F3P6QKDq17zcDuPeaywK/YaJVCEQRzPF3TOM/Bl9MFg64YE5Tu7ifj37qZJMhwU1tl2Ioivws5gRG5Q==", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.9", + "bson": "^6.10.3", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz", + "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==", + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^14.1.0 || ^13.0.0" + } + }, + "node_modules/mongoose": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.12.1.tgz", + "integrity": "sha512-UW22y8QFVYmrb36hm8cGncfn4ARc/XsYWQwRTaj0gxtQk1rDuhzDO1eBantS+hTTatfAIS96LlRCJrcNHvW5+Q==", + "license": "MIT", + "dependencies": { + "bson": "^6.10.3", + "kareem": "2.6.3", + "mongodb": "~6.14.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "17.1.3" + }, + "engines": { + "node": ">=16.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/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==", + "license": "MIT" + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "license": "MIT", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mquery/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==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nodemon": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.9.tgz", + "integrity": "sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==", + "license": "MIT", + "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/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/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==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "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==", + "license": "BSD-3-Clause", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.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" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "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==", + "license": "ISC" + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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/sift": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", + "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "license": "MIT", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.1.tgz", + "integrity": "sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==", + "license": "MIT", + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000000..21d705e54c --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "rdi25", + "version": "1.0.0", + "description": "Template de repo pour le projet Dev Web 2024-2025", + "main": "index.js", + "scripts": { + "start": "nodemon api_backend/server.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/loyde07/RDI25.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "module", + "bugs": { + "url": "https://github.com/loyde07/RDI25/issues" + }, + "homepage": "https://github.com/loyde07/RDI25#readme", + "dependencies": { + "dotenv": "^16.4.7", + "express": "^4.21.2", + "mongoose": "^8.12.1", + "nodemon": "^3.1.9" + } +} From 9dc314f768444b9a1dba3356c333aeb155ed5710 Mon Sep 17 00:00:00 2001 From: raimanta215 Date: Tue, 25 Mar 2025 20:52:01 +0100 Subject: [PATCH 05/22] frontend et api communiquant ensemble MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit le frontend avec react qui appelle une premiere page Home ou un bouton mene à une deuxieme page image. Le fichier bck.app.jsx est l'exemple donné par Vite (outils pour dev rapide qu'il faut installer aussi du coup ) . Les routes entre les differentes pages est traité dans App.jsx et main.jsx permet d'insérer dans le html d'origine les changments. dans commandes_node y a des dependenaces à installer . Pour lancer tout le site il faut dans un terminal npm start pour le back et dans un autre terminal npm run dev pour le front . attention à CORS sinon ca recupère pas les data --- api_backend/server.js | 3 + commandes_node | 17 +- package-lock.json | 1093 +++++++++- package.json | 5 +- web_frontend/.gitignore | 24 + web_frontend/README.md | 12 + web_frontend/eslint.config.js | 33 + web_frontend/index.html | 13 + web_frontend/package-lock.json | 3087 +++++++++++++++++++++++++++++ web_frontend/package.json | 29 + web_frontend/public/vite.svg | 1 + web_frontend/src/App.css | 42 + web_frontend/src/App.jsx | 18 + web_frontend/src/assets/react.svg | 1 + web_frontend/src/bck.App.jsx | 35 + web_frontend/src/index.css | 68 + web_frontend/src/main.jsx | 10 + web_frontend/src/pages/home.jsx | 51 + web_frontend/src/pages/image.jsx | 22 + web_frontend/vite.config.js | 7 + 20 files changed, 4568 insertions(+), 3 deletions(-) create mode 100644 web_frontend/.gitignore create mode 100644 web_frontend/README.md create mode 100644 web_frontend/eslint.config.js create mode 100644 web_frontend/index.html create mode 100644 web_frontend/package-lock.json create mode 100644 web_frontend/package.json create mode 100644 web_frontend/public/vite.svg create mode 100644 web_frontend/src/App.css create mode 100644 web_frontend/src/App.jsx create mode 100644 web_frontend/src/assets/react.svg create mode 100644 web_frontend/src/bck.App.jsx create mode 100644 web_frontend/src/index.css create mode 100644 web_frontend/src/main.jsx create mode 100644 web_frontend/src/pages/home.jsx create mode 100644 web_frontend/src/pages/image.jsx create mode 100644 web_frontend/vite.config.js diff --git a/api_backend/server.js b/api_backend/server.js index c57c1095da..664fdca139 100644 --- a/api_backend/server.js +++ b/api_backend/server.js @@ -3,6 +3,7 @@ import dotenv from "dotenv"; import { connectDB } from "../config/db.js"; import routesLocal from "../routes/routes.local.js"; +import cors from 'cors' dotenv.config(); // get pour récupérer des infos @@ -11,6 +12,8 @@ dotenv.config(); //delete pour supprimer const app = express(); +app.use(cors({origin: 'http://localhost:5173'})); + app.use(express.json()); //permet d'accepeter du JSOn dans le req.body app.use("/api/locals", routesLocal); //origine des routes pour les locaux diff --git a/commandes_node b/commandes_node index 694750d8e3..4e47f5fb65 100644 --- a/commandes_node +++ b/commandes_node @@ -1,3 +1,5 @@ +API + npm init -y npm install express mongoose dotenv nodemon { @@ -21,4 +23,17 @@ nodemon start //redemarre automatiquement apres chaque mise à jour { "nom": "local 203 up" } -''' \ No newline at end of file +''' + + + WEB + +npm create vite@latest ./web_backend //attention commandes differentes en fct de si on travaille dans le back ou front + +npm i + +npm i react-router-dom + +npm i cors + +npm i axios \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 34720c3dca..48ea577c93 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,10 +9,413 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "cors": "^2.8.5", "dotenv": "^16.4.7", "express": "^4.21.2", + "framer-motion": "^6.5.1", "mongoose": "^8.12.1", - "nodemon": "^3.1.9" + "nodemon": "^3.1.9", + "vite": "^6.2.3" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", + "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", + "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", + "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", + "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", + "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", + "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", + "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", + "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", + "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", + "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", + "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", + "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", + "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", + "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", + "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", + "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", + "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", + "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", + "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", + "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", + "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", + "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", + "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", + "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", + "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, "node_modules/@mongodb-js/saslprep": { @@ -24,6 +427,336 @@ "sparse-bitfield": "^3.0.3" } }, + "node_modules/@motionone/animation": { + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.18.0.tgz", + "integrity": "sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==", + "license": "MIT", + "dependencies": { + "@motionone/easing": "^10.18.0", + "@motionone/types": "^10.17.1", + "@motionone/utils": "^10.18.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/dom": { + "version": "10.12.0", + "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.12.0.tgz", + "integrity": "sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw==", + "license": "MIT", + "dependencies": { + "@motionone/animation": "^10.12.0", + "@motionone/generators": "^10.12.0", + "@motionone/types": "^10.12.0", + "@motionone/utils": "^10.12.0", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/easing": { + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.18.0.tgz", + "integrity": "sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==", + "license": "MIT", + "dependencies": { + "@motionone/utils": "^10.18.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/generators": { + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.18.0.tgz", + "integrity": "sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==", + "license": "MIT", + "dependencies": { + "@motionone/types": "^10.17.1", + "@motionone/utils": "^10.18.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/types": { + "version": "10.17.1", + "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.17.1.tgz", + "integrity": "sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==", + "license": "MIT" + }, + "node_modules/@motionone/utils": { + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.18.0.tgz", + "integrity": "sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==", + "license": "MIT", + "dependencies": { + "@motionone/types": "^10.17.1", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.37.0.tgz", + "integrity": "sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.37.0.tgz", + "integrity": "sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.37.0.tgz", + "integrity": "sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.37.0.tgz", + "integrity": "sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.37.0.tgz", + "integrity": "sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.37.0.tgz", + "integrity": "sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.37.0.tgz", + "integrity": "sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.37.0.tgz", + "integrity": "sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.37.0.tgz", + "integrity": "sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.37.0.tgz", + "integrity": "sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.37.0.tgz", + "integrity": "sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.37.0.tgz", + "integrity": "sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.37.0.tgz", + "integrity": "sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.37.0.tgz", + "integrity": "sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.37.0.tgz", + "integrity": "sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.37.0.tgz", + "integrity": "sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.37.0.tgz", + "integrity": "sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.37.0.tgz", + "integrity": "sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.37.0.tgz", + "integrity": "sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.37.0.tgz", + "integrity": "sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "license": "MIT" + }, "node_modules/@types/webidl-conversions": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", @@ -248,6 +981,19 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "license": "MIT" }, + "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==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -347,6 +1093,46 @@ "node": ">= 0.4" } }, + "node_modules/esbuild": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", + "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.1", + "@esbuild/android-arm": "0.25.1", + "@esbuild/android-arm64": "0.25.1", + "@esbuild/android-x64": "0.25.1", + "@esbuild/darwin-arm64": "0.25.1", + "@esbuild/darwin-x64": "0.25.1", + "@esbuild/freebsd-arm64": "0.25.1", + "@esbuild/freebsd-x64": "0.25.1", + "@esbuild/linux-arm": "0.25.1", + "@esbuild/linux-arm64": "0.25.1", + "@esbuild/linux-ia32": "0.25.1", + "@esbuild/linux-loong64": "0.25.1", + "@esbuild/linux-mips64el": "0.25.1", + "@esbuild/linux-ppc64": "0.25.1", + "@esbuild/linux-riscv64": "0.25.1", + "@esbuild/linux-s390x": "0.25.1", + "@esbuild/linux-x64": "0.25.1", + "@esbuild/netbsd-arm64": "0.25.1", + "@esbuild/netbsd-x64": "0.25.1", + "@esbuild/openbsd-arm64": "0.25.1", + "@esbuild/openbsd-x64": "0.25.1", + "@esbuild/sunos-x64": "0.25.1", + "@esbuild/win32-arm64": "0.25.1", + "@esbuild/win32-ia32": "0.25.1", + "@esbuild/win32-x64": "0.25.1" + } + }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -447,6 +1233,53 @@ "node": ">= 0.6" } }, + "node_modules/framer-motion": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-6.5.1.tgz", + "integrity": "sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==", + "license": "MIT", + "dependencies": { + "@motionone/dom": "10.12.0", + "framesync": "6.0.1", + "hey-listen": "^1.0.8", + "popmotion": "11.0.3", + "style-value-types": "5.0.0", + "tslib": "^2.1.0" + }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, + "peerDependencies": { + "react": ">=16.8 || ^17.0.0 || ^18.0.0", + "react-dom": ">=16.8 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/framer-motion/node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/framer-motion/node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "license": "MIT", + "optional": true + }, + "node_modules/framesync": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.0.1.tgz", + "integrity": "sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -573,6 +1406,12 @@ "node": ">= 0.4" } }, + "node_modules/hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==", + "license": "MIT" + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -894,6 +1733,24 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -963,6 +1820,15 @@ "node": ">=0.10.0" } }, + "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==", + "license": "MIT", + "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", @@ -1002,6 +1868,12 @@ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "license": "MIT" }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -1014,6 +1886,46 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/popmotion": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-11.0.3.tgz", + "integrity": "sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==", + "license": "MIT", + "dependencies": { + "framesync": "6.0.1", + "hey-listen": "^1.0.8", + "style-value-types": "5.0.0", + "tslib": "^2.1.0" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -1081,6 +1993,29 @@ "node": ">= 0.8" } }, + "node_modules/react": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", + "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.25.0" + }, + "peerDependencies": { + "react": "^19.0.0" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -1093,6 +2028,45 @@ "node": ">=8.10.0" } }, + "node_modules/rollup": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.37.0.tgz", + "integrity": "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.37.0", + "@rollup/rollup-android-arm64": "4.37.0", + "@rollup/rollup-darwin-arm64": "4.37.0", + "@rollup/rollup-darwin-x64": "4.37.0", + "@rollup/rollup-freebsd-arm64": "4.37.0", + "@rollup/rollup-freebsd-x64": "4.37.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.37.0", + "@rollup/rollup-linux-arm-musleabihf": "4.37.0", + "@rollup/rollup-linux-arm64-gnu": "4.37.0", + "@rollup/rollup-linux-arm64-musl": "4.37.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.37.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0", + "@rollup/rollup-linux-riscv64-gnu": "4.37.0", + "@rollup/rollup-linux-riscv64-musl": "4.37.0", + "@rollup/rollup-linux-s390x-gnu": "4.37.0", + "@rollup/rollup-linux-x64-gnu": "4.37.0", + "@rollup/rollup-linux-x64-musl": "4.37.0", + "@rollup/rollup-win32-arm64-msvc": "4.37.0", + "@rollup/rollup-win32-ia32-msvc": "4.37.0", + "@rollup/rollup-win32-x64-msvc": "4.37.0", + "fsevents": "~2.3.2" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1119,6 +2093,13 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, + "node_modules/scheduler": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", + "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", + "license": "MIT", + "peer": true + }, "node_modules/semver": { "version": "7.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", @@ -1281,6 +2262,15 @@ "node": ">=10" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", @@ -1299,6 +2289,16 @@ "node": ">= 0.8" } }, + "node_modules/style-value-types": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-5.0.0.tgz", + "integrity": "sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==", + "license": "MIT", + "dependencies": { + "hey-listen": "^1.0.8", + "tslib": "^2.1.0" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -1353,6 +2353,12 @@ "node": ">=18" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -1399,6 +2405,77 @@ "node": ">= 0.8" } }, + "node_modules/vite": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.3.tgz", + "integrity": "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -1420,6 +2497,20 @@ "engines": { "node": ">=18" } + }, + "node_modules/yaml": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } } } } diff --git a/package.json b/package.json index 21d705e54c..6847abce8d 100644 --- a/package.json +++ b/package.json @@ -19,9 +19,12 @@ }, "homepage": "https://github.com/loyde07/RDI25#readme", "dependencies": { + "cors": "^2.8.5", "dotenv": "^16.4.7", "express": "^4.21.2", + "framer-motion": "^6.5.1", "mongoose": "^8.12.1", - "nodemon": "^3.1.9" + "nodemon": "^3.1.9", + "vite": "^6.2.3" } } diff --git a/web_frontend/.gitignore b/web_frontend/.gitignore new file mode 100644 index 0000000000..a547bf36d8 --- /dev/null +++ b/web_frontend/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/web_frontend/README.md b/web_frontend/README.md new file mode 100644 index 0000000000..fd3b758d9c --- /dev/null +++ b/web_frontend/README.md @@ -0,0 +1,12 @@ +# React + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend using TypeScript and enable type-aware lint rules. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project. diff --git a/web_frontend/eslint.config.js b/web_frontend/eslint.config.js new file mode 100644 index 0000000000..ec2b712d30 --- /dev/null +++ b/web_frontend/eslint.config.js @@ -0,0 +1,33 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' + +export default [ + { ignores: ['dist'] }, + { + files: ['**/*.{js,jsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + parserOptions: { + ecmaVersion: 'latest', + ecmaFeatures: { jsx: true }, + sourceType: 'module', + }, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...js.configs.recommended.rules, + ...reactHooks.configs.recommended.rules, + 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +] diff --git a/web_frontend/index.html b/web_frontend/index.html new file mode 100644 index 0000000000..f9d4f10f2a --- /dev/null +++ b/web_frontend/index.html @@ -0,0 +1,13 @@ + + + + + + + tqt + + +
+ + + diff --git a/web_frontend/package-lock.json b/web_frontend/package-lock.json new file mode 100644 index 0000000000..af403ea4dc --- /dev/null +++ b/web_frontend/package-lock.json @@ -0,0 +1,3087 @@ +{ + "name": "web_frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "web_frontend", + "version": "0.0.0", + "dependencies": { + "axios": "^1.8.4", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router-dom": "^7.4.0" + }, + "devDependencies": { + "@eslint/js": "^9.21.0", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.21.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^15.15.0", + "vite": "^6.2.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", + "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", + "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", + "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", + "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", + "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", + "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", + "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", + "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", + "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", + "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", + "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", + "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", + "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", + "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", + "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", + "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", + "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", + "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", + "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", + "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", + "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", + "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", + "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", + "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", + "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", + "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", + "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", + "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.0.tgz", + "integrity": "sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.23.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.23.0.tgz", + "integrity": "sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", + "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.12.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.37.0.tgz", + "integrity": "sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.37.0.tgz", + "integrity": "sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.37.0.tgz", + "integrity": "sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.37.0.tgz", + "integrity": "sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.37.0.tgz", + "integrity": "sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.37.0.tgz", + "integrity": "sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.37.0.tgz", + "integrity": "sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.37.0.tgz", + "integrity": "sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.37.0.tgz", + "integrity": "sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.37.0.tgz", + "integrity": "sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.37.0.tgz", + "integrity": "sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.37.0.tgz", + "integrity": "sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.37.0.tgz", + "integrity": "sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.37.0.tgz", + "integrity": "sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.37.0.tgz", + "integrity": "sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.37.0.tgz", + "integrity": "sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.37.0.tgz", + "integrity": "sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.37.0.tgz", + "integrity": "sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.37.0.tgz", + "integrity": "sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.37.0.tgz", + "integrity": "sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.0.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.12.tgz", + "integrity": "sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.4.tgz", + "integrity": "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "license": "MIT", + "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==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001707", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz", + "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "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/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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.123", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.123.tgz", + "integrity": "sha512-refir3NlutEZqlKaBLK0tzlVLe5P2wDKS7UQt/3SpibizgsRAPOsqQC3ffw1nlv3ze5gjRQZYHoPymgVZkplFA==", + "dev": true, + "license": "ISC" + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", + "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.1", + "@esbuild/android-arm": "0.25.1", + "@esbuild/android-arm64": "0.25.1", + "@esbuild/android-x64": "0.25.1", + "@esbuild/darwin-arm64": "0.25.1", + "@esbuild/darwin-x64": "0.25.1", + "@esbuild/freebsd-arm64": "0.25.1", + "@esbuild/freebsd-x64": "0.25.1", + "@esbuild/linux-arm": "0.25.1", + "@esbuild/linux-arm64": "0.25.1", + "@esbuild/linux-ia32": "0.25.1", + "@esbuild/linux-loong64": "0.25.1", + "@esbuild/linux-mips64el": "0.25.1", + "@esbuild/linux-ppc64": "0.25.1", + "@esbuild/linux-riscv64": "0.25.1", + "@esbuild/linux-s390x": "0.25.1", + "@esbuild/linux-x64": "0.25.1", + "@esbuild/netbsd-arm64": "0.25.1", + "@esbuild/netbsd-x64": "0.25.1", + "@esbuild/openbsd-arm64": "0.25.1", + "@esbuild/openbsd-x64": "0.25.1", + "@esbuild/sunos-x64": "0.25.1", + "@esbuild/win32-arm64": "0.25.1", + "@esbuild/win32-ia32": "0.25.1", + "@esbuild/win32-x64": "0.25.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.23.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.23.0.tgz", + "integrity": "sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.2", + "@eslint/config-helpers": "^0.2.0", + "@eslint/core": "^0.12.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.23.0", + "@eslint/plugin-kit": "^0.2.7", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.19.tgz", + "integrity": "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.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==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 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, + "license": "MIT", + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "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==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "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==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", + "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.25.0" + }, + "peerDependencies": { + "react": "^19.0.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.4.0.tgz", + "integrity": "sha512-Y2g5ObjkvX3VFeVt+0CIPuYd9PpgqCslG7ASSIdN73LwA1nNWzcMLaoMRJfP3prZFI92svxFwbn7XkLJ+UPQ6A==", + "license": "MIT", + "dependencies": { + "@types/cookie": "^0.6.0", + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0", + "turbo-stream": "2.4.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.4.0.tgz", + "integrity": "sha512-VlksBPf3n2bijPvnA7nkTsXxMAKOj+bWp4R9c3i+bnwlSOFAGOkJkKhzy/OsRkWaBMICqcAl1JDzh9ZSOze9CA==", + "license": "MIT", + "dependencies": { + "react-router": "7.4.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.37.0.tgz", + "integrity": "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.37.0", + "@rollup/rollup-android-arm64": "4.37.0", + "@rollup/rollup-darwin-arm64": "4.37.0", + "@rollup/rollup-darwin-x64": "4.37.0", + "@rollup/rollup-freebsd-arm64": "4.37.0", + "@rollup/rollup-freebsd-x64": "4.37.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.37.0", + "@rollup/rollup-linux-arm-musleabihf": "4.37.0", + "@rollup/rollup-linux-arm64-gnu": "4.37.0", + "@rollup/rollup-linux-arm64-musl": "4.37.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.37.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0", + "@rollup/rollup-linux-riscv64-gnu": "4.37.0", + "@rollup/rollup-linux-riscv64-musl": "4.37.0", + "@rollup/rollup-linux-s390x-gnu": "4.37.0", + "@rollup/rollup-linux-x64-gnu": "4.37.0", + "@rollup/rollup-linux-x64-musl": "4.37.0", + "@rollup/rollup-win32-arm64-msvc": "4.37.0", + "@rollup/rollup-win32-ia32-msvc": "4.37.0", + "@rollup/rollup-win32-x64-msvc": "4.37.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", + "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/turbo-stream": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", + "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", + "license": "ISC" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.3.tgz", + "integrity": "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/web_frontend/package.json b/web_frontend/package.json new file mode 100644 index 0000000000..da370b564c --- /dev/null +++ b/web_frontend/package.json @@ -0,0 +1,29 @@ +{ + "name": "web_frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "axios": "^1.8.4", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router-dom": "^7.4.0" + }, + "devDependencies": { + "@eslint/js": "^9.21.0", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.21.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^15.15.0", + "vite": "^6.2.0" + } +} diff --git a/web_frontend/public/vite.svg b/web_frontend/public/vite.svg new file mode 100644 index 0000000000..e7b8dfb1b2 --- /dev/null +++ b/web_frontend/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web_frontend/src/App.css b/web_frontend/src/App.css new file mode 100644 index 0000000000..b9d355df2a --- /dev/null +++ b/web_frontend/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/web_frontend/src/App.jsx b/web_frontend/src/App.jsx new file mode 100644 index 0000000000..036da91a33 --- /dev/null +++ b/web_frontend/src/App.jsx @@ -0,0 +1,18 @@ +import React from "react"; +import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; +import Home from "./pages/home.jsx"; +import Image from "./pages/image.jsx"; + +function App(){ + + return ( + + + } /> + } /> + + + ); +} + +export default App; \ No newline at end of file diff --git a/web_frontend/src/assets/react.svg b/web_frontend/src/assets/react.svg new file mode 100644 index 0000000000..6c87de9bb3 --- /dev/null +++ b/web_frontend/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web_frontend/src/bck.App.jsx b/web_frontend/src/bck.App.jsx new file mode 100644 index 0000000000..f67355ae04 --- /dev/null +++ b/web_frontend/src/bck.App.jsx @@ -0,0 +1,35 @@ +import { useState } from 'react' +import reactLogo from './assets/react.svg' +import viteLogo from '/vite.svg' +import './App.css' + +function App() { + const [count, setCount] = useState(0) + + return ( + <> + +

Vite + React

+
+ +

+ Edit src/App.jsx and save to test HMR +

+
+

+ Click on the Vite and React logos to learn more +

+ + ) +} + +export default App diff --git a/web_frontend/src/index.css b/web_frontend/src/index.css new file mode 100644 index 0000000000..08a3ac9e1e --- /dev/null +++ b/web_frontend/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/web_frontend/src/main.jsx b/web_frontend/src/main.jsx new file mode 100644 index 0000000000..66f10ee3c1 --- /dev/null +++ b/web_frontend/src/main.jsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' + +import App from './App.jsx' + +createRoot(document.getElementById('root')).render( + + + , +) diff --git a/web_frontend/src/pages/home.jsx b/web_frontend/src/pages/home.jsx new file mode 100644 index 0000000000..fcd955e9b7 --- /dev/null +++ b/web_frontend/src/pages/home.jsx @@ -0,0 +1,51 @@ +import React, {useEffect, useState} from "react"; +import { useNavigate } from "react-router-dom"; +import axios from 'axios'; +function Home(){ + + const navigate = useNavigate(); + + + + + const [locals, setLocals] = useState([]); //pour créer un tableau + const fetchData = async () => { + try { + const response = await axios.get("http://localhost:5000/api/locals"); + setLocals(response.data.data); + } catch (error) { + console.error("Erreur lors de la récupération :", error); + } + }; + + useEffect(() => { + fetchData(); + }, []); + + + + return ( +
+

Home page RDI25

+

clique pour voir une photo drôle

+ +

locaux

+
+ {locals.length === 0 ? ( +

Aucun local trouvé.

+ ) : ( +
    + {locals.map((local) => ( +
  • + {local.nom} - Température Moyenne: {local.tempMoy}°C +
  • + ))} +
+ )} +
+ +
+ ); +} + +export default Home; \ No newline at end of file diff --git a/web_frontend/src/pages/image.jsx b/web_frontend/src/pages/image.jsx new file mode 100644 index 0000000000..96fb676238 --- /dev/null +++ b/web_frontend/src/pages/image.jsx @@ -0,0 +1,22 @@ +import React from "react"; +import { useNavigate } from "react-router-dom"; + +function Image(){ + const navigate = useNavigate(); + + const imageUrl = "https://i.pinimg.com/736x/45/f4/52/45f452315f2e9f4ee7fc981a52a7943b.jpg"; // Remplacez par votre lien d'image + + + return ( +
+

Page

+

Ceci est la page "drole".

+ + Description de l'image + + +
+ ); + } + +export default Image; \ No newline at end of file diff --git a/web_frontend/vite.config.js b/web_frontend/vite.config.js new file mode 100644 index 0000000000..8b0f57b91a --- /dev/null +++ b/web_frontend/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}) From 4e27a03f6013a8b20f9aeb581af5041c9b1c9104 Mon Sep 17 00:00:00 2001 From: Marry3005 Date: Tue, 1 Apr 2025 13:38:15 +0200 Subject: [PATCH 06/22] corrections mini bugs --- api_backend/server.js | 6 ++---- commandes_node | 10 ++++++++-- package-lock.json | 30 +++++++++++++++--------------- package.json | 2 +- web_frontend/package-lock.json | 8 ++++---- web_frontend/package.json | 2 +- web_frontend/src/pages/home.jsx | 6 ++++-- 7 files changed, 35 insertions(+), 29 deletions(-) diff --git a/api_backend/server.js b/api_backend/server.js index 664fdca139..45f35c6728 100644 --- a/api_backend/server.js +++ b/api_backend/server.js @@ -2,7 +2,7 @@ import express from "express" //version js const express = require('express'); import dotenv from "dotenv"; import { connectDB } from "../config/db.js"; -import routesLocal from "../routes/routes.local.js"; +//import routesLocal from "../routes/routes.local.js"; import cors from 'cors' dotenv.config(); @@ -16,14 +16,12 @@ app.use(cors({origin: 'http://localhost:5173'})); app.use(express.json()); //permet d'accepeter du JSOn dans le req.body -app.use("/api/locals", routesLocal); //origine des routes pour les locaux +//app.use("/api/locals", routesLocal); //origine des routes pour les locaux app.get("/", (req, res) => { res.send("Server is ready"); - }); -console.log(process.env.MONGO_URI); app.listen(process.env.PORT, () => { connectDB(); diff --git a/commandes_node b/commandes_node index 4e47f5fb65..8c8eda662c 100644 --- a/commandes_node +++ b/commandes_node @@ -1,7 +1,13 @@ +ENLEVER RESTRICTIONS +Set-ExecutionPolicy RemoteSigned -Scope CurrentUser +Get-ExecutionPolicy //verif + + API -npm init -y npm install express mongoose dotenv nodemon + + { "type": "module", @@ -27,7 +33,7 @@ nodemon start //redemarre automatiquement apres chaque mise à jour WEB - +npm install -D vite npm create vite@latest ./web_backend //attention commandes differentes en fct de si on travaille dans le back ou front npm i diff --git a/package-lock.json b/package-lock.json index 48ea577c93..1818da1ed5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "dotenv": "^16.4.7", "express": "^4.21.2", "framer-motion": "^6.5.1", - "mongoose": "^8.12.1", + "mongoose": "^8.13.1", "nodemon": "^3.1.9", "vite": "^6.2.3" } @@ -1600,9 +1600,9 @@ } }, "node_modules/mongodb": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.14.2.tgz", - "integrity": "sha512-kMEHNo0F3P6QKDq17zcDuPeaywK/YaJVCEQRzPF3TOM/Bl9MFg64YE5Tu7ifj37qZJMhwU1tl2Ioivws5gRG5Q==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.15.0.tgz", + "integrity": "sha512-ifBhQ0rRzHDzqp9jAQP6OwHSH7dbYIQjD3SbJs9YYk9AikKEettW/9s/tbSFDTpXcRbF+u1aLrhHxDFaYtZpFQ==", "license": "Apache-2.0", "dependencies": { "@mongodb-js/saslprep": "^1.1.9", @@ -1656,14 +1656,14 @@ } }, "node_modules/mongoose": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.12.1.tgz", - "integrity": "sha512-UW22y8QFVYmrb36hm8cGncfn4ARc/XsYWQwRTaj0gxtQk1rDuhzDO1eBantS+hTTatfAIS96LlRCJrcNHvW5+Q==", + "version": "8.13.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.13.1.tgz", + "integrity": "sha512-sRqlXI+6jhr9/KicCOjet1VVPONFsOxTrh14tfueX5y3GJ2ihswc5ewUUojuwdSS/5koGXLIPmGivDSApVXflA==", "license": "MIT", "dependencies": { "bson": "^6.10.3", "kareem": "2.6.3", - "mongodb": "~6.14.0", + "mongodb": "~6.15.0", "mpath": "0.9.0", "mquery": "5.0.0", "ms": "2.1.3", @@ -2342,9 +2342,9 @@ } }, "node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.0.tgz", + "integrity": "sha512-IUWnUK7ADYR5Sl1fZlO1INDUhVhatWl7BtJWsIhwJ0UAK7ilzzIa8uIqOO/aYVWHZPJkKbEL+362wrzoeRF7bw==", "license": "MIT", "dependencies": { "punycode": "^2.3.1" @@ -2486,12 +2486,12 @@ } }, "node_modules/whatwg-url": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.1.tgz", - "integrity": "sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==", + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", "license": "MIT", "dependencies": { - "tr46": "^5.0.0", + "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" }, "engines": { diff --git a/package.json b/package.json index 6847abce8d..7e756e753b 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "dotenv": "^16.4.7", "express": "^4.21.2", "framer-motion": "^6.5.1", - "mongoose": "^8.12.1", + "mongoose": "^8.13.1", "nodemon": "^3.1.9", "vite": "^6.2.3" } diff --git a/web_frontend/package-lock.json b/web_frontend/package-lock.json index af403ea4dc..bcfe55a018 100644 --- a/web_frontend/package-lock.json +++ b/web_frontend/package-lock.json @@ -22,7 +22,7 @@ "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^15.15.0", - "vite": "^6.2.0" + "vite": "^6.2.4" } }, "node_modules/@ampproject/remapping": { @@ -2966,9 +2966,9 @@ } }, "node_modules/vite": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.3.tgz", - "integrity": "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==", + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.4.tgz", + "integrity": "sha512-veHMSew8CcRzhL5o8ONjy8gkfmFJAd5Ac16oxBUjlwgX3Gq2Wqr+qNC3TjPIpy7TPV/KporLga5GT9HqdrCizw==", "dev": true, "license": "MIT", "dependencies": { diff --git a/web_frontend/package.json b/web_frontend/package.json index da370b564c..e67960e84b 100644 --- a/web_frontend/package.json +++ b/web_frontend/package.json @@ -24,6 +24,6 @@ "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^15.15.0", - "vite": "^6.2.0" + "vite": "^6.2.4" } } diff --git a/web_frontend/src/pages/home.jsx b/web_frontend/src/pages/home.jsx index fcd955e9b7..cfd7aee464 100644 --- a/web_frontend/src/pages/home.jsx +++ b/web_frontend/src/pages/home.jsx @@ -1,6 +1,8 @@ import React, {useEffect, useState} from "react"; import { useNavigate } from "react-router-dom"; import axios from 'axios'; + + function Home(){ const navigate = useNavigate(); @@ -29,7 +31,7 @@ function Home(){

Home page RDI25

clique pour voir une photo drôle

-

locaux

+

locaux

{locals.length === 0 ? (

Aucun local trouvé.

@@ -43,7 +45,7 @@ function Home(){ )}
- + ); } From 606cabe84dcd783608d0232918a0744ca4d5efb4 Mon Sep 17 00:00:00 2001 From: raimanta215 Date: Tue, 1 Apr 2025 15:10:26 +0200 Subject: [PATCH 07/22] maj --- api_backend/server.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/api_backend/server.js b/api_backend/server.js index 45f35c6728..6d547a05db 100644 --- a/api_backend/server.js +++ b/api_backend/server.js @@ -6,10 +6,7 @@ import { connectDB } from "../config/db.js"; import cors from 'cors' dotenv.config(); -// get pour récupérer des infos -//post pour créer des nouvelles data -//put ou patch pour mettre à jour -//delete pour supprimer + const app = express(); app.use(cors({origin: 'http://localhost:5173'})); From 32f0db814f810479e45f5275b788ac50b6b5670b Mon Sep 17 00:00:00 2001 From: raimanta215 Date: Thu, 3 Apr 2025 11:38:54 +0200 Subject: [PATCH 08/22] mini bug --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index be0e66756e..a0d06d2e80 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ .qodo /node_modules -/config/.env \ No newline at end of file +/.env \ No newline at end of file From f77689f4d61b2554b17c723a59de7bc7efccf4d6 Mon Sep 17 00:00:00 2001 From: raimanta215 Date: Mon, 7 Apr 2025 16:35:09 +0200 Subject: [PATCH 09/22] =?UTF-8?q?models=20=20pour=20les=20donn=C3=A9e=20jo?= =?UTF-8?q?ueur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Création de la DB et des models Joueurs, Team et ecole pour pouvoir constituer une team de 5 joueurs qui peuvent venir d'ecoles différentes --- .gitignore | 2 +- api_backend/models/ecole.model.js | 17 +++++++++++++ api_backend/models/joueur.model.js | 38 ++++++++++++++++++++++++++++++ api_backend/models/team.model.js | 24 +++++++++++++++++++ 4 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 api_backend/models/ecole.model.js create mode 100644 api_backend/models/joueur.model.js create mode 100644 api_backend/models/team.model.js diff --git a/.gitignore b/.gitignore index be0e66756e..a0d06d2e80 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ .qodo /node_modules -/config/.env \ No newline at end of file +/.env \ No newline at end of file diff --git a/api_backend/models/ecole.model.js b/api_backend/models/ecole.model.js new file mode 100644 index 0000000000..56ab6e9d59 --- /dev/null +++ b/api_backend/models/ecole.model.js @@ -0,0 +1,17 @@ +const mongoose = require('mongoose'); + +const ecoleSchema = new mongoose.Schema({ + nom: { + type: String, + required: true + }, + adresse: { + type: String, + required: true + }, + +}); + +const Ecole = mongoose.model('Ecole', ecoleSchema); + +export default Ecole; diff --git a/api_backend/models/joueur.model.js b/api_backend/models/joueur.model.js new file mode 100644 index 0000000000..4f70fe3dd6 --- /dev/null +++ b/api_backend/models/joueur.model.js @@ -0,0 +1,38 @@ +const mongoose = require('mongoose'); +const Ecole = require('./ecole.model.js'); +const Team = require('./team.model.js'); + + +const joueurScheama = new mongoose.Schema({ + nom:{ + type: String, + required: true + }, + prenom:{ + type: String, + required: true + }, + ecole_id: { + type: Number, + ref: 'Ecole', + required: true + }, + team_id: { + type: Number, + ref: 'Team', + required: true + }, + niveau:{ + type: Number, + }, + email:{ + type: String, + required: true + }, +}, {timestamps: true } // à chaque modif y a la date + +); + +const Joueur = mongoose.model("Joueur", joueurScheama); //creation d'une collection Local basé sur le modèle localSchema, chaque local suit le modele +//moongose prend le nom des collection avec Maj et sg --> locals +export default Joueur; \ No newline at end of file diff --git a/api_backend/models/team.model.js b/api_backend/models/team.model.js new file mode 100644 index 0000000000..bc7110c975 --- /dev/null +++ b/api_backend/models/team.model.js @@ -0,0 +1,24 @@ +import mongoose from "mongoose"; +const Ecole = require('./ecole.model.js'); + + +const teamScheama = new mongoose.Schema({ + nom:{ + type: String, + required: true + }, + ecole_id: { + type: Number, + ref: 'Ecole', + required: true + }, + logo:{ + type: String, + }, +}, {timestamps: true } // à chaque modif y a la date + +); + +const Team = mongoose.model("Team", teamScheama); //creation d'une collection Local basé sur le modèle localSchema, chaque local suit le modele +//moongose prend le nom des collection avec Maj et sg --> locals +export default Team; \ No newline at end of file From 3a9537f21706a920210229c8f08d6c8231797303 Mon Sep 17 00:00:00 2001 From: raimanta215 Date: Mon, 7 Apr 2025 16:56:27 +0200 Subject: [PATCH 10/22] =?UTF-8?q?d=C3=A9finition=20de=20toutes=20les=20tab?= =?UTF-8?q?les=20de=20la=20DB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit définition des tables des match et des tournois en plus pour la gestion de la LAN --- api_backend/models/joueur.model.js | 4 ++-- api_backend/models/match.model.js | 34 ++++++++++++++++++++++++++++ api_backend/models/team.model.js | 17 ++++++++++---- api_backend/models/tournois.model.js | 26 +++++++++++++++++++++ 4 files changed, 75 insertions(+), 6 deletions(-) create mode 100644 api_backend/models/match.model.js create mode 100644 api_backend/models/tournois.model.js diff --git a/api_backend/models/joueur.model.js b/api_backend/models/joueur.model.js index 4f70fe3dd6..004e96dfb3 100644 --- a/api_backend/models/joueur.model.js +++ b/api_backend/models/joueur.model.js @@ -13,12 +13,12 @@ const joueurScheama = new mongoose.Schema({ required: true }, ecole_id: { - type: Number, + type: mongoose.Schema.Types.ObjectId, ref: 'Ecole', required: true }, team_id: { - type: Number, + type: mongoose.Schema.Types.ObjectId, ref: 'Team', required: true }, diff --git a/api_backend/models/match.model.js b/api_backend/models/match.model.js new file mode 100644 index 0000000000..cf774d41b4 --- /dev/null +++ b/api_backend/models/match.model.js @@ -0,0 +1,34 @@ +import mongoose from "mongoose"; +const Team = require('./team.model.js'); +const Tournois = require('./tournois.model.js'); + + +const matchScheama = new mongoose.Schema({ + tournois_id:{ + type: String, + ref: 'Tournois', + required: true + }, + team1_id: { + type: mongoose.Schema.Types.ObjectId, + ref: 'Team', + required: true + }, + team2_id: { + type: mongoose.Schema.Types.ObjectId, + ref: 'Team', + required: true + }, + winner_id: { + type: mongoose.Schema.Types.ObjectId, + ref: 'Team', + required: true + }, + +}, {timestamps: true } // à chaque modif y a la date + +); + +const Match = mongoose.model("Match", matchScheama); //creation d'une collection Local basé sur le modèle localSchema, chaque local suit le modele +//moongose prend le nom des collection avec Maj et sg --> locals +export default Match; \ No newline at end of file diff --git a/api_backend/models/team.model.js b/api_backend/models/team.model.js index bc7110c975..1380279554 100644 --- a/api_backend/models/team.model.js +++ b/api_backend/models/team.model.js @@ -14,10 +14,19 @@ const teamScheama = new mongoose.Schema({ }, logo:{ type: String, - }, -}, {timestamps: true } // à chaque modif y a la date - -); + },joueurs: [{ + type: mongoose.Schema.Types.ObjectId, + ref: 'Joueur' + }], + }, { + // Validation du nombre de joueurs + validate: { + validator: function() { + return this.joueurs.length <= 5; // Vérifier que la longueur du tableau 'joueurs' est <= 5 + }, + message: 'Une équipe ne peut pas avoir plus de 5 joueurs.' + } + }); const Team = mongoose.model("Team", teamScheama); //creation d'une collection Local basé sur le modèle localSchema, chaque local suit le modele //moongose prend le nom des collection avec Maj et sg --> locals diff --git a/api_backend/models/tournois.model.js b/api_backend/models/tournois.model.js new file mode 100644 index 0000000000..79b617b3a7 --- /dev/null +++ b/api_backend/models/tournois.model.js @@ -0,0 +1,26 @@ +const mongoose = require('mongoose'); + +const tournoisSchema = new mongoose.Schema({ + nom: { + type: String, + required: true + }, + date_debut: { + type: Date, + required: true + }, + date_fin: { + type: Date, + required: true, + validate: { + validator: function(value) { + return value > this.date_debut; // La date de fin doit être après la date de début + }, + message: 'La date de fin doit être après la date de début.' + } + } +}); + +const Ecole = mongoose.model('Ecole', ecoleSchema); + +export default Ecole; From bc7fd3504b6feb285d8a05a0e9000d98171922f0 Mon Sep 17 00:00:00 2001 From: Hassan-mumu Date: Fri, 11 Apr 2025 00:22:18 +0200 Subject: [PATCH 11/22] =?UTF-8?q?ajout=20page=20inscription,=20page=20de?= =?UTF-8?q?=20connexion,=20page=20utilisateur,=20mdp=20chiffr=C3=A9=20dans?= =?UTF-8?q?=20la=20db,=20token=20identifiant=20les=20utilisateurs=20pour?= =?UTF-8?q?=20la=20connexion.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MicroPython/moteur.py | 116 --- api_backend/middleware/auth.js | 25 + api_backend/models/ecole.model.js | 3 +- api_backend/models/joueur.model.js | 24 +- api_backend/models/team.model.js | 2 +- api_backend/routes/ecoles.route.js | 16 + api_backend/routes/user.route.js | 122 +++ api_backend/server.js | 20 +- code_bouton.js | 88 -- package-lock.json | 893 +++++++++++++++++++ package.json | 4 + web_frontend/package-lock.json | 580 +++++++++++- web_frontend/package.json | 1 + web_frontend/src/App.jsx | 16 +- web_frontend/src/components/loginForm.jsx | 55 ++ web_frontend/src/components/registerForm.jsx | 134 +++ web_frontend/src/pages/accountPage.jsx | 86 ++ web_frontend/src/pages/compte.jsx | 121 +++ web_frontend/src/pages/home.jsx | 11 +- web_frontend/src/pages/login.jsx | 12 + web_frontend/src/pages/register.jsx | 12 + 21 files changed, 2103 insertions(+), 238 deletions(-) delete mode 100644 MicroPython/moteur.py create mode 100644 api_backend/middleware/auth.js create mode 100644 api_backend/routes/ecoles.route.js create mode 100644 api_backend/routes/user.route.js delete mode 100644 code_bouton.js create mode 100644 web_frontend/src/components/loginForm.jsx create mode 100644 web_frontend/src/components/registerForm.jsx create mode 100644 web_frontend/src/pages/accountPage.jsx create mode 100644 web_frontend/src/pages/compte.jsx create mode 100644 web_frontend/src/pages/login.jsx create mode 100644 web_frontend/src/pages/register.jsx diff --git a/MicroPython/moteur.py b/MicroPython/moteur.py deleted file mode 100644 index c1eed99b24..0000000000 --- a/MicroPython/moteur.py +++ /dev/null @@ -1,116 +0,0 @@ -from machine import Pin, PWM -import time - -# Définition des broches pour les moteurs -PWM_LEFT = 18 # Broche PWM pour le moteur gauche -DIR_LEFT = 19 # Direction pour le moteur gauche - -PWM_RIGHT = 20 # Broche PWM pour le moteur droit -DIR_RIGHT = 21 # Direction pour le moteur droit - -# Configuration des broches -pwm_left = PWM(Pin(PWM_LEFT)) -pwm_right = PWM(Pin(PWM_RIGHT)) - -pwm_left.freq(1000) # 1 kHz -pwm_right.freq(1000) # Même fréquence pour éviter les conflits - -dir_left = Pin(DIR_LEFT, Pin.OUT) -dir_right = Pin(DIR_RIGHT, Pin.OUT) - -from machine import Pin, PWM -import time - -# Configuration des broches pour les moteurs -PWM_A = PWM(Pin(18)) # Contrôle de vitesse moteur A -DIR_A = Pin(19, Pin.OUT) # Direction moteur A - -PWM_B = PWM(Pin(20)) # Contrôle de vitesse moteur B -DIR_B = Pin(21, Pin.OUT) # Direction moteur B - -# Définition de la fréquence PWM (1 kHz) -PWM_A.freq(1000) -PWM_B.freq(1000) - -def set_motor(motor, speed, direction): - """ - Contrôle un moteur donné. - - motor: 'A' ou 'B' - - speed: 0 à 100 (vitesse en %) - - direction: 1 = avant, 0 = arrière - """ - duty = int(speed * 65535 / 100) # Conversion en 16 bits (0-65535) - - if motor == 'A': - PWM_A.duty_u16(duty) - DIR_A.value(direction) - elif motor == 'B': - PWM_B.duty_u16(duty) - DIR_B.value(direction) - -def avancer(): - """ Fait avancer le robot en mettant les deux moteurs en marche avant. """ - set_motor('A', 70, 1) - set_motor('B', 70, 1) - -def reculer(): - """ Fait reculer le robot en mettant les deux moteurs en marche arrière. """ - set_motor('A', 70, 0) - set_motor('B', 70, 0) - -def tourner_gauche(): - """ Fait tourner le robot à gauche (moteur droit actif). """ - set_motor('A', 0, 1) - set_motor('B', 70, 1) - -def tourner_droite(): - """ Fait tourner le robot à droite (moteur gauche actif). """ - set_motor('A', 70, 1) - set_motor('B', 0, 1) - -def stop(): - """ Arrête les deux moteurs. """ - set_motor('A', 0, 0) - set_motor('B', 0, 0) - - -# Test des moteurs -avancer() -time.sleep(3) -stop() - -def set_motor(pwm, direction, direction_state, speed): - """ Active un moteur avec une direction et une vitesse donnée. """ - direction.value(direction_state) - duty_cycle = int(speed * 65535 / 100) # Conversion pour PWM 16 bits - pwm.duty_u16(duty_cycle) - -def avancer(): - """ Fait avancer les deux moteurs en même temps. """ - set_motor(pwm_left, dir_left, True, 50) - set_motor(pwm_right, dir_right, True, 50) - -def reculer(): - """ Fait reculer les deux moteurs en même temps. """ - set_motor(pwm_left, dir_left, False, 50) - set_motor(pwm_right, dir_right, False, 50) - -def tourner_droite(): - """ Tourne à droite (un moteur en avant, l'autre en arrière). """ - set_motor(pwm_left, dir_left, True, 50) - set_motor(pwm_right, dir_right, False, 50) - -def tourner_gauche(): - """ Tourne à gauche (un moteur en arrière, l'autre en avant). """ - set_motor(pwm_left, dir_left, False, 50) - set_motor(pwm_right, dir_right, True, 50) - -def stop(): - """ Arrête les moteurs. """ - pwm_left.duty_u16(0) - pwm_right.duty_u16(0) - -# Test : avancer pendant 3 secondes puis s'arrêter - - -stop() diff --git a/api_backend/middleware/auth.js b/api_backend/middleware/auth.js new file mode 100644 index 0000000000..f6ab81a4e4 --- /dev/null +++ b/api_backend/middleware/auth.js @@ -0,0 +1,25 @@ +import jwt from 'jsonwebtoken'; +import Joueur from '../models/joueur.model.js'; + +const auth = async (req, res, next) => { + const authHeader = req.headers.authorization; + if (!authHeader || !authHeader.startsWith('Bearer ')) { + return res.status(401).json({ message: 'Accès non autorisé.' }); + } + + const token = authHeader.split(' ')[1]; + try { + const decoded = jwt.verify(token, process.env.JWT_SECRET); + const joueur = await Joueur.findById(decoded.id).populate('ecole_id'); + if (!joueur) return res.status(404).json({ message: "Utilisateur introuvable." }); + + req.joueur = joueur; + next(); + } catch (err) { + res.status(401).json({ message: 'Token invalide.' }); + } +}; + +export default auth; + + diff --git a/api_backend/models/ecole.model.js b/api_backend/models/ecole.model.js index 56ab6e9d59..ee3f0558fb 100644 --- a/api_backend/models/ecole.model.js +++ b/api_backend/models/ecole.model.js @@ -1,5 +1,4 @@ -const mongoose = require('mongoose'); - +import mongoose from "mongoose"; const ecoleSchema = new mongoose.Schema({ nom: { type: String, diff --git a/api_backend/models/joueur.model.js b/api_backend/models/joueur.model.js index 004e96dfb3..9914314cf7 100644 --- a/api_backend/models/joueur.model.js +++ b/api_backend/models/joueur.model.js @@ -1,9 +1,9 @@ -const mongoose = require('mongoose'); -const Ecole = require('./ecole.model.js'); -const Team = require('./team.model.js'); +import mongoose from 'mongoose'; +import Ecole from './ecole.model.js'; +import bcrypt from 'bcrypt'; -const joueurScheama = new mongoose.Schema({ +const joueurSchema = new mongoose.Schema({ nom:{ type: String, required: true @@ -17,9 +17,8 @@ const joueurScheama = new mongoose.Schema({ ref: 'Ecole', required: true }, - team_id: { - type: mongoose.Schema.Types.ObjectId, - ref: 'Team', + password: { + type: String, required: true }, niveau:{ @@ -33,6 +32,13 @@ const joueurScheama = new mongoose.Schema({ ); -const Joueur = mongoose.model("Joueur", joueurScheama); //creation d'une collection Local basé sur le modèle localSchema, chaque local suit le modele +const Joueur = mongoose.model("Joueur", joueurSchema); //creation d'une collection Local basé sur le modèle localSchema, chaque local suit le modele //moongose prend le nom des collection avec Maj et sg --> locals -export default Joueur; \ No newline at end of file +export default Joueur; + +joueurSchema.pre('save', async function (next) { + if (!this.isModified('password')) return next(); + const salt = await bcrypt.genSalt(10); + this.password = await bcrypt.hash(this.password, salt); + next(); +}); \ No newline at end of file diff --git a/api_backend/models/team.model.js b/api_backend/models/team.model.js index 1380279554..5a1d6db86b 100644 --- a/api_backend/models/team.model.js +++ b/api_backend/models/team.model.js @@ -1,6 +1,6 @@ import mongoose from "mongoose"; -const Ecole = require('./ecole.model.js'); +import Ecole from "./ecole.model.js"; const teamScheama = new mongoose.Schema({ nom:{ diff --git a/api_backend/routes/ecoles.route.js b/api_backend/routes/ecoles.route.js new file mode 100644 index 0000000000..3ef93ea1ca --- /dev/null +++ b/api_backend/routes/ecoles.route.js @@ -0,0 +1,16 @@ +// routes/ecoles.js +import express from 'express'; +import Ecole from '../models/ecole.model.js'; + +const router = express.Router(); + +router.get('/', async (req, res) => { + try { + const ecoles = await Ecole.find(); + res.status(200).json(ecoles); + } catch (error) { + res.status(500).json({ message: "Erreur lors de la récupération des écoles." }); + } +}); + +export default router; diff --git a/api_backend/routes/user.route.js b/api_backend/routes/user.route.js new file mode 100644 index 0000000000..c015ebbe87 --- /dev/null +++ b/api_backend/routes/user.route.js @@ -0,0 +1,122 @@ +// routes/user.route.js +import dotenv from 'dotenv'; +import express from 'express'; +import bcrypt from 'bcrypt'; // module qui permet de hasher le mot de passe +import jwt from 'jsonwebtoken'; +import Joueur from '../models/joueur.model.js'; +import multer from 'multer'; +import fs from 'fs'; +import path from 'path'; +import auth from '../middleware/auth.js'; + +const router = express.Router(); +dotenv.config(); + +// Configuration pour multer (upload des fichiers) +const storage = multer.diskStorage({ + destination: (req, file, cb) => { + cb(null, './uploads/logos'); // Dossier pour stocker les logos + }, + filename: (req, file, cb) => { + cb(null, Date.now() + path.extname(file.originalname)); + } +}); + +const upload = multer({ storage: storage }); + +// Route pour obtenir les données de profil +router.get('/profile', auth, async (req, res) => { + try { + console.log("→ Accès à /profile avec :", req.joueur); + res.status(200).json(req.joueur); + } catch (error) { + console.error(error); + res.status(500).json({ message: 'Erreur serveur.' }); + } +}); + + + +// Route pour mettre à jour les informations de l'utilisateur +router.put('/update', auth, upload.single('logo'), async (req, res) => { + const { pseudo, password, niveau } = req.body; + let updateData = { pseudo, niveau }; + + // Si le mot de passe est modifié, on le hash + if (password) { + const hashedPassword = await bcrypt.hash(password, 10); + updateData.password = hashedPassword; + } + + // Si un logo est téléchargé, on l'ajoute aux données de l'utilisateur + if (req.file) { + updateData.logo = req.file.path; // Stocke le chemin du fichier + } + + try { + const joueur = await Joueur.findByIdAndUpdate(req.userId, updateData, { new: true }); + res.status(200).json(joueur); + } catch (error) { + console.error(error); + res.status(500).json({ message: 'Erreur lors de la mise à jour du profil.' }); + } +}); + + +router.post('/register', async (req, res) => { + const { nom, prenom, email, password, ecole_id, niveau } = req.body; + + try { + // Vérifie si l'email existe déjà + const joueurExist = await Joueur.findOne({ email }); + if (joueurExist) { + return res.status(400).json({ message: "Email déjà utilisé." }); + } + + // Hash du mot de passe + const salt = await bcrypt.genSalt(10); + const hashedPassword = await bcrypt.hash(password, salt); + + // Création du joueur + const nouveauJoueur = new Joueur({ + nom, + prenom, + email, + password: hashedPassword, // <- important + ecole_id, + niveau + }); + + await nouveauJoueur.save(); + + res.status(201).json({ message: "Inscription réussie." }); + } catch (err) { + console.error(err); + res.status(500).json({ message: "Erreur serveur pendant l'inscription." }); + } +}); + +router.post('/login', async (req, res) => { + const { email, password } = req.body; + + try { + const joueur = await Joueur.findOne({ email }); + if (!joueur) { + return res.status(400).json({ message: "Email non trouvé." }); + } + + const passwordMatch = await bcrypt.compare(password, joueur.password); + if (!passwordMatch) { + return res.status(400).json({ message: "Mot de passe incorrect." }); + } + + const token = jwt.sign({ id: joueur._id },process.env.JWT_SECRET,{ expiresIn: '1h' }); + + res.status(200).json({ token }); + } catch (err) { + console.error(err); + res.status(500).json({ message: "Erreur serveur pendant la connexion." }); + } +}); + +export default router; diff --git a/api_backend/server.js b/api_backend/server.js index 6d547a05db..63fa05cffb 100644 --- a/api_backend/server.js +++ b/api_backend/server.js @@ -3,25 +3,29 @@ import dotenv from "dotenv"; import { connectDB } from "../config/db.js"; //import routesLocal from "../routes/routes.local.js"; +import userRoutes from './routes/user.route.js' +import ecoleRoutes from './routes/ecoles.route.js'; + + import cors from 'cors' dotenv.config(); const app = express(); +const PORT = process.env.PORT || 5000; app.use(cors({origin: 'http://localhost:5173'})); app.use(express.json()); //permet d'accepeter du JSOn dans le req.body -//app.use("/api/locals", routesLocal); //origine des routes pour les locaux +app.use("/api/user", userRoutes); +app.use('/api/ecoles', ecoleRoutes); -app.get("/", (req, res) => { - res.send("Server is ready"); -}); +//app.use("/api/locals", routesLocal); //origine des routes pour les locaux -app.listen(process.env.PORT, () => { +app.listen(PORT, () => { connectDB(); - console.log("serveur lancé sur http://localhost:5000 "); - -}); \ No newline at end of file + console.log("serveur lancé sur http://localhost:"+PORT); + +}); \ No newline at end of file diff --git a/code_bouton.js b/code_bouton.js deleted file mode 100644 index d38b0b2f3d..0000000000 --- a/code_bouton.js +++ /dev/null @@ -1,88 +0,0 @@ -import { useState } from "react"; - -export default function InspectionModes() { - const [mode, setMode] = useState("home"); // État pour stocker la page actuelle - - // Composants des différentes pages - const HomePage = () => ( -
-

- Choisissez un mode d'inspection -

-
- - - -
-
- ); - - const AutonomiePage = () => ( -
-

Mode Autonomie

-

Le mode autonomie permet au robot de fonctionner sans intervention.

- -
- ); - - const ItinerairePage = () => ( -
-

- Mode Suivi d'itinéraire -

-

- Le mode suivi d'itinéraire permet au robot de suivre un trajet défini. -

- -
- ); - - const ControlePage = () => ( -
-

Mode Contrôle

-

- Le mode contrôle permet une intervention humaine pour guider le robot. -

- -
- ); - - return ( -
- {mode === "home" && } - {mode === "autonomie" && } - {mode === "itineraire" && } - {mode === "controle" && } -
- ); -} diff --git a/package-lock.json b/package-lock.json index 1818da1ed5..869feceab3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,12 +9,16 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "bcrypt": "^5.1.1", "cors": "^2.8.5", "dotenv": "^16.4.7", "express": "^4.21.2", "framer-motion": "^6.5.1", + "jsonwebtoken": "^9.0.2", "mongoose": "^8.13.1", + "multer": "^1.4.5-lts.2", "nodemon": "^3.1.9", + "react-router-dom": "^7.5.0", "vite": "^6.2.3" } }, @@ -418,6 +422,26 @@ "node": ">=18" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, "node_modules/@mongodb-js/saslprep": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.2.0.tgz", @@ -751,6 +775,12 @@ "win32" ] }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", @@ -772,6 +802,12 @@ "@types/webidl-conversions": "*" } }, + "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==", + "license": "ISC" + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -785,6 +821,50 @@ "node": ">= 0.6" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/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==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -798,6 +878,32 @@ "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==", + "license": "MIT" + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "license": "ISC" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -810,6 +916,20 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, + "node_modules/bcrypt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", + "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -877,6 +997,29 @@ "node": ">=16.20.1" } }, + "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==", + "license": "BSD-3-Clause" + }, + "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==", + "license": "MIT" + }, + "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", @@ -939,12 +1082,81 @@ "fsevents": "~2.3.2" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, + "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" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/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==", + "license": "MIT", + "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/concat-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==", + "license": "MIT" + }, + "node_modules/concat-stream/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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC" + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -981,6 +1193,12 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "license": "MIT" }, + "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==", + "license": "MIT" + }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -1003,6 +1221,12 @@ "ms": "2.0.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT" + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -1022,6 +1246,15 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/dotenv": { "version": "16.4.7", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", @@ -1048,12 +1281,27 @@ "node": ">= 0.4" } }, + "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==", + "license": "Apache-2.0", + "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==", "license": "MIT" }, + "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==", + "license": "MIT" + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -1289,6 +1537,36 @@ "node": ">= 0.6" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1312,6 +1590,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -1349,6 +1648,27 @@ "node": ">= 0.4" } }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -1394,6 +1714,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC" + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -1428,6 +1754,42 @@ "node": ">= 0.8" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/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==", + "license": "MIT" + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -1446,6 +1808,17 @@ "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", "license": "ISC" }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -1482,6 +1855,15 @@ "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -1503,6 +1885,61 @@ "node": ">=0.12.0" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/kareem": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", @@ -1512,6 +1949,72 @@ "node": ">=12.0.0" } }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -1599,6 +2102,61 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mongodb": { "version": "6.15.0", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.15.0.tgz", @@ -1733,6 +2291,36 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "node_modules/multer": { + "version": "1.4.5-lts.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.2.tgz", + "integrity": "sha512-VzGiVigcG9zUAoCNU+xShztrlr1auZOlurXynNvO9GiWD1/mTBbUljOKY+qMeazBqXgRnjzeEgJI/wyjJUHg9A==", + "license": "MIT", + "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/multer/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==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -1760,6 +2348,54 @@ "node": ">= 0.6" } }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/nodemon": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.9.tgz", @@ -1811,6 +2447,21 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -1820,6 +2471,19 @@ "node": ">=0.10.0" } }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -1853,6 +2517,15 @@ "node": ">= 0.8" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -1862,6 +2535,15 @@ "node": ">= 0.8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", @@ -1926,6 +2608,12 @@ "node": "^10 || ^12 || >=14" } }, + "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==", + "license": "MIT" + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -2016,6 +2704,69 @@ "react": "^19.0.0" } }, + "node_modules/react-router": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.0.tgz", + "integrity": "sha512-estOHrRlDMKdlQa6Mj32gIks4J+AxNsYoE0DbTTxiMy2mPzZuWSDU+N85/r1IlNR7kGfznF3VCUlvc5IUO+B9g==", + "license": "MIT", + "dependencies": { + "@types/cookie": "^0.6.0", + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0", + "turbo-stream": "2.4.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.0.tgz", + "integrity": "sha512-fFhGFCULy4vIseTtH5PNcY/VvDJK5gvOWcwJVHQp8JQcWVr85ENhJ3UpuF/zP1tQOIFYNRJHzXtyhU1Bdgw0RA==", + "license": "MIT", + "dependencies": { + "react-router": "7.5.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-router/node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -2028,6 +2779,22 @@ "node": ">=8.10.0" } }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/rollup": { "version": "4.37.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.37.0.tgz", @@ -2166,6 +2933,18 @@ "node": ">= 0.8.0" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -2250,6 +3029,12 @@ "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", "license": "MIT" }, + "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==", + "license": "ISC" + }, "node_modules/simple-update-notifier": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", @@ -2289,6 +3074,49 @@ "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.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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==", + "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/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/style-value-types": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-5.0.0.tgz", @@ -2311,6 +3139,23 @@ "node": ">=4" } }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "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/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -2359,6 +3204,12 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/turbo-stream": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", + "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", + "license": "ISC" + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -2372,6 +3223,12 @@ "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==", + "license": "MIT" + }, "node_modules/undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", @@ -2387,6 +3244,12 @@ "node": ">= 0.8" } }, + "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==", + "license": "MIT" + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -2498,6 +3361,36 @@ "node": ">=18" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, "node_modules/yaml": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", diff --git a/package.json b/package.json index 7e756e753b..cf2be34abe 100644 --- a/package.json +++ b/package.json @@ -19,12 +19,16 @@ }, "homepage": "https://github.com/loyde07/RDI25#readme", "dependencies": { + "bcrypt": "^5.1.1", "cors": "^2.8.5", "dotenv": "^16.4.7", "express": "^4.21.2", "framer-motion": "^6.5.1", + "jsonwebtoken": "^9.0.2", "mongoose": "^8.13.1", + "multer": "^1.4.5-lts.2", "nodemon": "^3.1.9", + "react-router-dom": "^7.5.0", "vite": "^6.2.3" } } diff --git a/web_frontend/package-lock.json b/web_frontend/package-lock.json index bcfe55a018..e90a9b366c 100644 --- a/web_frontend/package-lock.json +++ b/web_frontend/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.0", "dependencies": { "axios": "^1.8.4", + "bcrypt": "^5.1.1", "react": "^19.0.0", "react-dom": "^19.0.0", "react-router-dom": "^7.4.0" @@ -1016,6 +1017,38 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.37.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.37.0.tgz", @@ -1401,6 +1434,12 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, + "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==", + "license": "ISC" + }, "node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", @@ -1424,6 +1463,18 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1441,6 +1492,15 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -1457,6 +1517,26 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "license": "ISC" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1485,14 +1565,26 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, "license": "MIT" }, + "node_modules/bcrypt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", + "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, "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, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -1593,6 +1685,15 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1613,6 +1714,15 @@ "dev": true, "license": "MIT" }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1629,9 +1739,14 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, "license": "MIT" }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC" + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -1674,7 +1789,6 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -1704,6 +1818,21 @@ "node": ">=0.4.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -1725,6 +1854,12 @@ "dev": true, "license": "ISC" }, + "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==", + "license": "MIT" + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -2119,6 +2254,42 @@ "node": ">= 6" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2143,6 +2314,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -2190,6 +2382,27 @@ "node": ">= 0.4" } }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -2265,6 +2478,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC" + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -2277,6 +2496,19 @@ "node": ">= 0.4" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -2314,6 +2546,23 @@ "node": ">=0.8.19" } }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2324,6 +2573,15 @@ "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -2468,6 +2726,21 @@ "yallist": "^3.0.2" } }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -2502,7 +2775,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -2511,11 +2783,62 @@ "node": "*" } }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "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==", - "dev": true, "license": "MIT" }, "node_modules/nanoid": { @@ -2544,6 +2867,32 @@ "dev": true, "license": "MIT" }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", @@ -2551,6 +2900,52 @@ "dev": true, "license": "MIT" }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -2624,6 +3019,15 @@ "node": ">=8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -2767,6 +3171,20 @@ "react-dom": ">=18" } }, + "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==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -2777,6 +3195,22 @@ "node": ">=4" } }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/rollup": { "version": "4.37.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.37.0.tgz", @@ -2824,6 +3258,26 @@ "dev": true, "license": "MIT" }, + "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" + } + ], + "license": "MIT" + }, "node_modules/scheduler": { "version": "0.25.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", @@ -2834,12 +3288,17 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, "node_modules/set-cookie-parser": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", @@ -2869,6 +3328,12 @@ "node": ">=8" } }, + "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==", + "license": "ISC" + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -2879,6 +3344,41 @@ "node": ">=0.10.0" } }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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==", + "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/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -2905,6 +3405,35 @@ "node": ">=8" } }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "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/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, "node_modules/turbo-stream": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", @@ -2965,6 +3494,12 @@ "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==", + "license": "MIT" + }, "node_modules/vite": { "version": "6.2.4", "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.4.tgz", @@ -3037,6 +3572,22 @@ } } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3053,6 +3604,15 @@ "node": ">= 8" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -3063,6 +3623,12 @@ "node": ">=0.10.0" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", diff --git a/web_frontend/package.json b/web_frontend/package.json index e67960e84b..e36b78cbce 100644 --- a/web_frontend/package.json +++ b/web_frontend/package.json @@ -11,6 +11,7 @@ }, "dependencies": { "axios": "^1.8.4", + "bcrypt": "^5.1.1", "react": "^19.0.0", "react-dom": "^19.0.0", "react-router-dom": "^7.4.0" diff --git a/web_frontend/src/App.jsx b/web_frontend/src/App.jsx index 036da91a33..22bcfdd84d 100644 --- a/web_frontend/src/App.jsx +++ b/web_frontend/src/App.jsx @@ -2,14 +2,22 @@ import React from "react"; import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; import Home from "./pages/home.jsx"; import Image from "./pages/image.jsx"; +import RegisterForm from './pages/register.jsx'; +import LoginForm from './pages/login.jsx'; +import Compte from './pages/compte.jsx'; // à créer ensuite +import AccountPage from "./pages/accountPage.jsx"; -function App(){ - +function App() { return ( - } /> - } /> + } /> + } /> + } /> + } /> + } /> + } > + } /> ); diff --git a/web_frontend/src/components/loginForm.jsx b/web_frontend/src/components/loginForm.jsx new file mode 100644 index 0000000000..865484fa6c --- /dev/null +++ b/web_frontend/src/components/loginForm.jsx @@ -0,0 +1,55 @@ +import React, { useState } from 'react'; +import axios from 'axios'; +import { useNavigate } from 'react-router-dom'; + +function LoginForm() { + const [formData, setFormData] = useState({ email: '', password: '' }); + const navigate = useNavigate(); + + const handleChange = (e) => { + setFormData({ ...formData, [e.target.name]: e.target.value }); + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + try { + const res = await axios.post('http://localhost:5000/api/user/login', formData); + localStorage.setItem('token', res.data.token); // Enregistre le token + navigate('/compte'); // Redirige vers la page de compte + } catch (err) { + console.error("Erreur à la connexion :", err); + alert("Email ou mot de passe incorrect."); + } + }; + + return ( +
+

Connexion

+ +
+ +
+ +
+ +
+ ); +} + +export default LoginForm; diff --git a/web_frontend/src/components/registerForm.jsx b/web_frontend/src/components/registerForm.jsx new file mode 100644 index 0000000000..08ea27d7a4 --- /dev/null +++ b/web_frontend/src/components/registerForm.jsx @@ -0,0 +1,134 @@ +import React, { useEffect, useState } from 'react'; +import axios from 'axios'; + +import { useNavigate } from 'react-router-dom'; + + +function RegisterForm() { + const navigate = useNavigate(); + const [ecoles, setEcoles] = useState([]); + const [formData, setFormData] = useState({ + nom: '', + prenom: '', + email: '', + password: '', + niveau: '', + ecole_id: '', + });; + + + useEffect(() => { + axios.get('http://localhost:5000/api/ecoles') // adapte l’URL si besoin + .then((res) => { + if (Array.isArray(res.data)) { + setEcoles(res.data); + } else if (Array.isArray(res.data.ecoles)) { + setEcoles(res.data.ecoles); + } else { + console.error("Format inattendu :", res.data); + } + }) + .catch((err) => console.error("Erreur lors du fetch des écoles :", err)); + }, []); + + const handleChange = (e) => { + setFormData({ ...formData, [e.target.name]: e.target.value }); + }; + + const handleSubmit = (e) => { + e.preventDefault(); + + axios.post('http://localhost:5000/api/user/register', formData) + .then((res) => { + alert("Joueur inscrit avec succès !"); + console.log(res.data); + setFormData({ + nom: '', + prenom: '', + email: '', + password: '', + niveau: '', + ecole_id: '', + }); + }) + .catch((err) => { + const msg = err.response?.data?.message || "Erreur inconnue."; + alert(`Erreur à l'inscription : ${msg}`); + console.error("Erreur à l'inscription :", err); + }); + + }; + + return ( +
+

Inscription Joueur

+ + +
+ + +
+ + +
+ +
+ +
+ + +
+ + + +
+ ); +} + +export default RegisterForm; diff --git a/web_frontend/src/pages/accountPage.jsx b/web_frontend/src/pages/accountPage.jsx new file mode 100644 index 0000000000..a72c9eca2f --- /dev/null +++ b/web_frontend/src/pages/accountPage.jsx @@ -0,0 +1,86 @@ +import React, { useState, useEffect } from 'react'; +import axios from 'axios'; + +function AccountPage() { + const [userData, setUserData] = useState({ + pseudo: '', + email: '', + niveau: '', + logo: '', + password: '' + }); + const [newPassword, setNewPassword] = useState(''); + const [newPseudo, setNewPseudo] = useState(''); + const [newLogo, setNewLogo] = useState(null); + + useEffect(() => { + // Récupérer les données de l'utilisateur connecté + const fetchUserData = async () => { + const res = await axios.get('http://localhost:5000/api/user/profile'); // Assure-toi que cette route est disponible côté backend + setUserData(res.data); + }; + fetchUserData(); + }, []); + + const handleSubmit = async (e) => { + e.preventDefault(); + try { + const formData = new FormData(); + formData.append('pseudo', newPseudo || userData.pseudo); + formData.append('niveau', userData.niveau); + formData.append('logo', newLogo); + formData.append('password', newPassword || userData.password); + + const response = await axios.put('http://localhost:5000/api/user/update', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }); + + alert('Informations mises à jour avec succès !'); + setUserData(response.data); // Met à jour l’état avec les nouvelles données de l'utilisateur + } catch (error) { + console.error('Erreur lors de la mise à jour du profil', error); + alert('Erreur lors de la mise à jour du profil.'); + } + }; + + return ( +
+

Modifier mon compte

+
+
+ + setNewPseudo(e.target.value)} + placeholder={userData.pseudo} + /> +
+
+ + setNewPassword(e.target.value)} + placeholder="Nouveau mot de passe" + /> +
+
+ + setNewLogo(e.target.files[0])} + /> +
+
+ +
+
+
+ ); +} + +export default AccountPage; diff --git a/web_frontend/src/pages/compte.jsx b/web_frontend/src/pages/compte.jsx new file mode 100644 index 0000000000..1b016f27f4 --- /dev/null +++ b/web_frontend/src/pages/compte.jsx @@ -0,0 +1,121 @@ +import React, { useEffect, useState } from 'react'; +import axios from 'axios'; +import { useNavigate } from 'react-router-dom'; + +function Compte() { + const [joueur, setJoueur] = useState(null); + const navigate = useNavigate(); + + useEffect(() => { + const fetchData = async () => { + const token = localStorage.getItem('token'); + console.log("Token récupéré :", token); + + if (!token) { + navigate('/login'); + return; + } + + try { + const res = await axios.get('http://localhost:5000/api/user/profile', { + headers: { + Authorization: `Bearer ${token}` + } + }); + console.log("Réponse serveur :", res.data); + setJoueur(res.data); + } catch (err) { + console.error("Erreur lors de la récupération du profil :", err); + localStorage.removeItem('token'); + navigate('/login'); + } + }; + + fetchData(); + }, [navigate]); + + + const handleLogout = () => { + localStorage.removeItem('token'); + navigate('/login'); + }; + + const [formData, setFormData] = useState({ + pseudo: '', + password: '', + niveau: '' + }); + const [logoFile, setLogoFile] = useState(null); + + const handleChange = (e) => { + setFormData({ ...formData, [e.target.name]: e.target.value }); + }; + + const handleFileChange = (e) => { + setLogoFile(e.target.files[0]); + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + const token = localStorage.getItem('token'); + const form = new FormData(); + + form.append('pseudo', formData.pseudo); + form.append('password', formData.password); + form.append('niveau', formData.niveau); + if (logoFile) { + form.append('logo', logoFile); + } + + try { + const res = await axios.put('http://localhost:5000/api/user/update', form, { + headers: { + 'Authorization': `Bearer ${token}`, + 'Content-Type': 'multipart/form-data' + } + }); + alert('Profil mis à jour !'); + setJoueur(res.data); // actualise les infos affichées + } catch (err) { + console.error('Erreur lors de la mise à jour :', err); + alert('Erreur lors de la mise à jour'); + } + }; + + + if (!joueur) return

Chargement du profil...

; + + return ( +
+

Mon Compte

+

Nom : {joueur.nom}

+

Prénom : {joueur.prenom}

+

Email : {joueur.email}

+

Niveau : {joueur.niveau}

+

École : {joueur.ecole_id?.nom || 'Non défini'}

+ +
+

Modifier mon profil

+ + +
+ + +
+ + +
+ + +
+ + +
+ +
+ +
+ ); +} + +export default Compte; diff --git a/web_frontend/src/pages/home.jsx b/web_frontend/src/pages/home.jsx index cfd7aee464..3bf94e893d 100644 --- a/web_frontend/src/pages/home.jsx +++ b/web_frontend/src/pages/home.jsx @@ -1,7 +1,7 @@ import React, {useEffect, useState} from "react"; import { useNavigate } from "react-router-dom"; import axios from 'axios'; - +import { Link } from "react-router-dom"; function Home(){ @@ -24,8 +24,7 @@ function Home(){ fetchData(); }, []); - - + return (

Home page RDI25

@@ -45,6 +44,12 @@ function Home(){ )}
+ + +
+

Bienvenue

+ S'inscrire +
); diff --git a/web_frontend/src/pages/login.jsx b/web_frontend/src/pages/login.jsx new file mode 100644 index 0000000000..871dc7b621 --- /dev/null +++ b/web_frontend/src/pages/login.jsx @@ -0,0 +1,12 @@ +import React from 'react'; +import LoginForm from "../components/loginForm.jsx"; + +function Login() { + return ( +
+

Connexion

+ +
+ ); +} +export default Login ; diff --git a/web_frontend/src/pages/register.jsx b/web_frontend/src/pages/register.jsx new file mode 100644 index 0000000000..50a4a878b1 --- /dev/null +++ b/web_frontend/src/pages/register.jsx @@ -0,0 +1,12 @@ +import React from 'react'; +import RegisterForm from "../components/registerForm.jsx"; + +function Register() { + return ( +
+

Inscription

+ +
+ ); +} +export default Register; From 72c0db90d510ae34087257f93ff8f6d3665b5c1a Mon Sep 17 00:00:00 2001 From: Hassan-mumu Date: Sun, 13 Apr 2025 16:19:02 +0200 Subject: [PATCH 12/22] correction modification du profil + ajout css pour la page --- api_backend/models/joueur.model.js | 59 +++++--- api_backend/routes/user.route.js | 70 ++++++---- api_backend/server.js | 39 +++--- uploads/logos/1744396974925.jpg | Bin 0 -> 26121 bytes web_frontend/public/default-logo.png | Bin 0 -> 58847 bytes web_frontend/src/components/registerForm.jsx | 1 + web_frontend/src/css/compte.css | 111 +++++++++++++++ web_frontend/src/css/registerForm.css | 81 +++++++++++ web_frontend/src/pages/accountPage.jsx | 15 +- web_frontend/src/pages/compte.jsx | 138 ++++++++++++------- 10 files changed, 396 insertions(+), 118 deletions(-) create mode 100644 uploads/logos/1744396974925.jpg create mode 100644 web_frontend/public/default-logo.png create mode 100644 web_frontend/src/css/compte.css create mode 100644 web_frontend/src/css/registerForm.css diff --git a/api_backend/models/joueur.model.js b/api_backend/models/joueur.model.js index 9914314cf7..5f8510225b 100644 --- a/api_backend/models/joueur.model.js +++ b/api_backend/models/joueur.model.js @@ -1,44 +1,61 @@ import mongoose from 'mongoose'; -import Ecole from './ecole.model.js'; import bcrypt from 'bcrypt'; - const joueurSchema = new mongoose.Schema({ - nom:{ + nom: { type: String, - required: true + required: true, + trim: true }, - prenom:{ + prenom: { type: String, - required: true + required: true, + trim: true }, - ecole_id: { - type: mongoose.Schema.Types.ObjectId, - ref: 'Ecole', - required: true + pseudo: { + type: String, + unique: true, + sparse: true, + trim: true + }, + email: { + type: String, + required: true, + unique: true, + lowercase: true, + trim: true }, password: { type: String, required: true }, - niveau:{ + niveau: { type: Number, + default: 1, + min: 1, + max: 100 }, - email:{ - type: String, + logo: { + type: String // chemin vers l’image (ex: "uploads/logos/1712779851517.png") + }, + ecole_id: { + type: mongoose.Schema.Types.ObjectId, + ref: 'Ecole', required: true }, -}, {timestamps: true } // à chaque modif y a la date - -); - -const Joueur = mongoose.model("Joueur", joueurSchema); //creation d'une collection Local basé sur le modèle localSchema, chaque local suit le modele -//moongose prend le nom des collection avec Maj et sg --> locals -export default Joueur; + team_id: { + type: mongoose.Schema.Types.ObjectId, + ref: 'Team' // à créer plus tard + } +}, { timestamps: true }); +// Hash automatique du mot de passe avant sauvegarde joueurSchema.pre('save', async function (next) { if (!this.isModified('password')) return next(); const salt = await bcrypt.genSalt(10); this.password = await bcrypt.hash(this.password, salt); next(); -}); \ No newline at end of file +}); + +const Joueur = mongoose.model("Joueur", joueurSchema); +export default Joueur; diff --git a/api_backend/routes/user.route.js b/api_backend/routes/user.route.js index c015ebbe87..52974cdbac 100644 --- a/api_backend/routes/user.route.js +++ b/api_backend/routes/user.route.js @@ -1,7 +1,7 @@ // routes/user.route.js import dotenv from 'dotenv'; import express from 'express'; -import bcrypt from 'bcrypt'; // module qui permet de hasher le mot de passe +import bcrypt from 'bcrypt'; import jwt from 'jsonwebtoken'; import Joueur from '../models/joueur.model.js'; import multer from 'multer'; @@ -12,49 +12,60 @@ import auth from '../middleware/auth.js'; const router = express.Router(); dotenv.config(); -// Configuration pour multer (upload des fichiers) +// Multer config pour les logos const storage = multer.diskStorage({ destination: (req, file, cb) => { - cb(null, './uploads/logos'); // Dossier pour stocker les logos + cb(null, './uploads/logos'); }, filename: (req, file, cb) => { cb(null, Date.now() + path.extname(file.originalname)); } }); -const upload = multer({ storage: storage }); +const upload = multer({ storage }); -// Route pour obtenir les données de profil + + +// 🔒 GET Profil router.get('/profile', auth, async (req, res) => { try { - console.log("→ Accès à /profile avec :", req.joueur); - res.status(200).json(req.joueur); + const joueur = req.joueur; + res.status(200).json(joueur); } catch (error) { console.error(error); res.status(500).json({ message: 'Erreur serveur.' }); } }); +// 🔄 PUT Mise à jour +router.put('/update', auth, upload.single('logo'), async (req, res) => { + const { pseudo, password, niveau, team_id } = req.body; + const updateData = {}; -// Route pour mettre à jour les informations de l'utilisateur -router.put('/update', auth, upload.single('logo'), async (req, res) => { - const { pseudo, password, niveau } = req.body; - let updateData = { pseudo, niveau }; + if (pseudo) updateData.pseudo = pseudo; + if (niveau) updateData.niveau = niveau; + if (team_id) updateData.team_id = team_id; - // Si le mot de passe est modifié, on le hash if (password) { const hashedPassword = await bcrypt.hash(password, 10); updateData.password = hashedPassword; } - // Si un logo est téléchargé, on l'ajoute aux données de l'utilisateur if (req.file) { - updateData.logo = req.file.path; // Stocke le chemin du fichier + updateData.logo = req.file.filename; // au lieu de req.file.path + } try { - const joueur = await Joueur.findByIdAndUpdate(req.userId, updateData, { new: true }); + const joueur = await Joueur.findByIdAndUpdate( + req.joueur._id, + updateData, + { new: true } + ) + .populate('ecole_id') + .populate('team_id'); + res.status(200).json(joueur); } catch (error) { console.error(error); @@ -62,27 +73,21 @@ router.put('/update', auth, upload.single('logo'), async (req, res) => { } }); - +// 🆕 POST Inscription router.post('/register', async (req, res) => { const { nom, prenom, email, password, ecole_id, niveau } = req.body; try { - // Vérifie si l'email existe déjà const joueurExist = await Joueur.findOne({ email }); if (joueurExist) { return res.status(400).json({ message: "Email déjà utilisé." }); } - // Hash du mot de passe - const salt = await bcrypt.genSalt(10); - const hashedPassword = await bcrypt.hash(password, salt); - - // Création du joueur const nouveauJoueur = new Joueur({ nom, prenom, email, - password: hashedPassword, // <- important + password, // pas de hash ici ecole_id, niveau }); @@ -96,6 +101,8 @@ router.post('/register', async (req, res) => { } }); + +// 🔐 POST Connexion router.post('/login', async (req, res) => { const { email, password } = req.body; @@ -110,9 +117,22 @@ router.post('/login', async (req, res) => { return res.status(400).json({ message: "Mot de passe incorrect." }); } - const token = jwt.sign({ id: joueur._id },process.env.JWT_SECRET,{ expiresIn: '1h' }); + const token = jwt.sign({ id: joueur._id }, process.env.JWT_SECRET, { expiresIn: '1h' }); + + res.status(200).json({ token, + joueur: { + id: joueur._id, + nom: joueur.nom, + prenom: joueur.prenom, + email: joueur.email, + niveau: joueur.niveau, + pseudo: joueur.pseudo, + team_id: joueur.team_id, + logo: joueur.logo, + ecole_id: joueur.ecole_id, + } + }); - res.status(200).json({ token }); } catch (err) { console.error(err); res.status(500).json({ message: "Erreur serveur pendant la connexion." }); diff --git a/api_backend/server.js b/api_backend/server.js index 63fa05cffb..bf4fb8ad2b 100644 --- a/api_backend/server.js +++ b/api_backend/server.js @@ -1,31 +1,36 @@ -import express from "express" //version js const express = require('express'); -import dotenv from "dotenv"; -import { connectDB } from "../config/db.js"; - -//import routesLocal from "../routes/routes.local.js"; -import userRoutes from './routes/user.route.js' +import express from 'express'; +import dotenv from 'dotenv'; +import { connectDB } from '../config/db.js'; +import userRoutes from './routes/user.route.js'; import ecoleRoutes from './routes/ecoles.route.js'; - - -import cors from 'cors' +import cors from 'cors'; +import path from 'path'; +import { fileURLToPath } from 'url'; // Importation de fileURLToPath pour obtenir __dirname dotenv.config(); const app = express(); const PORT = process.env.PORT || 5000; -app.use(cors({origin: 'http://localhost:5173'})); +// Utiliser fileURLToPath pour obtenir __dirname +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); -app.use(express.json()); //permet d'accepeter du JSOn dans le req.body +// CORS configuration +app.use(cors({ origin: 'http://localhost:5173' })); -app.use("/api/user", userRoutes); -app.use('/api/ecoles', ecoleRoutes); +// Middleware pour analyser les JSON +app.use(express.json()); -//app.use("/api/locals", routesLocal); //origine des routes pour les locaux +// Servir les fichiers statiques dans 'uploads' +app.use('/uploads', express.static(path.join(__dirname, 'uploads'))); +// Routes +app.use('/api/user', userRoutes); +app.use('/api/ecoles', ecoleRoutes); +// Lancer le serveur app.listen(PORT, () => { connectDB(); - console.log("serveur lancé sur http://localhost:"+PORT); - -}); \ No newline at end of file + console.log(`Serveur lancé sur http://localhost:${PORT}`); +}); diff --git a/uploads/logos/1744396974925.jpg b/uploads/logos/1744396974925.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c09456c362c3bcf71c94e1d76bcf790eef319e47 GIT binary patch literal 26121 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 literal 0 HcmV?d00001 diff --git a/web_frontend/src/components/registerForm.jsx b/web_frontend/src/components/registerForm.jsx index 08ea27d7a4..671c4995af 100644 --- a/web_frontend/src/components/registerForm.jsx +++ b/web_frontend/src/components/registerForm.jsx @@ -1,5 +1,6 @@ import React, { useEffect, useState } from 'react'; import axios from 'axios'; +import '../css/RegisterForm.css'; // Assure-toi que le chemin d'importation correspond à l'emplacement de ton fichier CSS import { useNavigate } from 'react-router-dom'; diff --git a/web_frontend/src/css/compte.css b/web_frontend/src/css/compte.css new file mode 100644 index 0000000000..b184b7706c --- /dev/null +++ b/web_frontend/src/css/compte.css @@ -0,0 +1,111 @@ +/* Style global pour la page */ +.compte-container { + display: flex; + flex-direction: column; + align-items: center; + padding: 30px; + background-color: #e9d9d9; /* Fond de la page */ + min-height: 100vh; +} + +/* Section de présentation du profil */ +.profile-header { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + text-align: center; + margin-bottom: 30px; +} + +.profile-header h2 { + color: #382c2c; /* Couleur du titre */ + font-size: 2rem; + font-weight: bold; +} + +.profile-header .profile-image { + position: relative; + width: 120px; + height: 120px; + margin-bottom: 20px; + border-radius: 50%; + overflow: hidden; + border: 3px solid #8d695d; /* Contour du logo */ +} + +.profile-header .profile-image img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.profile-info { + font-size: 1rem; + color: #382c2c; + margin-bottom: 20px; + text-align: center; +} + +.profile-info p { + margin: 8px 0; +} + +.profile-info strong { + color: #52130c; /* Couleur de survol */ +} + +button { + background-color: #8f8360; + color: #fff; + border: none; + padding: 10px 20px; + border-radius: 5px; + cursor: pointer; + transition: background-color 0.3s; + margin-top: 10px; +} + +button:hover { + background-color: #52130c; /* Changer la couleur au survol */ +} + +/* Formulaire de modification */ +form { + background-color: #fff; + padding: 20px; + border-radius: 10px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + width: 100%; + max-width: 500px; + margin-top: 30px; +} + +form h3 { + color: #382c2c; + margin-bottom: 20px; +} + +form input { + width: 100%; + padding: 10px; + margin-bottom: 10px; + border-radius: 5px; + border: 1px solid #8d695d; + font-size: 1rem; +} + +form input[type="file"] { + padding: 5px; +} + +form button { + background-color: #52130c; + padding: 12px 25px; + width: 100%; + font-size: 1.1rem; +} + +form button:hover { + background-color: #8f8360; +} diff --git a/web_frontend/src/css/registerForm.css b/web_frontend/src/css/registerForm.css new file mode 100644 index 0000000000..c0fce74cb6 --- /dev/null +++ b/web_frontend/src/css/registerForm.css @@ -0,0 +1,81 @@ +/* Styles généraux */ +body { + background-color: #e9d9d9; + font-family: Arial, sans-serif; + margin: 0; + padding: 0; +} + +form { + width: 300px; + margin: 50px auto; + background-color: #fff; + padding: 20px; + border-radius: 8px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); +} + +h2 { + color: #382c2c; + text-align: center; + font-size: 24px; + margin-bottom: 20px; +} + +/* Champs de formulaire */ +input, select, button { + width: 100%; + padding: 10px; + margin: 10px 0; + border: 1px solid #8d695d; + border-radius: 4px; + box-sizing: border-box; +} + +input[type="text"], input[type="email"], input[type="password"], input[type="number"], select { + background-color: #f9f9f9; + color: #382c2c; +} + +button { + background-color: #8d695d; + color: #fff; + border: none; + cursor: pointer; + transition: background-color 0.3s ease; +} + +button:hover { + background-color: #52130c; +} + +/* Effets de survol */ +input:hover, select:hover { + border-color: #52130c; +} + +button[type="button"] { + background-color: transparent; + border: 1px solid #52130c; + margin-top: 10px; + color: black +} + +button[type="button"]:hover { + background-color: #52130c; + color: #fff; +} + +/* Ajouter un léger effet de relief */ +input:focus, select:focus { + border-color: #8f8360; + outline: none; +} + +/* Disposition de la page */ +.container { + display: flex; + justify-content: center; + align-items: center; + height: 100vh; +} diff --git a/web_frontend/src/pages/accountPage.jsx b/web_frontend/src/pages/accountPage.jsx index a72c9eca2f..387c0b279b 100644 --- a/web_frontend/src/pages/accountPage.jsx +++ b/web_frontend/src/pages/accountPage.jsx @@ -16,7 +16,12 @@ function AccountPage() { useEffect(() => { // Récupérer les données de l'utilisateur connecté const fetchUserData = async () => { - const res = await axios.get('http://localhost:5000/api/user/profile'); // Assure-toi que cette route est disponible côté backend + const token = localStorage.getItem('token'); + const res = await axios.get('http://localhost:5000/api/user/profile', { + headers: { + 'Authorization': `Bearer ${token}` + } + }); setUserData(res.data); }; fetchUserData(); @@ -31,14 +36,20 @@ function AccountPage() { formData.append('logo', newLogo); formData.append('password', newPassword || userData.password); + const token = localStorage.getItem('token'); + const response = await axios.put('http://localhost:5000/api/user/update', formData, { headers: { - 'Content-Type': 'multipart/form-data' + 'Content-Type': 'multipart/form-data', + 'Authorization': `Bearer ${token}` } }); + alert('Informations mises à jour avec succès !'); setUserData(response.data); // Met à jour l’état avec les nouvelles données de l'utilisateur + console.log("Mise à jour réussie, données :", response.data); + } catch (error) { console.error('Erreur lors de la mise à jour du profil', error); alert('Erreur lors de la mise à jour du profil.'); diff --git a/web_frontend/src/pages/compte.jsx b/web_frontend/src/pages/compte.jsx index 1b016f27f4..7a8856aeb1 100644 --- a/web_frontend/src/pages/compte.jsx +++ b/web_frontend/src/pages/compte.jsx @@ -1,72 +1,61 @@ import React, { useEffect, useState } from 'react'; import axios from 'axios'; +import '../css/Compte.css'; // Import du fichier CSS + import { useNavigate } from 'react-router-dom'; function Compte() { const [joueur, setJoueur] = useState(null); + const [formData, setFormData] = useState({ + pseudo: '', + password: '', + niveau: '' + }); + const [logoFile, setLogoFile] = useState(null); + const [editing, setEditing] = useState(false); // pour afficher/masquer les champs modifiables + const [showLogoInput, setShowLogoInput] = useState(false); // pour afficher/masquer l'input du logo const navigate = useNavigate(); useEffect(() => { - const fetchData = async () => { + const fetchProfile = async () => { const token = localStorage.getItem('token'); - console.log("Token récupéré :", token); - - if (!token) { - navigate('/login'); - return; - } - try { - const res = await axios.get('http://localhost:5000/api/user/profile', { - headers: { - Authorization: `Bearer ${token}` - } + const response = await axios.get('http://localhost:5000/api/user/profile', { + headers: { 'Authorization': `Bearer ${token}` } }); - console.log("Réponse serveur :", res.data); - setJoueur(res.data); + setJoueur(response.data); } catch (err) { - console.error("Erreur lors de la récupération du profil :", err); - localStorage.removeItem('token'); - navigate('/login'); + console.error('Erreur lors du chargement du profil :', err); } }; - - fetchData(); + fetchProfile(); }, [navigate]); - const handleLogout = () => { localStorage.removeItem('token'); navigate('/login'); }; - const [formData, setFormData] = useState({ - pseudo: '', - password: '', - niveau: '' - }); - const [logoFile, setLogoFile] = useState(null); - const handleChange = (e) => { setFormData({ ...formData, [e.target.name]: e.target.value }); }; - + const handleFileChange = (e) => { setLogoFile(e.target.files[0]); }; - + const handleSubmit = async (e) => { e.preventDefault(); const token = localStorage.getItem('token'); const form = new FormData(); - + form.append('pseudo', formData.pseudo); form.append('password', formData.password); form.append('niveau', formData.niveau); if (logoFile) { form.append('logo', logoFile); } - + try { const res = await axios.put('http://localhost:5000/api/user/update', form, { headers: { @@ -81,40 +70,83 @@ function Compte() { alert('Erreur lors de la mise à jour'); } }; - if (!joueur) return

Chargement du profil...

; return ( -
-

Mon Compte

-

Nom : {joueur.nom}

-

Prénom : {joueur.prenom}

-

Email : {joueur.email}

-

Niveau : {joueur.niveau}

-

École : {joueur.ecole_id?.nom || 'Non défini'}

- -
-

Modifier mon profil

+
+ {/* Header du profil */} +
+
+ {joueur.logo ? ( + Logo + ) : ( + Logo par défaut + )} +
- -
+

Mon Compte

+
- -
+ {/* Informations de l'utilisateur */} +
+

Nom : {joueur.nom || 'Ajouter le nom'}

+

Prénom : {joueur.prenom || 'Ajouter le prénom'}

+

Email : {joueur.email || 'Ajouter l\'email'}

+

Niveau : {joueur.niveau || 'Ajouter le niveau'}

+

École : {joueur.ecole_id?.nom || 'Ajouter l\'école'}

+
- -
+ {/* Bouton de modification et formulaire */} +
+ + {editing && ( + +

Modifier mon profil

- -
- - - + + + + + + + + + + + )} +

+ ); } From ff6c7fc49607aa35df38671a190fe0b87aa62fed Mon Sep 17 00:00:00 2001 From: Hassan-mumu Date: Tue, 22 Apr 2025 08:44:09 +0200 Subject: [PATCH 13/22] =?UTF-8?q?update=20db=20joueur,=20update=20route=20?= =?UTF-8?q?pour=20authentification,=20ajout=20de=20verification=20par=20em?= =?UTF-8?q?ail,=20ajout=20de=20reinitialisation=20du=20mot=20de=20passe=20?= =?UTF-8?q?oubli=C3=A9,=20update=20des=20pages=20login,=20signup,=20dashbo?= =?UTF-8?q?ard=20avec=20tailwindcss,=20reorganisation=20du=20code,=20gesti?= =?UTF-8?q?on=20des=20erreurs,=20ajout=20s=C3=A9curisation=20force=20de=20?= =?UTF-8?q?mot=20de=20passe,=20protection=20des=20routes=20via=20redirecti?= =?UTF-8?q?on,=20authentification=20requise=20pour=20chaque=20page,=20stoc?= =?UTF-8?q?kage=20des=20logo=20dans=20cloudinary,=20update=20importation?= =?UTF-8?q?=20logo=20fonctionnel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api_backend/cloudinary/cloudinary.js | 12 + api_backend/controllers/auth.controller.js | 242 +++ api_backend/mailtrap/emailTemplates.js | 95 + api_backend/mailtrap/emails.js | 82 + api_backend/mailtrap/mailtrap.config.js | 15 + api_backend/middleware/verifyToken.js | 19 + .../models/{joueur.model.js => user.model.js} | 40 +- api_backend/routes/auth.route.js | 17 + api_backend/routes/user.route.js | 5 - api_backend/server.js | 26 +- .../utils/generateTokenAndSetCookie.js | 16 + config/db.js | 1 - package-lock.json | 1222 ++++++++++- package.json | 14 +- uploads/logos/1744396974925.jpg | Bin 26121 -> 0 bytes web_frontend/README.md | 6 +- web_frontend/index.html | 2 +- web_frontend/package-lock.json | 1901 +++++++++-------- web_frontend/package.json | 23 +- web_frontend/public/avatar.png | Bin 0 -> 29733 bytes web_frontend/public/default-logo.png | Bin 58847 -> 0 bytes web_frontend/src/App.css | 43 +- web_frontend/src/App.jsx | 110 +- web_frontend/src/assets/react.svg | 1 - web_frontend/src/bck.App.jsx | 35 - web_frontend/src/components/FloatingShape.jsx | 26 + web_frontend/src/components/Input.jsx | 14 + .../src/components/LoadingSpinner.jsx | 17 + .../src/components/PasswordStrengthMeter.jsx | 76 + web_frontend/src/components/loginForm.jsx | 55 - web_frontend/src/components/registerForm.jsx | 135 -- web_frontend/src/css/compte.css | 111 - web_frontend/src/css/registerForm.css | 81 - web_frontend/src/index.css | 69 +- web_frontend/src/main.jsx | 5 +- web_frontend/src/pages/DashboardPage.jsx | 158 ++ .../src/pages/EmailVerificationPage.jsx | 108 + web_frontend/src/pages/ForgotPasswordPage.jsx | 81 + web_frontend/src/pages/ResetPasswordPage.jsx | 84 + web_frontend/src/pages/SignUpPage.jsx | 111 + web_frontend/src/pages/accountPage.jsx | 97 - web_frontend/src/pages/compte.jsx | 153 -- web_frontend/src/pages/home.jsx | 58 - web_frontend/src/pages/image.jsx | 22 - web_frontend/src/pages/login.jsx | 12 - web_frontend/src/pages/loginPage.jsx | 82 + web_frontend/src/pages/register.jsx | 12 - web_frontend/src/store/authStore.js | 116 + web_frontend/src/utils/date.js | 15 + web_frontend/vite.config.js | 7 +- 50 files changed, 3779 insertions(+), 1853 deletions(-) create mode 100644 api_backend/cloudinary/cloudinary.js create mode 100644 api_backend/controllers/auth.controller.js create mode 100644 api_backend/mailtrap/emailTemplates.js create mode 100644 api_backend/mailtrap/emails.js create mode 100644 api_backend/mailtrap/mailtrap.config.js create mode 100644 api_backend/middleware/verifyToken.js rename api_backend/models/{joueur.model.js => user.model.js} (57%) create mode 100644 api_backend/routes/auth.route.js create mode 100644 api_backend/utils/generateTokenAndSetCookie.js delete mode 100644 uploads/logos/1744396974925.jpg create mode 100644 web_frontend/public/avatar.png delete mode 100644 web_frontend/public/default-logo.png delete mode 100644 web_frontend/src/assets/react.svg delete mode 100644 web_frontend/src/bck.App.jsx create mode 100644 web_frontend/src/components/FloatingShape.jsx create mode 100644 web_frontend/src/components/Input.jsx create mode 100644 web_frontend/src/components/LoadingSpinner.jsx create mode 100644 web_frontend/src/components/PasswordStrengthMeter.jsx delete mode 100644 web_frontend/src/components/loginForm.jsx delete mode 100644 web_frontend/src/components/registerForm.jsx delete mode 100644 web_frontend/src/css/compte.css delete mode 100644 web_frontend/src/css/registerForm.css create mode 100644 web_frontend/src/pages/DashboardPage.jsx create mode 100644 web_frontend/src/pages/EmailVerificationPage.jsx create mode 100644 web_frontend/src/pages/ForgotPasswordPage.jsx create mode 100644 web_frontend/src/pages/ResetPasswordPage.jsx create mode 100644 web_frontend/src/pages/SignUpPage.jsx delete mode 100644 web_frontend/src/pages/accountPage.jsx delete mode 100644 web_frontend/src/pages/compte.jsx delete mode 100644 web_frontend/src/pages/home.jsx delete mode 100644 web_frontend/src/pages/image.jsx delete mode 100644 web_frontend/src/pages/login.jsx create mode 100644 web_frontend/src/pages/loginPage.jsx delete mode 100644 web_frontend/src/pages/register.jsx create mode 100644 web_frontend/src/store/authStore.js create mode 100644 web_frontend/src/utils/date.js diff --git a/api_backend/cloudinary/cloudinary.js b/api_backend/cloudinary/cloudinary.js new file mode 100644 index 0000000000..e86e9ff3f8 --- /dev/null +++ b/api_backend/cloudinary/cloudinary.js @@ -0,0 +1,12 @@ +import {v2 as cloudinary} from 'cloudinary' +import {config} from 'dotenv' + +config() + +cloudinary.config({ + cloud_name: process.env.CLOUDINARY_CLOUD_NAME, + api_key: process.env.CLOUDINARY_API_KEY, + api_secret: process.env.CLOUDINARY_API_SECRET +}) +export default cloudinary + diff --git a/api_backend/controllers/auth.controller.js b/api_backend/controllers/auth.controller.js new file mode 100644 index 0000000000..045244843d --- /dev/null +++ b/api_backend/controllers/auth.controller.js @@ -0,0 +1,242 @@ +import bcrypt from 'bcryptjs'; +import crypto from 'crypto'; + +import { User } from "../models/user.model.js"; +import { generateTokenAndSetCookie} from '../utils/generateTokenAndSetCookie.js'; +import { sendPasswordResetRequest, + sendResetSuccessEmail, + sendWelcomeEmail, + sendVerificationEmail } from "../mailtrap/emails.js"; + +import cloudinary from '../cloudinary/cloudinary.js'; +import { console } from 'inspector/promises'; + +export const checkAuth = async (req, res) => { + try { + const user = await User.findById(req.userId).select("-password"); // On récupère l'user de la DB + if (!user){ + return res.status(400).json({success:false, message:"User not found"}); + } + res.status(200).json({success:true, user}); // On envoie l'user comme réponse + } catch (error) { + console.log("Error in checkAuth ", error); + res.status(400).json({success:false, message: error.message}); + } + +} + +export const signup = async (req, res) => { + const {lName, fName,pseudo, email, password} = req.body; + try { + + // les champs requis doivent etre entrée + if(!lName, !fName, !pseudo, !email, !password){ + throw new Error("All fields are required") + } + + // Error si l'email existe déja dans la db + const userAlreadyExists = await User.findOne({email}); + console.log("userAlreadyExists", userAlreadyExists) + if (userAlreadyExists){ + return res.status(400).json({sucess:false, message: "User already exists"}); + } + + const pseudoAlreadyExists = await User.findOne({pseudo}); + console.log("pseudoAlreadyExists", pseudoAlreadyExists) + if (pseudoAlreadyExists){ + return res.status(400).json({sucess:false, message: "pseudo already exists"}); + } + + // permet de hashé le mot de passe pour qu'il ne soit pas stocké une fois enregistré + const hashedPassword = await bcrypt.hash(password, 12); + + // generation d'un Token random pour l'authentification + const verificationToken = Math.floor(100000 + Math.random() * 900000 );toString(); + const user = new User({ + lName, + fName, + pseudo, + email, + password: hashedPassword, + verificationToken, + verificationTokenExpiresAt: Date.now() + 24 * 60 * 60 * 1000 // 24 heures + }) + + // sauvegarde dans la db + await user.save(); + + //jwt + generateTokenAndSetCookie(res, user._id); + + await sendVerificationEmail(user.email, verificationToken); + + res.status(201).json({ + sucess: true, + message: "User created successfully", + user: { + ...user._doc, + password: undefined // empèche le client de voire le mot de passe en le supprimant de la réponse + } + }) + + } catch (error) { + return res.status(400).json({sucess:false, message: error.message}); + } +} + +export const verifyEmail = async (req, res) => { + const {code} = req.body; + try { + const user = await User.findOne({ + // s'assure qu'il y a un utilisateur avec ce Token et que le token n'est pas expiré + + verificationToken: code, + verificationTokenExpiresAt: { $gt: Date.now()} + }) + if (!user){ + return res.status(400).json({sucess:false, message: "Invalid or expired verification code"}) + } + + user.isVerified = true; + user.verificationToken = undefined; + user.verificationTokenExpiresAt = undefined; + await user.save(); + + await sendWelcomeEmail(user.email, user.fName); + res.status(200).json({sucess:true, + message:"Email verified successfully", + user: { + ...user._doc, + password: undefined + } + }) + } catch (error) { + console.log("Error in verifyEmail ", error) + res.status(500).json({success:false, message: "Server error"}) + } +} + +export const login = async (req, res) => { + const {email, password} = req.body; + try { + const user = await User.findOne({email}); + if (!user){ + return res.status(400).json({sucess:false, message:"Invalid credentials"}) + } + + const ispasswordValid = await bcrypt.compare(password, user.password); + if (!ispasswordValid){ + return res.status(400).json({sucess:false, message:"Invalid password"}) + } + + generateTokenAndSetCookie(res, user._id); + user.lastLogin = new Date(); + await user.save(); + + res.status(200).json({ + success:true, + message: "Logged in sucessfully", + user: { + ...user._doc, + password: undefined, + } + + }) + } + catch (error) { + console.log("Error in login, ", error) + return res.status(400).json({sucess:false, message: error.message}); + } +} + +export const logout = async (req, res) => { + res.clearCookie("token"); + res.status(200).json({success: true, message: "Logged out successfully" }); +} + +export const forgotPassword = async (req, res) => { + const {email} = req.body; + try { + const user = await User.findOne({email}); + if (!user){ + return res.status(400).json({success:false, message:"Email does not exist"}) + } + + // génère un nouveau token pour le reset du mot de passe + const resetToken = crypto.randomBytes(20).toString("hex"); + + user.resetPasswordToken = resetToken; + user.resetPasswordExpiresAt = Date.now() + 1 * 60 * 60 * 1000; //1 heure + + await user.save(); + + // envoie de l'email + await sendPasswordResetRequest(user.email, `${process.env.CLIENT_URL}/resetPassword/${resetToken}`); + res.status(200).json({success: true, message: "password reset link sent to your email" }); + + } catch (error) { + console.log("Error in forgotPassword ", error); + res.status(400).json({sucess: false, message: error.message}); + + } +} + +export const resetPassword = async (req, res) => { + try { + const {token} = req.params; + const {password} = req.body; + + const user = await User.findOne({ + resetPasswordToken: token, + resetPasswordExpiresAt: {$gt: Date.now()}, + }); + + if (!user){ + return res.status(400).json({success: false, message: "invalid or expired reset token"}) + } + + // Nouveau mot de passe récupéré sera haché à nouveau + const hashedPassword = await bcrypt.hash(password,10); + + user.password = hashedPassword + user.resetPasswordToken = undefined + user.resetPasswordExpiresAt = undefined + await user.save(); + + await sendResetSuccessEmail(user.email) + + res.status(200).json({success:true, message:"Password reset successful"}) + } catch (error) { + console.log("Error in resetPassword ", error) + res.status(400).json({success:false, message:error.message}) + + } + +} + +export const updatePic = async (req, res) => { + try { + const user = await User.findById(req.userId).select("-password"); // On récupère l'user de la DB + if (!user){ + return res.status(400).json({success:false, message:"User not found"}); + } + + const {profilePic} = req.body + console.log("Données envoyées:", profilePic); + + if(!profilePic){ + return res.status(400).json({success:false, message:"Profile picture is required"}) + } + const uploadResponse = await cloudinary.uploader.upload(profilePic, { + resource_type: "auto" + }); + const updatedUser = await User.findByIdAndUpdate(user._id, {logo: uploadResponse.secure_url}, {new:true}) + + res.status(200).json({success:true, user:updatedUser}) + + } catch (error) { + console.log("error in update profile: ", error) + res.status(500).json({success:false, message:"Internal server error"}) + + } +} \ No newline at end of file diff --git a/api_backend/mailtrap/emailTemplates.js b/api_backend/mailtrap/emailTemplates.js new file mode 100644 index 0000000000..4282bbd450 --- /dev/null +++ b/api_backend/mailtrap/emailTemplates.js @@ -0,0 +1,95 @@ +export const VERIFICATION_EMAIL_TEMPLATE = ` + + + + + + Verify Your Email + + +
+

Verify Your Email

+
+
+

Hello,

+

Thank you for signing up! Your verification code is:

+
+ {verificationCode} +
+

Enter this code on the verification page to complete your registration.

+

This code will expire in 15 minutes for security reasons.

+

If you didn't create an account with us, please ignore this email.

+

Best regards,
Your App Team

+
+
+

This is an automated message, please do not reply to this email.

+
+ + +`; + +export const PASSWORD_RESET_SUCCESS_TEMPLATE = ` + + + + + + Password Reset Successful + + +
+

Password Reset Successful

+
+
+

Hello,

+

We're writing to confirm that your password has been successfully reset.

+
+
+ ✓ +
+
+

If you did not initiate this password reset, please contact our support team immediately.

+

For security reasons, we recommend that you:

+
    +
  • Use a strong, unique password
  • +
  • Enable two-factor authentication if available
  • +
  • Avoid using the same password across multiple sites
  • +
+

Thank you for helping us keep your account secure.

+

Best regards,
Your App Team

+
+
+

This is an automated message, please do not reply to this email.

+
+ + +`; + +export const PASSWORD_RESET_REQUEST_TEMPLATE = ` + + + + + + Reset Your Password + + +
+

Password Reset

+
+
+
+

This is an automated message, please do not reply to this email.

+
+ + +`; \ No newline at end of file diff --git a/api_backend/mailtrap/emails.js b/api_backend/mailtrap/emails.js new file mode 100644 index 0000000000..43238fd790 --- /dev/null +++ b/api_backend/mailtrap/emails.js @@ -0,0 +1,82 @@ +import { mailtrapClient, sender } from "./mailtrap.config.js" +import {VERIFICATION_EMAIL_TEMPLATE,PASSWORD_RESET_SUCCESS_TEMPLATE, PASSWORD_RESET_REQUEST_TEMPLATE} from './emailTemplates.js' + +export const sendVerificationEmail = async (email, verificationToken) => { + const recipient = [{email}] + + try { + const response = await mailtrapClient.send({ + from: sender, + to: recipient, + subject: "Verify your email", + html: VERIFICATION_EMAIL_TEMPLATE.replace("{verificationCode}",verificationToken), + category: "Email Verfification" + }) + console.log("Email verification sent succefffully", response) + } + catch (error) { + console.log("Error sending verification email: ", error) + throw new Error('Error sending verification email: ',error) + + } +} + +export const sendWelcomeEmail = async (email, name) => { + const recipient = [{email}]; + + try { + const response = await mailtrapClient.send({ + from: sender, + to: recipient, + template_uuid: "5ec20a13-7c21-426a-8b16-e5da36e9d38f", + template_variables: { + company_info_name: "Lan-Party Ephec Company", + name: name + }, + }) + console.log("Welcome email sent successfully : ", response) + } catch (error) { + console.log("Error sending welcome email : ", error); + throw new Error('Error sending welcome email: ', error); + } + +} + +export const sendPasswordResetRequest = async (email, resetURL) => { + const recipient = [{email}] + + try { + const response = await mailtrapClient.send({ + from: sender, + to: recipient, + subject: "Reset your password", + html: PASSWORD_RESET_REQUEST_TEMPLATE.replace("{resetURL}", resetURL), + category: "Password Reset" + }) + console.log("Password reset successfully : ", response) + + } catch (error) { + console.log("Error sending resset password email: ", error); + throw new Error('Error sending resset password email: ', error); + } +} + +export const sendResetSuccessEmail = async (email) => { + const recipient = [{email}]; + + try { + const response = await mailtrapClient.send({ + from: sender, + to: recipient, + subject:"Email Password successfull", + html: PASSWORD_RESET_SUCCESS_TEMPLATE, + category:"Password Reset Successful" + + }) + console.log("Email password success reset sent successful ", response) + } catch (error) { + console.log("Error sending email password sucess reset: ", error); + throw new Error('Error sending email password sucess reset: ', error); + + } +} \ No newline at end of file diff --git a/api_backend/mailtrap/mailtrap.config.js b/api_backend/mailtrap/mailtrap.config.js new file mode 100644 index 0000000000..af08dce19a --- /dev/null +++ b/api_backend/mailtrap/mailtrap.config.js @@ -0,0 +1,15 @@ +import { MailtrapClient } from "mailtrap"; +import dotenv from "dotenv"; + +dotenv.config(); + +export const mailtrapClient = new MailtrapClient({ + endpoint: process.env.MAILTRAP_ENDPOINT, + token: process.env.MAILTRAP_TOKEN + }); + +export const sender = { + email: "hello@demomailtrap.co", + name: "Hassan", +}; + diff --git a/api_backend/middleware/verifyToken.js b/api_backend/middleware/verifyToken.js new file mode 100644 index 0000000000..d1fbee8735 --- /dev/null +++ b/api_backend/middleware/verifyToken.js @@ -0,0 +1,19 @@ +import jwt from 'jsonwebtoken'; + +export const verifyToken = (req, res, next) => { // next permet de passer à la fonction suivant de la fonction qui l'a appelé ici "checkAuth" + + const token = req.cookies.token // récupération du token dans les cookies + if (!token) return res.status(401).json({success:false, message:"Unauthorized- no token provided"}); + try { + const decoded = jwt.verify(token, process.env.JWT_SECRET); // On utilise le meme secret qui à permit de créer le token pour vérifier si il est bon + + if(!decoded) return res.status(401).json({success:false, message:'Unauthorized- invalid token'}); + + req.userId = decoded.userId; // on donne l'id du user qui correspond à ce token décodé à la page + next(); // on passe alors à la fonction suivante qui est "checkAuth" + } catch (error) { + console.log("Error in verifyToken ", error); + return res.status(500).json({ success: false, message:`server error: ${error}`}) + + } +} \ No newline at end of file diff --git a/api_backend/models/joueur.model.js b/api_backend/models/user.model.js similarity index 57% rename from api_backend/models/joueur.model.js rename to api_backend/models/user.model.js index 5f8510225b..0e8f2683e1 100644 --- a/api_backend/models/joueur.model.js +++ b/api_backend/models/user.model.js @@ -1,20 +1,21 @@ import mongoose from 'mongoose'; -import bcrypt from 'bcrypt'; -const joueurSchema = new mongoose.Schema({ - nom: { +const userSchema = new mongoose.Schema({ + lName: { type: String, required: true, trim: true }, - prenom: { + fName: { type: String, required: true, trim: true }, pseudo: { type: String, - unique: true, + default: null, + unique:true, + require: true, sparse: true, trim: true }, @@ -36,26 +37,31 @@ const joueurSchema = new mongoose.Schema({ max: 100 }, logo: { - type: String // chemin vers l’image (ex: "uploads/logos/1712779851517.png") + type: String, + defaul: "" }, ecole_id: { type: mongoose.Schema.Types.ObjectId, ref: 'Ecole', - required: true }, team_id: { type: mongoose.Schema.Types.ObjectId, ref: 'Team' // à créer plus tard - } + }, + lastLogin:{ + type: Date, + default: Date.now + }, + isVerified: { + type: Boolean, + default: false + }, + resetPasswordToken: String, + resetPasswordExpiresAt: Date, + verificationToken: String, + verificationTokenExpiresAt: Date, + }, { timestamps: true }); -// Hash automatique du mot de passe avant sauvegarde -joueurSchema.pre('save', async function (next) { - if (!this.isModified('password')) return next(); - const salt = await bcrypt.genSalt(10); - this.password = await bcrypt.hash(this.password, salt); - next(); -}); +export const User = mongoose.model("Joueur", userSchema); -const Joueur = mongoose.model("Joueur", joueurSchema); -export default Joueur; diff --git a/api_backend/routes/auth.route.js b/api_backend/routes/auth.route.js new file mode 100644 index 0000000000..f7196e5e57 --- /dev/null +++ b/api_backend/routes/auth.route.js @@ -0,0 +1,17 @@ +import express from 'express' +import {checkAuth, signup, login, logout, verifyEmail, forgotPassword, resetPassword, updatePic} from '../controllers/auth.controller.js' +import { verifyToken } from '../middleware/verifyToken.js'; +const router = express.Router(); + +router.get("/checkAuth", verifyToken, checkAuth) + +router.put("/updatePic",verifyToken, updatePic) + +router.post("/signup", signup) +router.post("/login",login) +router.post("/logout", logout) +router.post("/verifyEmail", verifyEmail) +router.post("/forgotPassword", forgotPassword) +router.post('/resetPassword/:token', resetPassword) + +export default router \ No newline at end of file diff --git a/api_backend/routes/user.route.js b/api_backend/routes/user.route.js index 52974cdbac..a0ea103668 100644 --- a/api_backend/routes/user.route.js +++ b/api_backend/routes/user.route.js @@ -12,7 +12,6 @@ import auth from '../middleware/auth.js'; const router = express.Router(); dotenv.config(); -// Multer config pour les logos const storage = multer.diskStorage({ destination: (req, file, cb) => { cb(null, './uploads/logos'); @@ -26,7 +25,6 @@ const upload = multer({ storage }); -// 🔒 GET Profil router.get('/profile', auth, async (req, res) => { try { const joueur = req.joueur; @@ -37,7 +35,6 @@ router.get('/profile', auth, async (req, res) => { } }); -// 🔄 PUT Mise à jour router.put('/update', auth, upload.single('logo'), async (req, res) => { const { pseudo, password, niveau, team_id } = req.body; @@ -73,7 +70,6 @@ router.put('/update', auth, upload.single('logo'), async (req, res) => { } }); -// 🆕 POST Inscription router.post('/register', async (req, res) => { const { nom, prenom, email, password, ecole_id, niveau } = req.body; @@ -102,7 +98,6 @@ router.post('/register', async (req, res) => { }); -// 🔐 POST Connexion router.post('/login', async (req, res) => { const { email, password } = req.body; diff --git a/api_backend/server.js b/api_backend/server.js index bf4fb8ad2b..1a5e0c8fd4 100644 --- a/api_backend/server.js +++ b/api_backend/server.js @@ -1,33 +1,27 @@ import express from 'express'; import dotenv from 'dotenv'; -import { connectDB } from '../config/db.js'; -import userRoutes from './routes/user.route.js'; -import ecoleRoutes from './routes/ecoles.route.js'; +import cookieParser from 'cookie-parser'; import cors from 'cors'; import path from 'path'; -import { fileURLToPath } from 'url'; // Importation de fileURLToPath pour obtenir __dirname + +import ecoleRoutes from './routes/ecoles.route.js'; +import authRoutes from './routes/auth.route.js'; +import { connectDB } from '../config/db.js'; dotenv.config(); const app = express(); const PORT = process.env.PORT || 5000; -// Utiliser fileURLToPath pour obtenir __dirname -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); - // CORS configuration -app.use(cors({ origin: 'http://localhost:5173' })); - -// Middleware pour analyser les JSON -app.use(express.json()); +app.use(cors({ origin: 'http://localhost:3000', credentials:true })); -// Servir les fichiers statiques dans 'uploads' -app.use('/uploads', express.static(path.join(__dirname, 'uploads'))); +app.use(express.json()); // Middleware pour analyser les requetes JSON à travers req.body +app.use(cookieParser()); // Middleware pour analyser les cookies // Routes -app.use('/api/user', userRoutes); -app.use('/api/ecoles', ecoleRoutes); +app.use("/api/auth", authRoutes); +app.use("/api/ecoles", ecoleRoutes); // Lancer le serveur app.listen(PORT, () => { diff --git a/api_backend/utils/generateTokenAndSetCookie.js b/api_backend/utils/generateTokenAndSetCookie.js new file mode 100644 index 0000000000..bb72a07190 --- /dev/null +++ b/api_backend/utils/generateTokenAndSetCookie.js @@ -0,0 +1,16 @@ +import jwt from 'jsonwebtoken'; + +export const generateTokenAndSetCookie = (res, userId) => { + const token = jwt.sign({userId}, process.env.JWT_SECRET, { + expiresIn: "7d" + }) + + res.cookie("token", token, { + httpOnly: true, // non accéssible via js, prévient des attaques XSS + secure: process.env.NODE_ENV === "production", + sameSite: "strict", // previent des attaques csrf + maxAge: 7 * 24 * 60 * 60 * 1000, + }); + + return token +} diff --git a/config/db.js b/config/db.js index 01cfda7490..da2cf87295 100644 --- a/config/db.js +++ b/config/db.js @@ -1,6 +1,5 @@ import mongoose from "mongoose"; - export const connectDB = async () => { try { const conn = await mongoose.connect(process.env.MONGO_URI); // se connecte à la DB en asynchrone diff --git a/package-lock.json b/package-lock.json index 869feceab3..69d2d33ffa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,16 +10,24 @@ "license": "ISC", "dependencies": { "bcrypt": "^5.1.1", + "bcryptjs": "^3.0.2", + "cloudinary": "^2.6.0", + "cookie-parser": "^1.4.7", "cors": "^2.8.5", - "dotenv": "^16.4.7", + "crypto": "^1.0.1", + "dotenv": "^16.5.0", "express": "^4.21.2", + "firebase": "^11.6.0", "framer-motion": "^6.5.1", "jsonwebtoken": "^9.0.2", - "mongoose": "^8.13.1", + "mailtrap": "^4.1.0", + "mongoose": "^8.13.2", "multer": "^1.4.5-lts.2", - "nodemon": "^3.1.9", "react-router-dom": "^7.5.0", "vite": "^6.2.3" + }, + "devDependencies": { + "nodemon": "^3.1.9" } }, "node_modules/@esbuild/aix-ppc64": { @@ -422,6 +430,645 @@ "node": ">=18" } }, + "node_modules/@firebase/analytics": { + "version": "0.10.12", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.12.tgz", + "integrity": "sha512-iDCGnw6qdFqwI5ywkgece99WADJNoymu+nLIQI4fZM/vCZ3bEo4wlpEetW71s1HqGpI0hQStiPhqVjFxDb2yyw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.13", + "@firebase/installations": "0.6.13", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/analytics-compat": { + "version": "0.2.18", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.18.tgz", + "integrity": "sha512-Hw9mzsSMZaQu6wrTbi3kYYwGw9nBqOHr47pVLxfr5v8CalsdrG5gfs9XUlPOZjHRVISp3oQrh1j7d3E+ulHPjQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/analytics": "0.10.12", + "@firebase/analytics-types": "0.8.3", + "@firebase/component": "0.6.13", + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/analytics-types": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.3.tgz", + "integrity": "sha512-VrIp/d8iq2g501qO46uGz3hjbDb8xzYMrbu8Tp0ovzIzrvJZ2fvmj649gTjge/b7cCCcjT0H37g1gVtlNhnkbg==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/app": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.11.4.tgz", + "integrity": "sha512-GPREsZjfSaHzwyC6cI/Cqvzf6zxqMzya+25tSpUstdqC2w0IdfxEfOMjfdW7bDfVEf4Rb4Nb6gfoOAgVSp4c4g==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.13", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.11.0", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/app-check": { + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.13.tgz", + "integrity": "sha512-ONsgml8/dplUOAP42JQO6hhiWDEwR9+RUTLenxAN9S8N6gel/sDQ9Ci721Py1oASMGdDU8v9R7xAZxzvOX5lPg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.13", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/app-check-compat": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.20.tgz", + "integrity": "sha512-/twgmlnNAaZ/wbz3kcQrL/26b+X+zUX+lBmu5LwwEcWcpnb+mrVEAKhD7/ttm52dxYiSWtLDeuXy3FXBhqBC5A==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check": "0.8.13", + "@firebase/app-check-types": "0.5.3", + "@firebase/component": "0.6.13", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/app-check-interop-types": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.3.tgz", + "integrity": "sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/app-check-types": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.3.tgz", + "integrity": "sha512-hyl5rKSj0QmwPdsAxrI5x1otDlByQ7bvNvVt8G/XPO2CSwE++rmSVf3VEhaeOR4J8ZFaF0Z0NDSmLejPweZ3ng==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/app-compat": { + "version": "0.2.53", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.53.tgz", + "integrity": "sha512-vDeZSit0q4NyaDIVcaiJF3zhLgguP6yc0JwQAfpTyllgt8XMtkMFyY/MxJtFrK2ocpQX/yCbV2DXwvpY2NVuJw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app": "0.11.4", + "@firebase/component": "0.6.13", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/app-types": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.3.tgz", + "integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/auth": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.10.0.tgz", + "integrity": "sha512-S7SqBsN7sIQsftNE3bitLlK+4bWrTHY+Rx2JFlNitgVYu2nK8W8ZQrkG8GCEwiFPq0B2vZ9pO5kVTFfq2sP96A==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.13", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@react-native-async-storage/async-storage": "^1.18.1" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/@firebase/auth-compat": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.20.tgz", + "integrity": "sha512-8FwODTSBnaqGQbKfML7LcpzGGPyouB7YHg3dZq+CZMziVc7oBY1jJeNvpnM1hAQoVuTjWPXoRrCltdGeOlkKfQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/auth": "1.10.0", + "@firebase/auth-types": "0.13.0", + "@firebase/component": "0.6.13", + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/auth-interop-types": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.4.tgz", + "integrity": "sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/auth-types": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.13.0.tgz", + "integrity": "sha512-S/PuIjni0AQRLF+l9ck0YpsMOdE8GO2KU6ubmBB7P+7TJUCQDa3R1dlgYm9UzGbbePMZsp0xzB93f2b/CgxMOg==", + "license": "Apache-2.0", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/component": { + "version": "0.6.13", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.13.tgz", + "integrity": "sha512-I/Eg1NpAtZ8AAfq8mpdfXnuUpcLxIDdCDtTzWSh+FXnp/9eCKJ3SNbOCKrUCyhLzNa2SiPJYruei0sxVjaOTeg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/data-connect": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.3.3.tgz", + "integrity": "sha512-JsgppNX1wcQYP5bg4Sg6WTS7S0XazklSjr1fG3ox9DHtt4LOQwJ3X1/c81mKMIZxocV22ujiwLYQWG6Y9D1FiQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/auth-interop-types": "0.2.4", + "@firebase/component": "0.6.13", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/database": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.14.tgz", + "integrity": "sha512-9nxYtkHAG02/Nh2Ssms1T4BbWPPjiwohCvkHDUl4hNxnki1kPgsLo5xe9kXNzbacOStmVys+RUXvwzynQSKmUQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.3", + "@firebase/auth-interop-types": "0.2.4", + "@firebase/component": "0.6.13", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.11.0", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/database-compat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.0.5.tgz", + "integrity": "sha512-CNf1UbvWh6qIaSf4sn6sx2DTDz/em/D7QxULH1LTxxDQHr9+CeYGvlAqrKnk4ZH0P0eIHyQFQU7RwkUJI0B9gQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.13", + "@firebase/database": "1.0.14", + "@firebase/database-types": "1.0.10", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/database-types": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.10.tgz", + "integrity": "sha512-mH6RC1E9/Pv8jf1/p+M8YFTX+iu+iHDN89hecvyO7wHrI4R1V0TXjxOHvX3nLJN1sfh0CWG6CHZ0VlrSmK/cwg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-types": "0.9.3", + "@firebase/util": "1.11.0" + } + }, + "node_modules/@firebase/firestore": { + "version": "4.7.10", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.7.10.tgz", + "integrity": "sha512-6nKsyo2U+jYSCcSE5sjMdDNA23DMUvYPUvsYGg09CNvcTO8GGKsPs7SpOhspsB91mbacq+u627CDAx3FUhPSSQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.13", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.11.0", + "@firebase/webchannel-wrapper": "1.0.3", + "@grpc/grpc-js": "~1.9.0", + "@grpc/proto-loader": "^0.7.8", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/firestore-compat": { + "version": "0.3.45", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.45.tgz", + "integrity": "sha512-uRvi7AYPmsDl7UZwPyV7jgDGYusEZ2+U2g7MndbQHKIA8fNHpYC6QrzMs58+/IjX+kF/lkUn67Vrr0AkVjlY+Q==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.13", + "@firebase/firestore": "4.7.10", + "@firebase/firestore-types": "3.0.3", + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/firestore-types": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.3.tgz", + "integrity": "sha512-hD2jGdiWRxB/eZWF89xcK9gF8wvENDJkzpVFb4aGkzfEaKxVRD1kjz1t1Wj8VZEp2LCB53Yx1zD8mrhQu87R6Q==", + "license": "Apache-2.0", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/functions": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.12.3.tgz", + "integrity": "sha512-Wv7JZMUkKLb1goOWRtsu3t7m97uK6XQvjQLPvn8rncY91+VgdU72crqnaYCDI/ophNuBEmuK8mn0/pAnjUeA6A==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.3", + "@firebase/auth-interop-types": "0.2.4", + "@firebase/component": "0.6.13", + "@firebase/messaging-interop-types": "0.2.3", + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/functions-compat": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.20.tgz", + "integrity": "sha512-iIudmYDAML6n3c7uXO2YTlzra2/J6lnMzmJTXNthvrKVMgNMaseNoQP1wKfchK84hMuSF8EkM4AvufwbJ+Juew==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.13", + "@firebase/functions": "0.12.3", + "@firebase/functions-types": "0.6.3", + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/functions-types": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.3.tgz", + "integrity": "sha512-EZoDKQLUHFKNx6VLipQwrSMh01A1SaL3Wg6Hpi//x6/fJ6Ee4hrAeswK99I5Ht8roiniKHw4iO0B1Oxj5I4plg==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/installations": { + "version": "0.6.13", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.13.tgz", + "integrity": "sha512-6ZpkUiaygPFwgVneYxuuOuHnSPnTA4KefLEaw/sKk/rNYgC7X6twaGfYb0sYLpbi9xV4i5jXsqZ3WO+yaguNgg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.13", + "@firebase/util": "1.11.0", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/installations-compat": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.13.tgz", + "integrity": "sha512-f/o6MqCI7LD/ulY9gvgkv6w5k6diaReD8BFHd/y/fEdpsXmFWYS/g28GXCB72bRVBOgPpkOUNl+VsMvDwlRKmw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.13", + "@firebase/installations": "0.6.13", + "@firebase/installations-types": "0.5.3", + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/installations-types": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.3.tgz", + "integrity": "sha512-2FJI7gkLqIE0iYsNQ1P751lO3hER+Umykel+TkLwHj6plzWVxqvfclPUZhcKFVQObqloEBTmpi2Ozn7EkCABAA==", + "license": "Apache-2.0", + "peerDependencies": { + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/logger": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.4.tgz", + "integrity": "sha512-mH0PEh1zoXGnaR8gD1DeGeNZtWFKbnz9hDO91dIml3iou1gpOnLqXQ2dJfB71dj6dpmUjcQ6phY3ZZJbjErr9g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/messaging": { + "version": "0.12.17", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.17.tgz", + "integrity": "sha512-W3CnGhTm6Nx8XGb6E5/+jZTuxX/EK8Vur4QXvO1DwZta/t0xqWMRgO9vNsZFMYBqFV4o3j4F9qK/iddGYwWS6g==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.13", + "@firebase/installations": "0.6.13", + "@firebase/messaging-interop-types": "0.2.3", + "@firebase/util": "1.11.0", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/messaging-compat": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.17.tgz", + "integrity": "sha512-5Q+9IG7FuedusdWHVQRjpA3OVD9KUWp/IPegcv0s5qSqRLBjib7FlAeWxN+VL0Ew43tuPJBY2HKhEecuizmO1Q==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.13", + "@firebase/messaging": "0.12.17", + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/messaging-interop-types": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.3.tgz", + "integrity": "sha512-xfzFaJpzcmtDjycpDeCUj0Ge10ATFi/VHVIvEEjDNc3hodVBQADZ7BWQU7CuFpjSHE+eLuBI13z5F/9xOoGX8Q==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/performance": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.7.2.tgz", + "integrity": "sha512-DXLLp0R0jdxH/yTmv+WTkOzsLl8YYecXh4lGZE0dzqC0IV8k+AxpLSSWvOTCkAETze8yEU/iF+PtgYVlGjfMMQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.13", + "@firebase/installations": "0.6.13", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.11.0", + "tslib": "^2.1.0", + "web-vitals": "^4.2.4" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/performance-compat": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.15.tgz", + "integrity": "sha512-wUxsw7hGBEMN6XfvYQqwPIQp5LcJXawWM5tmYp6L7ClCoTQuEiCKHWWVurJgN8Q1YHzoHVgjNfPQAOVu29iMVg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.13", + "@firebase/logger": "0.4.4", + "@firebase/performance": "0.7.2", + "@firebase/performance-types": "0.2.3", + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/performance-types": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.3.tgz", + "integrity": "sha512-IgkyTz6QZVPAq8GSkLYJvwSLr3LS9+V6vNPQr0x4YozZJiLF5jYixj0amDtATf1X0EtYHqoPO48a9ija8GocxQ==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/remote-config": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.6.0.tgz", + "integrity": "sha512-Yrk4l5+6FJLPHC6irNHMzgTtJ3NfHXlAXVChCBdNFtgmzyGmufNs/sr8oA0auEfIJ5VpXCaThRh3P4OdQxiAlQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.13", + "@firebase/installations": "0.6.13", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/remote-config-compat": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.13.tgz", + "integrity": "sha512-UmHoO7TxAEJPIZf8e1Hy6CeFGMeyjqSCpgoBkQZYXFI2JHhzxIyDpr8jVKJJN1dmAePKZ5EX7dC13CmcdTOl7Q==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.13", + "@firebase/logger": "0.4.4", + "@firebase/remote-config": "0.6.0", + "@firebase/remote-config-types": "0.4.0", + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/remote-config-types": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.4.0.tgz", + "integrity": "sha512-7p3mRE/ldCNYt8fmWMQ/MSGRmXYlJ15Rvs9Rk17t8p0WwZDbeK7eRmoI1tvCPaDzn9Oqh+yD6Lw+sGLsLg4kKg==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/storage": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.13.7.tgz", + "integrity": "sha512-FkRyc24rK+Y6EaQ1tYFm3TevBnnfSNA0VyTfew2hrYyL/aYfatBg7HOgktUdB4kWMHNA9VoTotzZTGoLuK92wg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.13", + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/storage-compat": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.17.tgz", + "integrity": "sha512-CBlODWEZ5b6MJWVh21VZioxwxNwVfPA9CAdsk+ZgVocJQQbE2oDW1XJoRcgthRY1HOitgbn4cVrM+NlQtuUYhw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.13", + "@firebase/storage": "0.13.7", + "@firebase/storage-types": "0.8.3", + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/storage-types": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.3.tgz", + "integrity": "sha512-+Muk7g9uwngTpd8xn9OdF/D48uiQ7I1Fae7ULsWPuKoCH3HU7bfFPhxtJYzyhjdniowhuDpQcfPmuNRAqZEfvg==", + "license": "Apache-2.0", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/util": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.11.0.tgz", + "integrity": "sha512-PzSrhIr++KI6y4P6C/IdgBNMkEx0Ex6554/cYd0Hm+ovyFSJtJXqb/3OSIdnBoa2cpwZT1/GW56EmRc5qEc5fQ==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/vertexai": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@firebase/vertexai/-/vertexai-1.2.1.tgz", + "integrity": "sha512-cukZ5ne2RsOWB4PB1EO6nTXgOLxPMKDJfEn+XnSV5ZKWM0ID5o0DvbyS59XihFaBzmy2SwJldP5ap7/xUnW4jA==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.3", + "@firebase/component": "0.6.13", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/webchannel-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.3.tgz", + "integrity": "sha512-2xCRM9q9FlzGZCdgDMJwc0gyUkWFtkosy7Xxr6sFgQwn+wMNIWd7xIvYNauU1r64B5L5rsGKy/n9TKJ0aAFeqQ==", + "license": "Apache-2.0" + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.15", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.15.tgz", + "integrity": "sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", @@ -515,6 +1162,70 @@ "tslib": "^2.3.1" } }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.37.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.37.0.tgz", @@ -787,6 +1498,15 @@ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "license": "MIT" }, + "node_modules/@types/node": { + "version": "22.14.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", + "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, "node_modules/@types/webidl-conversions": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", @@ -865,10 +1585,26 @@ "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==", + "license": "MIT", + "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, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -910,6 +1646,23 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "license": "MIT" }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "license": "MIT", + "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", @@ -930,10 +1683,20 @@ "node": ">= 10.0.0" } }, + "node_modules/bcryptjs": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.2.tgz", + "integrity": "sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog==", + "license": "BSD-3-Clause", + "bin": { + "bcrypt": "bin/bcrypt" + } + }, "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, "license": "MIT", "engines": { "node": ">=8" @@ -980,6 +1743,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -1062,6 +1826,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, "license": "MIT", "dependencies": { "anymatch": "~3.1.2", @@ -1091,6 +1856,51 @@ "node": ">=10" } }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cloudinary": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-2.6.0.tgz", + "integrity": "sha512-FIlny9RR5LPgkMioG4V7yUpC6ASyIFQMWfx4TgOi/xBeLxJTegbyQc3itiXL0b0lDlSaL0KyT2THEw6osrKqpQ==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21", + "q": "^1.5.1" + }, + "engines": { + "node": ">=9" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT" + }, "node_modules/color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", @@ -1100,6 +1910,18 @@ "color-support": "bin.js" } }, + "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==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1187,6 +2009,28 @@ "node": ">= 0.6" } }, + "node_modules/cookie-parser": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", + "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", + "license": "MIT", + "dependencies": { + "cookie": "0.7.2", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-parser/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "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", @@ -1212,6 +2056,13 @@ "node": ">= 0.10" } }, + "node_modules/crypto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", + "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", + "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in.", + "license": "ISC" + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -1221,6 +2072,15 @@ "ms": "2.0.0" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -1256,9 +2116,9 @@ } }, "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -1341,6 +2201,21 @@ "node": ">= 0.4" } }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/esbuild": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", @@ -1381,6 +2256,15 @@ "@esbuild/win32-x64": "0.25.1" } }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1442,10 +2326,23 @@ "url": "https://opencollective.com/express" } }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, "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, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -1472,6 +2369,77 @@ "node": ">= 0.8" } }, + "node_modules/firebase": { + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-11.6.0.tgz", + "integrity": "sha512-Xqm6j6zszIEmI5nW1MPR8yTafoRTSrW3mWG9Lk9elCJtQDQSiTEkKZiNtUm9y6XfOPl8xoF1TNpxZe8HjgA0Og==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/analytics": "0.10.12", + "@firebase/analytics-compat": "0.2.18", + "@firebase/app": "0.11.4", + "@firebase/app-check": "0.8.13", + "@firebase/app-check-compat": "0.3.20", + "@firebase/app-compat": "0.2.53", + "@firebase/app-types": "0.9.3", + "@firebase/auth": "1.10.0", + "@firebase/auth-compat": "0.5.20", + "@firebase/data-connect": "0.3.3", + "@firebase/database": "1.0.14", + "@firebase/database-compat": "2.0.5", + "@firebase/firestore": "4.7.10", + "@firebase/firestore-compat": "0.3.45", + "@firebase/functions": "0.12.3", + "@firebase/functions-compat": "0.3.20", + "@firebase/installations": "0.6.13", + "@firebase/installations-compat": "0.2.13", + "@firebase/messaging": "0.12.17", + "@firebase/messaging-compat": "0.2.17", + "@firebase/performance": "0.7.2", + "@firebase/performance-compat": "0.2.15", + "@firebase/remote-config": "0.6.0", + "@firebase/remote-config-compat": "0.2.13", + "@firebase/storage": "0.13.7", + "@firebase/storage-compat": "0.3.17", + "@firebase/util": "1.11.0", + "@firebase/vertexai": "1.2.1" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "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", @@ -1611,6 +2579,15 @@ "node": ">=10" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -1673,6 +2650,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -1697,6 +2675,7 @@ "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, "license": "MIT", "engines": { "node": ">=4" @@ -1714,6 +2693,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -1754,6 +2748,12 @@ "node": ">= 0.8" } }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -1802,10 +2802,17 @@ "node": ">=0.10.0" } }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "license": "ISC" + }, "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, "license": "ISC" }, "node_modules/inflight": { @@ -1838,6 +2845,7 @@ "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, "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -1850,6 +2858,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -1868,6 +2877,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -1880,6 +2890,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -1949,6 +2960,18 @@ "node": ">=12.0.0" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -1991,6 +3014,37 @@ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", "license": "MIT" }, + "node_modules/long": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.1.tgz", + "integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==", + "license": "Apache-2.0" + }, + "node_modules/mailtrap": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mailtrap/-/mailtrap-4.1.0.tgz", + "integrity": "sha512-rCuumv0ZcLvxMukV8Pn9sh5hmk2TL23THrpwgE/yXwDfeJQdJGVENa2rNzGR9zcGsUK3LSXuyvjKrTwc21RBOQ==", + "license": "MIT", + "dependencies": { + "axios": ">=0.27" + }, + "engines": { + "node": ">=16.20.1", + "yarn": ">=1.22.17" + }, + "peerDependencies": { + "@types/nodemailer": "^6.4.9", + "nodemailer": "^6.9.4" + }, + "peerDependenciesMeta": { + "@types/nodemailer": { + "optional": true + }, + "nodemailer": { + "optional": true + } + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -2214,9 +3268,9 @@ } }, "node_modules/mongoose": { - "version": "8.13.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.13.1.tgz", - "integrity": "sha512-sRqlXI+6jhr9/KicCOjet1VVPONFsOxTrh14tfueX5y3GJ2ihswc5ewUUojuwdSS/5koGXLIPmGivDSApVXflA==", + "version": "8.13.2", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.13.2.tgz", + "integrity": "sha512-riCBqZmNkYBWjXpM3qWLDQw7QmTKsVZDPhLXFJqC87+OjocEVpvS3dA2BPPUiLAu+m0/QmEj5pSXKhH+/DgerQ==", "license": "MIT", "dependencies": { "bson": "^6.10.3", @@ -2400,6 +3454,7 @@ "version": "3.1.9", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.9.tgz", "integrity": "sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==", + "dev": true, "license": "MIT", "dependencies": { "chokidar": "^3.5.2", @@ -2428,6 +3483,7 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2445,6 +3501,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, "license": "MIT" }, "node_modules/nopt": { @@ -2466,6 +3523,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -2560,6 +3618,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -2614,6 +3673,30 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "license": "MIT" }, + "node_modules/protobufjs": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.0.tgz", + "integrity": "sha512-Z2E/kOY1QjoMlCytmexzYfDm/w5fKAiRwpSzGtdnXW1zC88Z2yXazHHrOtwCzn+7wSxyE8PYM4rvVcMphF9sOA==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -2627,10 +3710,17 @@ "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==", + "license": "MIT" + }, "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, "license": "MIT" }, "node_modules/punycode": { @@ -2642,6 +3732,17 @@ "node": ">=6" } }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, "node_modules/qs": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", @@ -2771,6 +3872,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -2779,6 +3881,15 @@ "node": ">=8.10.0" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -3039,6 +4150,7 @@ "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, "license": "MIT", "dependencies": { "semver": "^7.5.3" @@ -3131,6 +4243,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^3.0.0" @@ -3160,6 +4273,7 @@ "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, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -3181,6 +4295,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, "license": "ISC", "bin": { "nodetouch": "bin/nodetouch.js" @@ -3233,6 +4348,13 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, "node_modules/unpipe": { @@ -3339,6 +4461,12 @@ } } }, + "node_modules/web-vitals": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", + "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", + "license": "Apache-2.0" + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -3348,6 +4476,29 @@ "node": ">=12" } }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/whatwg-url": { "version": "14.2.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", @@ -3370,6 +4521,23 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, + "node_modules/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==", + "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/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -3385,6 +4553,15 @@ "node": ">=0.4" } }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -3404,6 +4581,33 @@ "engines": { "node": ">= 14" } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } } } } diff --git a/package.json b/package.json index cf2be34abe..17f6f9637c 100644 --- a/package.json +++ b/package.json @@ -20,15 +20,23 @@ "homepage": "https://github.com/loyde07/RDI25#readme", "dependencies": { "bcrypt": "^5.1.1", + "bcryptjs": "^3.0.2", + "cloudinary": "^2.6.0", + "cookie-parser": "^1.4.7", "cors": "^2.8.5", - "dotenv": "^16.4.7", + "crypto": "^1.0.1", + "dotenv": "^16.5.0", "express": "^4.21.2", + "firebase": "^11.6.0", "framer-motion": "^6.5.1", "jsonwebtoken": "^9.0.2", - "mongoose": "^8.13.1", + "mailtrap": "^4.1.0", + "mongoose": "^8.13.2", "multer": "^1.4.5-lts.2", - "nodemon": "^3.1.9", "react-router-dom": "^7.5.0", "vite": "^6.2.3" + }, + "devDependencies": { + "nodemon": "^3.1.9" } } diff --git a/uploads/logos/1744396974925.jpg b/uploads/logos/1744396974925.jpg deleted file mode 100644 index c09456c362c3bcf71c94e1d76bcf790eef319e47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26121 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 - tqt + Vite + React

diff --git a/web_frontend/package-lock.json b/web_frontend/package-lock.json index e90a9b366c..e73e07348f 100644 --- a/web_frontend/package-lock.json +++ b/web_frontend/package-lock.json @@ -8,22 +8,29 @@ "name": "web_frontend", "version": "0.0.0", "dependencies": { + "@tailwindcss/vite": "^4.1.4", "axios": "^1.8.4", - "bcrypt": "^5.1.1", + "framer-motion": "^12.7.4", + "lucide-react": "^0.502.0", "react": "^19.0.0", "react-dom": "^19.0.0", - "react-router-dom": "^7.4.0" + "react-hot-toast": "^2.5.2", + "react-router-dom": "^7.5.1", + "zustand": "^5.0.3" }, "devDependencies": { - "@eslint/js": "^9.21.0", + "@eslint/js": "^9.22.0", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react": "^4.3.4", - "eslint": "^9.21.0", - "eslint-plugin-react-hooks": "^5.1.0", + "autoprefixer": "^10.4.21", + "eslint": "^9.22.0", + "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", - "globals": "^15.15.0", - "vite": "^6.2.4" + "globals": "^16.0.0", + "postcss": "^8.5.3", + "tailwindcss": "^4.1.4", + "vite": "^6.3.1" } }, "node_modules/@ampproject/remapping": { @@ -323,13 +330,12 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", - "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -340,13 +346,12 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", - "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -357,13 +362,12 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", - "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -374,13 +378,12 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", - "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -391,13 +394,12 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", - "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -408,13 +410,12 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", - "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -425,13 +426,12 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", - "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -442,13 +442,12 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", - "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -459,13 +458,12 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", - "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -476,13 +474,12 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", - "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -493,13 +490,12 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", - "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -510,13 +506,12 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", - "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -527,13 +522,12 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", - "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", "cpu": [ "mips64el" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -544,13 +538,12 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", - "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -561,13 +554,12 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", - "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -578,13 +570,12 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", - "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -595,13 +586,12 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", - "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -612,13 +602,12 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", - "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -629,13 +618,12 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", - "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -646,13 +634,12 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", - "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -663,13 +650,12 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", - "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -680,13 +666,12 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", - "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -697,13 +682,12 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", - "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -714,13 +698,12 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", - "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -731,13 +714,12 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", - "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -748,9 +730,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", - "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.1.tgz", + "integrity": "sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==", "dev": true, "license": "MIT", "dependencies": { @@ -790,9 +772,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", - "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -805,9 +787,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.0.tgz", - "integrity": "sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", + "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -815,9 +797,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", - "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -865,9 +847,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.23.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.23.0.tgz", - "integrity": "sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==", + "version": "9.25.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.25.0.tgz", + "integrity": "sha512-iWhsUS8Wgxz9AXNfvfOPFSW4VfMXdVhp1hjkZVhXCrpgh/aLcc45rX6MPu+tIVUWDw0HfNwth7O28M1xDxNf9w==", "dev": true, "license": "MIT", "engines": { @@ -885,13 +867,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", - "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.12.0", + "@eslint/core": "^0.13.0", "levn": "^0.4.1" }, "engines": { @@ -1017,46 +999,13 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "license": "BSD-3-Clause", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.37.0.tgz", - "integrity": "sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz", + "integrity": "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1064,13 +1013,12 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.37.0.tgz", - "integrity": "sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz", + "integrity": "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1078,13 +1026,12 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.37.0.tgz", - "integrity": "sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz", + "integrity": "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1092,13 +1039,12 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.37.0.tgz", - "integrity": "sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz", + "integrity": "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1106,13 +1052,12 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.37.0.tgz", - "integrity": "sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz", + "integrity": "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1120,13 +1065,12 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.37.0.tgz", - "integrity": "sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz", + "integrity": "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1134,13 +1078,12 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.37.0.tgz", - "integrity": "sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz", + "integrity": "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1148,13 +1091,12 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.37.0.tgz", - "integrity": "sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz", + "integrity": "sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1162,13 +1104,12 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.37.0.tgz", - "integrity": "sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz", + "integrity": "sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1176,13 +1117,12 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.37.0.tgz", - "integrity": "sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz", + "integrity": "sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1190,13 +1130,12 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.37.0.tgz", - "integrity": "sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz", + "integrity": "sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==", "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1204,13 +1143,12 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.37.0.tgz", - "integrity": "sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz", + "integrity": "sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==", "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1218,13 +1156,12 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.37.0.tgz", - "integrity": "sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz", + "integrity": "sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==", "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1232,13 +1169,12 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.37.0.tgz", - "integrity": "sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz", + "integrity": "sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==", "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1246,13 +1182,12 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.37.0.tgz", - "integrity": "sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz", + "integrity": "sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==", "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1260,13 +1195,12 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.37.0.tgz", - "integrity": "sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz", + "integrity": "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1274,13 +1208,12 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.37.0.tgz", - "integrity": "sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz", + "integrity": "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1288,13 +1221,12 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.37.0.tgz", - "integrity": "sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz", + "integrity": "sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1302,13 +1234,12 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.37.0.tgz", - "integrity": "sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz", + "integrity": "sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==", "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1316,19 +1247,272 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.37.0.tgz", - "integrity": "sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz", + "integrity": "sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ] }, + "node_modules/@tailwindcss/node": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.4.tgz", + "integrity": "sha512-MT5118zaiO6x6hNA04OWInuAiP1YISXql8Z+/Y8iisV5nuhM8VXlyhRuqc2PEviPszcXI66W44bCIk500Oolhw==", + "license": "MIT", + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.29.2", + "tailwindcss": "4.1.4" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.4.tgz", + "integrity": "sha512-p5wOpXyOJx7mKh5MXh5oKk+kqcz8T+bA3z/5VWWeQwFrmuBItGwz8Y2CHk/sJ+dNb9B0nYFfn0rj/cKHZyjahQ==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.4", + "@tailwindcss/oxide-darwin-arm64": "4.1.4", + "@tailwindcss/oxide-darwin-x64": "4.1.4", + "@tailwindcss/oxide-freebsd-x64": "4.1.4", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.4", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.4", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.4", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.4", + "@tailwindcss/oxide-linux-x64-musl": "4.1.4", + "@tailwindcss/oxide-wasm32-wasi": "4.1.4", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.4", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.4" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.4.tgz", + "integrity": "sha512-xMMAe/SaCN/vHfQYui3fqaBDEXMu22BVwQ33veLc8ep+DNy7CWN52L+TTG9y1K397w9nkzv+Mw+mZWISiqhmlA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.4.tgz", + "integrity": "sha512-JGRj0SYFuDuAGilWFBlshcexev2hOKfNkoX+0QTksKYq2zgF9VY/vVMq9m8IObYnLna0Xlg+ytCi2FN2rOL0Sg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.4.tgz", + "integrity": "sha512-sdDeLNvs3cYeWsEJ4H1DvjOzaGios4QbBTNLVLVs0XQ0V95bffT3+scptzYGPMjm7xv4+qMhCDrkHwhnUySEzA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.4.tgz", + "integrity": "sha512-VHxAqxqdghM83HslPhRsNhHo91McsxRJaEnShJOMu8mHmEj9Ig7ToHJtDukkuLWLzLboh2XSjq/0zO6wgvykNA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.4.tgz", + "integrity": "sha512-OTU/m/eV4gQKxy9r5acuesqaymyeSCnsx1cFto/I1WhPmi5HDxX1nkzb8KYBiwkHIGg7CTfo/AcGzoXAJBxLfg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.4.tgz", + "integrity": "sha512-hKlLNvbmUC6z5g/J4H+Zx7f7w15whSVImokLPmP6ff1QqTVE+TxUM9PGuNsjHvkvlHUtGTdDnOvGNSEUiXI1Ww==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.4.tgz", + "integrity": "sha512-X3As2xhtgPTY/m5edUtddmZ8rCruvBvtxYLMw9OsZdH01L2gS2icsHRwxdU0dMItNfVmrBezueXZCHxVeeb7Aw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.4.tgz", + "integrity": "sha512-2VG4DqhGaDSmYIu6C4ua2vSLXnJsb/C9liej7TuSO04NK+JJJgJucDUgmX6sn7Gw3Cs5ZJ9ZLrnI0QRDOjLfNQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.4.tgz", + "integrity": "sha512-v+mxVgH2kmur/X5Mdrz9m7TsoVjbdYQT0b4Z+dr+I4RvreCNXyCFELZL/DO0M1RsidZTrm6O1eMnV6zlgEzTMQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.4.tgz", + "integrity": "sha512-2TLe9ir+9esCf6Wm+lLWTMbgklIjiF0pbmDnwmhR9MksVOq+e8aP3TSsXySnBDDvTTVd/vKu1aNttEGj3P6l8Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.0", + "@emnapi/runtime": "^1.4.0", + "@emnapi/wasi-threads": "^1.0.1", + "@napi-rs/wasm-runtime": "^0.2.8", + "@tybys/wasm-util": "^0.9.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.4.tgz", + "integrity": "sha512-VlnhfilPlO0ltxW9/BgfLI5547PYzqBMPIzRrk4W7uupgCt8z6Trw/tAj6QUtF2om+1MH281Pg+HHUJoLesmng==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.4.tgz", + "integrity": "sha512-+7S63t5zhYjslUGb8NcgLpFXD+Kq1F/zt5Xv5qTv7HaFTG/DHyHD9GA6ieNAxhgyA4IcKa/zy7Xx4Oad2/wuhw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.4.tgz", + "integrity": "sha512-4UQeMrONbvrsXKXXp/uxmdEN5JIJ9RkH7YVzs6AMxC/KC1+Np7WZBaNIco7TEjlkthqxZbt8pU/ipD+hKjm80A==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.4", + "@tailwindcss/oxide": "4.1.4", + "tailwindcss": "4.1.4" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -1344,9 +1528,9 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", "dependencies": { @@ -1365,26 +1549,19 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", - "license": "MIT" - }, "node_modules/@types/estree": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "dev": true, "license": "MIT" }, "node_modules/@types/json-schema": { @@ -1395,19 +1572,19 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "19.0.12", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.12.tgz", - "integrity": "sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==", - "dev": true, + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.2.tgz", + "integrity": "sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==", + "devOptional": true, "license": "MIT", "dependencies": { "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.4.tgz", - "integrity": "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.2.tgz", + "integrity": "sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==", "dev": true, "license": "MIT", "peerDependencies": { @@ -1415,17 +1592,17 @@ } }, "node_modules/@vitejs/plugin-react": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", - "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz", + "integrity": "sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.26.0", + "@babel/core": "^7.26.10", "@babel/plugin-transform-react-jsx-self": "^7.25.9", "@babel/plugin-transform-react-jsx-source": "^7.25.9", "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.2" + "react-refresh": "^0.17.0" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -1434,12 +1611,6 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, - "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==", - "license": "ISC" - }, "node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", @@ -1463,18 +1634,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1492,15 +1651,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -1517,26 +1667,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "license": "ISC" - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1550,13 +1680,51 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, - "node_modules/axios": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", - "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -1565,26 +1733,14 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, "license": "MIT" }, - "node_modules/bcrypt": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", - "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.11", - "node-addon-api": "^5.0.0" - }, - "engines": { - "node": ">= 10.0.0" - } - }, "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, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -1648,9 +1804,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001707", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz", - "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==", + "version": "1.0.30001715", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001715.tgz", + "integrity": "sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==", "dev": true, "funding": [ { @@ -1685,15 +1841,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1714,15 +1861,6 @@ "dev": true, "license": "MIT" }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1739,14 +1877,9 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, "license": "MIT" }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC" - }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -1782,13 +1915,13 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, "license": "MIT" }, "node_modules/debug": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -1818,12 +1951,6 @@ "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "license": "MIT" - }, "node_modules/detect-libc": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", @@ -1848,17 +1975,24 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.123", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.123.tgz", - "integrity": "sha512-refir3NlutEZqlKaBLK0tzlVLe5P2wDKS7UQt/3SpibizgsRAPOsqQC3ffw1nlv3ze5gjRQZYHoPymgVZkplFA==", + "version": "1.5.139", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.139.tgz", + "integrity": "sha512-GGnRYOTdN5LYpwbIr0rwP/ZHOQSvAF6TG0LSzp28uCBb9JiXHJGmaaKw29qjNJc5bGnnp6kXJqRnGMQoELwi5w==", "dev": true, "license": "ISC" }, - "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==", - "license": "MIT" + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } }, "node_modules/es-define-property": { "version": "1.0.1", @@ -1906,10 +2040,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", - "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", - "dev": true, + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -1919,31 +2052,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.1", - "@esbuild/android-arm": "0.25.1", - "@esbuild/android-arm64": "0.25.1", - "@esbuild/android-x64": "0.25.1", - "@esbuild/darwin-arm64": "0.25.1", - "@esbuild/darwin-x64": "0.25.1", - "@esbuild/freebsd-arm64": "0.25.1", - "@esbuild/freebsd-x64": "0.25.1", - "@esbuild/linux-arm": "0.25.1", - "@esbuild/linux-arm64": "0.25.1", - "@esbuild/linux-ia32": "0.25.1", - "@esbuild/linux-loong64": "0.25.1", - "@esbuild/linux-mips64el": "0.25.1", - "@esbuild/linux-ppc64": "0.25.1", - "@esbuild/linux-riscv64": "0.25.1", - "@esbuild/linux-s390x": "0.25.1", - "@esbuild/linux-x64": "0.25.1", - "@esbuild/netbsd-arm64": "0.25.1", - "@esbuild/netbsd-x64": "0.25.1", - "@esbuild/openbsd-arm64": "0.25.1", - "@esbuild/openbsd-x64": "0.25.1", - "@esbuild/sunos-x64": "0.25.1", - "@esbuild/win32-arm64": "0.25.1", - "@esbuild/win32-ia32": "0.25.1", - "@esbuild/win32-x64": "0.25.1" + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" } }, "node_modules/escalade": { @@ -1970,20 +2103,20 @@ } }, "node_modules/eslint": { - "version": "9.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.23.0.tgz", - "integrity": "sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==", + "version": "9.25.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.25.0.tgz", + "integrity": "sha512-MsBdObhM4cEwkzCiraDv7A6txFXEqtNXOb877TsSp2FCkBNl8JfVQrmiuDqC1IkejT6JLPzYBXx/xAiYhyzgGA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.2", - "@eslint/config-helpers": "^0.2.0", - "@eslint/core": "^0.12.0", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.13.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.23.0", - "@eslint/plugin-kit": "^0.2.7", + "@eslint/js": "9.25.0", + "@eslint/plugin-kit": "^0.2.8", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -2168,6 +2301,20 @@ "dev": true, "license": "MIT" }, + "node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -2254,47 +2401,51 @@ "node": ">= 6" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 8" + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" } }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", + "node_modules/framer-motion": { + "version": "12.7.4", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.7.4.tgz", + "integrity": "sha512-jX0bPsTmU0oPZTYz/dVyD0dmOyEOEJvdn0TaZBE5I8g2GvVnnQnW9f65cJnoVfUkY3WZWNXGXnPbVA9YnaIfVA==", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "motion-dom": "^12.7.4", + "motion-utils": "^12.7.2", + "tslib": "^2.4.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } } }, - "node_modules/fs-minipass/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" - }, "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, "license": "MIT", "optional": true, @@ -2314,27 +2465,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -2382,27 +2512,6 @@ "node": ">= 0.4" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -2417,9 +2526,9 @@ } }, "node_modules/globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz", + "integrity": "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==", "dev": true, "license": "MIT", "engines": { @@ -2429,6 +2538,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/goober": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.16.tgz", + "integrity": "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==", + "license": "MIT", + "peerDependencies": { + "csstype": "^3.0.10" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -2441,6 +2559,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2478,12 +2602,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "license": "ISC" - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -2496,19 +2614,6 @@ "node": ">= 0.4" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -2546,23 +2651,6 @@ "node": ">=0.8.19" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2573,15 +2661,6 @@ "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -2602,6 +2681,15 @@ "dev": true, "license": "ISC" }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2693,6 +2781,234 @@ "node": ">= 0.8.0" } }, + "node_modules/lightningcss": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", + "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.29.2", + "lightningcss-darwin-x64": "1.29.2", + "lightningcss-freebsd-x64": "1.29.2", + "lightningcss-linux-arm-gnueabihf": "1.29.2", + "lightningcss-linux-arm64-gnu": "1.29.2", + "lightningcss-linux-arm64-musl": "1.29.2", + "lightningcss-linux-x64-gnu": "1.29.2", + "lightningcss-linux-x64-musl": "1.29.2", + "lightningcss-win32-arm64-msvc": "1.29.2", + "lightningcss-win32-x64-msvc": "1.29.2" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", + "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", + "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", + "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", + "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", + "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", + "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", + "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", + "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", + "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", + "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -2726,19 +3042,13 @@ "yallist": "^3.0.2" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/lucide-react": { + "version": "0.502.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.502.0.tgz", + "integrity": "sha512-Ou3wpc5wbBnL9JnQOScCs1jw0bF9ozFGEDs+4+6HsgSzME2L0jINcNUU7DZtZqgMxrcEjJ4evj+so3AKZxZ9EQ==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/math-intrinsics": { @@ -2775,6 +3085,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -2783,69 +3094,32 @@ "node": "*" } }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "node_modules/motion-dom": { + "version": "12.7.4", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.7.4.tgz", + "integrity": "sha512-1ZUHAoSUMMxP6jPqyxlk9XUfb6NxMsnWPnH2YGhrOhTURLcXWbETi6eemoKb60Pe32NVJYduL4B62VQSO5Jq8Q==", "license": "MIT", "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "motion-utils": "^12.7.2" } }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } + "node_modules/motion-utils": { + "version": "12.7.2", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.7.2.tgz", + "integrity": "sha512-XhZwqctxyJs89oX00zn3OGCuIIpVevbTa+u82usWBC6pSHUd2AoNWiYa7Du8tJxJy9TFbZ82pcn5t7NOm1PHAw==", + "license": "MIT" }, "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==", + "dev": true, "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, "funding": [ { "type": "github", @@ -2867,32 +3141,6 @@ "dev": true, "license": "MIT" }, - "node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", - "license": "MIT" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", @@ -2900,52 +3148,16 @@ "dev": true, "license": "MIT" }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "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==", + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -3019,15 +3231,6 @@ "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -3042,14 +3245,24 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, "license": "ISC" }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/postcss": { "version": "8.5.3", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "dev": true, "funding": [ { "type": "opencollective", @@ -3074,6 +3287,13 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -3101,30 +3321,47 @@ } }, "node_modules/react": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", - "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", - "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/react-hot-toast": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.5.2.tgz", + "integrity": "sha512-Tun3BbCxzmXXM7C+NI4qiv6lT0uwGh4oAfeJyNOjYUejTsm35mK9iCaYLGv8cBz9L5YxZLx/2ii7zsIwPtPUdw==", "license": "MIT", "dependencies": { - "scheduler": "^0.25.0" + "csstype": "^3.1.3", + "goober": "^2.1.16" + }, + "engines": { + "node": ">=10" }, "peerDependencies": { - "react": "^19.0.0" + "react": ">=16", + "react-dom": ">=16" } }, "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", "dev": true, "license": "MIT", "engines": { @@ -3132,12 +3369,11 @@ } }, "node_modules/react-router": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.4.0.tgz", - "integrity": "sha512-Y2g5ObjkvX3VFeVt+0CIPuYd9PpgqCslG7ASSIdN73LwA1nNWzcMLaoMRJfP3prZFI92svxFwbn7XkLJ+UPQ6A==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.1.tgz", + "integrity": "sha512-/jjU3fcYNd2bwz9Q0xt5TwyiyoO8XjSEFXJY4O/lMAlkGTHWuHRAbR9Etik+lSDqMC7A7mz3UlXzgYT6Vl58sA==", "license": "MIT", "dependencies": { - "@types/cookie": "^0.6.0", "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0", "turbo-stream": "2.4.0" @@ -3156,12 +3392,12 @@ } }, "node_modules/react-router-dom": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.4.0.tgz", - "integrity": "sha512-VlksBPf3n2bijPvnA7nkTsXxMAKOj+bWp4R9c3i+bnwlSOFAGOkJkKhzy/OsRkWaBMICqcAl1JDzh9ZSOze9CA==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.1.tgz", + "integrity": "sha512-5DPSPc7ENrt2tlKPq0FtpG80ZbqA9aIKEyqX6hSNJDlol/tr6iqCK4crqdsusmOSSotq6zDsn0y3urX9TuTNmA==", "license": "MIT", "dependencies": { - "react-router": "7.4.0" + "react-router": "7.5.1" }, "engines": { "node": ">=20.0.0" @@ -3171,20 +3407,6 @@ "react-dom": ">=18" } }, - "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==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -3195,30 +3417,13 @@ "node": ">=4" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/rollup": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.37.0.tgz", - "integrity": "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==", - "dev": true, + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz", + "integrity": "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==", "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.7" }, "bin": { "rollup": "dist/bin/rollup" @@ -3228,77 +3433,45 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.37.0", - "@rollup/rollup-android-arm64": "4.37.0", - "@rollup/rollup-darwin-arm64": "4.37.0", - "@rollup/rollup-darwin-x64": "4.37.0", - "@rollup/rollup-freebsd-arm64": "4.37.0", - "@rollup/rollup-freebsd-x64": "4.37.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.37.0", - "@rollup/rollup-linux-arm-musleabihf": "4.37.0", - "@rollup/rollup-linux-arm64-gnu": "4.37.0", - "@rollup/rollup-linux-arm64-musl": "4.37.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.37.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0", - "@rollup/rollup-linux-riscv64-gnu": "4.37.0", - "@rollup/rollup-linux-riscv64-musl": "4.37.0", - "@rollup/rollup-linux-s390x-gnu": "4.37.0", - "@rollup/rollup-linux-x64-gnu": "4.37.0", - "@rollup/rollup-linux-x64-musl": "4.37.0", - "@rollup/rollup-win32-arm64-msvc": "4.37.0", - "@rollup/rollup-win32-ia32-msvc": "4.37.0", - "@rollup/rollup-win32-x64-msvc": "4.37.0", + "@rollup/rollup-android-arm-eabi": "4.40.0", + "@rollup/rollup-android-arm64": "4.40.0", + "@rollup/rollup-darwin-arm64": "4.40.0", + "@rollup/rollup-darwin-x64": "4.40.0", + "@rollup/rollup-freebsd-arm64": "4.40.0", + "@rollup/rollup-freebsd-x64": "4.40.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.40.0", + "@rollup/rollup-linux-arm-musleabihf": "4.40.0", + "@rollup/rollup-linux-arm64-gnu": "4.40.0", + "@rollup/rollup-linux-arm64-musl": "4.40.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.40.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.40.0", + "@rollup/rollup-linux-riscv64-gnu": "4.40.0", + "@rollup/rollup-linux-riscv64-musl": "4.40.0", + "@rollup/rollup-linux-s390x-gnu": "4.40.0", + "@rollup/rollup-linux-x64-gnu": "4.40.0", + "@rollup/rollup-linux-x64-musl": "4.40.0", + "@rollup/rollup-win32-arm64-msvc": "4.40.0", + "@rollup/rollup-win32-ia32-msvc": "4.40.0", + "@rollup/rollup-win32-x64-msvc": "4.40.0", "fsevents": "~2.3.2" } }, - "node_modules/rollup/node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, - "license": "MIT" - }, - "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" - } - ], - "license": "MIT" - }, "node_modules/scheduler": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", - "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", "license": "MIT" }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" - }, "node_modules/set-cookie-parser": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", @@ -3328,57 +3501,15 @@ "node": ">=8" } }, - "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==", - "license": "ISC" - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "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==", - "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/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -3405,34 +3536,42 @@ "node": ">=8" } }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "license": "ISC", + "node_modules/tailwindcss": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.4.tgz", + "integrity": "sha512-1ZIUqtPITFbv/DxRmDr5/agPqJwF69d24m9qmM1939TJehgY539CtzeZRjbLt5G6fSy/7YqqYsfvoTEw9xUI2A==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "license": "MIT", "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" + "fdir": "^6.4.4", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=10" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/turbo-stream": { "version": "2.4.0", @@ -3494,22 +3633,18 @@ "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==", - "license": "MIT" - }, "node_modules/vite": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.4.tgz", - "integrity": "sha512-veHMSew8CcRzhL5o8ONjy8gkfmFJAd5Ac16oxBUjlwgX3Gq2Wqr+qNC3TjPIpy7TPV/KporLga5GT9HqdrCizw==", - "dev": true, + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.2.tgz", + "integrity": "sha512-ZSvGOXKGceizRQIZSz7TGJ0pS3QLlVY/9hwxVh17W3re67je1RKYzFHivZ/t0tubU78Vkyb9WnHPENSBCzbckg==", "license": "MIT", "dependencies": { "esbuild": "^0.25.0", + "fdir": "^6.4.3", + "picomatch": "^4.0.2", "postcss": "^8.5.3", - "rollup": "^4.30.1" + "rollup": "^4.34.9", + "tinyglobby": "^0.2.12" }, "bin": { "vite": "bin/vite.js" @@ -3572,22 +3707,6 @@ } } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3604,15 +3723,6 @@ "node": ">= 8" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -3623,12 +3733,6 @@ "node": ">=0.10.0" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -3648,6 +3752,35 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zustand": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.3.tgz", + "integrity": "sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } } } } diff --git a/web_frontend/package.json b/web_frontend/package.json index e36b78cbce..baed9dc805 100644 --- a/web_frontend/package.json +++ b/web_frontend/package.json @@ -4,27 +4,34 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "vite", + "dev": "vite --port 3000", "build": "vite build", "lint": "eslint .", "preview": "vite preview" }, "dependencies": { + "@tailwindcss/vite": "^4.1.4", "axios": "^1.8.4", - "bcrypt": "^5.1.1", + "framer-motion": "^12.7.4", + "lucide-react": "^0.502.0", "react": "^19.0.0", "react-dom": "^19.0.0", - "react-router-dom": "^7.4.0" + "react-hot-toast": "^2.5.2", + "react-router-dom": "^7.5.1", + "zustand": "^5.0.3" }, "devDependencies": { - "@eslint/js": "^9.21.0", + "@eslint/js": "^9.22.0", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react": "^4.3.4", - "eslint": "^9.21.0", - "eslint-plugin-react-hooks": "^5.1.0", + "autoprefixer": "^10.4.21", + "eslint": "^9.22.0", + "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", - "globals": "^15.15.0", - "vite": "^6.2.4" + "globals": "^16.0.0", + "postcss": "^8.5.3", + "tailwindcss": "^4.1.4", + "vite": "^6.3.1" } } diff --git a/web_frontend/public/avatar.png b/web_frontend/public/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..e67ef099c9afce1fc19f3009e9e1c55626cb8663 GIT binary patch literal 29733 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 PPZ&9nvQ({vamfDx7IaA% literal 0 HcmV?d00001 diff --git a/web_frontend/public/default-logo.png b/web_frontend/public/default-logo.png deleted file mode 100644 index c7645dd59dad7f09cdde9e17bd456c9036a2408b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58847 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 diff --git a/web_frontend/src/App.css b/web_frontend/src/App.css index b9d355df2a..a461c505f1 100644 --- a/web_frontend/src/App.css +++ b/web_frontend/src/App.css @@ -1,42 +1 @@ -#root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} +@import "tailwindcss"; \ No newline at end of file diff --git a/web_frontend/src/App.jsx b/web_frontend/src/App.jsx index 22bcfdd84d..cf463e6529 100644 --- a/web_frontend/src/App.jsx +++ b/web_frontend/src/App.jsx @@ -1,26 +1,92 @@ -import React from "react"; -import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; -import Home from "./pages/home.jsx"; -import Image from "./pages/image.jsx"; -import RegisterForm from './pages/register.jsx'; -import LoginForm from './pages/login.jsx'; -import Compte from './pages/compte.jsx'; // à créer ensuite -import AccountPage from "./pages/accountPage.jsx"; +import { Routes, Route, Navigate } from "react-router-dom" +import {Toaster} from 'react-hot-toast' +import {useAuthStore} from './store/authStore.js' +import { useEffect } from "react" + + +import FloatingShape from "./components/FloatingShape.jsx" +import LoadingSpinner from "./components/LoadingSpinner.jsx" +import SignUpPage from "./pages/SignUpPage.jsx" +import LoginPage from "./pages/LoginPage.jsx" +import EmailVerificationPage from "./pages/EmailVerificationPage.jsx" +import DashboardPage from "./pages/DashBoardPage.jsx" +import ForgotPasswordPage from "./pages/ForgotPasswordPage.jsx" +import ResetPasswordPage from "./pages/ResetPasswordPage.jsx" + +// protège les routes qui demande une authentification +const ProtectedRoute = ({ children }) => { + const { isAuthenticated, user } = useAuthStore(); + + if (!isAuthenticated) { + return ; + } + + if (!user.isVerified) { + return ; + } + + return children; +}; + +// redirige les utilisateur authentifié vers la page principale +const RedirectAuthenticatedUser = ({ children }) => { + const { isAuthenticated, user }=useAuthStore(); + + if (isAuthenticated && user && user.isVerified) { + return ; + } + + return children; +}; function App() { - return ( - - - } /> - } /> - } /> - } /> - } /> - } > - } /> - - - ); + const {isCheckingAuth, checkAuth, isAuthenticated, user }=useAuthStore() + + useEffect( () =>{ + checkAuth() + },[checkAuth]) + + if (isCheckingAuth) return ; + + return ( +

+ ) } -export default App; \ No newline at end of file +export default App diff --git a/web_frontend/src/assets/react.svg b/web_frontend/src/assets/react.svg deleted file mode 100644 index 6c87de9bb3..0000000000 --- a/web_frontend/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/web_frontend/src/bck.App.jsx b/web_frontend/src/bck.App.jsx deleted file mode 100644 index f67355ae04..0000000000 --- a/web_frontend/src/bck.App.jsx +++ /dev/null @@ -1,35 +0,0 @@ -import { useState } from 'react' -import reactLogo from './assets/react.svg' -import viteLogo from '/vite.svg' -import './App.css' - -function App() { - const [count, setCount] = useState(0) - - return ( - <> - -

Vite + React

-
- -

- Edit src/App.jsx and save to test HMR -

-
-

- Click on the Vite and React logos to learn more -

- - ) -} - -export default App diff --git a/web_frontend/src/components/FloatingShape.jsx b/web_frontend/src/components/FloatingShape.jsx new file mode 100644 index 0000000000..053fceae5e --- /dev/null +++ b/web_frontend/src/components/FloatingShape.jsx @@ -0,0 +1,26 @@ +import {motion} from 'framer-motion' + +const FloatingShape = ({color, size, top, left, delay}) => { + return ( +
- + ); } diff --git a/web_frontend/src/components/PasswordStrengthMeter.jsx b/web_frontend/src/components/PasswordStrengthMeter.jsx index e911251a58..a6847986cb 100644 --- a/web_frontend/src/components/PasswordStrengthMeter.jsx +++ b/web_frontend/src/components/PasswordStrengthMeter.jsx @@ -18,7 +18,7 @@ const PasswordCriteria = ({ password }) => { ) : ( )} - {item.label} + {item.label} ))} @@ -55,7 +55,7 @@ const PasswordStrengthMeter = ({ password }) => { return (
- Force du mot de passe + Force du mot de passe {getStrengthText(strength)}
diff --git a/web_frontend/src/pages/header.jsx b/web_frontend/src/pages/header.jsx index df788aaf67..adecffe315 100644 --- a/web_frontend/src/pages/header.jsx +++ b/web_frontend/src/pages/header.jsx @@ -61,7 +61,7 @@ const Navbar = () => { {/* Bottom section with links */}
- + Tournois diff --git a/web_frontend/src/pages/home.jsx b/web_frontend/src/pages/home.jsx index 88bd1e8340..97026b5cb0 100644 --- a/web_frontend/src/pages/home.jsx +++ b/web_frontend/src/pages/home.jsx @@ -2,7 +2,6 @@ import React, { useState } from 'react'; //import CreationTeam from 'newTeam.jsx'; //import RejoindreTeam from 'joinTeam.jsx'; -import '../home.css'; function Home() { diff --git a/web_frontend/src/store/authStore.js b/web_frontend/src/store/authStore.js index ba1d6d2c7e..d397f76dd4 100644 --- a/web_frontend/src/store/authStore.js +++ b/web_frontend/src/store/authStore.js @@ -35,6 +35,7 @@ export const useAuthStore = create((set) => ({ error: null, isLoading: false, }); + toast.success(`Bon retour ${response.data.user.pseudo}`) } catch (error) { set({ error: error.response?.data?.message || "Error logging in", isLoading: false }); throw error; From 9f044fae4ee10c64f78fb655b6f9147fe7425639 Mon Sep 17 00:00:00 2001 From: Hassan-mumu Date: Thu, 24 Apr 2025 09:53:55 +0200 Subject: [PATCH 16/22] initialisation environnement de test + debut de stests pour controller signup --- api_backend/controllers/auth.controller.js | 1 + api_backend/server.js | 2 + api_backend/tests/auth/signup.test.js | 159 + commandes_node | 6 +- .../api_backend/cloudinary/cloudinary.js.html | 121 + coverage/api_backend/cloudinary/index.html | 116 + .../controllers/auth.controller.js.html | 919 +++ coverage/api_backend/controllers/index.html | 116 + coverage/api_backend/index.html | 116 + .../mailtrap/emailTemplates.js.html | 367 ++ coverage/api_backend/mailtrap/emails.js.html | 328 + coverage/api_backend/mailtrap/index.html | 146 + .../mailtrap/mailtrap.config.js.html | 130 + coverage/api_backend/middleware/index.html | 116 + .../middleware/verifyToken.js.html | 139 + .../api_backend/models/ecole.model.js.html | 133 + coverage/api_backend/models/index.html | 131 + .../api_backend/models/user.model.js.html | 286 + .../api_backend/routes/auth.route.js.html | 136 + .../api_backend/routes/ecoles.route.js.html | 133 + coverage/api_backend/routes/index.html | 131 + coverage/api_backend/server.js.html | 181 + .../utils/generateTokenAndSetCookie.js.html | 133 + coverage/api_backend/utils/index.html | 116 + coverage/base.css | 224 + coverage/block-navigation.js | 87 + coverage/config/db.js.html | 121 + coverage/config/index.html | 116 + coverage/favicon.png | Bin 0 -> 445 bytes coverage/index.html | 101 + coverage/prettify.css | 1 + coverage/prettify.js | 2 + coverage/sort-arrow-sprite.png | Bin 0 -> 138 bytes coverage/sorter.js | 196 + jest.config.mjs | 11 + package-lock.json | 5325 +++++++++++++++-- package.json | 10 +- 37 files changed, 9771 insertions(+), 585 deletions(-) create mode 100644 api_backend/tests/auth/signup.test.js create mode 100644 coverage/api_backend/cloudinary/cloudinary.js.html create mode 100644 coverage/api_backend/cloudinary/index.html create mode 100644 coverage/api_backend/controllers/auth.controller.js.html create mode 100644 coverage/api_backend/controllers/index.html create mode 100644 coverage/api_backend/index.html create mode 100644 coverage/api_backend/mailtrap/emailTemplates.js.html create mode 100644 coverage/api_backend/mailtrap/emails.js.html create mode 100644 coverage/api_backend/mailtrap/index.html create mode 100644 coverage/api_backend/mailtrap/mailtrap.config.js.html create mode 100644 coverage/api_backend/middleware/index.html create mode 100644 coverage/api_backend/middleware/verifyToken.js.html create mode 100644 coverage/api_backend/models/ecole.model.js.html create mode 100644 coverage/api_backend/models/index.html create mode 100644 coverage/api_backend/models/user.model.js.html create mode 100644 coverage/api_backend/routes/auth.route.js.html create mode 100644 coverage/api_backend/routes/ecoles.route.js.html create mode 100644 coverage/api_backend/routes/index.html create mode 100644 coverage/api_backend/server.js.html create mode 100644 coverage/api_backend/utils/generateTokenAndSetCookie.js.html create mode 100644 coverage/api_backend/utils/index.html create mode 100644 coverage/base.css create mode 100644 coverage/block-navigation.js create mode 100644 coverage/config/db.js.html create mode 100644 coverage/config/index.html create mode 100644 coverage/favicon.png create mode 100644 coverage/index.html create mode 100644 coverage/prettify.css create mode 100644 coverage/prettify.js create mode 100644 coverage/sort-arrow-sprite.png create mode 100644 coverage/sorter.js create mode 100644 jest.config.mjs diff --git a/api_backend/controllers/auth.controller.js b/api_backend/controllers/auth.controller.js index 7f61633e23..d8838965a0 100644 --- a/api_backend/controllers/auth.controller.js +++ b/api_backend/controllers/auth.controller.js @@ -3,6 +3,7 @@ import crypto from 'crypto'; import { User } from "../models/user.model.js"; import { generateTokenAndSetCookie} from '../utils/generateTokenAndSetCookie.js'; + import { sendPasswordResetRequest, sendResetSuccessEmail, sendWelcomeEmail, diff --git a/api_backend/server.js b/api_backend/server.js index 1a5e0c8fd4..1775e42ebe 100644 --- a/api_backend/server.js +++ b/api_backend/server.js @@ -28,3 +28,5 @@ app.listen(PORT, () => { connectDB(); console.log(`Serveur lancé sur http://localhost:${PORT}`); }); + +export default app diff --git a/api_backend/tests/auth/signup.test.js b/api_backend/tests/auth/signup.test.js new file mode 100644 index 0000000000..156bdc546d --- /dev/null +++ b/api_backend/tests/auth/signup.test.js @@ -0,0 +1,159 @@ +import request from 'supertest'; +import mongoose from 'mongoose'; +import { MongoMemoryServer } from 'mongodb-memory-server'; + + +import app from '../../server.js'; +import { User } from '../../models/user.model.js'; +import {generateTokenAndSetCookie} from '../../utils/generateTokenAndSetCookie.js'; +import { sendVerificationEmail } from '../../mailtrap/emails.js'; + +let mongo; + +// Mocks des fonctions utilisées dans signup +jest.mock('../../utils/generateTokenAndSetCookie.js', () => ({ + __esModule: true, + default: jest.fn() +})); + +jest.mock('../../mailtrap/emails.js', () => ({ + __esModule: true, + sendVerificationEmail: jest.fn() +})); + +beforeAll(async () => { + mongo = await MongoMemoryServer.create(); + await mongoose.connect(mongo.getUri()); +}); + +afterEach(async () => { + await User.deleteMany(); +}); + +afterAll(async () => { + await mongoose.disconnect(); + await mongo.stop(); +}); + +describe('POST /api/auth/signup', () => { + + it('✅ Crée un utilisateur avec succès', async () => { + const res = await request(app).post('/api/auth/signup').send({ + lName: 'Doe', + fName: 'John', + pseudo: 'johnny', + email: 'john@example.com', + password: 'StrongPass123!' + }); + + expect(res.status).toBe(201); + expect(res.body.sucess).toBe(true); + expect(res.body.user.pseudo).toBe('johnny'); + expect(res.body.user.password).toBeUndefined(); + expect(generateTokenAndSetCookie).toHaveBeenCalled(); + expect(sendVerificationEmail).toHaveBeenCalled(); + }); + + it('❌ Échoue si un champ est manquant', async () => { + const res = await request(app).post('/api/auth/signup').send({ + fName: 'John', + pseudo: 'johnny', + email: 'john@example.com', + password: 'StrongPass123!' + }); + + expect(res.status).toBe(400); + expect(res.body.message).toBe("All fields are required"); + }); + + it('❌ Échoue si email déjà existant', async () => { + await User.create({ + lName: 'Test', + fName: 'User', + pseudo: 'uniquePseudo', + email: 'existing@example.com', + password: 'hashedpass' + }); + + const res = await request(app).post('/api/auth/signup').send({ + lName: 'New', + fName: 'User', + pseudo: 'anotherPseudo', + email: 'existing@example.com', + password: 'StrongPass123!' + }); + + expect(res.status).toBe(400); + expect(res.body.message).toBe("User already exists"); + }); + + it('❌ Échoue si pseudo déjà utilisé', async () => { + await User.create({ + lName: 'Test', + fName: 'User', + pseudo: 'duplicatePseudo', + email: 'someone@example.com', + password: 'hashedpass' + }); + + const res = await request(app).post('/api/auth/signup').send({ + lName: 'Another', + fName: 'User', + pseudo: 'duplicatePseudo', + email: 'new@example.com', + password: 'StrongPass123!' + }); + + expect(res.status).toBe(400); + expect(res.body.message).toBe("pseudo already exists"); + }); + + it('💥 Gère une erreur interne (ex: save échoue)', async () => { + jest.spyOn(User.prototype, 'save').mockImplementationOnce(() => { + throw new Error("Erreur simulée"); + }); + + const res = await request(app).post('/api/auth/signup').send({ + lName: 'Doe', + fName: 'Jane', + pseudo: 'jane123', + email: 'jane@example.com', + password: 'StrongPass123!' + }); + + expect(res.status).toBe(400); + expect(res.body.message).toBe("Erreur simulée"); + }); + + it('❌ Échoue si les champs sont vides (ex: "")', async () => { + const res = await request(app).post('/api/auth/signup').send({ + lName: '', + fName: '', + pseudo: '', + email: '', + password: '' + }); + + expect(res.status).toBe(400); + expect(res.body.message).toBe("All fields are required"); + }); + + it('💥 Gère une erreur si generateTokenAndSetCookie échoue', async () => { + generateTokenAndSetCookie.mockImplementationOnce(() => { + throw new Error("Cookie error"); + }); + + const res = await request(app).post('/api/auth/signup').send({ + lName: 'Doe', + fName: 'Error', + pseudo: 'cookieerror', + email: 'cookie@example.com', + password: 'StrongPass123!' + }); + + expect(res.status).toBe(400); + expect(res.body.message).toBe("Cookie error"); + }); + + +}); \ No newline at end of file diff --git a/commandes_node b/commandes_node index 8c8eda662c..334c945fd1 100644 --- a/commandes_node +++ b/commandes_node @@ -42,4 +42,8 @@ npm i react-router-dom npm i cors -npm i axios \ No newline at end of file +npm i axios + + +// modules pour les tests des routes +npm i --save-dev jest supertest mongodb-memory-server nyc diff --git a/coverage/api_backend/cloudinary/cloudinary.js.html b/coverage/api_backend/cloudinary/cloudinary.js.html new file mode 100644 index 0000000000..1ebbbbb88e --- /dev/null +++ b/coverage/api_backend/cloudinary/cloudinary.js.html @@ -0,0 +1,121 @@ + + + + + + Code coverage report for api_backend/cloudinary/cloudinary.js + + + + + + + + + +
+
+

All files / api_backend/cloudinary cloudinary.js

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13  +  +  +1x +  +1x +  +  +  +  +  +  + 
import {v2 as cloudinary} from 'cloudinary'
+import {config} from 'dotenv'
+ 
+config()
+ 
+cloudinary.config({
+    cloud_name: process.env.CLOUDINARY_CLOUD_NAME,
+    api_key: process.env.CLOUDINARY_API_KEY,
+    api_secret: process.env.CLOUDINARY_API_SECRET
+})
+export default cloudinary
+ 
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/api_backend/cloudinary/index.html b/coverage/api_backend/cloudinary/index.html new file mode 100644 index 0000000000..bb3677a0b5 --- /dev/null +++ b/coverage/api_backend/cloudinary/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for api_backend/cloudinary + + + + + + + + + +
+
+

All files api_backend/cloudinary

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
cloudinary.js +
+
100%2/2100%0/0100%0/0100%2/2
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/api_backend/controllers/auth.controller.js.html b/coverage/api_backend/controllers/auth.controller.js.html new file mode 100644 index 0000000000..9a48936b8d --- /dev/null +++ b/coverage/api_backend/controllers/auth.controller.js.html @@ -0,0 +1,919 @@ + + + + + + Code coverage report for api_backend/controllers/auth.controller.js + + + + + + + + + +
+
+

All files / api_backend/controllers auth.controller.js

+
+ +
+ 21.09% + Statements + 27/128 +
+ + +
+ 12.5% + Branches + 4/32 +
+ + +
+ 11.11% + Functions + 1/9 +
+ + +
+ 20.96% + Lines + 26/124 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +2x +2x +  +  +2x +  +  +  +  +2x +2x +2x +1x +  +  +1x +1x +1x +  +  +  +  +1x +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import bcrypt from 'bcryptjs';
+import crypto from 'crypto';
+ 
+import { User } from "../models/user.model.js";
+import { generateTokenAndSetCookie} from '../utils/generateTokenAndSetCookie.js';
+import {    sendPasswordResetRequest,
+            sendResetSuccessEmail,
+            sendWelcomeEmail,
+            sendVerificationEmail } from "../mailtrap/emails.js";
+ 
+import cloudinary from '../cloudinary/cloudinary.js';
+import { console } from 'inspector/promises';
+ 
+export const checkAuth = async (req, res) => {
+    try {
+        const user = await User.findById(req.userId).select("-password"); // On récupère l'user de la DB
+        if (!user){
+            return res.status(400).json({success:false, message:"User not found"});
+        }
+        res.status(200).json({success:true, user}); // On envoie l'user comme réponse
+    } catch (error) {
+        console.log("Error in checkAuth ", error);
+        res.status(400).json({success:false, message: error.message});
+    }
+ 
+}
+ 
+export const signup = async  (req, res) => {
+    const {lName, fName,pseudo, email, password} = req.body;
+    try {
+ 
+        // les champs requis doivent etre entrée
+        Iif(!lName, !fName, !pseudo, !email, !password){
+            throw new Error("All fields are required")
+        }
+ 
+        // Error si l'email existe déja dans la db
+        const userAlreadyExists = await User.findOne({email});
+        console.log("userAlreadyExists", userAlreadyExists)
+        if (userAlreadyExists){
+            return res.status(400).json({sucess:false, message: "User already exists"});
+        }
+ 
+        const pseudoAlreadyExists = await User.findOne({pseudo});
+        console.log("pseudoAlreadyExists", pseudoAlreadyExists)
+        Iif (pseudoAlreadyExists){
+            return res.status(400).json({sucess:false, message: "pseudo already exists"});
+        }
+ 
+        // permet de hashé le mot de passe pour qu'il ne soit pas stocké une fois enregistré
+        const hashedPassword = await bcrypt.hash(password, 12);
+ 
+        // generation d'un Token random pour l'authentification
+        const verificationToken = Math.floor(100000 + Math.random() * 900000 );toString();
+        const user = new User({
+            lName,
+            fName,
+            pseudo,
+            email,
+            password: hashedPassword,
+            verificationToken,
+            verificationTokenExpiresAt: Date.now() + 24 * 60 * 60 * 1000 // 24 heures
+        })
+ 
+        // sauvegarde dans la db
+        await user.save();
+ 
+        //jwt
+        generateTokenAndSetCookie(res, user._id);
+ 
+        await sendVerificationEmail(user.email, verificationToken);
+ 
+        res.status(201).json({
+            sucess: true,
+            message: "User created successfully",
+            user: {
+                ...user._doc,
+                password: undefined //  empèche le client de voire le mot de passe en le supprimant de la réponse
+            }
+        })
+ 
+    } catch (error) {
+        return res.status(400).json({sucess:false, message: error.message});
+    }
+}
+ 
+export const verifyEmail = async (req, res) => {
+    const {code} = req.body;
+    try {
+        const user = await User.findOne({
+            // s'assure qu'il y a un utilisateur avec ce Token et que le token n'est pas expiré
+ 
+            verificationToken: code,
+            verificationTokenExpiresAt: { $gt: Date.now()}
+        })
+        if (!user){
+            return res.status(400).json({sucess:false, message: "Invalid or expired verification code"})
+        }
+ 
+        user.isVerified = true;
+        user.verificationToken = undefined;
+        user.verificationTokenExpiresAt = undefined;
+        await user.save();
+ 
+        await sendWelcomeEmail(user.email, user.fName);
+        res.status(200).json({sucess:true,
+             message:"Email verified successfully",
+             user: {
+                ...user._doc,
+                password: undefined
+             }
+        })
+    } catch (error) {
+        console.log("Error in verifyEmail ", error)
+        res.status(500).json({success:false,  message: "Server error"})
+    }
+}
+ 
+export const login = async  (req, res) => {
+    const {email, password} = req.body;
+    try {
+        const user = await User.findOne({email});
+        if (!user){
+            return res.status(400).json({sucess:false, message:"Invalid credentials"})
+        }
+ 
+        const ispasswordValid = await bcrypt.compare(password, user.password);
+        if (!ispasswordValid){
+            return res.status(400).json({sucess:false, message:"Invalid password"})
+        }
+ 
+        generateTokenAndSetCookie(res, user._id);
+        user.lastLogin = new Date();
+        await user.save();
+ 
+        res.status(200).json({
+            success:true,
+            message: "Logged in sucessfully",
+            user: {
+                ...user._doc,
+                password: undefined,
+            }
+ 
+        })
+    } 
+    catch (error) {
+        console.log("Error in login, ", error)
+        return res.status(400).json({sucess:false, message: error.message});
+    }
+}
+ 
+export const logout = async  (req, res) => {
+    res.clearCookie("token");
+    res.status(200).json({success: true, message: "Logged out successfully" });
+}
+ 
+export const forgotPassword = async (req, res) => {
+    const {email} = req.body;
+    try {
+        const user = await User.findOne({email});
+        if (!user){
+            return res.status(400).json({success:false, message:"Email does not exist"})
+        }
+ 
+        // génère un nouveau token pour le reset du mot de passe
+        const resetToken = crypto.randomBytes(20).toString("hex");
+ 
+        user.resetPasswordToken = resetToken;
+        user.resetPasswordExpiresAt = Date.now() + 1 * 60 * 60 * 1000; //1 heure 
+ 
+        await user.save();
+ 
+        // envoie de l'email 
+        await sendPasswordResetRequest(user.email, `${process.env.CLIENT_URL}/resetPassword/${resetToken}`);
+        res.status(200).json({success: true, message: "password reset link sent to your email" });
+ 
+    } catch (error) {
+        console.log("Error in forgotPassword ", error);
+        res.status(400).json({sucess: false, message: error.message});
+        
+    }
+}
+ 
+export const resetPassword = async (req, res) => {
+    try {
+        const {token} = req.params;
+        const {password} = req.body;
+ 
+        const user = await User.findOne({
+            resetPasswordToken: token,
+            resetPasswordExpiresAt: {$gt: Date.now()},
+        });
+ 
+        if (!user){
+            return res.status(400).json({success: false, message: "invalid or expired reset token"})
+        }
+ 
+        // Nouveau mot de passe récupéré sera haché à nouveau
+        const hashedPassword = await bcrypt.hash(password,10);
+ 
+        user.password = hashedPassword
+        user.resetPasswordToken = undefined
+        user.resetPasswordExpiresAt = undefined
+        await user.save();
+ 
+        await sendResetSuccessEmail(user.email)
+ 
+        res.status(200).json({success:true, message:"Password reset successful"})
+    } catch (error) {
+        console.log("Error in resetPassword ", error)
+        res.status(400).json({success:false, message:error.message})
+        
+    }
+ 
+}
+ 
+export const updatePic = async (req, res) => {
+    try {
+        const user = await User.findById(req.userId).select("-password"); // On récupère l'user de la DB
+        if (!user){
+            return res.status(400).json({success:false, message:"User not found"});
+        }
+ 
+        const {profilePic} = req.body
+        console.log("Données envoyées:", profilePic);
+ 
+        if(!profilePic){
+            return res.status(400).json({success:false, message:"Profile picture is required"})
+        }
+        const uploadResponse = await cloudinary.uploader.upload(profilePic, {
+            resource_type: "auto"
+          });
+                  const updatedUser = await User.findByIdAndUpdate(user._id, {logo: uploadResponse.secure_url}, {new:true})
+ 
+        res.status(200).json({success:true, user:updatedUser})
+ 
+    } catch (error) {
+        console.log("error in update profile: ", error)
+        res.status(500).json({success:false, message:"Internal server error"})
+        
+    }
+}
+ 
+export const updateProfile = async (req, res) => {
+	try {
+		const userId = req.userId; // Injecté par verifyToken
+		const { nom, prenom, pseudo, password } = req.body;
+ 
+		const user = await User.findById(userId);
+		if (!user) {
+			return res.status(404).json({ message: "Utilisateur non trouvé" });
+		}
+ 
+		// Mettre à jour les champs
+		if (nom) user.lName = nom;
+		if (prenom) user.fName = prenom;
+		if (pseudo) user.pseudo = pseudo;
+ 
+		// Si password fourni, on le hash avant update
+		if (password) {
+			const salt = await bcrypt.genSalt(10);
+			const hashedPassword = await bcrypt.hash(password, salt);
+			user.password = hashedPassword;
+		}
+ 
+		// Sauvegarde
+		await user.save();
+ 
+		// On enlève le mot de passe de la réponse
+		const { password: pwd, ...userData } = user._doc;
+ 
+		return res.status(200).json({success: true, message: "Profil mis à jour avec succès", user: userData });
+ 
+	} catch (error) {
+		console.error("Erreur updateProfile:", error);
+		return res.status(500).json({ message: "Erreur serveur" });
+	}
+};
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/api_backend/controllers/index.html b/coverage/api_backend/controllers/index.html new file mode 100644 index 0000000000..8326f0334c --- /dev/null +++ b/coverage/api_backend/controllers/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for api_backend/controllers + + + + + + + + + +
+
+

All files api_backend/controllers

+
+ +
+ 21.09% + Statements + 27/128 +
+ + +
+ 12.5% + Branches + 4/32 +
+ + +
+ 11.11% + Functions + 1/9 +
+ + +
+ 20.96% + Lines + 26/124 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
auth.controller.js +
+
21.09%27/12812.5%4/3211.11%1/920.96%26/124
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/api_backend/index.html b/coverage/api_backend/index.html new file mode 100644 index 0000000000..2f75abcf9b --- /dev/null +++ b/coverage/api_backend/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for api_backend + + + + + + + + + +
+
+

All files api_backend

+
+ +
+ 81.81% + Statements + 9/11 +
+ + +
+ 50% + Branches + 1/2 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 81.81% + Lines + 9/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
server.js +
+
81.81%9/1150%1/20%0/181.81%9/11
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/api_backend/mailtrap/emailTemplates.js.html b/coverage/api_backend/mailtrap/emailTemplates.js.html new file mode 100644 index 0000000000..37d2e27c52 --- /dev/null +++ b/coverage/api_backend/mailtrap/emailTemplates.js.html @@ -0,0 +1,367 @@ + + + + + + Code coverage report for api_backend/mailtrap/emailTemplates.js + + + + + + + + + +
+
+

All files / api_backend/mailtrap emailTemplates.js

+
+ +
+ 100% + Statements + 3/3 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +951x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
export const VERIFICATION_EMAIL_TEMPLATE = `
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>Verify Your Email</title>
+</head>
+<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
+  <div style="background: linear-gradient(to right, #4CAF50, #45a049); padding: 20px; text-align: center;">
+    <h1 style="color: white; margin: 0;">Verify Your Email</h1>
+  </div>
+  <div style="background-color: #f9f9f9; padding: 20px; border-radius: 0 0 5px 5px; box-shadow: 0 2px 5px rgba(0,0,0,0.1);">
+    <p>Hello,</p>
+    <p>Thank you for signing up! Your verification code is:</p>
+    <div style="text-align: center; margin: 30px 0;">
+      <span style="font-size: 32px; font-weight: bold; letter-spacing: 5px; color: #4CAF50;">{verificationCode}</span>
+    </div>
+    <p>Enter this code on the verification page to complete your registration.</p>
+    <p>This code will expire in 15 minutes for security reasons.</p>
+    <p>If you didn't create an account with us, please ignore this email.</p>
+    <p>Best regards,<br>Your App Team</p>
+  </div>
+  <div style="text-align: center; margin-top: 20px; color: #888; font-size: 0.8em;">
+    <p>This is an automated message, please do not reply to this email.</p>
+  </div>
+</body>
+</html>
+`;
+ 
+export const PASSWORD_RESET_SUCCESS_TEMPLATE = `
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>Password Reset Successful</title>
+</head>
+<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
+  <div style="background: linear-gradient(to right, #4CAF50, #45a049); padding: 20px; text-align: center;">
+    <h1 style="color: white; margin: 0;">Password Reset Successful</h1>
+  </div>
+  <div style="background-color: #f9f9f9; padding: 20px; border-radius: 0 0 5px 5px; box-shadow: 0 2px 5px rgba(0,0,0,0.1);">
+    <p>Hello,</p>
+    <p>We're writing to confirm that your password has been successfully reset.</p>
+    <div style="text-align: center; margin: 30px 0;">
+      <div style="background-color: #4CAF50; color: white; width: 50px; height: 50px; line-height: 50px; border-radius: 50%; display: inline-block; font-size: 30px;">
+        ✓
+      </div>
+    </div>
+    <p>If you did not initiate this password reset, please contact our support team immediately.</p>
+    <p>For security reasons, we recommend that you:</p>
+    <ul>
+      <li>Use a strong, unique password</li>
+      <li>Enable two-factor authentication if available</li>
+      <li>Avoid using the same password across multiple sites</li>
+    </ul>
+    <p>Thank you for helping us keep your account secure.</p>
+    <p>Best regards,<br>Your App Team</p>
+  </div>
+  <div style="text-align: center; margin-top: 20px; color: #888; font-size: 0.8em;">
+    <p>This is an automated message, please do not reply to this email.</p>
+  </div>
+</body>
+</html>
+`;
+ 
+export const PASSWORD_RESET_REQUEST_TEMPLATE = `
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>Reset Your Password</title>
+</head>
+<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
+  <div style="background: linear-gradient(to right, #4CAF50, #45a049); padding: 20px; text-align: center;">
+    <h1 style="color: white; margin: 0;">Password Reset</h1>
+  </div>
+  <div style="background-color: #f9f9f9; padding: 20px; border-radius: 0 0 5px 5px; box-shadow: 0 2px 5px rgba(0,0,0,0.1);">
+    <p>Hello,</p>
+    <p>We received a request to reset your password. If you didn't make this request, please ignore this email.</p>
+    <p>To reset your password, click the button below:</p>
+    <div style="text-align: center; margin: 30px 0;">
+      <a href="{resetURL}" style="background-color: #4CAF50; color: white; padding: 12px 20px; text-decoration: none; border-radius: 5px; font-weight: bold;">Reset Password</a>
+    </div>
+    <p>This link will expire in 1 hour for security reasons.</p>
+    <p>Best regards,<br>Your App Team</p>
+  </div>
+  <div style="text-align: center; margin-top: 20px; color: #888; font-size: 0.8em;">
+    <p>This is an automated message, please do not reply to this email.</p>
+  </div>
+</body>
+</html>
+`;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/api_backend/mailtrap/emails.js.html b/coverage/api_backend/mailtrap/emails.js.html new file mode 100644 index 0000000000..dbf9243f86 --- /dev/null +++ b/coverage/api_backend/mailtrap/emails.js.html @@ -0,0 +1,328 @@ + + + + + + Code coverage report for api_backend/mailtrap/emails.js + + + + + + + + + +
+
+

All files / api_backend/mailtrap emails.js

+
+ +
+ 32.14% + Statements + 9/28 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 25% + Functions + 1/4 +
+ + +
+ 32.14% + Lines + 9/28 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82  +  +  +1x +1x +  +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { mailtrapClient, sender } from "./mailtrap.config.js"
+import {VERIFICATION_EMAIL_TEMPLATE,PASSWORD_RESET_SUCCESS_TEMPLATE,  PASSWORD_RESET_REQUEST_TEMPLATE} from './emailTemplates.js'
+ 
+export const sendVerificationEmail = async (email, verificationToken) => {
+    const recipient = [{email}]
+    
+    try {
+        const response = await mailtrapClient.send({
+            from: sender,
+            to: recipient,
+            subject: "Verify your email",
+            html: VERIFICATION_EMAIL_TEMPLATE.replace("{verificationCode}",verificationToken),
+            category: "Email Verfification"
+        })
+        console.log("Email verification sent succefffully", response)    
+    } 
+    catch (error) {
+        console.log("Error sending verification email: ", error)
+        throw new Error('Error sending verification email: ',error)
+        
+    }
+}
+ 
+export const sendWelcomeEmail = async (email, name) => {
+    const recipient = [{email}];
+ 
+    try {
+        const response = await mailtrapClient.send({
+            from: sender,
+            to: recipient,
+            template_uuid: "5ec20a13-7c21-426a-8b16-e5da36e9d38f",
+            template_variables: {
+            company_info_name: "Lan-Party Ephec Company",
+            name: name
+            },
+        })
+        console.log("Welcome email sent successfully : ", response)
+    } catch (error) {
+        console.log("Error sending welcome email : ", error);
+        throw new Error('Error sending welcome email: ', error);
+    }
+    
+}
+ 
+export const sendPasswordResetRequest = async (email, resetURL) => {
+    const recipient = [{email}]
+ 
+    try {
+        const response = await mailtrapClient.send({
+            from: sender,
+            to: recipient,
+            subject: "Reset your password",
+            html: PASSWORD_RESET_REQUEST_TEMPLATE.replace("{resetURL}", resetURL),
+            category: "Password Reset"
+        })
+        console.log("Password reset successfully : ", response)
+        
+    } catch (error) {
+        console.log("Error sending resset password email: ", error);
+        throw new Error('Error sending resset password email: ', error);
+    }
+}
+ 
+export const sendResetSuccessEmail = async (email) => {
+    const recipient = [{email}];
+ 
+    try {
+        const response = await mailtrapClient.send({
+            from: sender,
+            to: recipient,
+            subject:"Email Password successfull",
+            html: PASSWORD_RESET_SUCCESS_TEMPLATE,
+            category:"Password Reset Successful"
+ 
+        })
+        console.log("Email password success reset sent successful ", response)
+    } catch (error) {
+        console.log("Error sending email password sucess reset: ", error);
+        throw new Error('Error sending email password sucess reset: ', error);
+        
+    }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/api_backend/mailtrap/index.html b/coverage/api_backend/mailtrap/index.html new file mode 100644 index 0000000000..0e67b5ef48 --- /dev/null +++ b/coverage/api_backend/mailtrap/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for api_backend/mailtrap + + + + + + + + + +
+
+

All files api_backend/mailtrap

+
+ +
+ 44.11% + Statements + 15/34 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 25% + Functions + 1/4 +
+ + +
+ 44.11% + Lines + 15/34 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
emailTemplates.js +
+
100%3/3100%0/0100%0/0100%3/3
emails.js +
+
32.14%9/28100%0/025%1/432.14%9/28
mailtrap.config.js +
+
100%3/3100%0/0100%0/0100%3/3
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/api_backend/mailtrap/mailtrap.config.js.html b/coverage/api_backend/mailtrap/mailtrap.config.js.html new file mode 100644 index 0000000000..df851c3f88 --- /dev/null +++ b/coverage/api_backend/mailtrap/mailtrap.config.js.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for api_backend/mailtrap/mailtrap.config.js + + + + + + + + + +
+
+

All files / api_backend/mailtrap mailtrap.config.js

+
+ +
+ 100% + Statements + 3/3 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16  +  +  +1x +  +1x +  +  +  +  +1x +  +  +  +  + 
import { MailtrapClient } from "mailtrap";
+import dotenv from "dotenv";
+ 
+dotenv.config();
+ 
+export const mailtrapClient = new MailtrapClient({
+    endpoint: process.env.MAILTRAP_ENDPOINT,
+     token: process.env.MAILTRAP_TOKEN 
+    });
+ 
+export const sender = {
+  email: "hello@demomailtrap.co",
+  name: "Hassan",
+};
+ 
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/api_backend/middleware/index.html b/coverage/api_backend/middleware/index.html new file mode 100644 index 0000000000..5644193e14 --- /dev/null +++ b/coverage/api_backend/middleware/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for api_backend/middleware + + + + + + + + + +
+
+

All files api_backend/middleware

+
+ +
+ 8.33% + Statements + 1/12 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 10% + Lines + 1/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
verifyToken.js +
+
8.33%1/120%0/40%0/110%1/10
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/api_backend/middleware/verifyToken.js.html b/coverage/api_backend/middleware/verifyToken.js.html new file mode 100644 index 0000000000..98716f19f5 --- /dev/null +++ b/coverage/api_backend/middleware/verifyToken.js.html @@ -0,0 +1,139 @@ + + + + + + Code coverage report for api_backend/middleware/verifyToken.js + + + + + + + + + +
+
+

All files / api_backend/middleware verifyToken.js

+
+ +
+ 8.33% + Statements + 1/12 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 10% + Lines + 1/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import jwt from 'jsonwebtoken'; 
+ 
+export const verifyToken =  (req, res, next) => {   // next permet de passer à la fonction suivant de la fonction qui l'a appelé ici "checkAuth"
+ 
+    const token = req.cookies.token // récupération du token dans les cookies
+    if (!token) return res.status(401).json({success:false, message:"Unauthorized- no token provided"});
+    try {
+        const decoded = jwt.verify(token, process.env.JWT_SECRET); // On utilise le meme secret qui à permit de créer le token pour vérifier si il est bon 
+ 
+        if(!decoded) return res.status(401).json({success:false, message:'Unauthorized- invalid token'});
+        
+        req.userId = decoded.userId; // on donne l'id du user qui correspond à ce token décodé à la page
+        next(); // on passe alors à la fonction suivante qui est "checkAuth"
+    } catch (error) {
+        console.log("Error in verifyToken ", error);
+        return res.status(500).json({ success: false, message:`server error: ${error}`})
+        
+    }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/api_backend/models/ecole.model.js.html b/coverage/api_backend/models/ecole.model.js.html new file mode 100644 index 0000000000..da68c329db --- /dev/null +++ b/coverage/api_backend/models/ecole.model.js.html @@ -0,0 +1,133 @@ + + + + + + Code coverage report for api_backend/models/ecole.model.js + + + + + + + + + +
+
+

All files / api_backend/models ecole.model.js

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  + 
import mongoose from "mongoose";
+const ecoleSchema = new mongoose.Schema({
+  nom: {
+    type: String,
+    required: true
+  },
+  adresse: {
+    type: String,
+    required: true
+  },
+ 
+});
+ 
+const Ecole = mongoose.model('Ecole', ecoleSchema);
+ 
+export default Ecole;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/api_backend/models/index.html b/coverage/api_backend/models/index.html new file mode 100644 index 0000000000..be808e323d --- /dev/null +++ b/coverage/api_backend/models/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for api_backend/models + + + + + + + + + +
+
+

All files api_backend/models

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
ecole.model.js +
+
100%2/2100%0/0100%0/0100%2/2
user.model.js +
+
100%2/2100%0/0100%0/0100%2/2
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/api_backend/models/user.model.js.html b/coverage/api_backend/models/user.model.js.html new file mode 100644 index 0000000000..ae9e4e1a51 --- /dev/null +++ b/coverage/api_backend/models/user.model.js.html @@ -0,0 +1,286 @@ + + + + + + Code coverage report for api_backend/models/user.model.js + + + + + + + + + +
+
+

All files / api_backend/models user.model.js

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  + 
import mongoose from 'mongoose';
+ 
+const userSchema = new mongoose.Schema({
+    lName: {
+        type: String,
+        required: true,
+        trim: true
+    },
+    fName: {
+        type: String,
+        required: true,
+        trim: true
+    },
+    pseudo: {
+        type: String,
+        default: null,
+        unique:true,
+        require: true,
+        sparse: true,
+        trim: true
+    },
+    email: {
+        type: String,
+        required: true,
+        unique: true,
+        lowercase: true,
+        trim: true
+    },
+    password: {
+        type: String,
+        required: true
+    },
+    niveau: {
+        type: Number,
+        default: 1,
+        min: 1,
+        max: 100
+    },
+    logo: {
+        type: String,
+        defaul: ""
+    },
+    ecole_id: {
+        type: mongoose.Schema.Types.ObjectId,
+        ref: 'Ecole',
+    },
+    team_id: {
+        type: mongoose.Schema.Types.ObjectId,
+        ref: 'Team' // à créer plus tard
+    },
+    lastLogin:{
+    type: Date,
+    default: Date.now
+    },
+    isVerified: {
+        type: Boolean,
+        default: false
+    },
+    resetPasswordToken: String,
+    resetPasswordExpiresAt: Date,
+    verificationToken: String,
+    verificationTokenExpiresAt: Date,
+ 
+}, { timestamps: true });
+ 
+export const User = mongoose.model("Joueur", userSchema);
+ 
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/api_backend/routes/auth.route.js.html b/coverage/api_backend/routes/auth.route.js.html new file mode 100644 index 0000000000..268dcacea2 --- /dev/null +++ b/coverage/api_backend/routes/auth.route.js.html @@ -0,0 +1,136 @@ + + + + + + Code coverage report for api_backend/routes/auth.route.js + + + + + + + + + +
+
+

All files / api_backend/routes auth.route.js

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18  +  +  +1x +  +1x +  +1x +1x +  +1x +1x +1x +1x +1x +1x +  + 
import express from 'express'
+import {checkAuth, signup, login, logout, verifyEmail, forgotPassword, resetPassword, updatePic, updateProfile} from '../controllers/auth.controller.js' 
+import { verifyToken } from '../middleware/verifyToken.js';
+const router = express.Router();
+ 
+router.get("/checkAuth", verifyToken, checkAuth)
+ 
+router.put("/updatePic",verifyToken, updatePic)
+router.put("/updateProfile",verifyToken, updateProfile)
+ 
+router.post("/signup", signup)
+router.post("/login",login)
+router.post("/logout", logout)
+router.post("/verifyEmail", verifyEmail)
+router.post("/forgotPassword", forgotPassword)
+router.post('/resetPassword/:token', resetPassword)
+ 
+export default router
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/api_backend/routes/ecoles.route.js.html b/coverage/api_backend/routes/ecoles.route.js.html new file mode 100644 index 0000000000..d06c8e72b5 --- /dev/null +++ b/coverage/api_backend/routes/ecoles.route.js.html @@ -0,0 +1,133 @@ + + + + + + Code coverage report for api_backend/routes/ecoles.route.js + + + + + + + + + +
+
+

All files / api_backend/routes ecoles.route.js

+
+ +
+ 33.33% + Statements + 2/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 33.33% + Lines + 2/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17  +  +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  + 
// routes/ecoles.js
+import express from 'express';
+import Ecole from '../models/ecole.model.js';
+ 
+const router = express.Router();
+ 
+router.get('/', async (req, res) => {
+    try {
+        const ecoles = await Ecole.find();
+        res.status(200).json(ecoles);
+    } catch (error) {
+        res.status(500).json({ message: "Erreur lors de la récupération des écoles." });
+    }
+});
+ 
+export default router;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/api_backend/routes/index.html b/coverage/api_backend/routes/index.html new file mode 100644 index 0000000000..bc0ed216f6 --- /dev/null +++ b/coverage/api_backend/routes/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for api_backend/routes + + + + + + + + + +
+
+

All files api_backend/routes

+
+ +
+ 75% + Statements + 12/16 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 75% + Lines + 12/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
auth.route.js +
+
100%10/10100%0/0100%0/0100%10/10
ecoles.route.js +
+
33.33%2/6100%0/00%0/133.33%2/6
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/api_backend/server.js.html b/coverage/api_backend/server.js.html new file mode 100644 index 0000000000..b3d4a97ba9 --- /dev/null +++ b/coverage/api_backend/server.js.html @@ -0,0 +1,181 @@ + + + + + + Code coverage report for api_backend/server.js + + + + + + + + + +
+
+

All files / api_backend server.js

+
+ +
+ 81.81% + Statements + 9/11 +
+ + +
+ 50% + Branches + 1/2 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 81.81% + Lines + 9/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33  +  +  +  +  +  +  +  +  +  +1x +  +1x +1x +  +  +1x +  +1x +1x +  +  +1x +1x +  +  +1x +  +  +  +  +  + 
import express from 'express';
+import dotenv from 'dotenv';
+import cookieParser from 'cookie-parser';
+import cors from 'cors';
+import path from 'path';
+ 
+import ecoleRoutes from './routes/ecoles.route.js';
+import authRoutes from './routes/auth.route.js';
+import { connectDB } from '../config/db.js';
+ 
+dotenv.config();
+ 
+const app = express();
+const PORT = process.env.PORT || 5000;
+ 
+// CORS configuration
+app.use(cors({ origin: 'http://localhost:3000', credentials:true }));
+ 
+app.use(express.json()); // Middleware pour analyser les requetes JSON à travers req.body
+app.use(cookieParser()); // Middleware pour analyser les cookies
+ 
+// Routes
+app.use("/api/auth", authRoutes);
+app.use("/api/ecoles", ecoleRoutes);
+ 
+// Lancer le serveur
+app.listen(PORT, () => {
+    connectDB();
+    console.log(`Serveur lancé sur http://localhost:${PORT}`);
+});
+ 
+export default app
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/api_backend/utils/generateTokenAndSetCookie.js.html b/coverage/api_backend/utils/generateTokenAndSetCookie.js.html new file mode 100644 index 0000000000..d05073dfa9 --- /dev/null +++ b/coverage/api_backend/utils/generateTokenAndSetCookie.js.html @@ -0,0 +1,133 @@ + + + + + + Code coverage report for api_backend/utils/generateTokenAndSetCookie.js + + + + + + + + + +
+
+

All files / api_backend/utils generateTokenAndSetCookie.js

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17  +  +1x +1x +  +  +  +1x +  +  +  +  +  +  +1x +  + 
import jwt from 'jsonwebtoken';
+ 
+export const generateTokenAndSetCookie = (res, userId) => {
+    const token = jwt.sign({userId}, process.env.JWT_SECRET, {
+        expiresIn: "7d"
+    })
+ 
+    res.cookie("token", token, {
+        httpOnly: true, // non accéssible via js, prévient des attaques XSS
+        secure: process.env.NODE_ENV === "production",
+        sameSite: "strict", // previent des attaques csrf
+        maxAge: 7 * 24 * 60 * 60 * 1000,
+    });
+    
+    return token
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/api_backend/utils/index.html b/coverage/api_backend/utils/index.html new file mode 100644 index 0000000000..c9458cc122 --- /dev/null +++ b/coverage/api_backend/utils/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for api_backend/utils + + + + + + + + + +
+
+

All files api_backend/utils

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
generateTokenAndSetCookie.js +
+
100%4/4100%0/0100%1/1100%4/4
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/base.css b/coverage/base.css new file mode 100644 index 0000000000..f418035b46 --- /dev/null +++ b/coverage/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/coverage/block-navigation.js b/coverage/block-navigation.js new file mode 100644 index 0000000000..cc12130231 --- /dev/null +++ b/coverage/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/coverage/config/db.js.html b/coverage/config/db.js.html new file mode 100644 index 0000000000..ad8628b4b5 --- /dev/null +++ b/coverage/config/db.js.html @@ -0,0 +1,121 @@ + + + + + + Code coverage report for config/db.js + + + + + + + + + +
+
+

All files / config db.js

+
+ +
+ 16.66% + Statements + 1/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 16.66% + Lines + 1/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13  +  +1x +  +  +  +  +  +  +  +  +  + 
import mongoose from "mongoose";
+ 
+export const connectDB = async () => {
+    try {
+        const conn = await mongoose.connect(process.env.MONGO_URI); // se connecte à la DB en asynchrone
+        console.log(`MongoDB connected: ${conn.connection.host}`);
+    } catch (error){
+        console.error(`Error: ${error.message}`);
+        process.exit(1); // 1 c'est pour dire que y a eu erreur et 0 succès 
+    }
+}
+ 
+//NoSQL enrgistre dans des collections avec des documents 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/config/index.html b/coverage/config/index.html new file mode 100644 index 0000000000..2f30c500cf --- /dev/null +++ b/coverage/config/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for config + + + + + + + + + +
+
+

All files config

+
+ +
+ 16.66% + Statements + 1/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 16.66% + Lines + 1/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
db.js +
+
16.66%1/6100%0/00%0/116.66%1/6
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/favicon.png b/coverage/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1525b811a167671e9de1fa78aab9f5c0b61cef7 GIT binary patch literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ Unknown% + Statements + 0/0 +
+ + +
+ Unknown% + Branches + 0/0 +
+ + +
+ Unknown% + Functions + 0/0 +
+ + +
+ Unknown% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/prettify.css b/coverage/prettify.css new file mode 100644 index 0000000000..b317a7cda3 --- /dev/null +++ b/coverage/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/prettify.js b/coverage/prettify.js new file mode 100644 index 0000000000..b3225238f2 --- /dev/null +++ b/coverage/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/coverage/sort-arrow-sprite.png b/coverage/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed68316eb3f65dec9063332d2f69bf3093bbfab GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc literal 0 HcmV?d00001 diff --git a/coverage/sorter.js b/coverage/sorter.js new file mode 100644 index 0000000000..2bb296a8ca --- /dev/null +++ b/coverage/sorter.js @@ -0,0 +1,196 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + if ( + row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()) + ) { + row.style.display = ''; + } else { + row.style.display = 'none'; + } + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/jest.config.mjs b/jest.config.mjs new file mode 100644 index 0000000000..2059e6a117 --- /dev/null +++ b/jest.config.mjs @@ -0,0 +1,11 @@ +export default { + rootDir: './api_backend', // Indique à Jest où commencer + testEnvironment: 'node', + verbose: true, + collectCoverage: true, + coverageDirectory: '../coverage', // revient à la racine du projet + coverageReporters: ['text', 'html'], + testMatch: [ + "**/tests/**/*.test.js", // cible les tests dans le dossier api_backend/tests/ + ] +}; diff --git a/package-lock.json b/package-lock.json index 69d2d33ffa..67151e9081 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,365 +27,939 @@ "vite": "^6.2.3" }, "devDependencies": { - "nodemon": "^3.1.9" + "jest": "^29.7.0", + "mongodb-memory-server": "^10.1.4", + "nodemon": "^3.1.9", + "nyc": "^17.1.0", + "supertest": "^7.1.0" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", - "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, "engines": { - "node": ">=18" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", - "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", - "cpu": [ - "arm" - ], + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", - "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/compat-data": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", - "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", - "cpu": [ - "x64" - ], + "node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", - "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/core/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=18" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", - "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" + "node_modules/@babel/core/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", - "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", - "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", - "cpu": [ - "x64" - ], + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", + "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", - "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", - "cpu": [ - "arm" - ], + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", - "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", - "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", - "cpu": [ - "ia32" - ], + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", - "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", - "cpu": [ - "loong64" - ], + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", - "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", - "cpu": [ - "mips64el" - ], + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", - "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", - "cpu": [ - "ppc64" - ], + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", - "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", - "cpu": [ - "riscv64" - ], + "node_modules/@babel/helpers": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", - "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", + "node_modules/@babel/parser": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/types": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", + "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", "cpu": [ - "s390x" + "ppc64" ], "license": "MIT", "optional": true, "os": [ - "linux" + "aix" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/linux-x64": { + "node_modules/@esbuild/android-arm": { "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", - "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", + "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", "cpu": [ - "x64" + "arm" ], "license": "MIT", "optional": true, "os": [ - "linux" + "android" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/netbsd-arm64": { + "node_modules/@esbuild/android-arm64": { "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", - "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", + "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", "cpu": [ "arm64" ], "license": "MIT", "optional": true, "os": [ - "netbsd" + "android" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/netbsd-x64": { + "node_modules/@esbuild/android-x64": { "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", - "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", + "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", "cpu": [ "x64" ], "license": "MIT", "optional": true, "os": [ - "netbsd" + "android" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/openbsd-arm64": { + "node_modules/@esbuild/darwin-arm64": { "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", - "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", + "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", "cpu": [ "arm64" ], "license": "MIT", "optional": true, "os": [ - "openbsd" + "darwin" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/openbsd-x64": { + "node_modules/@esbuild/darwin-x64": { "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", - "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", + "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", "cpu": [ "x64" ], "license": "MIT", "optional": true, "os": [ - "openbsd" + "darwin" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/sunos-x64": { + "node_modules/@esbuild/freebsd-arm64": { "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", - "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", + "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", "cpu": [ - "x64" + "arm64" ], "license": "MIT", "optional": true, "os": [ - "sunos" + "freebsd" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/win32-arm64": { + "node_modules/@esbuild/freebsd-x64": { "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", - "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", + "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", + "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", + "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", + "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", + "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", + "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", + "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", + "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", + "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", + "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", + "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", + "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", + "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", + "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", + "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", + "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", "cpu": [ "arm64" ], @@ -1069,20 +1643,392 @@ "node": ">=6" } }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "license": "BSD-3-Clause", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", "tar": "^6.1.11" }, "bin": { @@ -1162,6 +2108,29 @@ "tslib": "^2.3.1" } }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz", + "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -1486,6 +2455,78 @@ "win32" ] }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, "node_modules/@types/cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", @@ -1498,6 +2539,43 @@ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "license": "MIT" }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, "node_modules/@types/node": { "version": "22.14.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", @@ -1507,6 +2585,13 @@ "undici-types": "~6.21.0" } }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/webidl-conversions": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", @@ -1522,6 +2607,23 @@ "@types/webidl-conversions": "*" } }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -1576,28 +2678,58 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "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==", + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, "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==", + "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==", + "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "type-fest": "^0.21.3" }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/anymatch": { @@ -1620,12 +2752,32 @@ "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", "license": "MIT" }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "license": "ISC" }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true, + "license": "MIT" + }, "node_modules/are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", @@ -1640,12 +2792,39 @@ "node": ">=10" } }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "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==", "license": "MIT" }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-mutex": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", + "integrity": "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1663,12 +2842,153 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==", "license": "MIT" }, + "node_modules/bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, "node_modules/bcrypt": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", @@ -1752,6 +3072,49 @@ "node": ">=8" } }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, "node_modules/bson": { "version": "6.10.3", "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.3.tgz", @@ -1761,6 +3124,16 @@ "node": ">=16.20.1" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, "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", @@ -1793,6 +3166,35 @@ "node": ">= 0.8" } }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/caching-transform/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, "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", @@ -1822,6 +3224,97 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001715", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001715.tgz", + "integrity": "sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "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/chalk/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -1856,6 +3349,39 @@ "node": ">=10" } }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -1883,6 +3409,24 @@ "node": ">=9" } }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true, + "license": "MIT" + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1922,7 +3466,24 @@ "node": ">= 0.8" } }, - "node_modules/concat-map": { + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", @@ -2000,6 +3561,13 @@ "node": ">= 0.6" } }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, "node_modules/cookie": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", @@ -2037,6 +3605,13 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "license": "MIT" }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true, + "license": "MIT" + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -2056,6 +3631,43 @@ "node": ">= 0.10" } }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/crypto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", @@ -2072,6 +3684,57 @@ "ms": "2.0.0" } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2115,6 +3778,37 @@ "node": ">=8" } }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/dotenv": { "version": "16.5.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", @@ -2156,6 +3850,26 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, + "node_modules/electron-to-chromium": { + "version": "1.5.140", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.140.tgz", + "integrity": "sha512-o82Rj+ONp4Ip7Cl1r7lrqx/pXhbp/lh9DpKcMNscFJdh8ebyRofnc7Sh01B4jx403RI0oqTBvlZ7OBIZLMr2+Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -2171,6 +3885,16 @@ "node": ">= 0.8" } }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -2216,6 +3940,13 @@ "node": ">= 0.4" } }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT" + }, "node_modules/esbuild": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", @@ -2271,6 +4002,30 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -2280,6 +4035,56 @@ "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==", + "dev": true, + "license": "MIT", + "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/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/express": { "version": "4.21.2", "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", @@ -2326,6 +4131,27 @@ "url": "https://opencollective.com/express" } }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "license": "MIT" + }, "node_modules/faye-websocket": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", @@ -2338,6 +4164,16 @@ "node": ">=0.8.0" } }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -2369,6 +4205,38 @@ "node": ">= 0.8" } }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/firebase": { "version": "11.6.0", "resolved": "https://registry.npmjs.org/firebase/-/firebase-11.6.0.tgz", @@ -2425,6 +4293,36 @@ } } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", @@ -2437,471 +4335,1527 @@ "mime-types": "^2.1.12" }, "engines": { - "node": ">= 6" + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", + "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/framer-motion": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-6.5.1.tgz", + "integrity": "sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==", + "license": "MIT", + "dependencies": { + "@motionone/dom": "10.12.0", + "framesync": "6.0.1", + "hey-listen": "^1.0.8", + "popmotion": "11.0.3", + "style-value-types": "5.0.0", + "tslib": "^2.1.0" + }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, + "peerDependencies": { + "react": ">=16.8 || ^17.0.0 || ^18.0.0", + "react-dom": ">=16.8 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/framer-motion/node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/framer-motion/node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "license": "MIT", + "optional": true + }, + "node_modules/framesync": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.0.1.tgz", + "integrity": "sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "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-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "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==", + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC" + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==", + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT", + "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-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/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==", + "license": "MIT" + }, + "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==", + "dev": true, + "license": "Apache-2.0", + "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==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "license": "ISC" + }, + "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, + "license": "ISC" + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "license": "ISC", + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "node_modules/istanbul-lib-report/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==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/framer-motion": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-6.5.1.tgz", - "integrity": "sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==", + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, "license": "MIT", "dependencies": { - "@motionone/dom": "10.12.0", - "framesync": "6.0.1", - "hey-listen": "^1.0.8", - "popmotion": "11.0.3", - "style-value-types": "5.0.0", - "tslib": "^2.1.0" + "semver": "^7.5.3" }, - "optionalDependencies": { - "@emotion/is-prop-valid": "^0.8.2" + "engines": { + "node": ">=10" }, - "peerDependencies": { - "react": ">=16.8 || ^17.0.0 || ^18.0.0", - "react-dom": ">=16.8 || ^17.0.0 || ^18.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/framer-motion/node_modules/@emotion/is-prop-valid": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", - "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "node_modules/istanbul-lib-report/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==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "@emotion/memoize": "0.7.4" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/framer-motion/node_modules/@emotion/memoize": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", - "license": "MIT", - "optional": true - }, - "node_modules/framesync": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.0.1.tgz", - "integrity": "sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==", - "license": "MIT", + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "license": "ISC", + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "ms": "^2.1.3" }, "engines": { - "node": ">= 8" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", + "node_modules/istanbul-lib-source-maps/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "yallist": "^4.0.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "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==", + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "deprecated": "This package is no longer supported.", - "license": "ISC", "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "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==", + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "detect-newline": "^3.0.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, "license": "MIT", "dependencies": { - "has-symbols": "^1.0.3" + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "license": "ISC" - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/hey-listen": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", - "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==", - "license": "MIT" - }, - "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==", + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">= 0.8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/http-parser-js": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", - "license": "MIT" - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, "license": "MIT", "dependencies": { - "agent-base": "6", - "debug": "4" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" }, "engines": { - "node": ">=6.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" }, "peerDependenciesMeta": { - "supports-color": { + "jest-resolve": { "optional": true } } }, - "node_modules/https-proxy-agent/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==", - "license": "MIT" + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.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==", + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", - "license": "ISC" + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "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==", + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "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==", + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "license": "MIT", "dependencies": { - "binary-extensions": "^2.0.0" + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.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==", + "node_modules/jest-worker/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==", + "dev": true, "license": "MIT", "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==", + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "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==", + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, "engines": { - "node": ">=0.12.0" + "node": ">=6" } }, - "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/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, "license": "MIT" }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/jsonwebtoken": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", @@ -2960,6 +5914,46 @@ "node": ">=12.0.0" } }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -2972,6 +5966,13 @@ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "license": "MIT" }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -3020,6 +6021,23 @@ "integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==", "license": "Apache-2.0" }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lru-cache/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, "node_modules/mailtrap": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/mailtrap/-/mailtrap-4.1.0.tgz", @@ -3069,6 +6087,16 @@ "semver": "bin/semver.js" } }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -3102,6 +6130,13 @@ "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==", + "dev": true, + "license": "MIT" + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -3111,6 +6146,20 @@ "node": ">= 0.6" } }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -3144,6 +6193,16 @@ "node": ">= 0.6" } }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -3267,6 +6326,107 @@ "whatwg-url": "^14.1.0 || ^13.0.0" } }, + "node_modules/mongodb-memory-server": { + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-10.1.4.tgz", + "integrity": "sha512-+oKQ/kc3CX+816oPFRtaF0CN4vNcGKNjpOQe4bHo/21A3pMD+lC7Xz1EX5HP7siCX4iCpVchDMmCOFXVQSGkUg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "mongodb-memory-server-core": "10.1.4", + "tslib": "^2.7.0" + }, + "engines": { + "node": ">=16.20.1" + } + }, + "node_modules/mongodb-memory-server-core": { + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-10.1.4.tgz", + "integrity": "sha512-o8fgY7ZalEd8pGps43fFPr/hkQu1L8i6HFEGbsTfA2zDOW0TopgpswaBCqDr0qD7ptibyPfB5DmC+UlIxbThzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-mutex": "^0.5.0", + "camelcase": "^6.3.0", + "debug": "^4.3.7", + "find-cache-dir": "^3.3.2", + "follow-redirects": "^1.15.9", + "https-proxy-agent": "^7.0.5", + "mongodb": "^6.9.0", + "new-find-package-json": "^2.0.0", + "semver": "^7.6.3", + "tar-stream": "^3.1.7", + "tslib": "^2.7.0", + "yauzl": "^3.1.3" + }, + "engines": { + "node": ">=16.20.1" + } + }, + "node_modules/mongodb-memory-server-core/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/mongodb-memory-server-core/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mongodb-memory-server-core/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mongodb-memory-server-core/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/mongodb-memory-server-core/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==", + "dev": true, + "license": "MIT" + }, "node_modules/mongoose": { "version": "8.13.2", "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.13.2.tgz", @@ -3393,6 +6553,13 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -3402,6 +6569,44 @@ "node": ">= 0.6" } }, + "node_modules/new-find-package-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/new-find-package-json/-/new-find-package-json-2.0.0.tgz", + "integrity": "sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/new-find-package-json/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/new-find-package-json/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==", + "dev": true, + "license": "MIT" + }, "node_modules/node-addon-api": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", @@ -3450,6 +6655,33 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, "node_modules/nodemon": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.9.tgz", @@ -3529,6 +6761,19 @@ "node": ">=0.10.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==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/npmlog": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", @@ -3542,46 +6787,285 @@ "set-blocking": "^2.0.0" } }, + "node_modules/nyc": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-17.1.0.tgz", + "integrity": "sha512-U42vQ4czpKa0QdI1hu950XuNhYqgoM+ZF1HT+VuUHL9hPfDPVvNQyltmMqdE9bUHMVa+8yNbc3QKTj8zQhlVxQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^3.3.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^6.0.2", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/nyc/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, "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==", "license": "MIT", "engines": { - "node": ">=0.10.0" + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "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==", + "node_modules/p-locate/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==", + "dev": true, "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, "license": "MIT", "dependencies": { - "ee-first": "1.1.1" + "aggregate-error": "^3.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, "license": "ISC", "dependencies": { - "wrappy": "1" + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parseurl": { @@ -3593,6 +7077,16 @@ "node": ">= 0.8" } }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -3602,12 +7096,36 @@ "node": ">=0.10.0" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, "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==", "license": "MIT" }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -3627,6 +7145,29 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/popmotion": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-11.0.3.tgz", @@ -3667,12 +7208,67 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "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==", "license": "MIT" }, + "node_modules/process-on-spawn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", + "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/protobufjs": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.0.tgz", @@ -3732,6 +7328,23 @@ "node": ">=6" } }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, "node_modules/q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -3805,6 +7418,13 @@ "react": "^19.0.0" } }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, "node_modules/react-router": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.0.tgz", @@ -3881,6 +7501,19 @@ "node": ">=8.10.0" } }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "license": "ISC", + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3890,6 +7523,67 @@ "node": ">=0.10.0" } }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true, + "license": "ISC" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -4062,6 +7756,29 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -4146,35 +7863,125 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, - "node_modules/simple-update-notifier": { + "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, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "license": "MIT", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/spawn-wrap": { "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==", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "semver": "^7.5.3" + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", + "node_modules/spawn-wrap/node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0.0" } }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, "license": "MIT", "dependencies": { - "memory-pager": "^1.0.2" + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/statuses": { @@ -4194,6 +8001,20 @@ "node": ">=10.0.0" } }, + "node_modules/streamx": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -4203,6 +8024,20 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -4229,6 +8064,39 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/style-value-types": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-5.0.0.tgz", @@ -4239,6 +8107,79 @@ "tslib": "^2.1.0" } }, + "node_modules/superagent": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz", + "integrity": "sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^3.5.1", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/superagent/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/supertest": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.1.0.tgz", + "integrity": "sha512-5QeSO8hSrKghtcWEoPiO036fxH0Ii2wVQfFZSP0oqQhmjk8bOLhDFXr4JrvaFmPuEWUoq4znY3uSi8UzLKxGqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "methods": "^1.1.2", + "superagent": "^9.0.1" + }, + "engines": { + "node": ">=14.18.0" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -4252,6 +8193,19 @@ "node": ">=4" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/tar": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", @@ -4269,6 +8223,50 @@ "node": ">=10" } }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -4325,6 +8323,29 @@ "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", "license": "ISC" }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "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", @@ -4344,6 +8365,16 @@ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "license": "MIT" }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, "node_modules/undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", @@ -4366,6 +8397,37 @@ "node": ">= 0.8" } }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -4381,6 +8443,31 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -4461,6 +8548,16 @@ } } }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, "node_modules/web-vitals": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", @@ -4512,6 +8609,29 @@ "node": ">=18" } }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true, + "license": "ISC" + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -4544,6 +8664,20 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -4608,6 +8742,33 @@ "engines": { "node": ">=12" } + }, + "node_modules/yauzl": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", + "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "pend": "~1.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index 17f6f9637c..b25b899855 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,10 @@ "name": "rdi25", "version": "1.0.0", "description": "Template de repo pour le projet Dev Web 2024-2025", - "main": "index.js", + "main": "server.js", "scripts": { + "test": "jest", + "test:cov": "node --experimental-vm-modules node_modules/jest/bin/jest.js --coverage", "start": "nodemon api_backend/server.js" }, "repository": { @@ -37,6 +39,10 @@ "vite": "^6.2.3" }, "devDependencies": { - "nodemon": "^3.1.9" + "jest": "^29.7.0", + "mongodb-memory-server": "^10.1.4", + "nodemon": "^3.1.9", + "nyc": "^17.1.0", + "supertest": "^7.1.0" } } From f080055632b4e36b6ebd725954f10e9375ec0733 Mon Sep 17 00:00:00 2001 From: Hassan-mumu Date: Tue, 29 Apr 2025 08:42:53 +0200 Subject: [PATCH 17/22] + ajout des modulles de test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit + retrait de la verification par mail + ajout du fichier de config pour les test, vitest + ajout , robustesse de l'iinscription, vérification des valeur entrée et affichage de message en adéquation + ajout des 15 tests valide sur la page signup ~update du fichier SignUpPge.jsx organisation pour le handle dans une section à part --- api_backend/controllers/auth.controller.js | 7 +- api_backend/tests/auth/signup.test.js | 159 - commandes_node | 7 + .../api_backend/cloudinary/cloudinary.js.html | 121 - coverage/api_backend/cloudinary/index.html | 116 - .../controllers/auth.controller.js.html | 919 ---- coverage/api_backend/controllers/index.html | 116 - coverage/api_backend/index.html | 116 - .../mailtrap/emailTemplates.js.html | 367 -- coverage/api_backend/mailtrap/emails.js.html | 328 -- coverage/api_backend/mailtrap/index.html | 146 - .../mailtrap/mailtrap.config.js.html | 130 - coverage/api_backend/middleware/index.html | 116 - .../middleware/verifyToken.js.html | 139 - .../api_backend/models/ecole.model.js.html | 133 - coverage/api_backend/models/index.html | 131 - .../api_backend/models/user.model.js.html | 286 - .../api_backend/routes/auth.route.js.html | 136 - .../api_backend/routes/ecoles.route.js.html | 133 - coverage/api_backend/routes/index.html | 131 - coverage/api_backend/server.js.html | 181 - .../utils/generateTokenAndSetCookie.js.html | 133 - coverage/api_backend/utils/index.html | 116 - coverage/base.css | 224 - coverage/block-navigation.js | 87 - coverage/config/db.js.html | 121 - coverage/config/index.html | 116 - coverage/favicon.png | Bin 445 -> 0 bytes coverage/index.html | 101 - coverage/prettify.css | 1 - coverage/prettify.js | 2 - coverage/sort-arrow-sprite.png | Bin 138 -> 0 bytes coverage/sorter.js | 196 - package-lock.json | 287 + package.json | 3 + web_frontend/package-lock.json | 4881 ++++++++++++++++- web_frontend/package.json | 16 +- web_frontend/src/components/Input.jsx | 2 + .../src/components/PasswordStrengthMeter.jsx | 2 + web_frontend/src/pages/SignUpPage.jsx | 40 +- web_frontend/src/pages/SignUpPage.test.jsx | 274 + .../src/utils/validation/validationSignUp.js | 65 + web_frontend/vitest.config.js | 8 + 43 files changed, 5311 insertions(+), 5282 deletions(-) delete mode 100644 api_backend/tests/auth/signup.test.js delete mode 100644 coverage/api_backend/cloudinary/cloudinary.js.html delete mode 100644 coverage/api_backend/cloudinary/index.html delete mode 100644 coverage/api_backend/controllers/auth.controller.js.html delete mode 100644 coverage/api_backend/controllers/index.html delete mode 100644 coverage/api_backend/index.html delete mode 100644 coverage/api_backend/mailtrap/emailTemplates.js.html delete mode 100644 coverage/api_backend/mailtrap/emails.js.html delete mode 100644 coverage/api_backend/mailtrap/index.html delete mode 100644 coverage/api_backend/mailtrap/mailtrap.config.js.html delete mode 100644 coverage/api_backend/middleware/index.html delete mode 100644 coverage/api_backend/middleware/verifyToken.js.html delete mode 100644 coverage/api_backend/models/ecole.model.js.html delete mode 100644 coverage/api_backend/models/index.html delete mode 100644 coverage/api_backend/models/user.model.js.html delete mode 100644 coverage/api_backend/routes/auth.route.js.html delete mode 100644 coverage/api_backend/routes/ecoles.route.js.html delete mode 100644 coverage/api_backend/routes/index.html delete mode 100644 coverage/api_backend/server.js.html delete mode 100644 coverage/api_backend/utils/generateTokenAndSetCookie.js.html delete mode 100644 coverage/api_backend/utils/index.html delete mode 100644 coverage/base.css delete mode 100644 coverage/block-navigation.js delete mode 100644 coverage/config/db.js.html delete mode 100644 coverage/config/index.html delete mode 100644 coverage/favicon.png delete mode 100644 coverage/index.html delete mode 100644 coverage/prettify.css delete mode 100644 coverage/prettify.js delete mode 100644 coverage/sort-arrow-sprite.png delete mode 100644 coverage/sorter.js create mode 100644 web_frontend/src/pages/SignUpPage.test.jsx create mode 100644 web_frontend/src/utils/validation/validationSignUp.js create mode 100644 web_frontend/vitest.config.js diff --git a/api_backend/controllers/auth.controller.js b/api_backend/controllers/auth.controller.js index d8838965a0..0d1f98f15e 100644 --- a/api_backend/controllers/auth.controller.js +++ b/api_backend/controllers/auth.controller.js @@ -64,12 +64,17 @@ export const signup = async (req, res) => { }) // sauvegarde dans la db + user.isVerified = true + user.verificationToken = undefined; + user.verificationTokenExpiresAt = undefined; await user.save(); //jwt generateTokenAndSetCookie(res, user._id); - await sendVerificationEmail(user.email, verificationToken); + // await sendVerificationEmail(user.email, verificationToken); + + res.status(201).json({ sucess: true, diff --git a/api_backend/tests/auth/signup.test.js b/api_backend/tests/auth/signup.test.js deleted file mode 100644 index 156bdc546d..0000000000 --- a/api_backend/tests/auth/signup.test.js +++ /dev/null @@ -1,159 +0,0 @@ -import request from 'supertest'; -import mongoose from 'mongoose'; -import { MongoMemoryServer } from 'mongodb-memory-server'; - - -import app from '../../server.js'; -import { User } from '../../models/user.model.js'; -import {generateTokenAndSetCookie} from '../../utils/generateTokenAndSetCookie.js'; -import { sendVerificationEmail } from '../../mailtrap/emails.js'; - -let mongo; - -// Mocks des fonctions utilisées dans signup -jest.mock('../../utils/generateTokenAndSetCookie.js', () => ({ - __esModule: true, - default: jest.fn() -})); - -jest.mock('../../mailtrap/emails.js', () => ({ - __esModule: true, - sendVerificationEmail: jest.fn() -})); - -beforeAll(async () => { - mongo = await MongoMemoryServer.create(); - await mongoose.connect(mongo.getUri()); -}); - -afterEach(async () => { - await User.deleteMany(); -}); - -afterAll(async () => { - await mongoose.disconnect(); - await mongo.stop(); -}); - -describe('POST /api/auth/signup', () => { - - it('✅ Crée un utilisateur avec succès', async () => { - const res = await request(app).post('/api/auth/signup').send({ - lName: 'Doe', - fName: 'John', - pseudo: 'johnny', - email: 'john@example.com', - password: 'StrongPass123!' - }); - - expect(res.status).toBe(201); - expect(res.body.sucess).toBe(true); - expect(res.body.user.pseudo).toBe('johnny'); - expect(res.body.user.password).toBeUndefined(); - expect(generateTokenAndSetCookie).toHaveBeenCalled(); - expect(sendVerificationEmail).toHaveBeenCalled(); - }); - - it('❌ Échoue si un champ est manquant', async () => { - const res = await request(app).post('/api/auth/signup').send({ - fName: 'John', - pseudo: 'johnny', - email: 'john@example.com', - password: 'StrongPass123!' - }); - - expect(res.status).toBe(400); - expect(res.body.message).toBe("All fields are required"); - }); - - it('❌ Échoue si email déjà existant', async () => { - await User.create({ - lName: 'Test', - fName: 'User', - pseudo: 'uniquePseudo', - email: 'existing@example.com', - password: 'hashedpass' - }); - - const res = await request(app).post('/api/auth/signup').send({ - lName: 'New', - fName: 'User', - pseudo: 'anotherPseudo', - email: 'existing@example.com', - password: 'StrongPass123!' - }); - - expect(res.status).toBe(400); - expect(res.body.message).toBe("User already exists"); - }); - - it('❌ Échoue si pseudo déjà utilisé', async () => { - await User.create({ - lName: 'Test', - fName: 'User', - pseudo: 'duplicatePseudo', - email: 'someone@example.com', - password: 'hashedpass' - }); - - const res = await request(app).post('/api/auth/signup').send({ - lName: 'Another', - fName: 'User', - pseudo: 'duplicatePseudo', - email: 'new@example.com', - password: 'StrongPass123!' - }); - - expect(res.status).toBe(400); - expect(res.body.message).toBe("pseudo already exists"); - }); - - it('💥 Gère une erreur interne (ex: save échoue)', async () => { - jest.spyOn(User.prototype, 'save').mockImplementationOnce(() => { - throw new Error("Erreur simulée"); - }); - - const res = await request(app).post('/api/auth/signup').send({ - lName: 'Doe', - fName: 'Jane', - pseudo: 'jane123', - email: 'jane@example.com', - password: 'StrongPass123!' - }); - - expect(res.status).toBe(400); - expect(res.body.message).toBe("Erreur simulée"); - }); - - it('❌ Échoue si les champs sont vides (ex: "")', async () => { - const res = await request(app).post('/api/auth/signup').send({ - lName: '', - fName: '', - pseudo: '', - email: '', - password: '' - }); - - expect(res.status).toBe(400); - expect(res.body.message).toBe("All fields are required"); - }); - - it('💥 Gère une erreur si generateTokenAndSetCookie échoue', async () => { - generateTokenAndSetCookie.mockImplementationOnce(() => { - throw new Error("Cookie error"); - }); - - const res = await request(app).post('/api/auth/signup').send({ - lName: 'Doe', - fName: 'Error', - pseudo: 'cookieerror', - email: 'cookie@example.com', - password: 'StrongPass123!' - }); - - expect(res.status).toBe(400); - expect(res.body.message).toBe("Cookie error"); - }); - - -}); \ No newline at end of file diff --git a/commandes_node b/commandes_node index 334c945fd1..49a432a29e 100644 --- a/commandes_node +++ b/commandes_node @@ -47,3 +47,10 @@ npm i axios // modules pour les tests des routes npm i --save-dev jest supertest mongodb-memory-server nyc + +npm install --save-dev @testing-library/react @testing-library/jest-dom @testing-library/user-event jest + +npm install -D vitest @testing-library/react @testing-library/jest-dom + +npm install --save-dev @testing-library/jest-dom + diff --git a/coverage/api_backend/cloudinary/cloudinary.js.html b/coverage/api_backend/cloudinary/cloudinary.js.html deleted file mode 100644 index 1ebbbbb88e..0000000000 --- a/coverage/api_backend/cloudinary/cloudinary.js.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - Code coverage report for api_backend/cloudinary/cloudinary.js - - - - - - - - - -
-
-

All files / api_backend/cloudinary cloudinary.js

-
- -
- 100% - Statements - 2/2 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 2/2 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13  -  -  -1x -  -1x -  -  -  -  -  -  - 
import {v2 as cloudinary} from 'cloudinary'
-import {config} from 'dotenv'
- 
-config()
- 
-cloudinary.config({
-    cloud_name: process.env.CLOUDINARY_CLOUD_NAME,
-    api_key: process.env.CLOUDINARY_API_KEY,
-    api_secret: process.env.CLOUDINARY_API_SECRET
-})
-export default cloudinary
- 
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/api_backend/cloudinary/index.html b/coverage/api_backend/cloudinary/index.html deleted file mode 100644 index bb3677a0b5..0000000000 --- a/coverage/api_backend/cloudinary/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for api_backend/cloudinary - - - - - - - - - -
-
-

All files api_backend/cloudinary

-
- -
- 100% - Statements - 2/2 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 2/2 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
cloudinary.js -
-
100%2/2100%0/0100%0/0100%2/2
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/api_backend/controllers/auth.controller.js.html b/coverage/api_backend/controllers/auth.controller.js.html deleted file mode 100644 index 9a48936b8d..0000000000 --- a/coverage/api_backend/controllers/auth.controller.js.html +++ /dev/null @@ -1,919 +0,0 @@ - - - - - - Code coverage report for api_backend/controllers/auth.controller.js - - - - - - - - - -
-
-

All files / api_backend/controllers auth.controller.js

-
- -
- 21.09% - Statements - 27/128 -
- - -
- 12.5% - Branches - 4/32 -
- - -
- 11.11% - Functions - 1/9 -
- - -
- 20.96% - Lines - 26/124 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -2x -2x -  -  -2x -  -  -  -  -2x -2x -2x -1x -  -  -1x -1x -1x -  -  -  -  -1x -  -  -1x -1x -  -  -  -  -  -  -  -  -  -  -1x -  -  -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import bcrypt from 'bcryptjs';
-import crypto from 'crypto';
- 
-import { User } from "../models/user.model.js";
-import { generateTokenAndSetCookie} from '../utils/generateTokenAndSetCookie.js';
-import {    sendPasswordResetRequest,
-            sendResetSuccessEmail,
-            sendWelcomeEmail,
-            sendVerificationEmail } from "../mailtrap/emails.js";
- 
-import cloudinary from '../cloudinary/cloudinary.js';
-import { console } from 'inspector/promises';
- 
-export const checkAuth = async (req, res) => {
-    try {
-        const user = await User.findById(req.userId).select("-password"); // On récupère l'user de la DB
-        if (!user){
-            return res.status(400).json({success:false, message:"User not found"});
-        }
-        res.status(200).json({success:true, user}); // On envoie l'user comme réponse
-    } catch (error) {
-        console.log("Error in checkAuth ", error);
-        res.status(400).json({success:false, message: error.message});
-    }
- 
-}
- 
-export const signup = async  (req, res) => {
-    const {lName, fName,pseudo, email, password} = req.body;
-    try {
- 
-        // les champs requis doivent etre entrée
-        Iif(!lName, !fName, !pseudo, !email, !password){
-            throw new Error("All fields are required")
-        }
- 
-        // Error si l'email existe déja dans la db
-        const userAlreadyExists = await User.findOne({email});
-        console.log("userAlreadyExists", userAlreadyExists)
-        if (userAlreadyExists){
-            return res.status(400).json({sucess:false, message: "User already exists"});
-        }
- 
-        const pseudoAlreadyExists = await User.findOne({pseudo});
-        console.log("pseudoAlreadyExists", pseudoAlreadyExists)
-        Iif (pseudoAlreadyExists){
-            return res.status(400).json({sucess:false, message: "pseudo already exists"});
-        }
- 
-        // permet de hashé le mot de passe pour qu'il ne soit pas stocké une fois enregistré
-        const hashedPassword = await bcrypt.hash(password, 12);
- 
-        // generation d'un Token random pour l'authentification
-        const verificationToken = Math.floor(100000 + Math.random() * 900000 );toString();
-        const user = new User({
-            lName,
-            fName,
-            pseudo,
-            email,
-            password: hashedPassword,
-            verificationToken,
-            verificationTokenExpiresAt: Date.now() + 24 * 60 * 60 * 1000 // 24 heures
-        })
- 
-        // sauvegarde dans la db
-        await user.save();
- 
-        //jwt
-        generateTokenAndSetCookie(res, user._id);
- 
-        await sendVerificationEmail(user.email, verificationToken);
- 
-        res.status(201).json({
-            sucess: true,
-            message: "User created successfully",
-            user: {
-                ...user._doc,
-                password: undefined //  empèche le client de voire le mot de passe en le supprimant de la réponse
-            }
-        })
- 
-    } catch (error) {
-        return res.status(400).json({sucess:false, message: error.message});
-    }
-}
- 
-export const verifyEmail = async (req, res) => {
-    const {code} = req.body;
-    try {
-        const user = await User.findOne({
-            // s'assure qu'il y a un utilisateur avec ce Token et que le token n'est pas expiré
- 
-            verificationToken: code,
-            verificationTokenExpiresAt: { $gt: Date.now()}
-        })
-        if (!user){
-            return res.status(400).json({sucess:false, message: "Invalid or expired verification code"})
-        }
- 
-        user.isVerified = true;
-        user.verificationToken = undefined;
-        user.verificationTokenExpiresAt = undefined;
-        await user.save();
- 
-        await sendWelcomeEmail(user.email, user.fName);
-        res.status(200).json({sucess:true,
-             message:"Email verified successfully",
-             user: {
-                ...user._doc,
-                password: undefined
-             }
-        })
-    } catch (error) {
-        console.log("Error in verifyEmail ", error)
-        res.status(500).json({success:false,  message: "Server error"})
-    }
-}
- 
-export const login = async  (req, res) => {
-    const {email, password} = req.body;
-    try {
-        const user = await User.findOne({email});
-        if (!user){
-            return res.status(400).json({sucess:false, message:"Invalid credentials"})
-        }
- 
-        const ispasswordValid = await bcrypt.compare(password, user.password);
-        if (!ispasswordValid){
-            return res.status(400).json({sucess:false, message:"Invalid password"})
-        }
- 
-        generateTokenAndSetCookie(res, user._id);
-        user.lastLogin = new Date();
-        await user.save();
- 
-        res.status(200).json({
-            success:true,
-            message: "Logged in sucessfully",
-            user: {
-                ...user._doc,
-                password: undefined,
-            }
- 
-        })
-    } 
-    catch (error) {
-        console.log("Error in login, ", error)
-        return res.status(400).json({sucess:false, message: error.message});
-    }
-}
- 
-export const logout = async  (req, res) => {
-    res.clearCookie("token");
-    res.status(200).json({success: true, message: "Logged out successfully" });
-}
- 
-export const forgotPassword = async (req, res) => {
-    const {email} = req.body;
-    try {
-        const user = await User.findOne({email});
-        if (!user){
-            return res.status(400).json({success:false, message:"Email does not exist"})
-        }
- 
-        // génère un nouveau token pour le reset du mot de passe
-        const resetToken = crypto.randomBytes(20).toString("hex");
- 
-        user.resetPasswordToken = resetToken;
-        user.resetPasswordExpiresAt = Date.now() + 1 * 60 * 60 * 1000; //1 heure 
- 
-        await user.save();
- 
-        // envoie de l'email 
-        await sendPasswordResetRequest(user.email, `${process.env.CLIENT_URL}/resetPassword/${resetToken}`);
-        res.status(200).json({success: true, message: "password reset link sent to your email" });
- 
-    } catch (error) {
-        console.log("Error in forgotPassword ", error);
-        res.status(400).json({sucess: false, message: error.message});
-        
-    }
-}
- 
-export const resetPassword = async (req, res) => {
-    try {
-        const {token} = req.params;
-        const {password} = req.body;
- 
-        const user = await User.findOne({
-            resetPasswordToken: token,
-            resetPasswordExpiresAt: {$gt: Date.now()},
-        });
- 
-        if (!user){
-            return res.status(400).json({success: false, message: "invalid or expired reset token"})
-        }
- 
-        // Nouveau mot de passe récupéré sera haché à nouveau
-        const hashedPassword = await bcrypt.hash(password,10);
- 
-        user.password = hashedPassword
-        user.resetPasswordToken = undefined
-        user.resetPasswordExpiresAt = undefined
-        await user.save();
- 
-        await sendResetSuccessEmail(user.email)
- 
-        res.status(200).json({success:true, message:"Password reset successful"})
-    } catch (error) {
-        console.log("Error in resetPassword ", error)
-        res.status(400).json({success:false, message:error.message})
-        
-    }
- 
-}
- 
-export const updatePic = async (req, res) => {
-    try {
-        const user = await User.findById(req.userId).select("-password"); // On récupère l'user de la DB
-        if (!user){
-            return res.status(400).json({success:false, message:"User not found"});
-        }
- 
-        const {profilePic} = req.body
-        console.log("Données envoyées:", profilePic);
- 
-        if(!profilePic){
-            return res.status(400).json({success:false, message:"Profile picture is required"})
-        }
-        const uploadResponse = await cloudinary.uploader.upload(profilePic, {
-            resource_type: "auto"
-          });
-                  const updatedUser = await User.findByIdAndUpdate(user._id, {logo: uploadResponse.secure_url}, {new:true})
- 
-        res.status(200).json({success:true, user:updatedUser})
- 
-    } catch (error) {
-        console.log("error in update profile: ", error)
-        res.status(500).json({success:false, message:"Internal server error"})
-        
-    }
-}
- 
-export const updateProfile = async (req, res) => {
-	try {
-		const userId = req.userId; // Injecté par verifyToken
-		const { nom, prenom, pseudo, password } = req.body;
- 
-		const user = await User.findById(userId);
-		if (!user) {
-			return res.status(404).json({ message: "Utilisateur non trouvé" });
-		}
- 
-		// Mettre à jour les champs
-		if (nom) user.lName = nom;
-		if (prenom) user.fName = prenom;
-		if (pseudo) user.pseudo = pseudo;
- 
-		// Si password fourni, on le hash avant update
-		if (password) {
-			const salt = await bcrypt.genSalt(10);
-			const hashedPassword = await bcrypt.hash(password, salt);
-			user.password = hashedPassword;
-		}
- 
-		// Sauvegarde
-		await user.save();
- 
-		// On enlève le mot de passe de la réponse
-		const { password: pwd, ...userData } = user._doc;
- 
-		return res.status(200).json({success: true, message: "Profil mis à jour avec succès", user: userData });
- 
-	} catch (error) {
-		console.error("Erreur updateProfile:", error);
-		return res.status(500).json({ message: "Erreur serveur" });
-	}
-};
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/api_backend/controllers/index.html b/coverage/api_backend/controllers/index.html deleted file mode 100644 index 8326f0334c..0000000000 --- a/coverage/api_backend/controllers/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for api_backend/controllers - - - - - - - - - -
-
-

All files api_backend/controllers

-
- -
- 21.09% - Statements - 27/128 -
- - -
- 12.5% - Branches - 4/32 -
- - -
- 11.11% - Functions - 1/9 -
- - -
- 20.96% - Lines - 26/124 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
auth.controller.js -
-
21.09%27/12812.5%4/3211.11%1/920.96%26/124
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/api_backend/index.html b/coverage/api_backend/index.html deleted file mode 100644 index 2f75abcf9b..0000000000 --- a/coverage/api_backend/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for api_backend - - - - - - - - - -
-
-

All files api_backend

-
- -
- 81.81% - Statements - 9/11 -
- - -
- 50% - Branches - 1/2 -
- - -
- 0% - Functions - 0/1 -
- - -
- 81.81% - Lines - 9/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
server.js -
-
81.81%9/1150%1/20%0/181.81%9/11
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/api_backend/mailtrap/emailTemplates.js.html b/coverage/api_backend/mailtrap/emailTemplates.js.html deleted file mode 100644 index 37d2e27c52..0000000000 --- a/coverage/api_backend/mailtrap/emailTemplates.js.html +++ /dev/null @@ -1,367 +0,0 @@ - - - - - - Code coverage report for api_backend/mailtrap/emailTemplates.js - - - - - - - - - -
-
-

All files / api_backend/mailtrap emailTemplates.js

-
- -
- 100% - Statements - 3/3 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 3/3 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -951x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
export const VERIFICATION_EMAIL_TEMPLATE = `
-<!DOCTYPE html>
-<html lang="en">
-<head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  <title>Verify Your Email</title>
-</head>
-<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
-  <div style="background: linear-gradient(to right, #4CAF50, #45a049); padding: 20px; text-align: center;">
-    <h1 style="color: white; margin: 0;">Verify Your Email</h1>
-  </div>
-  <div style="background-color: #f9f9f9; padding: 20px; border-radius: 0 0 5px 5px; box-shadow: 0 2px 5px rgba(0,0,0,0.1);">
-    <p>Hello,</p>
-    <p>Thank you for signing up! Your verification code is:</p>
-    <div style="text-align: center; margin: 30px 0;">
-      <span style="font-size: 32px; font-weight: bold; letter-spacing: 5px; color: #4CAF50;">{verificationCode}</span>
-    </div>
-    <p>Enter this code on the verification page to complete your registration.</p>
-    <p>This code will expire in 15 minutes for security reasons.</p>
-    <p>If you didn't create an account with us, please ignore this email.</p>
-    <p>Best regards,<br>Your App Team</p>
-  </div>
-  <div style="text-align: center; margin-top: 20px; color: #888; font-size: 0.8em;">
-    <p>This is an automated message, please do not reply to this email.</p>
-  </div>
-</body>
-</html>
-`;
- 
-export const PASSWORD_RESET_SUCCESS_TEMPLATE = `
-<!DOCTYPE html>
-<html lang="en">
-<head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  <title>Password Reset Successful</title>
-</head>
-<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
-  <div style="background: linear-gradient(to right, #4CAF50, #45a049); padding: 20px; text-align: center;">
-    <h1 style="color: white; margin: 0;">Password Reset Successful</h1>
-  </div>
-  <div style="background-color: #f9f9f9; padding: 20px; border-radius: 0 0 5px 5px; box-shadow: 0 2px 5px rgba(0,0,0,0.1);">
-    <p>Hello,</p>
-    <p>We're writing to confirm that your password has been successfully reset.</p>
-    <div style="text-align: center; margin: 30px 0;">
-      <div style="background-color: #4CAF50; color: white; width: 50px; height: 50px; line-height: 50px; border-radius: 50%; display: inline-block; font-size: 30px;">
-        ✓
-      </div>
-    </div>
-    <p>If you did not initiate this password reset, please contact our support team immediately.</p>
-    <p>For security reasons, we recommend that you:</p>
-    <ul>
-      <li>Use a strong, unique password</li>
-      <li>Enable two-factor authentication if available</li>
-      <li>Avoid using the same password across multiple sites</li>
-    </ul>
-    <p>Thank you for helping us keep your account secure.</p>
-    <p>Best regards,<br>Your App Team</p>
-  </div>
-  <div style="text-align: center; margin-top: 20px; color: #888; font-size: 0.8em;">
-    <p>This is an automated message, please do not reply to this email.</p>
-  </div>
-</body>
-</html>
-`;
- 
-export const PASSWORD_RESET_REQUEST_TEMPLATE = `
-<!DOCTYPE html>
-<html lang="en">
-<head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  <title>Reset Your Password</title>
-</head>
-<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
-  <div style="background: linear-gradient(to right, #4CAF50, #45a049); padding: 20px; text-align: center;">
-    <h1 style="color: white; margin: 0;">Password Reset</h1>
-  </div>
-  <div style="background-color: #f9f9f9; padding: 20px; border-radius: 0 0 5px 5px; box-shadow: 0 2px 5px rgba(0,0,0,0.1);">
-    <p>Hello,</p>
-    <p>We received a request to reset your password. If you didn't make this request, please ignore this email.</p>
-    <p>To reset your password, click the button below:</p>
-    <div style="text-align: center; margin: 30px 0;">
-      <a href="{resetURL}" style="background-color: #4CAF50; color: white; padding: 12px 20px; text-decoration: none; border-radius: 5px; font-weight: bold;">Reset Password</a>
-    </div>
-    <p>This link will expire in 1 hour for security reasons.</p>
-    <p>Best regards,<br>Your App Team</p>
-  </div>
-  <div style="text-align: center; margin-top: 20px; color: #888; font-size: 0.8em;">
-    <p>This is an automated message, please do not reply to this email.</p>
-  </div>
-</body>
-</html>
-`;
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/api_backend/mailtrap/emails.js.html b/coverage/api_backend/mailtrap/emails.js.html deleted file mode 100644 index dbf9243f86..0000000000 --- a/coverage/api_backend/mailtrap/emails.js.html +++ /dev/null @@ -1,328 +0,0 @@ - - - - - - Code coverage report for api_backend/mailtrap/emails.js - - - - - - - - - -
-
-

All files / api_backend/mailtrap emails.js

-
- -
- 32.14% - Statements - 9/28 -
- - -
- 100% - Branches - 0/0 -
- - -
- 25% - Functions - 1/4 -
- - -
- 32.14% - Lines - 9/28 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82  -  -  -1x -1x -  -1x -1x -  -  -  -  -  -  -  -  -  -1x -1x -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { mailtrapClient, sender } from "./mailtrap.config.js"
-import {VERIFICATION_EMAIL_TEMPLATE,PASSWORD_RESET_SUCCESS_TEMPLATE,  PASSWORD_RESET_REQUEST_TEMPLATE} from './emailTemplates.js'
- 
-export const sendVerificationEmail = async (email, verificationToken) => {
-    const recipient = [{email}]
-    
-    try {
-        const response = await mailtrapClient.send({
-            from: sender,
-            to: recipient,
-            subject: "Verify your email",
-            html: VERIFICATION_EMAIL_TEMPLATE.replace("{verificationCode}",verificationToken),
-            category: "Email Verfification"
-        })
-        console.log("Email verification sent succefffully", response)    
-    } 
-    catch (error) {
-        console.log("Error sending verification email: ", error)
-        throw new Error('Error sending verification email: ',error)
-        
-    }
-}
- 
-export const sendWelcomeEmail = async (email, name) => {
-    const recipient = [{email}];
- 
-    try {
-        const response = await mailtrapClient.send({
-            from: sender,
-            to: recipient,
-            template_uuid: "5ec20a13-7c21-426a-8b16-e5da36e9d38f",
-            template_variables: {
-            company_info_name: "Lan-Party Ephec Company",
-            name: name
-            },
-        })
-        console.log("Welcome email sent successfully : ", response)
-    } catch (error) {
-        console.log("Error sending welcome email : ", error);
-        throw new Error('Error sending welcome email: ', error);
-    }
-    
-}
- 
-export const sendPasswordResetRequest = async (email, resetURL) => {
-    const recipient = [{email}]
- 
-    try {
-        const response = await mailtrapClient.send({
-            from: sender,
-            to: recipient,
-            subject: "Reset your password",
-            html: PASSWORD_RESET_REQUEST_TEMPLATE.replace("{resetURL}", resetURL),
-            category: "Password Reset"
-        })
-        console.log("Password reset successfully : ", response)
-        
-    } catch (error) {
-        console.log("Error sending resset password email: ", error);
-        throw new Error('Error sending resset password email: ', error);
-    }
-}
- 
-export const sendResetSuccessEmail = async (email) => {
-    const recipient = [{email}];
- 
-    try {
-        const response = await mailtrapClient.send({
-            from: sender,
-            to: recipient,
-            subject:"Email Password successfull",
-            html: PASSWORD_RESET_SUCCESS_TEMPLATE,
-            category:"Password Reset Successful"
- 
-        })
-        console.log("Email password success reset sent successful ", response)
-    } catch (error) {
-        console.log("Error sending email password sucess reset: ", error);
-        throw new Error('Error sending email password sucess reset: ', error);
-        
-    }
-}
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/api_backend/mailtrap/index.html b/coverage/api_backend/mailtrap/index.html deleted file mode 100644 index 0e67b5ef48..0000000000 --- a/coverage/api_backend/mailtrap/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for api_backend/mailtrap - - - - - - - - - -
-
-

All files api_backend/mailtrap

-
- -
- 44.11% - Statements - 15/34 -
- - -
- 100% - Branches - 0/0 -
- - -
- 25% - Functions - 1/4 -
- - -
- 44.11% - Lines - 15/34 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
emailTemplates.js -
-
100%3/3100%0/0100%0/0100%3/3
emails.js -
-
32.14%9/28100%0/025%1/432.14%9/28
mailtrap.config.js -
-
100%3/3100%0/0100%0/0100%3/3
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/api_backend/mailtrap/mailtrap.config.js.html b/coverage/api_backend/mailtrap/mailtrap.config.js.html deleted file mode 100644 index df851c3f88..0000000000 --- a/coverage/api_backend/mailtrap/mailtrap.config.js.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - Code coverage report for api_backend/mailtrap/mailtrap.config.js - - - - - - - - - -
-
-

All files / api_backend/mailtrap mailtrap.config.js

-
- -
- 100% - Statements - 3/3 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 3/3 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16  -  -  -1x -  -1x -  -  -  -  -1x -  -  -  -  - 
import { MailtrapClient } from "mailtrap";
-import dotenv from "dotenv";
- 
-dotenv.config();
- 
-export const mailtrapClient = new MailtrapClient({
-    endpoint: process.env.MAILTRAP_ENDPOINT,
-     token: process.env.MAILTRAP_TOKEN 
-    });
- 
-export const sender = {
-  email: "hello@demomailtrap.co",
-  name: "Hassan",
-};
- 
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/api_backend/middleware/index.html b/coverage/api_backend/middleware/index.html deleted file mode 100644 index 5644193e14..0000000000 --- a/coverage/api_backend/middleware/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for api_backend/middleware - - - - - - - - - -
-
-

All files api_backend/middleware

-
- -
- 8.33% - Statements - 1/12 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/1 -
- - -
- 10% - Lines - 1/10 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
verifyToken.js -
-
8.33%1/120%0/40%0/110%1/10
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/api_backend/middleware/verifyToken.js.html b/coverage/api_backend/middleware/verifyToken.js.html deleted file mode 100644 index 98716f19f5..0000000000 --- a/coverage/api_backend/middleware/verifyToken.js.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - Code coverage report for api_backend/middleware/verifyToken.js - - - - - - - - - -
-
-

All files / api_backend/middleware verifyToken.js

-
- -
- 8.33% - Statements - 1/12 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/1 -
- - -
- 10% - Lines - 1/10 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import jwt from 'jsonwebtoken'; 
- 
-export const verifyToken =  (req, res, next) => {   // next permet de passer à la fonction suivant de la fonction qui l'a appelé ici "checkAuth"
- 
-    const token = req.cookies.token // récupération du token dans les cookies
-    if (!token) return res.status(401).json({success:false, message:"Unauthorized- no token provided"});
-    try {
-        const decoded = jwt.verify(token, process.env.JWT_SECRET); // On utilise le meme secret qui à permit de créer le token pour vérifier si il est bon 
- 
-        if(!decoded) return res.status(401).json({success:false, message:'Unauthorized- invalid token'});
-        
-        req.userId = decoded.userId; // on donne l'id du user qui correspond à ce token décodé à la page
-        next(); // on passe alors à la fonction suivante qui est "checkAuth"
-    } catch (error) {
-        console.log("Error in verifyToken ", error);
-        return res.status(500).json({ success: false, message:`server error: ${error}`})
-        
-    }
-}
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/api_backend/models/ecole.model.js.html b/coverage/api_backend/models/ecole.model.js.html deleted file mode 100644 index da68c329db..0000000000 --- a/coverage/api_backend/models/ecole.model.js.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - Code coverage report for api_backend/models/ecole.model.js - - - - - - - - - -
-
-

All files / api_backend/models ecole.model.js

-
- -
- 100% - Statements - 2/2 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 2/2 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17  -1x -  -  -  -  -  -  -  -  -  -  -  -1x -  -  - 
import mongoose from "mongoose";
-const ecoleSchema = new mongoose.Schema({
-  nom: {
-    type: String,
-    required: true
-  },
-  adresse: {
-    type: String,
-    required: true
-  },
- 
-});
- 
-const Ecole = mongoose.model('Ecole', ecoleSchema);
- 
-export default Ecole;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/api_backend/models/index.html b/coverage/api_backend/models/index.html deleted file mode 100644 index be808e323d..0000000000 --- a/coverage/api_backend/models/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for api_backend/models - - - - - - - - - -
-
-

All files api_backend/models

-
- -
- 100% - Statements - 4/4 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 4/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
ecole.model.js -
-
100%2/2100%0/0100%0/0100%2/2
user.model.js -
-
100%2/2100%0/0100%0/0100%2/2
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/api_backend/models/user.model.js.html b/coverage/api_backend/models/user.model.js.html deleted file mode 100644 index ae9e4e1a51..0000000000 --- a/coverage/api_backend/models/user.model.js.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - - Code coverage report for api_backend/models/user.model.js - - - - - - - - - -
-
-

All files / api_backend/models user.model.js

-
- -
- 100% - Statements - 2/2 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 2/2 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  - 
import mongoose from 'mongoose';
- 
-const userSchema = new mongoose.Schema({
-    lName: {
-        type: String,
-        required: true,
-        trim: true
-    },
-    fName: {
-        type: String,
-        required: true,
-        trim: true
-    },
-    pseudo: {
-        type: String,
-        default: null,
-        unique:true,
-        require: true,
-        sparse: true,
-        trim: true
-    },
-    email: {
-        type: String,
-        required: true,
-        unique: true,
-        lowercase: true,
-        trim: true
-    },
-    password: {
-        type: String,
-        required: true
-    },
-    niveau: {
-        type: Number,
-        default: 1,
-        min: 1,
-        max: 100
-    },
-    logo: {
-        type: String,
-        defaul: ""
-    },
-    ecole_id: {
-        type: mongoose.Schema.Types.ObjectId,
-        ref: 'Ecole',
-    },
-    team_id: {
-        type: mongoose.Schema.Types.ObjectId,
-        ref: 'Team' // à créer plus tard
-    },
-    lastLogin:{
-    type: Date,
-    default: Date.now
-    },
-    isVerified: {
-        type: Boolean,
-        default: false
-    },
-    resetPasswordToken: String,
-    resetPasswordExpiresAt: Date,
-    verificationToken: String,
-    verificationTokenExpiresAt: Date,
- 
-}, { timestamps: true });
- 
-export const User = mongoose.model("Joueur", userSchema);
- 
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/api_backend/routes/auth.route.js.html b/coverage/api_backend/routes/auth.route.js.html deleted file mode 100644 index 268dcacea2..0000000000 --- a/coverage/api_backend/routes/auth.route.js.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - Code coverage report for api_backend/routes/auth.route.js - - - - - - - - - -
-
-

All files / api_backend/routes auth.route.js

-
- -
- 100% - Statements - 10/10 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 10/10 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18  -  -  -1x -  -1x -  -1x -1x -  -1x -1x -1x -1x -1x -1x -  - 
import express from 'express'
-import {checkAuth, signup, login, logout, verifyEmail, forgotPassword, resetPassword, updatePic, updateProfile} from '../controllers/auth.controller.js' 
-import { verifyToken } from '../middleware/verifyToken.js';
-const router = express.Router();
- 
-router.get("/checkAuth", verifyToken, checkAuth)
- 
-router.put("/updatePic",verifyToken, updatePic)
-router.put("/updateProfile",verifyToken, updateProfile)
- 
-router.post("/signup", signup)
-router.post("/login",login)
-router.post("/logout", logout)
-router.post("/verifyEmail", verifyEmail)
-router.post("/forgotPassword", forgotPassword)
-router.post('/resetPassword/:token', resetPassword)
- 
-export default router
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/api_backend/routes/ecoles.route.js.html b/coverage/api_backend/routes/ecoles.route.js.html deleted file mode 100644 index d06c8e72b5..0000000000 --- a/coverage/api_backend/routes/ecoles.route.js.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - Code coverage report for api_backend/routes/ecoles.route.js - - - - - - - - - -
-
-

All files / api_backend/routes ecoles.route.js

-
- -
- 33.33% - Statements - 2/6 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 33.33% - Lines - 2/6 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17  -  -  -  -1x -  -1x -  -  -  -  -  -  -  -  -  - 
// routes/ecoles.js
-import express from 'express';
-import Ecole from '../models/ecole.model.js';
- 
-const router = express.Router();
- 
-router.get('/', async (req, res) => {
-    try {
-        const ecoles = await Ecole.find();
-        res.status(200).json(ecoles);
-    } catch (error) {
-        res.status(500).json({ message: "Erreur lors de la récupération des écoles." });
-    }
-});
- 
-export default router;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/api_backend/routes/index.html b/coverage/api_backend/routes/index.html deleted file mode 100644 index bc0ed216f6..0000000000 --- a/coverage/api_backend/routes/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for api_backend/routes - - - - - - - - - -
-
-

All files api_backend/routes

-
- -
- 75% - Statements - 12/16 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 75% - Lines - 12/16 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
auth.route.js -
-
100%10/10100%0/0100%0/0100%10/10
ecoles.route.js -
-
33.33%2/6100%0/00%0/133.33%2/6
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/api_backend/server.js.html b/coverage/api_backend/server.js.html deleted file mode 100644 index b3d4a97ba9..0000000000 --- a/coverage/api_backend/server.js.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - Code coverage report for api_backend/server.js - - - - - - - - - -
-
-

All files / api_backend server.js

-
- -
- 81.81% - Statements - 9/11 -
- - -
- 50% - Branches - 1/2 -
- - -
- 0% - Functions - 0/1 -
- - -
- 81.81% - Lines - 9/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33  -  -  -  -  -  -  -  -  -  -1x -  -1x -1x -  -  -1x -  -1x -1x -  -  -1x -1x -  -  -1x -  -  -  -  -  - 
import express from 'express';
-import dotenv from 'dotenv';
-import cookieParser from 'cookie-parser';
-import cors from 'cors';
-import path from 'path';
- 
-import ecoleRoutes from './routes/ecoles.route.js';
-import authRoutes from './routes/auth.route.js';
-import { connectDB } from '../config/db.js';
- 
-dotenv.config();
- 
-const app = express();
-const PORT = process.env.PORT || 5000;
- 
-// CORS configuration
-app.use(cors({ origin: 'http://localhost:3000', credentials:true }));
- 
-app.use(express.json()); // Middleware pour analyser les requetes JSON à travers req.body
-app.use(cookieParser()); // Middleware pour analyser les cookies
- 
-// Routes
-app.use("/api/auth", authRoutes);
-app.use("/api/ecoles", ecoleRoutes);
- 
-// Lancer le serveur
-app.listen(PORT, () => {
-    connectDB();
-    console.log(`Serveur lancé sur http://localhost:${PORT}`);
-});
- 
-export default app
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/api_backend/utils/generateTokenAndSetCookie.js.html b/coverage/api_backend/utils/generateTokenAndSetCookie.js.html deleted file mode 100644 index d05073dfa9..0000000000 --- a/coverage/api_backend/utils/generateTokenAndSetCookie.js.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - Code coverage report for api_backend/utils/generateTokenAndSetCookie.js - - - - - - - - - -
-
-

All files / api_backend/utils generateTokenAndSetCookie.js

-
- -
- 100% - Statements - 4/4 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 1/1 -
- - -
- 100% - Lines - 4/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17  -  -1x -1x -  -  -  -1x -  -  -  -  -  -  -1x -  - 
import jwt from 'jsonwebtoken';
- 
-export const generateTokenAndSetCookie = (res, userId) => {
-    const token = jwt.sign({userId}, process.env.JWT_SECRET, {
-        expiresIn: "7d"
-    })
- 
-    res.cookie("token", token, {
-        httpOnly: true, // non accéssible via js, prévient des attaques XSS
-        secure: process.env.NODE_ENV === "production",
-        sameSite: "strict", // previent des attaques csrf
-        maxAge: 7 * 24 * 60 * 60 * 1000,
-    });
-    
-    return token
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/api_backend/utils/index.html b/coverage/api_backend/utils/index.html deleted file mode 100644 index c9458cc122..0000000000 --- a/coverage/api_backend/utils/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for api_backend/utils - - - - - - - - - -
-
-

All files api_backend/utils

-
- -
- 100% - Statements - 4/4 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 1/1 -
- - -
- 100% - Lines - 4/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
generateTokenAndSetCookie.js -
-
100%4/4100%0/0100%1/1100%4/4
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/base.css b/coverage/base.css deleted file mode 100644 index f418035b46..0000000000 --- a/coverage/base.css +++ /dev/null @@ -1,224 +0,0 @@ -body, html { - margin:0; padding: 0; - height: 100%; -} -body { - font-family: Helvetica Neue, Helvetica, Arial; - font-size: 14px; - color:#333; -} -.small { font-size: 12px; } -*, *:after, *:before { - -webkit-box-sizing:border-box; - -moz-box-sizing:border-box; - box-sizing:border-box; - } -h1 { font-size: 20px; margin: 0;} -h2 { font-size: 14px; } -pre { - font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; - margin: 0; - padding: 0; - -moz-tab-size: 2; - -o-tab-size: 2; - tab-size: 2; -} -a { color:#0074D9; text-decoration:none; } -a:hover { text-decoration:underline; } -.strong { font-weight: bold; } -.space-top1 { padding: 10px 0 0 0; } -.pad2y { padding: 20px 0; } -.pad1y { padding: 10px 0; } -.pad2x { padding: 0 20px; } -.pad2 { padding: 20px; } -.pad1 { padding: 10px; } -.space-left2 { padding-left:55px; } -.space-right2 { padding-right:20px; } -.center { text-align:center; } -.clearfix { display:block; } -.clearfix:after { - content:''; - display:block; - height:0; - clear:both; - visibility:hidden; - } -.fl { float: left; } -@media only screen and (max-width:640px) { - .col3 { width:100%; max-width:100%; } - .hide-mobile { display:none!important; } -} - -.quiet { - color: #7f7f7f; - color: rgba(0,0,0,0.5); -} -.quiet a { opacity: 0.7; } - -.fraction { - font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; - font-size: 10px; - color: #555; - background: #E8E8E8; - padding: 4px 5px; - border-radius: 3px; - vertical-align: middle; -} - -div.path a:link, div.path a:visited { color: #333; } -table.coverage { - border-collapse: collapse; - margin: 10px 0 0 0; - padding: 0; -} - -table.coverage td { - margin: 0; - padding: 0; - vertical-align: top; -} -table.coverage td.line-count { - text-align: right; - padding: 0 5px 0 20px; -} -table.coverage td.line-coverage { - text-align: right; - padding-right: 10px; - min-width:20px; -} - -table.coverage td span.cline-any { - display: inline-block; - padding: 0 5px; - width: 100%; -} -.missing-if-branch { - display: inline-block; - margin-right: 5px; - border-radius: 3px; - position: relative; - padding: 0 4px; - background: #333; - color: yellow; -} - -.skip-if-branch { - display: none; - margin-right: 10px; - position: relative; - padding: 0 4px; - background: #ccc; - color: white; -} -.missing-if-branch .typ, .skip-if-branch .typ { - color: inherit !important; -} -.coverage-summary { - border-collapse: collapse; - width: 100%; -} -.coverage-summary tr { border-bottom: 1px solid #bbb; } -.keyline-all { border: 1px solid #ddd; } -.coverage-summary td, .coverage-summary th { padding: 10px; } -.coverage-summary tbody { border: 1px solid #bbb; } -.coverage-summary td { border-right: 1px solid #bbb; } -.coverage-summary td:last-child { border-right: none; } -.coverage-summary th { - text-align: left; - font-weight: normal; - white-space: nowrap; -} -.coverage-summary th.file { border-right: none !important; } -.coverage-summary th.pct { } -.coverage-summary th.pic, -.coverage-summary th.abs, -.coverage-summary td.pct, -.coverage-summary td.abs { text-align: right; } -.coverage-summary td.file { white-space: nowrap; } -.coverage-summary td.pic { min-width: 120px !important; } -.coverage-summary tfoot td { } - -.coverage-summary .sorter { - height: 10px; - width: 7px; - display: inline-block; - margin-left: 0.5em; - background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; -} -.coverage-summary .sorted .sorter { - background-position: 0 -20px; -} -.coverage-summary .sorted-desc .sorter { - background-position: 0 -10px; -} -.status-line { height: 10px; } -/* yellow */ -.cbranch-no { background: yellow !important; color: #111; } -/* dark red */ -.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } -.low .chart { border:1px solid #C21F39 } -.highlighted, -.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ - background: #C21F39 !important; -} -/* medium red */ -.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } -/* light red */ -.low, .cline-no { background:#FCE1E5 } -/* light green */ -.high, .cline-yes { background:rgb(230,245,208) } -/* medium green */ -.cstat-yes { background:rgb(161,215,106) } -/* dark green */ -.status-line.high, .high .cover-fill { background:rgb(77,146,33) } -.high .chart { border:1px solid rgb(77,146,33) } -/* dark yellow (gold) */ -.status-line.medium, .medium .cover-fill { background: #f9cd0b; } -.medium .chart { border:1px solid #f9cd0b; } -/* light yellow */ -.medium { background: #fff4c2; } - -.cstat-skip { background: #ddd; color: #111; } -.fstat-skip { background: #ddd; color: #111 !important; } -.cbranch-skip { background: #ddd !important; color: #111; } - -span.cline-neutral { background: #eaeaea; } - -.coverage-summary td.empty { - opacity: .5; - padding-top: 4px; - padding-bottom: 4px; - line-height: 1; - color: #888; -} - -.cover-fill, .cover-empty { - display:inline-block; - height: 12px; -} -.chart { - line-height: 0; -} -.cover-empty { - background: white; -} -.cover-full { - border-right: none !important; -} -pre.prettyprint { - border: none !important; - padding: 0 !important; - margin: 0 !important; -} -.com { color: #999 !important; } -.ignore-none { color: #999; font-weight: normal; } - -.wrapper { - min-height: 100%; - height: auto !important; - height: 100%; - margin: 0 auto -48px; -} -.footer, .push { - height: 48px; -} diff --git a/coverage/block-navigation.js b/coverage/block-navigation.js deleted file mode 100644 index cc12130231..0000000000 --- a/coverage/block-navigation.js +++ /dev/null @@ -1,87 +0,0 @@ -/* eslint-disable */ -var jumpToCode = (function init() { - // Classes of code we would like to highlight in the file view - var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; - - // Elements to highlight in the file listing view - var fileListingElements = ['td.pct.low']; - - // We don't want to select elements that are direct descendants of another match - var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` - - // Selecter that finds elements on the page to which we can jump - var selector = - fileListingElements.join(', ') + - ', ' + - notSelector + - missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` - - // The NodeList of matching elements - var missingCoverageElements = document.querySelectorAll(selector); - - var currentIndex; - - function toggleClass(index) { - missingCoverageElements - .item(currentIndex) - .classList.remove('highlighted'); - missingCoverageElements.item(index).classList.add('highlighted'); - } - - function makeCurrent(index) { - toggleClass(index); - currentIndex = index; - missingCoverageElements.item(index).scrollIntoView({ - behavior: 'smooth', - block: 'center', - inline: 'center' - }); - } - - function goToPrevious() { - var nextIndex = 0; - if (typeof currentIndex !== 'number' || currentIndex === 0) { - nextIndex = missingCoverageElements.length - 1; - } else if (missingCoverageElements.length > 1) { - nextIndex = currentIndex - 1; - } - - makeCurrent(nextIndex); - } - - function goToNext() { - var nextIndex = 0; - - if ( - typeof currentIndex === 'number' && - currentIndex < missingCoverageElements.length - 1 - ) { - nextIndex = currentIndex + 1; - } - - makeCurrent(nextIndex); - } - - return function jump(event) { - if ( - document.getElementById('fileSearch') === document.activeElement && - document.activeElement != null - ) { - // if we're currently focused on the search input, we don't want to navigate - return; - } - - switch (event.which) { - case 78: // n - case 74: // j - goToNext(); - break; - case 66: // b - case 75: // k - case 80: // p - goToPrevious(); - break; - } - }; -})(); -window.addEventListener('keydown', jumpToCode); diff --git a/coverage/config/db.js.html b/coverage/config/db.js.html deleted file mode 100644 index ad8628b4b5..0000000000 --- a/coverage/config/db.js.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - Code coverage report for config/db.js - - - - - - - - - -
-
-

All files / config db.js

-
- -
- 16.66% - Statements - 1/6 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 16.66% - Lines - 1/6 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13  -  -1x -  -  -  -  -  -  -  -  -  - 
import mongoose from "mongoose";
- 
-export const connectDB = async () => {
-    try {
-        const conn = await mongoose.connect(process.env.MONGO_URI); // se connecte à la DB en asynchrone
-        console.log(`MongoDB connected: ${conn.connection.host}`);
-    } catch (error){
-        console.error(`Error: ${error.message}`);
-        process.exit(1); // 1 c'est pour dire que y a eu erreur et 0 succès 
-    }
-}
- 
-//NoSQL enrgistre dans des collections avec des documents 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/config/index.html b/coverage/config/index.html deleted file mode 100644 index 2f30c500cf..0000000000 --- a/coverage/config/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for config - - - - - - - - - -
-
-

All files config

-
- -
- 16.66% - Statements - 1/6 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 16.66% - Lines - 1/6 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
db.js -
-
16.66%1/6100%0/00%0/116.66%1/6
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/favicon.png b/coverage/favicon.png deleted file mode 100644 index c1525b811a167671e9de1fa78aab9f5c0b61cef7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> - - - - Code coverage report for All files - - - - - - - - - -
-
-

All files

-
- -
- Unknown% - Statements - 0/0 -
- - -
- Unknown% - Branches - 0/0 -
- - -
- Unknown% - Functions - 0/0 -
- - -
- Unknown% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/prettify.css b/coverage/prettify.css deleted file mode 100644 index b317a7cda3..0000000000 --- a/coverage/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/prettify.js b/coverage/prettify.js deleted file mode 100644 index b3225238f2..0000000000 --- a/coverage/prettify.js +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable */ -window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/coverage/sort-arrow-sprite.png b/coverage/sort-arrow-sprite.png deleted file mode 100644 index 6ed68316eb3f65dec9063332d2f69bf3093bbfab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc diff --git a/coverage/sorter.js b/coverage/sorter.js deleted file mode 100644 index 2bb296a8ca..0000000000 --- a/coverage/sorter.js +++ /dev/null @@ -1,196 +0,0 @@ -/* eslint-disable */ -var addSorting = (function() { - 'use strict'; - var cols, - currentSort = { - index: 0, - desc: false - }; - - // returns the summary table element - function getTable() { - return document.querySelector('.coverage-summary'); - } - // returns the thead element of the summary table - function getTableHeader() { - return getTable().querySelector('thead tr'); - } - // returns the tbody element of the summary table - function getTableBody() { - return getTable().querySelector('tbody'); - } - // returns the th element for nth column - function getNthColumn(n) { - return getTableHeader().querySelectorAll('th')[n]; - } - - function onFilterInput() { - const searchValue = document.getElementById('fileSearch').value; - const rows = document.getElementsByTagName('tbody')[0].children; - for (let i = 0; i < rows.length; i++) { - const row = rows[i]; - if ( - row.textContent - .toLowerCase() - .includes(searchValue.toLowerCase()) - ) { - row.style.display = ''; - } else { - row.style.display = 'none'; - } - } - } - - // loads the search box - function addSearchBox() { - var template = document.getElementById('filterTemplate'); - var templateClone = template.content.cloneNode(true); - templateClone.getElementById('fileSearch').oninput = onFilterInput; - template.parentElement.appendChild(templateClone); - } - - // loads all columns - function loadColumns() { - var colNodes = getTableHeader().querySelectorAll('th'), - colNode, - cols = [], - col, - i; - - for (i = 0; i < colNodes.length; i += 1) { - colNode = colNodes[i]; - col = { - key: colNode.getAttribute('data-col'), - sortable: !colNode.getAttribute('data-nosort'), - type: colNode.getAttribute('data-type') || 'string' - }; - cols.push(col); - if (col.sortable) { - col.defaultDescSort = col.type === 'number'; - colNode.innerHTML = - colNode.innerHTML + ''; - } - } - return cols; - } - // attaches a data attribute to every tr element with an object - // of data values keyed by column name - function loadRowData(tableRow) { - var tableCols = tableRow.querySelectorAll('td'), - colNode, - col, - data = {}, - i, - val; - for (i = 0; i < tableCols.length; i += 1) { - colNode = tableCols[i]; - col = cols[i]; - val = colNode.getAttribute('data-value'); - if (col.type === 'number') { - val = Number(val); - } - data[col.key] = val; - } - return data; - } - // loads all row data - function loadData() { - var rows = getTableBody().querySelectorAll('tr'), - i; - - for (i = 0; i < rows.length; i += 1) { - rows[i].data = loadRowData(rows[i]); - } - } - // sorts the table using the data for the ith column - function sortByIndex(index, desc) { - var key = cols[index].key, - sorter = function(a, b) { - a = a.data[key]; - b = b.data[key]; - return a < b ? -1 : a > b ? 1 : 0; - }, - finalSorter = sorter, - tableBody = document.querySelector('.coverage-summary tbody'), - rowNodes = tableBody.querySelectorAll('tr'), - rows = [], - i; - - if (desc) { - finalSorter = function(a, b) { - return -1 * sorter(a, b); - }; - } - - for (i = 0; i < rowNodes.length; i += 1) { - rows.push(rowNodes[i]); - tableBody.removeChild(rowNodes[i]); - } - - rows.sort(finalSorter); - - for (i = 0; i < rows.length; i += 1) { - tableBody.appendChild(rows[i]); - } - } - // removes sort indicators for current column being sorted - function removeSortIndicators() { - var col = getNthColumn(currentSort.index), - cls = col.className; - - cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); - col.className = cls; - } - // adds sort indicators for current column being sorted - function addSortIndicators() { - getNthColumn(currentSort.index).className += currentSort.desc - ? ' sorted-desc' - : ' sorted'; - } - // adds event listeners for all sorter widgets - function enableUI() { - var i, - el, - ithSorter = function ithSorter(i) { - var col = cols[i]; - - return function() { - var desc = col.defaultDescSort; - - if (currentSort.index === i) { - desc = !currentSort.desc; - } - sortByIndex(i, desc); - removeSortIndicators(); - currentSort.index = i; - currentSort.desc = desc; - addSortIndicators(); - }; - }; - for (i = 0; i < cols.length; i += 1) { - if (cols[i].sortable) { - // add the click event handler on the th so users - // dont have to click on those tiny arrows - el = getNthColumn(i).querySelector('.sorter').parentElement; - if (el.addEventListener) { - el.addEventListener('click', ithSorter(i)); - } else { - el.attachEvent('onclick', ithSorter(i)); - } - } - } - } - // adds sorting functionality to the UI - return function() { - if (!getTable()) { - return; - } - cols = loadColumns(); - loadData(); - addSearchBox(); - addSortIndicators(); - enableUI(); - }; -})(); - -window.addEventListener('load', addSorting); diff --git a/package-lock.json b/package-lock.json index 67151e9081..aa8ce41805 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,9 @@ "vite": "^6.2.3" }, "devDependencies": { + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^14.6.1", "jest": "^29.7.0", "mongodb-memory-server": "^10.1.4", "nodemon": "^3.1.9", @@ -34,6 +37,13 @@ "supertest": "^7.1.0" } }, + "node_modules/@adobe/css-tools": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.2.tgz", + "integrity": "sha512-baYZExFpsdkBNuvGKTKWCwKH57HRZLVtycZS05WTQNVOiXVSeAki3nU35zlRbToeMW8aHlJfyS+1C4BOv27q0A==", + "dev": true, + "license": "MIT" + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -524,6 +534,19 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.27.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", @@ -2482,6 +2505,180 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/dom/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@testing-library/dom/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz", + "integrity": "sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.21", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/jest-dom/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/react": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz", + "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -2802,6 +2999,16 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -3675,6 +3882,13 @@ "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in.", "license": "ISC" }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -3759,6 +3973,16 @@ "node": ">= 0.8" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -3809,6 +4033,14 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/dotenv": { "version": "16.5.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", @@ -6038,6 +6270,17 @@ "dev": true, "license": "ISC" }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, "node_modules/mailtrap": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/mailtrap/-/mailtrap-4.1.0.tgz", @@ -6203,6 +6446,16 @@ "node": ">=6" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -7501,6 +7754,27 @@ "node": ">=8.10.0" } }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true, + "license": "MIT" + }, "node_modules/release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -8084,6 +8358,19 @@ "node": ">=6" } }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", diff --git a/package.json b/package.json index b25b899855..cd56cc88bb 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,9 @@ "vite": "^6.2.3" }, "devDependencies": { + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^14.6.1", "jest": "^29.7.0", "mongodb-memory-server": "^10.1.4", "nodemon": "^3.1.9", diff --git a/web_frontend/package-lock.json b/web_frontend/package-lock.json index e73e07348f..4b415eae0f 100644 --- a/web_frontend/package-lock.json +++ b/web_frontend/package-lock.json @@ -12,27 +12,41 @@ "axios": "^1.8.4", "framer-motion": "^12.7.4", "lucide-react": "^0.502.0", - "react": "^19.0.0", - "react-dom": "^19.0.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", "react-hot-toast": "^2.5.2", "react-router-dom": "^7.5.1", "zustand": "^5.0.3" }, "devDependencies": { "@eslint/js": "^9.22.0", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^14.6.1", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react": "^4.3.4", "autoprefixer": "^10.4.21", + "chai-dom": "^1.12.1", "eslint": "^9.22.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^16.0.0", + "jest": "^29.7.0", + "jsdom": "^26.1.0", "postcss": "^8.5.3", "tailwindcss": "^4.1.4", - "vite": "^6.3.1" + "vite": "^6.3.1", + "vitest": "^3.1.2" } }, + "node_modules/@adobe/css-tools": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.2.tgz", + "integrity": "sha512-baYZExFpsdkBNuvGKTKWCwKH57HRZLVtycZS05WTQNVOiXVSeAki3nU35zlRbToeMW8aHlJfyS+1C4BOv27q0A==", + "dev": true, + "license": "MIT" + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -47,6 +61,27 @@ "node": ">=6.0.0" } }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.1.5.tgz", + "integrity": "sha512-w7AmVyTTiU41fNLsFDf+gA2Dwtbx2EJtn2pbJNAGSRAg50loXy1uLXA3hEpD8+eydcomTurw09tq5/AyceCaGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", @@ -239,6 +274,245 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", @@ -271,6 +545,19 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.27.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", @@ -329,65 +616,187 @@ "node": ">=6.9.0" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", - "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@csstools/color-helpers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } ], + "license": "MIT-0", "engines": { "node": ">=18" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", - "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", - "cpu": [ - "arm" + "node_modules/@csstools/css-calc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.3.tgz", + "integrity": "sha512-XBG3talrhid44BY1x3MHzUx/aTG8+x/Zi57M4aTKK9RFB4aLlF3TTSzfzn8nWVHWL3FgAXAxmupmDd6VWww+pw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } ], "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", - "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", - "cpu": [ - "arm64" + "node_modules/@csstools/css-color-parser": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.9.tgz", + "integrity": "sha512-wILs5Zk7BU86UArYBJTPy/FMPPKVKHMj1ycCEyf3VUptol0JNRLFU/BZsJ4aiIHJEbSLiizzRrw8Pc1uAEDrXw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } ], "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@csstools/color-helpers": "^5.0.2", + "@csstools/css-calc": "^2.1.3" + }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", - "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" ], "engines": { "node": ">=18" @@ -946,144 +1355,588 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=8" } }, - "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==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0.0" + "dependencies": { + "sprintf-js": "~1.0.2" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=8" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz", - "integrity": "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==", - "cpu": [ - "arm" - ], + "node_modules/@istanbuljs/load-nyc-config/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==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ] + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz", - "integrity": "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==", - "cpu": [ - "arm64" - ], + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ] + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz", - "integrity": "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==", - "cpu": [ - "arm64" - ], + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "engines": { + "node": ">=8" + } }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz", - "integrity": "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==", - "cpu": [ - "x64" - ], + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "engines": { + "node": ">=8" + } }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz", - "integrity": "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==", - "cpu": [ - "arm64" - ], + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz", - "integrity": "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==", - "cpu": [ - "x64" - ], + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz", - "integrity": "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==", - "cpu": [ - "arm" - ], + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz", + "integrity": "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz", + "integrity": "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz", + "integrity": "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz", + "integrity": "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz", + "integrity": "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz", + "integrity": "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz", + "integrity": "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==", + "cpu": [ + "arm" + ], "license": "MIT", "optional": true, "os": [ @@ -1259,15 +2112,42 @@ "win32" ] }, - "node_modules/@tailwindcss/node": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.4.tgz", - "integrity": "sha512-MT5118zaiO6x6hNA04OWInuAiP1YISXql8Z+/Y8iisV5nuhM8VXlyhRuqc2PEviPszcXI66W44bCIk500Oolhw==", - "license": "MIT", - "dependencies": { - "enhanced-resolve": "^5.18.1", - "jiti": "^2.4.2", - "lightningcss": "1.29.2", + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.4.tgz", + "integrity": "sha512-MT5118zaiO6x6hNA04OWInuAiP1YISXql8Z+/Y8iisV5nuhM8VXlyhRuqc2PEviPszcXI66W44bCIk500Oolhw==", + "license": "MIT", + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.29.2", "tailwindcss": "4.1.4" } }, @@ -1513,6 +2393,119 @@ "vite": "^5.2.0 || ^6" } }, + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz", + "integrity": "sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.21", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz", + "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -1564,6 +2557,43 @@ "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "license": "MIT" }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -1571,6 +2601,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/node": { + "version": "22.15.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.2.tgz", + "integrity": "sha512-uKXqKN9beGoMdBfcaTY1ecwz6ctxuJAcUlwE55938g0ZJ8lRxwAZqRz2AJ4pzpt5dHdTPMB863UZ0ESiFUcP7A==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, "node_modules/@types/react": { "version": "19.1.2", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.2.tgz", @@ -1591,6 +2631,30 @@ "@types/react": "^19.0.0" } }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@vitejs/plugin-react": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz", @@ -1611,6 +2675,119 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, + "node_modules/@vitest/expect": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.2.tgz", + "integrity": "sha512-O8hJgr+zREopCAqWl3uCVaOdqJwZ9qaDwUP7vy3Xigad0phZe9APxKhPcDNqYYi0rX5oMvwJMSCAXY2afqeTSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.1.2", + "@vitest/utils": "3.1.2", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.2.tgz", + "integrity": "sha512-kOtd6K2lc7SQ0mBqYv/wdGedlqPdM/B38paPY+OwJ1XiNi44w3Fpog82UfOibmHaV9Wod18A09I9SCKLyDMqgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.1.2", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.2.tgz", + "integrity": "sha512-R0xAiHuWeDjTSB3kQ3OQpT8Rx3yhdOAIm/JM4axXxnG7Q/fS8XUwggv/A4xzbQA+drYRjzkMnpYnOGAc4oeq8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.2.tgz", + "integrity": "sha512-bhLib9l4xb4sUMPXnThbnhX2Yi8OutBMA8Yahxa7yavQsFDtwY/jrUZwpKp2XH9DhRFJIeytlyGpXCqZ65nR+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.1.2", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.2.tgz", + "integrity": "sha512-Q1qkpazSF/p4ApZg1vfZSQ5Yw6OCQxVMVrLjslbLFA1hMDrT2uxtqMaw8Tc/jy5DLka1sNs1Y7rBcftMiaSH/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.1.2", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.2.tgz", + "integrity": "sha512-OEc5fSXMws6sHVe4kOFyDSj/+4MSwst0ib4un0DlcYgQvRuYQ0+M2HyqGaauUMnjq87tmUaMNDxKQx7wNfVqPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.2.tgz", + "integrity": "sha512-5GGd0ytZ7BH3H6JTj9Kw7Prn1Nbg0wZVrIvou+UWxm54d+WoXXgAgjFJ8wn3LdagWLFSEfpPeyYrByZaGEZHLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.1.2", + "loupe": "^3.1.3", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", @@ -1634,6 +2811,16 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1651,6 +2838,32 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -1667,6 +2880,33 @@ "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, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1674,6 +2914,26 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1729,27 +2989,156 @@ "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==", - "dev": true, - "license": "MIT" - }, - "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==", + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" } }, - "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ @@ -1780,6 +3169,33 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=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", @@ -1803,6 +3219,16 @@ "node": ">=6" } }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001715", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001715.tgz", @@ -1824,6 +3250,36 @@ ], "license": "CC-BY-4.0" }, + "node_modules/chai": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", + "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/chai-dom": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/chai-dom/-/chai-dom-1.12.1.tgz", + "integrity": "sha512-tvz+D0PJue2VHXRec3udgP/OeeXBiePU3VH6JhEnHQJYzvNzR2nUvEykA9dXVS76JvaUENSOYH8Ufr0kZSnlCQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.12.0" + }, + "peerDependencies": { + "chai": ">= 3" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1841,6 +3297,82 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true, + "license": "MIT" + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1896,6 +3428,28 @@ "node": ">=18" } }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -1911,12 +3465,47 @@ "node": ">= 8" } }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.3.1.tgz", + "integrity": "sha512-ZgW+Jgdd7i52AaLYCriF8Mxqft0gD/R9i9wi6RWBhs1pqdPEzPjym7rvRKi397WmQFf3SlyUsszhw+VVCbx79Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^3.1.2", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/debug": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", @@ -1935,6 +3524,38 @@ } } }, + "node_modules/decimal.js": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", + "dev": true, + "license": "MIT" + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -1942,6 +3563,16 @@ "dev": true, "license": "MIT" }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1951,6 +3582,16 @@ "node": ">=0.4.0" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/detect-libc": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", @@ -1960,6 +3601,34 @@ "node": ">=8" } }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -1981,6 +3650,26 @@ "dev": true, "license": "ISC" }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, "node_modules/enhanced-resolve": { "version": "5.18.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", @@ -1994,6 +3683,29 @@ "node": ">=10.13.0" } }, + "node_modules/entities": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", + "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -2012,8 +3724,15 @@ "node": ">= 0.4" } }, - "node_modules/es-object-atoms": { - "version": "1.1.1", + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "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==", "license": "MIT", @@ -2234,6 +3953,20 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", @@ -2270,6 +4003,16 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -2280,6 +4023,66 @@ "node": ">=0.10.0" } }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "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/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", + "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.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", @@ -2301,6 +4104,16 @@ "dev": true, "license": "MIT" }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, "node_modules/fdir": { "version": "6.4.4", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", @@ -2328,6 +4141,19 @@ "node": ">=16.0.0" } }, + "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, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -2442,6 +4268,13 @@ } } }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2475,6 +4308,16 @@ "node": ">=6.9.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -2499,6 +4342,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", @@ -2512,6 +4365,41 @@ "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -2614,6 +4502,77 @@ "node": ">= 0.4" } }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "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==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -2641,6 +4600,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -2651,6 +4630,58 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2661,6 +4692,26 @@ "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -2674,6 +4725,36 @@ "node": ">=0.10.0" } }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2681,46 +4762,1094 @@ "dev": true, "license": "ISC" }, - "node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "license": "MIT" + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "argparse": "^2.0.1" + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=10" } }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, - "license": "MIT", + "license": "ISC", "bin": { - "jsesc": "bin/jsesc" + "semver": "bin/semver.js" }, "engines": { - "node": ">=6" + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-config/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-leak-detector/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.5.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.1.1", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.1", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" } }, "node_modules/json-buffer": { @@ -2730,6 +5859,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -2767,6 +5903,26 @@ "json-buffer": "3.0.1" } }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -3009,6 +6165,13 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -3025,6 +6188,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -3032,6 +6202,13 @@ "dev": true, "license": "MIT" }, + "node_modules/loupe": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "dev": true, + "license": "MIT" + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -3051,13 +6228,107 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, "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==", "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">= 0.4" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/mime-db": { @@ -3081,6 +6352,26 @@ "node": ">= 0.6" } }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -3141,6 +6432,13 @@ "dev": true, "license": "MIT" }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", @@ -3148,6 +6446,16 @@ "dev": true, "license": "MIT" }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", @@ -3158,6 +6466,52 @@ "node": ">=0.10.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==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nwsapi": { + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", + "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", + "dev": true, + "license": "MIT" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -3208,6 +6562,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -3221,6 +6585,38 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3231,6 +6627,16 @@ "node": ">=8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -3241,6 +6647,30 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -3259,6 +6689,85 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/postcss": { "version": "8.5.3", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", @@ -3304,6 +6813,50 @@ "node": ">= 0.8.0" } }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -3320,6 +6873,23 @@ "node": ">=6" } }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, "node_modules/react": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", @@ -3358,6 +6928,14 @@ "react-dom": ">=16" } }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/react-refresh": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", @@ -3378,33 +6956,108 @@ "set-cookie-parser": "^2.6.0", "turbo-stream": "2.4.0" }, - "engines": { - "node": ">=20.0.0" + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.1.tgz", + "integrity": "sha512-5DPSPc7ENrt2tlKPq0FtpG80ZbqA9aIKEyqX6hSNJDlol/tr6iqCK4crqdsusmOSSotq6zDsn0y3urX9TuTNmA==", + "license": "MIT", + "dependencies": { + "react-router": "7.5.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" + "engines": { + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-router-dom": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.1.tgz", - "integrity": "sha512-5DPSPc7ENrt2tlKPq0FtpG80ZbqA9aIKEyqX6hSNJDlol/tr6iqCK4crqdsusmOSSotq6zDsn0y3urX9TuTNmA==", + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, "license": "MIT", "dependencies": { - "react-router": "7.5.1" + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, "node_modules/resolve-from": { @@ -3417,6 +7070,16 @@ "node": ">=4" } }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/rollup": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz", @@ -3456,6 +7119,33 @@ "fsevents": "~2.3.2" } }, + "node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", @@ -3498,73 +7188,389 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": 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/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tailwindcss": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.4.tgz", + "integrity": "sha512-1ZIUqtPITFbv/DxRmDr5/agPqJwF69d24m9qmM1939TJehgY539CtzeZRjbLt5G6fSy/7YqqYsfvoTEw9xUI2A==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinypool": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=14.0.0" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=14.0.0" } }, - "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==", + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "tldts-core": "^6.1.86" }, - "engines": { - "node": ">=8" + "bin": { + "tldts": "bin/cli.js" } }, - "node_modules/tailwindcss": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.4.tgz", - "integrity": "sha512-1ZIUqtPITFbv/DxRmDr5/agPqJwF69d24m9qmM1939TJehgY539CtzeZRjbLt5G6fSy/7YqqYsfvoTEw9xUI2A==", + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "dev": true, "license": "MIT" }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "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, "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, "engines": { - "node": ">=6" + "node": ">=8.0" } }, - "node_modules/tinyglobby": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", - "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", - "license": "MIT", + "node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "tldts": "^6.1.32" }, "engines": { - "node": ">=12.0.0" + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "engines": { + "node": ">=18" } }, "node_modules/tslib": { @@ -3592,6 +7598,36 @@ "node": ">= 0.8.0" } }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "devOptional": true, + "license": "MIT" + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -3633,6 +7669,21 @@ "punycode": "^2.1.0" } }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, "node_modules/vite": { "version": "6.3.2", "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.2.tgz", @@ -3707,6 +7758,170 @@ } } }, + "node_modules/vite-node": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.2.tgz", + "integrity": "sha512-/8iMryv46J3aK13iUXsei5G/A3CUlW4665THCPS+K8xAaqrVWiGB4RfXMQXCLjpK9P2eK//BczrVkn5JLAk6DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.0", + "es-module-lexer": "^1.6.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.2.tgz", + "integrity": "sha512-WaxpJe092ID1C0mr+LH9MmNrhfzi8I65EX/NRU/Ld016KqQNRgxSOlGNP1hHN+a/F8L15Mh8klwaF77zR3GeDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "3.1.2", + "@vitest/mocker": "3.1.2", + "@vitest/pretty-format": "^3.1.2", + "@vitest/runner": "3.1.2", + "@vitest/snapshot": "3.1.2", + "@vitest/spy": "3.1.2", + "@vitest/utils": "3.1.2", + "chai": "^5.2.0", + "debug": "^4.4.0", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.13", + "tinypool": "^1.0.2", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0", + "vite-node": "3.1.2", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.1.2", + "@vitest/ui": "3.1.2", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3723,6 +7938,23 @@ "node": ">= 8" } }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -3733,6 +7965,94 @@ "node": ">=0.10.0" } }, + "node_modules/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==", + "dev": 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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -3740,6 +8060,35 @@ "dev": true, "license": "ISC" }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/web_frontend/package.json b/web_frontend/package.json index baed9dc805..77f9b91b8f 100644 --- a/web_frontend/package.json +++ b/web_frontend/package.json @@ -7,31 +7,39 @@ "dev": "vite --port 3000", "build": "vite build", "lint": "eslint .", - "preview": "vite preview" + "preview": "vite preview", + "test": "vitest" }, "dependencies": { "@tailwindcss/vite": "^4.1.4", "axios": "^1.8.4", "framer-motion": "^12.7.4", "lucide-react": "^0.502.0", - "react": "^19.0.0", - "react-dom": "^19.0.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", "react-hot-toast": "^2.5.2", "react-router-dom": "^7.5.1", "zustand": "^5.0.3" }, "devDependencies": { "@eslint/js": "^9.22.0", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^14.6.1", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react": "^4.3.4", "autoprefixer": "^10.4.21", + "chai-dom": "^1.12.1", "eslint": "^9.22.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^16.0.0", + "jest": "^29.7.0", + "jsdom": "^26.1.0", "postcss": "^8.5.3", "tailwindcss": "^4.1.4", - "vite": "^6.3.1" + "vite": "^6.3.1", + "vitest": "^3.1.2" } } diff --git a/web_frontend/src/components/Input.jsx b/web_frontend/src/components/Input.jsx index 84b1896dbc..0d64347277 100644 --- a/web_frontend/src/components/Input.jsx +++ b/web_frontend/src/components/Input.jsx @@ -1,3 +1,5 @@ +import React from 'react'; // Ajoutez cette ligne en haut du fichier + const Input = ({ icon: Icon, ...props }) => { return (
diff --git a/web_frontend/src/components/PasswordStrengthMeter.jsx b/web_frontend/src/components/PasswordStrengthMeter.jsx index a6847986cb..9201793e5a 100644 --- a/web_frontend/src/components/PasswordStrengthMeter.jsx +++ b/web_frontend/src/components/PasswordStrengthMeter.jsx @@ -1,3 +1,5 @@ +import React from 'react'; // Ajoutez cette ligne en haut du fichier + import { Check, X } from "lucide-react"; const PasswordCriteria = ({ password }) => { diff --git a/web_frontend/src/pages/SignUpPage.jsx b/web_frontend/src/pages/SignUpPage.jsx index a6cebabcc6..af7e5dae66 100644 --- a/web_frontend/src/pages/SignUpPage.jsx +++ b/web_frontend/src/pages/SignUpPage.jsx @@ -2,10 +2,13 @@ import { motion } from 'framer-motion' import {Link, useNavigate} from 'react-router-dom' import { User, Mail, Lock, Loader } from "lucide-react" import { useState } from 'react' +import React from 'react' +import { toast } from 'react-hot-toast' import { useAuthStore } from '../store/authStore' import Input from '../components/Input' import PasswordStrengthMeter from '../components/PasswordStrengthMeter' +import { validateSignup } from '../utils/validation/validationSignUp'; const SignUpPage = () => { @@ -14,22 +17,37 @@ const SignUpPage = () => { const [pseudo, setUserName] = useState('') const [email, setEmail] = useState('') const [password, setPassword] = useState('') - + const [localError, setLocalError] = useState('') + const navigate = useNavigate() const { signup, error, isLoading } = useAuthStore(); + const handleSignUp = async (e) => { - e.preventDefault() + e.preventDefault(); + + const formData = { lName, fName, pseudo, email, password }; + const errors = validateSignup(formData); + + if (Object.keys(errors).length > 0) { + const firstError = errors.global || Object.values(errors)[0]; + toast.error(firstError); + setLocalError(firstError); + return; + } + + setLocalError(''); try { - await signup(lName, fName, pseudo, email, password) - navigate("/verifyEmail") + await signup(formData.lName.trim(), formData.fName.trim(), formData.pseudo.trim(), formData.email.trim(), formData.password); + navigate("/dashboard"); } catch (error) { - console.log(error) - + console.error(error); + toast.error(localError || error.message || 'Une erreur est survenue lors de l\'inscription'); } - } + }; + return ( { /> setEmail(e.target.value)} + onInvalid={(e) => e.preventDefault()} /> { value={password} onChange={(e) => setPassword(e.target.value)} /> - {error &&

{error}

} + {(localError || error) && (

{localError || error}

)} { whileTop={{scale:0.98}} type='submit' disabled={isLoading} + data-testid="submit-button" > - {isLoading? :"S'inscrire"} + {isLoading? :"S'inscrire"}
diff --git a/web_frontend/src/pages/SignUpPage.test.jsx b/web_frontend/src/pages/SignUpPage.test.jsx new file mode 100644 index 0000000000..886472d777 --- /dev/null +++ b/web_frontend/src/pages/SignUpPage.test.jsx @@ -0,0 +1,274 @@ +import { render, screen, fireEvent, waitFor } from "@testing-library/react"; +import '@testing-library/jest-dom'; + +import { MemoryRouter } from "react-router-dom"; +import React from "react"; +import { describe, it, expect, vi } from "vitest"; // ou Jest sinon +import SignUpPage from "./SignUpPage"; +import { useAuthStore } from "../store/authStore"; + +// On mock le store +vi.mock("../store/authStore", () => ({ + useAuthStore: vi.fn(), +})); + +describe("SignUpPage", () => { + let mockSignup; + + beforeEach(() => { + mockSignup = vi.fn(); + useAuthStore.mockReturnValue({ + signup: mockSignup, + error: '', + isLoading: false, + }); + }); + + it("renders all input fields and signup button", () => { + render(); + + expect(screen.getByPlaceholderText(/^Nom$/i)).to.exist; + expect(screen.getByPlaceholderText(/prenom/i)).to.exist; + expect(screen.getByPlaceholderText(/pseudo/i)).to.exist; + expect(screen.getByPlaceholderText(/adresse mail/i)).to.exist; + expect(screen.getByPlaceholderText(/password/i)).to.exist; + expect(screen.getByRole("button", { name: /S'inscrire/i })).to.exist; + }); + + it("shows error if last name is too short", async () => { + render(); + + fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "D" } }); + fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "johnny" } }); + fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "john@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "Pass_word123" } }); + + fireEvent.click(screen.getByTestId("submit-button")); + + await waitFor(() => { + expect(screen.getByText(/Le nom doit contenir au moins 2 caractères/i)).to.exist; + }); + }); + + it("shows error if first name is too short", async () => { + render(); + + fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); + fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "J" } }); + fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "johnny" } }); + fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "john@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "Pass_word123" } }); + + fireEvent.click(screen.getByTestId("submit-button")); + + await waitFor(() => { + expect(screen.getByText(/Le prénom doit contenir au moins 2 caractères/i)).to.exist; + }); + }); + + it("shows error if pseudo is too short or too long", async () => { + render(); + + fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); + fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "jo" } }); // trop court + fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "john@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "Pass_word123" } }); + + fireEvent.click(screen.getByTestId("submit-button")); + + await waitFor(() => { + expect(screen.getByText(/Le pseudo doit contenir entre 3 et 30 caractères/i)).to.exist; + }); + + fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "a".repeat(31) } }); // trop long + + fireEvent.click(screen.getByTestId("submit-button")); + + await waitFor(() => { + expect(screen.getByText(/Le pseudo doit contenir entre 3 et 30 caractères/i)).to.exist; + }); + }); + + it("shows error if pseudo contains only numbers", async () => { + render(); + + fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); + fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "123456" } }); + fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "john@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "Pass_word123" } }); + + fireEvent.click(screen.getByTestId("submit-button")); + + await waitFor(() => { + expect(screen.getByText(/Le pseudo ne peut pas être uniquement des chiffres/i)).to.exist; + }); + }); + + it("shows error if pseudo contains invalid characters", async () => { + render(); + + fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); + fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "john@doe" } }); + fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "john@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "Pass_word123" } }); + + fireEvent.click(screen.getByTestId("submit-button")); + + await waitFor(() => { + expect(screen.getByText(/Le pseudo ne peut contenir que des lettres, chiffres, tirets et underscores/i)).to.exist; + }); + }); + + it("shows error if form fields are empty", async () => { + render(); + + const button = screen.getByTestId("submit-button"); + fireEvent.click(button); + + await waitFor(() => { + expect(screen.getByText(/Veuillez remplir tous les champs/i)).to.exist; + }); + }); + + it("shows error if email is invalid", async () => { + render(); + + fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); + fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "johnny" } }); + fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "invalidemail" } }); + fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "password123" } }); + + fireEvent.click(screen.getByTestId("submit-button")); + + const errorMessage = await screen.findByText((content, element) => + content.includes('Veuillez entrer une adresse email valide') + ); + expect(errorMessage).to.exist; + + }); + + it("shows error if password is too short", async () => { + render(); + + fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); + fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "johnny" } }); + fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "john@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "123" } }); + + fireEvent.click(screen.getByTestId("submit-button")); + + await waitFor(() => { + expect(screen.getByText(/Le mot de passe doit contenir au moins 6 caractères/i)).to.exist; + }); + }); + + it("shows error if password has no uppercase letter", async () => { + render(); + + fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); + fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "johnny" } }); + fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "john@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "password123!" } }); + + fireEvent.click(screen.getByTestId("submit-button")); + + await waitFor(() => { + expect(screen.getByText(/Le mot de passe doit contenir au moins une majuscule/i)).to.exist; + }); + }); + + it("shows error if password has no number", async () => { + render(); + + fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); + fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "johnny" } }); + fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "john@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "Password!" } }); + + fireEvent.click(screen.getByTestId("submit-button")); + + await waitFor(() => { + expect(screen.getByText(/Le mot de passe doit contenir au moins un chiffre/i)).to.exist; + }); + }); + + it("shows error if password has no special character", async () => { + render(); + + fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); + fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "johnny" } }); + fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "john@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "Password123" } }); + + fireEvent.click(screen.getByTestId("submit-button")); + + await waitFor(() => { + expect(screen.getByText(/Le mot de passe doit contenir au moins un caractère spécial/i)).to.exist; + }); + }); + + it("shows error if password is same as pseudo or email", async () => { + render(); + + fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); + fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "johnny" } }); + fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "john@example.com" } }); + + // Cas où mot de passe == pseudo + fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "johnny" } }); + fireEvent.click(screen.getByTestId("submit-button")); + + await waitFor(() => { + expect(screen.getByText(/Le mot de passe ne doit pas être identique au pseudo ou à l'email/i)).to.exist; + }); + + // Cas où mot de passe == email + fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "john@example.com" } }); + fireEvent.click(screen.getByTestId("submit-button")); + + await waitFor(() => { + expect(screen.getByText(/Le mot de passe ne doit pas être identique au pseudo ou à l'email/i)).to.exist; + }); + }); + + it("calls signup and redirects on valid form submission", async () => { + + render(); + + fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); + fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "johnny" } }); + fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "john@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "Pass_word123" } }); + + fireEvent.click(screen.getByTestId("submit-button")); + + await waitFor(() => { + expect(mockSignup).toHaveBeenCalledWith("Doe", "John", "johnny", "john@example.com", "Pass_word123"); + }); + }); + + it("disables button and shows loader when loading", () => { + useAuthStore.mockReturnValue({ + signup: vi.fn(), + error: '', + isLoading: true, + }); + + render(); + + const button = screen.getByTestId("submit-button"); + expect(button).toBeDisabled(); // Vérifie que le bouton est désactivé + expect(screen.getByTestId("loader")).to.exist; // Le loader Lucide génère une balise + }); +}); diff --git a/web_frontend/src/utils/validation/validationSignUp.js b/web_frontend/src/utils/validation/validationSignUp.js new file mode 100644 index 0000000000..f0b1d18ce3 --- /dev/null +++ b/web_frontend/src/utils/validation/validationSignUp.js @@ -0,0 +1,65 @@ +export function validateSignup({ lName, fName, pseudo, email, password }) { + const errors = {}; + + // Trim tous les champs + const trimmedLName = lName.trim(); + const trimmedFName = fName.trim(); + const trimmedPseudo = pseudo.trim(); + const trimmedEmail = email.trim(); + const trimmedPassword = password; + + // Vérification de champs vides + if (!trimmedLName || !trimmedFName || !trimmedPseudo || !trimmedEmail || !trimmedPassword) { + errors.global = 'Veuillez remplir tous les champs'; + return errors; + } + + // Vérification Nom/Prénom + if (trimmedLName.length < 2) { + errors.lName = 'Le nom doit contenir au moins 2 caractères'; + } + if (trimmedFName.length < 2) { + errors.fName = 'Le prénom doit contenir au moins 2 caractères'; + } + + // Vérification Pseudo + if (trimmedPseudo.length < 3 || trimmedPseudo.length > 30) { + errors.pseudo = 'Le pseudo doit contenir entre 3 et 30 caractères'; + } else if (/^\d+$/.test(trimmedPseudo)) { + errors.pseudo = 'Le pseudo ne peut pas être uniquement des chiffres'; + } else if (/[^a-zA-Z0-9_-]/.test(trimmedPseudo)) { + errors.pseudo = 'Le pseudo ne peut contenir que des lettres, chiffres, tirets et underscores'; + } + + // Vérification Email + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + if (!emailRegex.test(trimmedEmail)) { + errors.email = 'Veuillez entrer une adresse email valide'; + } else { + const tempEmailDomains = ['yopmail.com', 'mailinator.com', 'tempmail.com', '10minutemail.com']; + const emailDomain = trimmedEmail.split('@')[1]; + if (tempEmailDomains.includes(emailDomain)) { + errors.email = 'Adresse email temporaire non autorisée'; + } + } + + // Vérification Mot de passe + if (trimmedPassword.length < 6) { + errors.password = 'Le mot de passe doit contenir au moins 6 caractères'; + } else { + if (!/[A-Z]/.test(trimmedPassword)) { + errors.password = 'Le mot de passe doit contenir au moins une majuscule'; + } + if (!/[0-9]/.test(trimmedPassword)) { + errors.password = 'Le mot de passe doit contenir au moins un chiffre'; + } + if (!/[^a-zA-Z0-9]/.test(trimmedPassword)) { + errors.password = 'Le mot de passe doit contenir au moins un caractère spécial'; + } + if (trimmedPassword === trimmedPseudo || trimmedPassword === trimmedEmail) { + errors.password = 'Le mot de passe ne doit pas être identique au pseudo ou à l\'email'; + } + } + + return errors; +} diff --git a/web_frontend/vitest.config.js b/web_frontend/vitest.config.js new file mode 100644 index 0000000000..2fc41f0193 --- /dev/null +++ b/web_frontend/vitest.config.js @@ -0,0 +1,8 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + globals: true, + environment: 'jsdom', + }, +}) From ce0d4dd906e87af4a3e6d3046156fedc570c334d Mon Sep 17 00:00:00 2001 From: Hassan-mumu Date: Tue, 29 Apr 2025 18:17:37 +0200 Subject: [PATCH 18/22] + Ajout des tests unitaire pour la page de login ~ update LoginPage, message en cas d'erreur ~petit ajustement visuels et changement de nm de page Dashboard -> Profile --- api_backend/controllers/auth.controller.js | 4 +- web_frontend/src/App.jsx | 4 +- web_frontend/src/pages/EditProfilePage.jsx | 4 +- web_frontend/src/pages/LoginPage.test.jsx | 91 +++++++++++++++++++ .../{DashboardPage.jsx => ProfilePage.jsx} | 0 web_frontend/src/pages/SignUpPage.jsx | 5 +- web_frontend/src/pages/header.jsx | 2 +- web_frontend/src/pages/loginPage.jsx | 52 ++++++++--- web_frontend/src/store/authStore.js | 2 +- .../src/utils/validation/validationLogin.js | 22 +++++ 10 files changed, 164 insertions(+), 22 deletions(-) create mode 100644 web_frontend/src/pages/LoginPage.test.jsx rename web_frontend/src/pages/{DashboardPage.jsx => ProfilePage.jsx} (100%) create mode 100644 web_frontend/src/utils/validation/validationLogin.js diff --git a/api_backend/controllers/auth.controller.js b/api_backend/controllers/auth.controller.js index 0d1f98f15e..233cb760a7 100644 --- a/api_backend/controllers/auth.controller.js +++ b/api_backend/controllers/auth.controller.js @@ -127,12 +127,12 @@ export const login = async (req, res) => { try { const user = await User.findOne({email}); if (!user){ - return res.status(400).json({sucess:false, message:"Invalid credentials"}) + return res.status(400).json({sucess:false, message:"email incorrecte"}) } const ispasswordValid = await bcrypt.compare(password, user.password); if (!ispasswordValid){ - return res.status(400).json({sucess:false, message:"Invalid password"}) + return res.status(400).json({sucess:false, message:"Mot de passe incorrect"}) } generateTokenAndSetCookie(res, user._id); diff --git a/web_frontend/src/App.jsx b/web_frontend/src/App.jsx index a0ee6ca4aa..ce95d26acc 100644 --- a/web_frontend/src/App.jsx +++ b/web_frontend/src/App.jsx @@ -16,7 +16,7 @@ import LoadingSpinner from "./components/LoadingSpinner.jsx" import SignUpPage from "./pages/SignUpPage.jsx" import LoginPage from "./pages/LoginPage.jsx" import EmailVerificationPage from "./pages/EmailVerificationPage.jsx" -import DashboardPage from "./pages/DashBoardPage.jsx" +import ProfilePage from "./pages/ProfilePage.jsx" import EditProfilePage from "./pages/EditProfilePage.jsx"; import ForgotPasswordPage from "./pages/ForgotPasswordPage.jsx" import ResetPasswordPage from "./pages/ResetPasswordPage.jsx" @@ -82,7 +82,7 @@ function App() {
} /> - } /> + } /> } /> } /> } /> diff --git a/web_frontend/src/pages/EditProfilePage.jsx b/web_frontend/src/pages/EditProfilePage.jsx index 625073c8c2..a002667ccb 100644 --- a/web_frontend/src/pages/EditProfilePage.jsx +++ b/web_frontend/src/pages/EditProfilePage.jsx @@ -56,7 +56,7 @@ const EditProfilePage = () => { if (password) updatePayload.password = password; await updateProfile(updatePayload); - navigate("/dashboard"); + navigate("/profile"); } catch (error) { toast.error("Erreur lors de la mise à jour"); console.error(error); @@ -131,7 +131,7 @@ const EditProfilePage = () => { font-bold rounded-lg shadow-lg hover:from-blue-800 hover:to-indigo-900 focus:outline-none focus:ring-2 focus:ring-blue-700 focus:ring-offset-2 focus:ring-offset-gray-900' > - Annuler + Annuler diff --git a/web_frontend/src/pages/LoginPage.test.jsx b/web_frontend/src/pages/LoginPage.test.jsx new file mode 100644 index 0000000000..750066ece4 --- /dev/null +++ b/web_frontend/src/pages/LoginPage.test.jsx @@ -0,0 +1,91 @@ +import { render, screen, fireEvent, waitFor } from "@testing-library/react"; +import '@testing-library/jest-dom'; +import { MemoryRouter } from "react-router-dom"; +import React from "react"; +import { describe, it, expect, vi, beforeEach } from "vitest"; +import LoginPage from "./LoginPage"; +import { useAuthStore } from "../store/authStore"; + +vi.mock("../store/authStore", () => ({ + useAuthStore: vi.fn(), +})); + +describe("LoginPage", () => { + let mockLogin; + + beforeEach(() => { + mockLogin = vi.fn(); + useAuthStore.mockReturnValue({ + login: mockLogin, + error: '', + isLoading: false, + }); + }); + + it("renders email and password fields and login button", () => { + render(); + expect(screen.getByPlaceholderText(/adresse mail/i)).toBeInTheDocument(); + expect(screen.getByPlaceholderText(/password/i)).toBeInTheDocument(); + expect(screen.getByTestId("login-button")).toBeInTheDocument(); + }); + + it("shows error if email is empty", async () => { + render(); + fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "Password123!" } }); + fireEvent.click(screen.getByTestId("login-button")); + + await waitFor(() => { + expect(screen.getByText(/Veuillez remplir tous les champs/i)).toBeInTheDocument(); + }); + }); + + it("shows error if email is invalid", async () => { + render(); + fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "invalidemail" } }); + fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "Password123!" } }); + fireEvent.click(screen.getByTestId("login-button")); + + await waitFor(() => { + expect(screen.getByText(/Veuillez entrer une adresse email valide/i)).toBeInTheDocument(); + }); + }); + + it("shows error if password is empty", async () => { + render(); + fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "user@mail.com" } }); + fireEvent.click(screen.getByTestId("login-button")); + + await waitFor(() => { + expect(screen.getByText(/Veuillez remplir tous les champs/i)).toBeInTheDocument(); + }); + }); + + it("calls login function when inputs are valid", async () => { + render(); + fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "user@mail.com" } }); + fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "Password123!" } }); + fireEvent.click(screen.getByTestId("login-button")); + + await waitFor(() => { + expect(mockLogin).toHaveBeenCalledWith("user@mail.com", "Password123!"); + }); + }); + + it("displays backend error if login fails", async () => { + useAuthStore.mockReturnValue({ + login: vi.fn(), + error: "Identifiants incorrects", + isLoading: false, + }); + + render(); + + fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "user@mail.com" } }); + fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "WrongPassword" } }); + fireEvent.click(screen.getByTestId("login-button")); + + await waitFor(() => { + expect(screen.getByText(/Identifiants incorrects/i)).toBeInTheDocument(); + }); + }); +}); diff --git a/web_frontend/src/pages/DashboardPage.jsx b/web_frontend/src/pages/ProfilePage.jsx similarity index 100% rename from web_frontend/src/pages/DashboardPage.jsx rename to web_frontend/src/pages/ProfilePage.jsx diff --git a/web_frontend/src/pages/SignUpPage.jsx b/web_frontend/src/pages/SignUpPage.jsx index af7e5dae66..a42b5b3d6f 100644 --- a/web_frontend/src/pages/SignUpPage.jsx +++ b/web_frontend/src/pages/SignUpPage.jsx @@ -41,10 +41,11 @@ const SignUpPage = () => { try { await signup(formData.lName.trim(), formData.fName.trim(), formData.pseudo.trim(), formData.email.trim(), formData.password); - navigate("/dashboard"); + navigate("/profile"); } catch (error) { console.error(error); - toast.error(localError || error.message || 'Une erreur est survenue lors de l\'inscription'); + const message = error?.response?.data?.message || error.message || 'Une erreur est survenue'; + toast.error(message); } }; diff --git a/web_frontend/src/pages/header.jsx b/web_frontend/src/pages/header.jsx index adecffe315..346902131d 100644 --- a/web_frontend/src/pages/header.jsx +++ b/web_frontend/src/pages/header.jsx @@ -25,7 +25,7 @@ const Navbar = () => {
{isAuthenticated ? ( <> - + Compte diff --git a/web_frontend/src/pages/loginPage.jsx b/web_frontend/src/pages/loginPage.jsx index 327cc27e31..b7d46f2bd1 100644 --- a/web_frontend/src/pages/loginPage.jsx +++ b/web_frontend/src/pages/loginPage.jsx @@ -1,22 +1,49 @@ -import {useState} from 'react' -import {motion} from 'framer-motion' +import { useState } from 'react' +import { motion } from 'framer-motion' import { Mail, Lock, Loader } from "lucide-react" -import {Link} from 'react-router-dom' +import { Link } from 'react-router-dom' +import React from 'react' +import { toast } from 'react-hot-toast' import { useAuthStore } from '../store/authStore' import Input from '../components/Input' +import { validateLogin } from '../utils/validation/validationLogin.js'; + const LoginPage = () => { const [email, setEmail] = useState('') const [password, setPassword] = useState('') + const [localError, setLocalError] = useState('') - const {login, isLoading, error} = useAuthStore() + const { login, isLoading, error } = useAuthStore() const handleLogin = async (e) => { e.preventDefault(); - await login(email, password) + const formData = { email, password }; + const errors = validateLogin(formData); + + if (Object.keys(errors).length > 0) { + const firstError = errors.global || Object.values(errors)[0]; + toast.error(firstError); + setLocalError(firstError); + return; + } + + setLocalError(''); + try { + await login(email.trim(), password.trim()) + navigate("/profile"); + + } catch (error) { + console.error(error); + const message = error?.response?.data?.message || error.message || 'Une erreur est survenue'; + toast.error(message); + } + // Si la connexion échoue, vous pouvez gérer l'erreur ici + // Si la connexion est réussie, redirige l'utilisateur vers le tableau de bord ou une autre page } + return ( {
setEmail(e.target.value)} @@ -52,18 +79,19 @@ const LoginPage = () => { Mot de passe oublier?
- {error &&

{error}

} + {(localError || error) && (

{localError || error}

)} - {isLoading? :"Se connecter"} + {isLoading ? : "Se connecter"} diff --git a/web_frontend/src/store/authStore.js b/web_frontend/src/store/authStore.js index d397f76dd4..18ed384afd 100644 --- a/web_frontend/src/store/authStore.js +++ b/web_frontend/src/store/authStore.js @@ -35,7 +35,7 @@ export const useAuthStore = create((set) => ({ error: null, isLoading: false, }); - toast.success(`Bon retour ${response.data.user.pseudo}`) + toast.success(`Salut ${response.data.user.pseudo}`) } catch (error) { set({ error: error.response?.data?.message || "Error logging in", isLoading: false }); throw error; diff --git a/web_frontend/src/utils/validation/validationLogin.js b/web_frontend/src/utils/validation/validationLogin.js new file mode 100644 index 0000000000..bf8a28d3ff --- /dev/null +++ b/web_frontend/src/utils/validation/validationLogin.js @@ -0,0 +1,22 @@ +export function validateLogin({ email, password }) { + const errors = {}; + + // Trim tous les champs + const trimmedEmail = email.trim(); + const trimmedPassword = password.trim(); + + // Vérification de champs vides + if (!trimmedEmail || !trimmedPassword) { + errors.global = 'Veuillez remplir tous les champs'; + return errors; + } + + // Vérification Email + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + if (!emailRegex.test(trimmedEmail)) { + errors.email = 'Veuillez entrer une adresse email valide'; + } + + + return errors; +} From 080554838cd80b131380165783c6e6f595d5def9 Mon Sep 17 00:00:00 2001 From: Hassan-mumu Date: Sat, 3 May 2025 22:19:56 +0200 Subject: [PATCH 19/22] + ajoute des ecoles et des niveau dans le formulaire d'inscription MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ~update test pour intégrer les niveau et les ecoles + librairie d'image de logo pour valorant ~update modifier profil ajout d'une sidebar et des section dédié, apparence de la page modifié --- api_backend/controllers/auth.controller.js | 32 +- api_backend/models/user.model.js | 2 +- commandes_node | 2 + web_frontend/package-lock.json | 463 ++++++++++++++++-- web_frontend/package.json | 2 + .../public/ranks/Ascendant_1_Rank.png | Bin 0 -> 9998 bytes .../public/ranks/Ascendant_2_Rank.png | Bin 0 -> 16502 bytes .../public/ranks/Ascendant_3_Rank.png | Bin 0 -> 22715 bytes web_frontend/public/ranks/Bronze_1_Rank.png | Bin 0 -> 13454 bytes web_frontend/public/ranks/Bronze_2_Rank.png | Bin 0 -> 25437 bytes web_frontend/public/ranks/Bronze_3_Rank.png | Bin 0 -> 32995 bytes web_frontend/public/ranks/Diamond_1_Rank.png | Bin 0 -> 16354 bytes web_frontend/public/ranks/Diamond_2_Rank.png | Bin 0 -> 28817 bytes web_frontend/public/ranks/Diamond_3_Rank.png | Bin 0 -> 36818 bytes web_frontend/public/ranks/Gold_1_Rank.png | Bin 0 -> 22158 bytes web_frontend/public/ranks/Gold_2_Rank.png | Bin 0 -> 35057 bytes web_frontend/public/ranks/Gold_3_Rank.png | Bin 0 -> 44074 bytes web_frontend/public/ranks/Immortal_1_Rank.png | Bin 0 -> 23819 bytes web_frontend/public/ranks/Immortal_2_Rank.png | Bin 0 -> 43019 bytes web_frontend/public/ranks/Immortal_3_Rank.png | Bin 0 -> 50553 bytes web_frontend/public/ranks/Iron_1_Rank.png | Bin 0 -> 15054 bytes web_frontend/public/ranks/Iron_2_Rank.png | Bin 0 -> 27474 bytes web_frontend/public/ranks/Iron_3_Rank.png | Bin 0 -> 34256 bytes web_frontend/public/ranks/Platinum_1_Rank.png | Bin 0 -> 16917 bytes web_frontend/public/ranks/Platinum_2_Rank.png | Bin 0 -> 28062 bytes web_frontend/public/ranks/Platinum_3_Rank.png | Bin 0 -> 38131 bytes web_frontend/public/ranks/Radiant_Rank.png | Bin 0 -> 31567 bytes web_frontend/public/ranks/Silver_1_Rank.png | Bin 0 -> 13587 bytes web_frontend/public/ranks/Silver_2_Rank.png | Bin 0 -> 27405 bytes web_frontend/public/ranks/Silver_3_Rank.png | Bin 0 -> 35607 bytes web_frontend/public/ranks/unknown.jpg | Bin 0 -> 8104 bytes web_frontend/src/App.css | 1 - web_frontend/src/components/CustomSelect.jsx | 41 ++ web_frontend/src/components/EditableField.jsx | 81 +++ web_frontend/src/components/Input.jsx | 2 +- web_frontend/src/index.css | 2 + web_frontend/src/pages/EditProfilePage.jsx | 178 ++++--- web_frontend/src/pages/ProfilePage.jsx | 268 ++++------ .../src/pages/ProfileSections/MesEquipes.jsx | 31 ++ .../src/pages/ProfileSections/MesTournois.jsx | 23 + .../src/pages/ProfileSections/MonProfil.jsx | 156 ++++++ web_frontend/src/pages/SignUpPage.jsx | 67 ++- web_frontend/src/pages/SignUpPage.test.jsx | 363 ++++++++++---- web_frontend/src/pages/loginPage.jsx | 7 +- web_frontend/src/store/authStore.js | 5 +- web_frontend/src/store/ecoleStore.js | 25 + .../src/utils/validation/validationSignUp.js | 58 ++- web_frontend/src/utils/valorantRanks.js | 26 + 48 files changed, 1397 insertions(+), 438 deletions(-) create mode 100644 web_frontend/public/ranks/Ascendant_1_Rank.png create mode 100644 web_frontend/public/ranks/Ascendant_2_Rank.png create mode 100644 web_frontend/public/ranks/Ascendant_3_Rank.png create mode 100644 web_frontend/public/ranks/Bronze_1_Rank.png create mode 100644 web_frontend/public/ranks/Bronze_2_Rank.png create mode 100644 web_frontend/public/ranks/Bronze_3_Rank.png create mode 100644 web_frontend/public/ranks/Diamond_1_Rank.png create mode 100644 web_frontend/public/ranks/Diamond_2_Rank.png create mode 100644 web_frontend/public/ranks/Diamond_3_Rank.png create mode 100644 web_frontend/public/ranks/Gold_1_Rank.png create mode 100644 web_frontend/public/ranks/Gold_2_Rank.png create mode 100644 web_frontend/public/ranks/Gold_3_Rank.png create mode 100644 web_frontend/public/ranks/Immortal_1_Rank.png create mode 100644 web_frontend/public/ranks/Immortal_2_Rank.png create mode 100644 web_frontend/public/ranks/Immortal_3_Rank.png create mode 100644 web_frontend/public/ranks/Iron_1_Rank.png create mode 100644 web_frontend/public/ranks/Iron_2_Rank.png create mode 100644 web_frontend/public/ranks/Iron_3_Rank.png create mode 100644 web_frontend/public/ranks/Platinum_1_Rank.png create mode 100644 web_frontend/public/ranks/Platinum_2_Rank.png create mode 100644 web_frontend/public/ranks/Platinum_3_Rank.png create mode 100644 web_frontend/public/ranks/Radiant_Rank.png create mode 100644 web_frontend/public/ranks/Silver_1_Rank.png create mode 100644 web_frontend/public/ranks/Silver_2_Rank.png create mode 100644 web_frontend/public/ranks/Silver_3_Rank.png create mode 100644 web_frontend/public/ranks/unknown.jpg delete mode 100644 web_frontend/src/App.css create mode 100644 web_frontend/src/components/CustomSelect.jsx create mode 100644 web_frontend/src/components/EditableField.jsx create mode 100644 web_frontend/src/pages/ProfileSections/MesEquipes.jsx create mode 100644 web_frontend/src/pages/ProfileSections/MesTournois.jsx create mode 100644 web_frontend/src/pages/ProfileSections/MonProfil.jsx create mode 100644 web_frontend/src/store/ecoleStore.js create mode 100644 web_frontend/src/utils/valorantRanks.js diff --git a/api_backend/controllers/auth.controller.js b/api_backend/controllers/auth.controller.js index 233cb760a7..2b0f2127fe 100644 --- a/api_backend/controllers/auth.controller.js +++ b/api_backend/controllers/auth.controller.js @@ -14,38 +14,38 @@ import { console } from 'inspector/promises'; export const checkAuth = async (req, res) => { try { - const user = await User.findById(req.userId).select("-password"); // On récupère l'user de la DB + const user = await User.findById(req.userId).select("-password").populate('ecole_id'); if (!user){ - return res.status(400).json({success:false, message:"User not found"}); + return res.status(400).json({ success: false, message: "Utilisateur introuvable" }); } - res.status(200).json({success:true, user}); // On envoie l'user comme réponse + res.status(200).json({ success: true, user }); } catch (error) { console.log("Error in checkAuth ", error); - res.status(400).json({success:false, message: error.message}); + res.status(400).json({ success: false, message: error.message }); } - } + export const signup = async (req, res) => { - const {lName, fName,pseudo, email, password} = req.body; + const {lName, fName, pseudo, ecole_id, niveau, email, password} = req.body; try { // les champs requis doivent etre entrée - if(!lName, !fName, !pseudo, !email, !password){ - throw new Error("All fields are required") + if(!lName, !fName, !pseudo, !ecole_id, !niveau, !email, !password){ + throw new Error("Tout les champs sont requis") } // Error si l'email existe déja dans la db const userAlreadyExists = await User.findOne({email}); console.log("userAlreadyExists", userAlreadyExists) if (userAlreadyExists){ - return res.status(400).json({sucess:false, message: "User already exists"}); + return res.status(400).json({sucess:false, message: "Adresse email déjà utilisée"}); } const pseudoAlreadyExists = await User.findOne({pseudo}); console.log("pseudoAlreadyExists", pseudoAlreadyExists) if (pseudoAlreadyExists){ - return res.status(400).json({sucess:false, message: "pseudo already exists"}); + return res.status(400).json({sucess:false, message: "pseudo déjà utilisé"}); } // permet de hashé le mot de passe pour qu'il ne soit pas stocké une fois enregistré @@ -57,6 +57,8 @@ export const signup = async (req, res) => { lName, fName, pseudo, + ecole_id, + niveau, email, password: hashedPassword, verificationToken, @@ -78,7 +80,7 @@ export const signup = async (req, res) => { res.status(201).json({ sucess: true, - message: "User created successfully", + message: "Utilisateur créé avec succès", user: { ...user._doc, password: undefined // empèche le client de voire le mot de passe en le supprimant de la réponse @@ -125,7 +127,7 @@ export const verifyEmail = async (req, res) => { export const login = async (req, res) => { const {email, password} = req.body; try { - const user = await User.findOne({email}); + const user = await User.findOne({email}).populate('ecole_id');; if (!user){ return res.status(400).json({sucess:false, message:"email incorrecte"}) } @@ -250,9 +252,9 @@ export const updatePic = async (req, res) => { export const updateProfile = async (req, res) => { try { const userId = req.userId; // Injecté par verifyToken - const { nom, prenom, pseudo, password } = req.body; + const { nom, prenom, pseudo, ecole_id, niveau, password } = req.body; - const user = await User.findById(userId); + const user = await User.findById(userId).populate('ecole_id');; if (!user) { return res.status(404).json({ message: "Utilisateur non trouvé" }); } @@ -261,6 +263,8 @@ export const updateProfile = async (req, res) => { if (nom) user.lName = nom; if (prenom) user.fName = prenom; if (pseudo) user.pseudo = pseudo; + if (ecole_id) user.ecole_id = ecole_id; + if (niveau) user.niveau = niveau; // Si password fourni, on le hash avant update if (password) { diff --git a/api_backend/models/user.model.js b/api_backend/models/user.model.js index 0e8f2683e1..00158493ca 100644 --- a/api_backend/models/user.model.js +++ b/api_backend/models/user.model.js @@ -38,7 +38,7 @@ const userSchema = new mongoose.Schema({ }, logo: { type: String, - defaul: "" + default: "" }, ecole_id: { type: mongoose.Schema.Types.ObjectId, diff --git a/commandes_node b/commandes_node index 49a432a29e..e45ca46985 100644 --- a/commandes_node +++ b/commandes_node @@ -54,3 +54,5 @@ npm install -D vitest @testing-library/react @testing-library/jest-dom npm install --save-dev @testing-library/jest-dom + +npm install react-select diff --git a/web_frontend/package-lock.json b/web_frontend/package-lock.json index 4b415eae0f..319e628748 100644 --- a/web_frontend/package-lock.json +++ b/web_frontend/package-lock.json @@ -16,6 +16,7 @@ "react-dom": "^19.1.0", "react-hot-toast": "^2.5.2", "react-router-dom": "^7.5.1", + "react-select": "^5.10.1", "zustand": "^5.0.3" }, "devDependencies": { @@ -35,6 +36,7 @@ "jest": "^29.7.0", "jsdom": "^26.1.0", "postcss": "^8.5.3", + "tailwind-scrollbar": "^4.0.2", "tailwindcss": "^4.1.4", "vite": "^6.3.1", "vitest": "^3.1.2" @@ -86,7 +88,6 @@ "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", @@ -142,7 +143,6 @@ "version": "7.27.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.27.0", @@ -176,7 +176,6 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.25.9", @@ -218,7 +217,6 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -228,7 +226,6 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -262,7 +259,6 @@ "version": "7.27.0", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.27.0" @@ -549,7 +545,6 @@ "version": "7.27.0", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", - "dev": true, "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -562,7 +557,6 @@ "version": "7.27.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", @@ -577,7 +571,6 @@ "version": "7.27.0", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", @@ -596,7 +589,6 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -606,7 +598,6 @@ "version": "7.27.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", @@ -738,6 +729,135 @@ "node": ">=18" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", @@ -1289,6 +1409,31 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", + "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", + "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "license": "MIT" + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -1803,7 +1948,6 @@ "version": "0.3.8", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -1818,7 +1962,6 @@ "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, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -1828,7 +1971,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -1838,14 +1980,12 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -2611,11 +2751,23 @@ "undici-types": "~6.21.0" } }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prismjs": { + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", + "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/react": { "version": "19.1.2", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.2.tgz", "integrity": "sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==", - "devOptional": true, "license": "MIT", "dependencies": { "csstype": "^3.0.2" @@ -2631,6 +2783,15 @@ "@types/react": "^19.0.0" } }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -3061,6 +3222,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, "node_modules/babel-preset-current-node-syntax": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", @@ -3213,7 +3389,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -3355,6 +3530,16 @@ "node": ">=12" } }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -3428,6 +3613,31 @@ "node": ">=18" } }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -3510,7 +3720,6 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -3629,6 +3838,16 @@ "license": "MIT", "peer": true }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -3700,7 +3919,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" @@ -3812,7 +4030,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -4154,6 +4371,12 @@ "node": ">=8" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -4502,6 +4725,21 @@ "node": ">= 0.4" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, "node_modules/html-encoding-sniffer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", @@ -4587,7 +4825,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -4663,14 +4900,12 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, "license": "MIT" }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -5783,7 +6018,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -5843,7 +6077,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -5863,7 +6096,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { @@ -6169,7 +6401,6 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, "license": "MIT" }, "node_modules/locate-path": { @@ -6202,6 +6433,18 @@ "dev": true, "license": "MIT" }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/loupe": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", @@ -6297,6 +6540,12 @@ "node": ">= 0.4" } }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -6404,7 +6653,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/nanoid": { @@ -6486,6 +6734,15 @@ "dev": true, "license": "MIT" }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -6576,7 +6833,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -6589,7 +6845,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", @@ -6651,9 +6906,17 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, "license": "MIT" }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -6843,6 +7106,20 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/prism-react-renderer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", + "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -6857,6 +7134,23 @@ "node": ">= 6" } }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -6947,9 +7241,9 @@ } }, "node_modules/react-router": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.1.tgz", - "integrity": "sha512-/jjU3fcYNd2bwz9Q0xt5TwyiyoO8XjSEFXJY4O/lMAlkGTHWuHRAbR9Etik+lSDqMC7A7mz3UlXzgYT6Vl58sA==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.3.tgz", + "integrity": "sha512-3iUDM4/fZCQ89SXlDa+Ph3MevBrozBAI655OAfWQlTm9nBR0IKlrmNwFow5lPHttbwvITZfkeeeZFP6zt3F7pw==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", @@ -6970,12 +7264,12 @@ } }, "node_modules/react-router-dom": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.1.tgz", - "integrity": "sha512-5DPSPc7ENrt2tlKPq0FtpG80ZbqA9aIKEyqX6hSNJDlol/tr6iqCK4crqdsusmOSSotq6zDsn0y3urX9TuTNmA==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.3.tgz", + "integrity": "sha512-cK0jSaTyW4jV9SRKAItMIQfWZ/D6WEZafgHuuCb9g+SjhLolY78qc+De4w/Cz9ybjvLzShAmaIMEXt8iF1Cm+A==", "license": "MIT", "dependencies": { - "react-router": "7.5.1" + "react-router": "7.5.3" }, "engines": { "node": ">=20.0.0" @@ -6985,6 +7279,43 @@ "react-dom": ">=18" } }, + "node_modules/react-select": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.10.1.tgz", + "integrity": "sha512-roPEZUL4aRZDx6DcsD+ZNreVl+fM8VsKn0Wtex1v4IazH60ILp5xhdlp464IsEAlJdXeD+BhDAFsBVMfvLQueA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.2.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -7003,7 +7334,6 @@ "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true, "license": "MIT" }, "node_modules/require-directory": { @@ -7020,7 +7350,6 @@ "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", @@ -7064,7 +7393,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -7384,6 +7712,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -7401,7 +7735,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7417,6 +7750,22 @@ "dev": true, "license": "MIT" }, + "node_modules/tailwind-scrollbar": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/tailwind-scrollbar/-/tailwind-scrollbar-4.0.2.tgz", + "integrity": "sha512-wAQiIxAPqk0MNTPptVe/xoyWi27y+NRGnTwvn4PQnbvB9kp8QUBiGl/wsfoVBHnQxTmhXJSNt9NHTmcz9EivFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "prism-react-renderer": "^2.4.1" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "tailwindcss": "4.x" + } + }, "node_modules/tailwindcss": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.4.tgz", @@ -7669,6 +8018,20 @@ "punycode": "^2.1.0" } }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.0.tgz", + "integrity": "sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/v8-to-istanbul": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", @@ -8060,6 +8423,20 @@ "dev": true, "license": "ISC" }, + "node_modules/yaml": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", + "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/web_frontend/package.json b/web_frontend/package.json index 77f9b91b8f..dca409ec79 100644 --- a/web_frontend/package.json +++ b/web_frontend/package.json @@ -19,6 +19,7 @@ "react-dom": "^19.1.0", "react-hot-toast": "^2.5.2", "react-router-dom": "^7.5.1", + "react-select": "^5.10.1", "zustand": "^5.0.3" }, "devDependencies": { @@ -38,6 +39,7 @@ "jest": "^29.7.0", "jsdom": "^26.1.0", "postcss": "^8.5.3", + "tailwind-scrollbar": "^4.0.2", "tailwindcss": "^4.1.4", "vite": "^6.3.1", "vitest": "^3.1.2" diff --git a/web_frontend/public/ranks/Ascendant_1_Rank.png b/web_frontend/public/ranks/Ascendant_1_Rank.png new file mode 100644 index 0000000000000000000000000000000000000000..f58ff671b0b3d7ade274629cabb6ffaf4157ba7a GIT binary patch literal 9998 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 NJvCj`@;lZM{|CV4j~oC1 literal 0 HcmV?d00001 diff --git a/web_frontend/public/ranks/Ascendant_2_Rank.png b/web_frontend/public/ranks/Ascendant_2_Rank.png new file mode 100644 index 0000000000000000000000000000000000000000..c5462581a7b1e7ba72b61553f142f21e5213afd1 GIT binary patch literal 16502 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 br}E^uFB1B zo?R`z(k(SnPEp{jpqBu2GUR$7p=fzN{NR#R=1ljf1wR z^`#6wmNhBmQg5ff71}@eO0VSjx{LNB>-LFptb%kT!cLRzDwvI-(14Nap3=4ZK~*(nNyw9-CGuyXAVJQz zXJ6@3Xlx&(1yF(0F~5~sA-p1PF+C0rUac&tl^N*MUBmE&dneGmd`zz<>4}ewQIJ&v*e;oAxx4keQvo%M6G96?cmMGwoR;qEf<^QxiYw->;f4$s12TXg)puMKU2+k@anFk>yCUsw>np_M<-p8-XMk%2Hpa4F@;W;btxy| z!g{_FXR!-`v~CjuASDKTr8~l2Q=9sHVgkQYak*^JuXF-(EuH`PcWtD5pAQAJZmH30 zVBo21pEcqX0qGDDPmG1G})0Y>Vk2J(a;#~A+rJ~9`>_pg_}AR1W>_TA{HsBDDB)y%`F6?#;fjF8{-~ zIFpEuXfID)%AHdzydr12Zs18?-!ee)uO3}$xOUJ#|6H%pQumAtt)DrRx?osomwVPK z-u)t%#E92^_S!(@qKf8z@2{4zjHyQLo)>0ER#!N`Yq`boDC+C8>bk~XjazMOW>NRv z$d|8^F88}=<*f!g(6`@;${|}o$&vLidIq!!6o2lY+ne|t(#^;B3U;$&QW!1fcyMN0 z>oI3{+%RVh7Ze!2cg}*!PQA|xkBm4%GaiFy_kDM>3i7M8>j=9yDNtj*bfAc9K|pgg zwUctA-1hVF>+xD95D<8Zobw0=_7crf;I{M2vXEw)h6l~K zCG5R0@t9|CU{iqg^UpyO4VDl~yq3MU+H>8++#*y5-j?V^596-#aT{(aCS8)hFyS~P zLGn|K+B6nq#awbNpyHl&MG^}!)iP`uUQBc^r+_|9OmoW#>?0gwlk8Rt zu~GP+-rK%=D~W+Jg=)GD=3J(}SoldL;Gmf;RHD_PnqA+z5coSZ(cEgD$=tRw>y*WA zUG}3+(rs*RRVnl6{LA8`AX-R3uEeRGKh_L{VI<6Yl)Wwz(Oa(6$QOHl(fB0#PLI4pmK=a>ulHz zP*qj?yYY{|?yOz|jL6HH&;H=vp3cN*%z0lF?evIZ5G>Wq8q_WVAf7FeY^fIoz}xYU zG{dm>cn1k8a;Ai+)#<@fD@^R)g4f4-z`t2nhvg{cpCr6JZhr`NLfM6E4U+wM)Lmie zsk>s#X2v4HN0^d1>xiGL4KfJ7?ZQP$ud z(cEB=3^x3pPZ(e11C-`N!NQpKMixyB8Xb861eTUCeJ2cyokFx+#IzO^8TCI7YvDov!vf3T~*JHjRH6* zmx8Q-Zc*VYgTE}5ttLXeT$~BZR`PRTfYjN^xOb^j{zR_+kjdIU*WtbA62+1ruh8QH z0neg|X&(r|pV=TG_#8;-4xAtWTtnQZNeWAX8iOR{nDA0)rwyj^f`Tcw5VY$kkNjz5KQPhb@n~p6-5t;a068fo$p&$g(EkDKbw2h0 literal 0 HcmV?d00001 diff --git a/web_frontend/public/ranks/Ascendant_3_Rank.png b/web_frontend/public/ranks/Ascendant_3_Rank.png new file mode 100644 index 0000000000000000000000000000000000000000..15a8aabc1f4bc6704783f361771efd6d3389c573 GIT binary patch literal 22715 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 IN#nr(2db2#w*UYD literal 0 HcmV?d00001 diff --git a/web_frontend/public/ranks/Bronze_2_Rank.png b/web_frontend/public/ranks/Bronze_2_Rank.png new file mode 100644 index 0000000000000000000000000000000000000000..1dc52b4f11665d96eb2cf751cab290344693d420 GIT binary patch literal 25437 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 C!jIYj literal 0 HcmV?d00001 diff --git a/web_frontend/public/ranks/Bronze_3_Rank.png b/web_frontend/public/ranks/Bronze_3_Rank.png new file mode 100644 index 0000000000000000000000000000000000000000..c1e0b16748e51257ee4e5c689a4d7d23f5fd9519 GIT binary patch literal 32995 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 z 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 literal 0 HcmV?d00001 diff --git a/web_frontend/public/ranks/Diamond_1_Rank.png b/web_frontend/public/ranks/Diamond_1_Rank.png new file mode 100644 index 0000000000000000000000000000000000000000..4524c99d32614e02b3d0a4d9f9bbe8390d02451a GIT binary patch literal 16354 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%0Aaobxww{i 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 literal 0 HcmV?d00001 diff --git a/web_frontend/public/ranks/Diamond_3_Rank.png b/web_frontend/public/ranks/Diamond_3_Rank.png new file mode 100644 index 0000000000000000000000000000000000000000..084b2745c380514502dfab7aca2807f84848987e GIT binary patch literal 36818 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 i)Lsvil_!kC%&Kko^0-g$t#-l`jyA3L~t9i}* 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 Va}WB)v8*nRz3FKQM6>1D6m9H2V2J`t6j-9b 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 literal 0 HcmV?d00001 diff --git a/web_frontend/public/ranks/Gold_3_Rank.png b/web_frontend/public/ranks/Gold_3_Rank.png new file mode 100644 index 0000000000000000000000000000000000000000..ec164991b64f1e02a8d2189b86acc9a53a86e565 GIT binary patch literal 44074 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 z z{~XU3@igLDRuzuyBrYy4>ed_ggj{BCEogFba_qjn*XLN>{FxgXn}+Ky*N^%0TShku z!O4jbL@JjtpY^0o3S2X@Icx2W0#K$j zV2R^A+3XW%E_O~hCS~PSu;2!{5)5-f&TAfg`S8_}m2i1J7ZUyk0MZ(?@avvSPJwkW zS#pv_o*;nbImCJnpi%+-jd)&-C+N;z_(!Bpp1ar`3QQn`jk@)w>x!Q}aI860;%V4@ zeEoHMvOw;$kPB3g7mst0Sc^x$qEoXP?i9d8u--!RK5xQ zZanwkxgC!U&lRcm&Yp>;){emqrA3*+656(@JoEVJs*cgI;Af-Ud)J*sIHf%tt|a92 zbg=RS@#Dcv1YrWmx-29Jp{|zKI+$E7N=Hho^Z5V(1o%lrK~#{>2jBZn7lJ>{=NsSo z895XJ3qfT+o{+~NB8*>k>fFViP+-D~rEUXv^3?N(oBSpM$E?iExIMdfh2%7@ zTUs4~(piK%_w&4j=OCUV0FjwRq_G}lnJBOhCd)+FrAijS!dah3`Ix|R2h7*w!Gc>O z4Nusrv%AmH(A+k#sk|g85Nz34mU-;-h0dX2|7WAzd-t8i0G*KeE|IK+yOaqYC-EHp z+^0TCpf#R(=6BTA)heREI+(1Yml3KcCb003p2qity8GHMRo4t)#p`0Y60Su#i-$8X$MMtwK<1#Yt5r^c zbud}wFDOv)04&_)dcu4RfQudGU3hlj*@9;`9uASB@wioY@4)2c#sSR(GW^zoEgMUN zawnV0OVe|*G7@_Ghr9%u_ul=g61{QKoupsGfkQ8cGlMgY$drAY$HOUd3Q}tT9$tCE zZC$Ma3ao?48hAcC~1sR|1U61P`WgdAF3sJhtS+1WLzW2s+)#u%PfJOmA%kwUJA0_Xm9&I44q2Gly3 zTmvuBUljl@?7);a@Np}EOk7|8P{!E!#J}Qzq`!1~_%W217TF8(vS)kx`pE?u_uhTy zMnA#4oOl-Z+4GeT!;xS??u48N%P=hR4w%=~HAsP|uYK+F*I>2Qc9r(;<)qEBD*^*K zgP_ySPN(yE9K(2Tad9z+PZz@|)i)9517U=_q9E%6*efF6vPAY8PcKUj>xr&b3UIjb zub~Qu6|P+Cl0P;!`ar0#@TaWfD`A9N4{{AsU>!`Z!Iv6AmA;Cw6QRQ6F5rs*mHR@4 zgFm^F)-b}Y2e}3*uns2I;7g65N*xIMFQLLGCM0IY#l?qOSV95tKZi!_W z(aTuDqHw5lB^&YxMoYontRM;2v%XRatb@swQt;Y{KZ0s3R^GuiBq8N4*9Mu^YY~hB z>tGU$IxFNC&T{o-DB5CYVmKo-z6|AAPjZb>U>!_W;R_3Phs`n;m&@NHT_e(rI3d@n zEMuA1lU_v>SO=3;^fIId=8_uEAgc7S*U%}yyFL!bRWLgK3RoqrqvS{mIvXaza{dqr%A|ACAGu&xoOO$ov zp9%$HS4hD3r$XOF*K-AjHoj#hfczQ{hdht@dam2oDIgSB=S+kWYd~M2;m&VB8lL_7 zqcuRH^&+ky1=dfeUqRvr%bLIuiaQA>Ot3s6@cSUb^32$EwN8O`3anFLodW9=Sf{`` i1=cCBPJuN*f&T}d4dx`dB=Y3|0000F$Qh|Gv1d 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 WO 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 literal 0 HcmV?d00001 diff --git a/web_frontend/public/ranks/Iron_3_Rank.png b/web_frontend/public/ranks/Iron_3_Rank.png new file mode 100644 index 0000000000000000000000000000000000000000..8ee23a2394b637512c0b8644a85f6a6671fbbe0a GIT binary patch literal 34256 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 literal 0 HcmV?d00001 diff --git a/web_frontend/public/ranks/Platinum_2_Rank.png b/web_frontend/public/ranks/Platinum_2_Rank.png new file mode 100644 index 0000000000000000000000000000000000000000..00e35c38c554b510140d7ed55d5514f357a639e8 GIT binary patch literal 28062 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 literal 0 HcmV?d00001 diff --git a/web_frontend/public/ranks/Platinum_3_Rank.png b/web_frontend/public/ranks/Platinum_3_Rank.png new file mode 100644 index 0000000000000000000000000000000000000000..80ed89b62fdd032d2177b959365da179d324e1f5 GIT binary patch literal 38131 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 SGEad30000Q6o(N literal 0 HcmV?d00001 diff --git a/web_frontend/public/ranks/Silver_1_Rank.png b/web_frontend/public/ranks/Silver_1_Rank.png new file mode 100644 index 0000000000000000000000000000000000000000..f071ab41ab4fb757edaaaa43e376eb13b313b466 GIT binary patch literal 13587 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
D!)|>r1w{M!tJum}AiVaK)?e z2C`eEIo^(~cL&Pjm1rFBT(9oebQ~uJZye2a z)XVx)Q^Odjy?p?+hHPI6R+8z^H{24S7<)WKel^8*WH<>RCI`L0sibjaC*oZN3<2`n z07~Wbs`XK3{Vw2sMwUnGq3M4Y49M8j?h@b!QNOWEUIZ7U@8_N>cuXn*1jp4_PWdA= z?mJa#phWytsW}(zcTxr*W23&@aWH|D`0ML8QP!K30hFPnt^&veIBOrpkobQXC1aW= zDh8@A4WtYp>bI($eD|QKBxZi=Am5w&2)Lxk3m42YD{!YK5e&$BzwAz=va&*h{2afg;}Z6DB(m$APu;03sxv0}z-srsPvYn3 zpPF%qfm8w*hacVOGPe!Wq+-90hxC7nffNHN22u>97)UXYVj#spih&dZDF#vuq!>ss nkYXUkK#GAB11SdT4+H-Xd%9tr#^=yJ00000NkvXXu0mjfg$^hK literal 0 HcmV?d00001 diff --git a/web_frontend/public/ranks/unknown.jpg b/web_frontend/public/ranks/unknown.jpg new file mode 100644 index 0000000000000000000000000000000000000000..becccbc17dc5378112a706a6ce63df1eb716085d GIT binary patch literal 8104 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 { + const [open, setOpen] = useState(false); + + const handleSelect = (option) => { + onChange(option); + setOpen(false); + }; + + return ( +
+
setOpen(!open)} + > + {value?.label || placeholder} + +
+
+ +
+ {open && ( +
    + {options.map((option) => ( +
  • handleSelect(option)} + > + {option.label} +
  • + ))} +
+ )} +
+ ); +}; + +export default Select; diff --git a/web_frontend/src/components/EditableField.jsx b/web_frontend/src/components/EditableField.jsx new file mode 100644 index 0000000000..7257ebb5df --- /dev/null +++ b/web_frontend/src/components/EditableField.jsx @@ -0,0 +1,81 @@ +import React, { useState, useEffect } from 'react'; +import { Pencil, Check, Ban, icons } from 'lucide-react'; + +const EditableField = ({ label, name, value, initialValue, onChange, icon: Icon, type = 'text', options = [] }) => { + const [isEditing, setIsEditing] = useState(false); + const [tempValue, setTempValue] = useState(value); + + // Synchroniser quand la valeur externe change + useEffect(() => { + setTempValue(value); + }, [value]); + + const handleConfirm = () => { + onChange(name, tempValue); + setIsEditing(false); + }; + + const handleCancel = () => { + setTempValue(value); + setIsEditing(false); + }; + + const isUnchanged = value === initialValue; + + const inputClassNames = `flex-1 px-3 py-2 bg-gray-800 rounded-lg border border-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 ${ + !isEditing && isUnchanged ? 'text-gray-400' : 'text-white' + }`; + + return ( +
+ +
+ {options.length > 0 ? ( + + ) : ( + setTempValue(e.target.value)} + className={inputClassNames} + > + + )} +
+ {isEditing ? ( + <> + + + + ) : ( + + )} +
+
+
+ ); +}; + +export default EditableField; diff --git a/web_frontend/src/components/Input.jsx b/web_frontend/src/components/Input.jsx index 0d64347277..baf9b26a2a 100644 --- a/web_frontend/src/components/Input.jsx +++ b/web_frontend/src/components/Input.jsx @@ -1,4 +1,4 @@ -import React from 'react'; // Ajoutez cette ligne en haut du fichier +import React from 'react'; const Input = ({ icon: Icon, ...props }) => { return ( diff --git a/web_frontend/src/index.css b/web_frontend/src/index.css index f1d8c73cdc..4bbb069ad7 100644 --- a/web_frontend/src/index.css +++ b/web_frontend/src/index.css @@ -1 +1,3 @@ @import "tailwindcss"; +@plugin 'tailwind-scrollbar'; + diff --git a/web_frontend/src/pages/EditProfilePage.jsx b/web_frontend/src/pages/EditProfilePage.jsx index a002667ccb..76eb76ac8b 100644 --- a/web_frontend/src/pages/EditProfilePage.jsx +++ b/web_frontend/src/pages/EditProfilePage.jsx @@ -1,59 +1,70 @@ import React, { useState, useEffect } from "react"; -import { useNavigate, Link } from "react-router-dom"; +import { useNavigate } from "react-router-dom"; import toast from "react-hot-toast"; -import { User, Lock, Loader } from "lucide-react" -import { motion } from 'framer-motion' +import { Loader, User, GraduationCap, Star, Lock } from "lucide-react"; +import { motion } from 'framer-motion'; import { useAuthStore } from "../store/authStore"; +import { useEcoleStore } from "../store/ecoleStore"; import PasswordStrengthMeter from "../components/PasswordStrengthMeter"; -import Input from '../components/Input' +import EditableField from "../components/EditableField"; +import { valorantRanks } from "../utils/valorantRanks"; -const EditProfilePage = () => { - +const EditProfilePage = () => { const navigate = useNavigate(); const [formData, setFormData] = useState({ nom: "", prenom: "", pseudo: "", + ecole_id: "", + niveau: "", password: "", confirmPassword: "", }); - const { updateProfile , user, error, isLoading } = useAuthStore(); + const [showPasswordSection, setShowPasswordSection] = useState(false); + + const { ecoles, fetchEcoles } = useEcoleStore(); + const { updateProfile, user, error, isLoading } = useAuthStore(); + useEffect(() => { + fetchEcoles(); + }, []); useEffect(() => { if (user) { - setFormData((prev) => ({ - ...prev, + setFormData({ nom: user.lName || "", prenom: user.fName || "", pseudo: user.pseudo || "", - })); + niveau: user.niveau || "", + ecole_id: user.ecole_id?._id || "", + password: "", + confirmPassword: "", + }); } }, [user]); - const handleChange = (e) => { - const { name, value } = e.target; + const handleFieldChange = (name, value) => { setFormData((prev) => ({ ...prev, [name]: value })); }; const handleUpdateProfile = async (e) => { e.preventDefault(); - const { nom, prenom, pseudo, password, confirmPassword } = formData; + const { nom, prenom, pseudo, niveau, ecole_id, password, confirmPassword } = formData; - if (password && password !== confirmPassword) { + if (showPasswordSection && password !== confirmPassword) { toast.error("Les mots de passe ne correspondent pas."); return; } try { - const updatePayload = { nom, prenom, pseudo }; - if (password) updatePayload.password = password; + const updatePayload = { nom, prenom, pseudo, niveau, ecole_id }; + if (showPasswordSection && password) updatePayload.password = password; await updateProfile(updatePayload); navigate("/profile"); @@ -64,79 +75,100 @@ const EditProfilePage = () => { }; return ( -
-

Modifier mon profil

+
+

Modifier mon profil

- - - - ({ label: ecole.nom, value: ecole._id }))} /> - + +
+ +
+ + {showPasswordSection && ( +
+
+ + handleFieldChange("password", e.target.value)} + className="w-full px-3 py-2 bg-gray-800 text-white rounded-lg border border-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500" + /> +
+
+ + handleFieldChange("confirmPassword", e.target.value)} + className="w-full px-3 py-2 bg-gray-800 text-white rounded-lg border border-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500" + /> +
+ +
+ )} + {error &&

{error}

} - - {isLoading? :"Enregistrer les informations"} + {isLoading ? : "Enregistrer les informations"} - - - Annuler - -
); -} +}; export default EditProfilePage; diff --git a/web_frontend/src/pages/ProfilePage.jsx b/web_frontend/src/pages/ProfilePage.jsx index 41c04d5063..8de9a72e95 100644 --- a/web_frontend/src/pages/ProfilePage.jsx +++ b/web_frontend/src/pages/ProfilePage.jsx @@ -1,179 +1,109 @@ -import { motion } from "framer-motion"; -import { Camera, Mail, User } from "lucide-react"; -import { Link } from "react-router-dom"; import { useState } from "react"; - - +import { Link } from "react-router-dom"; +import { motion } from "framer-motion"; import { useAuthStore } from "../store/authStore"; -import { formatDate } from "../utils/date"; - -const DashboardPage = () => { - const { user, logout, isUpdatingPic, updatePic } = useAuthStore(); - const [selectedImg, setSelectedImg] = useState(null) +import MonProfil from "./ProfileSections/MonProfil"; +import MesTournois from "./ProfileSections/MesTournois"; +import MesEquipes from "./ProfileSections/MesEquipes"; +import EditProfile from "./EditProfilePage"; - const handleImageUpload = async (e) => { - const file = e.target.files[0]; - if (!file) return; - - const reader = new FileReader(); - - reader.readAsDataURL(file); - - reader.onload = async () => { - const base64Image = reader.result; - console.log("Base64 envoyé:", base64Image); +const ProfilPage = () => { + const [activeSection, setActiveSection] = useState("profil"); + const { logout } = useAuthStore(); - setSelectedImg(base64Image); - await updatePic({ profilePic: base64Image }); - }; - }; - const handleUpdateProfile = async (e) => { - + const renderSection = () => { + switch (activeSection) { + case "profil": + return ; + case "tournois": + return ; + case "equipes": + return ; + case "editProfile": + return ; + default: + return ; } - const handleLogout = () => { - logout(); - }; - return ( - -

- Profil de {user.fName} -

-
-
- Profil - -
+ }; -

- {isUpdatingPic ? "Uploading..." : "Cliquez sur l'icone pour mettre à jour la photo de profil"} -

-
+ const handleLogout = () => { + logout(); + }; -
- + {/* Sidebar fixe en hauteur et visible au scroll */} +
+ + + + + setActiveSection("editProfile")} + > + Modifier le profil + + + + + Se déconnecter + + +
- - className='p-4 bg-gray-800 bg-opacity-50 rounded-lg border border-gray-700' - initial={{ opacity: 0, y: 20 }} - animate={{ opacity: 1, y: 0 }} - transition={{ delay: 0.2 }} - > -

Informations utilisateur

-
-
- - Nom Complet -
-

{user.lName} {user.fName}

-
- -
-
- - Pseudo -
-

{user.pseudo}

-
-
-
- - Adresse mail -
-

{user.email}

-
- - -
- -

Activité du compte - -

-

- Creation du compte: - {new Date(user.createdAt).toLocaleDateString("en-US", { - year: "numeric", - month: "long", - day: "numeric", - })} -

-

- Dernière connexion: - - {formatDate(user.lastLogin)} -

-
-
- - - Modifier Profile - - - - - - Se déconnecter - - -
- ); + {/* Contenu principal scrollable */} +
+ {renderSection()} +
+
+ ); }; -export default DashboardPage; \ No newline at end of file + +export default ProfilPage; diff --git a/web_frontend/src/pages/ProfileSections/MesEquipes.jsx b/web_frontend/src/pages/ProfileSections/MesEquipes.jsx new file mode 100644 index 0000000000..63dbd08781 --- /dev/null +++ b/web_frontend/src/pages/ProfileSections/MesEquipes.jsx @@ -0,0 +1,31 @@ +export default function MesEquipes() { + return ( +
+

Mes Équipes

+ +
+ {/* Une équipe */} +
+

Team Alpha

+

Niveau moyen : Platine

+

Membres : Jean, Marc, Léo

+
    +
  • Match gagné contre Team Bravo
  • +
  • Match perdu contre Team Delta
  • +
+
+ + {/* Une autre équipe */} +
+

Team Omega

+

Niveau moyen : Or

+

Membres : Alice, Bob, Claire

+
    +
  • Match gagné contre Team Zeta
  • +
  • Match perdu contre Team Alpha
  • +
+
+
+
+ ); +} diff --git a/web_frontend/src/pages/ProfileSections/MesTournois.jsx b/web_frontend/src/pages/ProfileSections/MesTournois.jsx new file mode 100644 index 0000000000..df91dabad0 --- /dev/null +++ b/web_frontend/src/pages/ProfileSections/MesTournois.jsx @@ -0,0 +1,23 @@ +export default function MesTournois() { + return ( +
+

Mes Tournois

+

Statistiques globales :

+
    +
  • Matchs joués : 12
  • +
  • Matchs gagnés : 7
  • +
  • Matchs perdus : 5
  • +
+

Détails des matchs :

+
    +
  • + Team Alpha vs Team Bravo — Gagné +
  • +
  • + Team Alpha vs Team Delta — Perdu +
  • + {/* Autres matchs */} +
+
+ ); +} diff --git a/web_frontend/src/pages/ProfileSections/MonProfil.jsx b/web_frontend/src/pages/ProfileSections/MonProfil.jsx new file mode 100644 index 0000000000..5235ecabdd --- /dev/null +++ b/web_frontend/src/pages/ProfileSections/MonProfil.jsx @@ -0,0 +1,156 @@ +import { motion } from "framer-motion"; +import { Camera, Mail, User, Users, GraduationCap } from "lucide-react"; +import { useState } from "react"; + + +import { useAuthStore } from "../../store/authStore"; +import { valorantRanks } from "../../utils/valorantRanks"; + +const DashboardPage = () => { + const { user, logout, isUpdatingPic, updatePic } = useAuthStore(); + const [selectedImg, setSelectedImg] = useState(null) + + const selectedRank = valorantRanks.find((option) => option.value === user.niveau); + + const handleImageUpload = async (e) => { + const file = e.target.files[0]; + if (!file) return; + + const reader = new FileReader(); + + reader.readAsDataURL(file); + + reader.onload = async () => { + const base64Image = reader.result; + console.log("Base64 envoyé:", base64Image); + + setSelectedImg(base64Image); + await updatePic({ profilePic: base64Image }); + }; + }; + + + return ( + +

+ Profil de {user.fName} +

+
+
+ Profil +
+ {selectedRank.label +
+ {selectedRank.label} +
+
+ +
+ +

+ {isUpdatingPic ? "Uploading..." : "Cliquez sur l'icone pour mettre à jour la photo de profil"} +

+
+ +
+ +

Informations utilisateur

+ +
+ + Nom Complet +
+

{user.lName} {user.fName}

+
+ + +
+ + Pseudo +
+

{user.pseudo}

+
+ + +
+ + Adresse mail +
+

{user.email}

+
+ +
+ + Ecole +
+

{user.ecole_id.nom}

+
+ + +
+
+
+ ); +}; +export default DashboardPage; \ No newline at end of file diff --git a/web_frontend/src/pages/SignUpPage.jsx b/web_frontend/src/pages/SignUpPage.jsx index a42b5b3d6f..ca0709b5bc 100644 --- a/web_frontend/src/pages/SignUpPage.jsx +++ b/web_frontend/src/pages/SignUpPage.jsx @@ -1,14 +1,18 @@ import { motion } from 'framer-motion' -import {Link, useNavigate} from 'react-router-dom' -import { User, Mail, Lock, Loader } from "lucide-react" -import { useState } from 'react' +import { Link, useNavigate } from 'react-router-dom' +import { User, Mail, Lock, Loader, Star, GraduationCap } from "lucide-react" +import { useState, useEffect } from 'react' import React from 'react' import { toast } from 'react-hot-toast' + +import { valorantRanks } from '../utils/valorantRanks' import { useAuthStore } from '../store/authStore' +import { useEcoleStore } from '../store/ecoleStore' +import Select from '../components/CustomSelect' import Input from '../components/Input' import PasswordStrengthMeter from '../components/PasswordStrengthMeter' -import { validateSignup } from '../utils/validation/validationSignUp'; +import { validateSignup } from '../utils/validation/validationSignUp'; const SignUpPage = () => { @@ -16,18 +20,24 @@ const SignUpPage = () => { const [fName, setFName] = useState('') const [pseudo, setUserName] = useState('') const [email, setEmail] = useState('') + const [niveau, setNiveau] = useState('') + const [ecole_id, setEcole] = useState(null); const [password, setPassword] = useState('') - const [localError, setLocalError] = useState('') + const [localError, setLocalError] = useState('') const navigate = useNavigate() - const { signup, error, isLoading } = useAuthStore(); + const { ecoles, fetchEcoles } = useEcoleStore(); + const { signup, error, isLoading } = useAuthStore(); + useEffect(() => { + fetchEcoles(); + }, []); const handleSignUp = async (e) => { e.preventDefault(); - const formData = { lName, fName, pseudo, email, password }; + const formData = { lName, fName, pseudo, ecole_id, niveau, email, password }; const errors = validateSignup(formData); if (Object.keys(errors).length > 0) { @@ -40,10 +50,9 @@ const SignUpPage = () => { setLocalError(''); try { - await signup(formData.lName.trim(), formData.fName.trim(), formData.pseudo.trim(), formData.email.trim(), formData.password); + await signup(formData.lName.trim(), formData.fName.trim(), formData.pseudo.trim(), formData.ecole_id.value, formData.niveau, formData.email.trim(), formData.password); navigate("/profile"); } catch (error) { - console.error(error); const message = error?.response?.data?.message || error.message || 'Une erreur est survenue'; toast.error(message); } @@ -75,21 +84,37 @@ const SignUpPage = () => { setFName(e.target.value)} /> setUserName(e.target.value)} /> + option.value === niveau)} + onChange={(option) => setNiveau(option.value)} + placeholder="Niveau" + data-testid="niveau-select" + /> setEmail(e.target.value)} onInvalid={(e) => e.preventDefault()} @@ -97,25 +122,25 @@ const SignUpPage = () => { setPassword(e.target.value)} /> - {(localError || error) && (

{localError || error}

)} - + {(localError || error) && (

{localError || error}

)} + - {isLoading? :"S'inscrire"} + {isLoading ? : "S'inscrire"}
diff --git a/web_frontend/src/pages/SignUpPage.test.jsx b/web_frontend/src/pages/SignUpPage.test.jsx index 886472d777..23986005a8 100644 --- a/web_frontend/src/pages/SignUpPage.test.jsx +++ b/web_frontend/src/pages/SignUpPage.test.jsx @@ -6,16 +6,28 @@ import React from "react"; import { describe, it, expect, vi } from "vitest"; // ou Jest sinon import SignUpPage from "./SignUpPage"; import { useAuthStore } from "../store/authStore"; +import { useEcoleStore } from "../store/ecoleStore"; // On mock le store vi.mock("../store/authStore", () => ({ useAuthStore: vi.fn(), })); +vi.mock("../store/ecoleStore", () => ({ + useEcoleStore: vi.fn() +})); + describe("SignUpPage", () => { let mockSignup; beforeEach(() => { + + useEcoleStore.mockReturnValue({ + ecoles: [{ _id: '123', nom: 'EPHEC' }], + fetchEcoles: vi.fn() + }); + + mockSignup = vi.fn(); useAuthStore.mockReturnValue({ signup: mockSignup, @@ -24,46 +36,90 @@ describe("SignUpPage", () => { }); }); - it("renders all input fields and signup button", () => { + it("renders all input fields, selects and signup button", () => { render(); + expect(screen.getByPlaceholderText(/^Nom$/i)).toBeInTheDocument(); + expect(screen.getByPlaceholderText(/Prenom/i)).toBeInTheDocument(); + expect(screen.getByPlaceholderText(/Pseudo/i)).toBeInTheDocument(); + expect(screen.getByPlaceholderText(/Adresse mail/i)).toBeInTheDocument(); + expect(screen.getByPlaceholderText(/Mot de passe/i)).toBeInTheDocument(); + + expect(screen.getByText(/École/i)).toBeInTheDocument(); + expect(screen.getByText(/Niveau/i)).toBeInTheDocument(); - expect(screen.getByPlaceholderText(/^Nom$/i)).to.exist; - expect(screen.getByPlaceholderText(/prenom/i)).to.exist; - expect(screen.getByPlaceholderText(/pseudo/i)).to.exist; - expect(screen.getByPlaceholderText(/adresse mail/i)).to.exist; - expect(screen.getByPlaceholderText(/password/i)).to.exist; - expect(screen.getByRole("button", { name: /S'inscrire/i })).to.exist; + expect(screen.getByRole("button", { name: /S'inscrire/i })).toBeInTheDocument(); }); + it("shows error if last name is too short", async () => { render(); fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "D" } }); - fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "John" } }); - fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "johnny" } }); - fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "john@example.com" } }); - fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "Pass_word123" } }); + fireEvent.change(screen.getByPlaceholderText(/Prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/Pseudo/i), { target: { value: "johnny" } }); + fireEvent.change(screen.getByPlaceholderText(/Adresse mail/i), { target: { value: "john@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/Mot de passe/i), { target: { value: "Pass_word123" } }); + + fireEvent.click(screen.getByText(/École/i)); + await waitFor(() => screen.getByText("EPHEC")); + fireEvent.click(screen.getByText("EPHEC")); + + fireEvent.click(screen.getByText(/Niveau/i)); + await waitFor(() => screen.getByText("Iron 2")); + fireEvent.click(screen.getByText("Iron 2")); + + fireEvent.click(screen.getByTestId("submit-button")); + await waitFor(() => { + expect(screen.getByText(/Le nom doit contenir au moins 2 caractères/i)).toBeInTheDocument(); + }); + }); + + it("accepts first name with hyphen", async () => { + render(); + + fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Dupont" } }); + fireEvent.change(screen.getByPlaceholderText(/Prenom/i), { target: { value: "Jean-Luc" } }); + fireEvent.change(screen.getByPlaceholderText(/Pseudo/i), { target: { value: "jeanluc42" } }); + fireEvent.change(screen.getByPlaceholderText(/Adresse mail/i), { target: { value: "jeanluc@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/Mot de passe/i), { target: { value: "Pass_word123!" } }); + + fireEvent.click(screen.getByText(/École/i)); + await waitFor(() => screen.getByText("EPHEC")); + fireEvent.click(screen.getByText("EPHEC")); + + fireEvent.click(screen.getByText(/Niveau/i)); + await waitFor(() => screen.getByText("Iron 2")); + fireEvent.click(screen.getByText("Iron 2")); fireEvent.click(screen.getByTestId("submit-button")); await waitFor(() => { - expect(screen.getByText(/Le nom doit contenir au moins 2 caractères/i)).to.exist; + expect(mockSignup).toHaveBeenCalled(); }); }); + it("shows error if first name is too short", async () => { render(); fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); - fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "J" } }); - fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "johnny" } }); - fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "john@example.com" } }); - fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "Pass_word123" } }); + fireEvent.change(screen.getByPlaceholderText(/Prenom/i), { target: { value: "J" } }); + fireEvent.change(screen.getByPlaceholderText(/Pseudo/i), { target: { value: "johnny" } }); + fireEvent.change(screen.getByPlaceholderText(/Adresse mail/i), { target: { value: "john@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/Mot de passe/i), { target: { value: "Pass_word123" } }); + + fireEvent.click(screen.getByText(/École/i)); + await waitFor(() => screen.getByText("EPHEC")); + fireEvent.click(screen.getByText("EPHEC")); + + fireEvent.click(screen.getByText(/Niveau/i)); + await waitFor(() => screen.getByText("Iron 2")); + fireEvent.click(screen.getByText("Iron 2")); fireEvent.click(screen.getByTestId("submit-button")); await waitFor(() => { - expect(screen.getByText(/Le prénom doit contenir au moins 2 caractères/i)).to.exist; + expect(screen.getByText(/Le prénom doit contenir au moins 2 caractères/i)).toBeInTheDocument(); }); }); @@ -71,39 +127,57 @@ describe("SignUpPage", () => { render(); fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); - fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "John" } }); - fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "jo" } }); // trop court - fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "john@example.com" } }); - fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "Pass_word123" } }); + fireEvent.change(screen.getByPlaceholderText(/Prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/Pseudo/i), { target: { value: "jo" } }); // trop court + fireEvent.change(screen.getByPlaceholderText(/Adresse mail/i), { target: { value: "john@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/Mot de passe/i), { target: { value: "Pass_word123" } }); + + fireEvent.click(screen.getByText(/École/i)); + await waitFor(() => screen.getByText("EPHEC")); + fireEvent.click(screen.getByText("EPHEC")); + + fireEvent.click(screen.getByText(/Niveau/i)); + await waitFor(() => screen.getByText("Iron 2")); + fireEvent.click(screen.getByText("Iron 2")); fireEvent.click(screen.getByTestId("submit-button")); await waitFor(() => { - expect(screen.getByText(/Le pseudo doit contenir entre 3 et 30 caractères/i)).to.exist; + expect(screen.getByText(/Le pseudo doit contenir entre 3 et 20 caractères/i)).toBeInTheDocument(); }); - - fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "a".repeat(31) } }); // trop long - + + fireEvent.change(screen.getByPlaceholderText(/Pseudo/i), { target: { value: "a".repeat(21) } }); // trop court + fireEvent.click(screen.getByTestId("submit-button")); await waitFor(() => { - expect(screen.getByText(/Le pseudo doit contenir entre 3 et 30 caractères/i)).to.exist; + expect(screen.getByText(/Le pseudo doit contenir entre 3 et 20 caractères/i)).toBeInTheDocument(); }); + + }); it("shows error if pseudo contains only numbers", async () => { render(); fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); - fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "John" } }); - fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "123456" } }); - fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "john@example.com" } }); - fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "Pass_word123" } }); + fireEvent.change(screen.getByPlaceholderText(/Prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/Pseudo/i), { target: { value: "123456" } }); + fireEvent.change(screen.getByPlaceholderText(/Adresse mail/i), { target: { value: "john@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/Mot de passe/i), { target: { value: "Pass_word123" } }); + + fireEvent.click(screen.getByText(/École/i)); + await waitFor(() => screen.getByText("EPHEC")); + fireEvent.click(screen.getByText("EPHEC")); + + fireEvent.click(screen.getByText(/Niveau/i)); + await waitFor(() => screen.getByText("Iron 2")); + fireEvent.click(screen.getByText("Iron 2")); fireEvent.click(screen.getByTestId("submit-button")); await waitFor(() => { - expect(screen.getByText(/Le pseudo ne peut pas être uniquement des chiffres/i)).to.exist; + expect(screen.getByText(/Le pseudo ne peut pas être uniquement composé de chiffres/i)).toBeInTheDocument(); }); }); @@ -111,26 +185,33 @@ describe("SignUpPage", () => { render(); fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); - fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "John" } }); - fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "john@doe" } }); - fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "john@example.com" } }); - fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "Pass_word123" } }); + fireEvent.change(screen.getByPlaceholderText(/Prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/Pseudo/i), { target: { value: "john@doe" } }); + fireEvent.change(screen.getByPlaceholderText(/Adresse mail/i), { target: { value: "john@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/Mot de passe/i), { target: { value: "Pass_word123" } }); + + fireEvent.click(screen.getByText(/École/i)); + await waitFor(() => screen.getByText("EPHEC")); + fireEvent.click(screen.getByText("EPHEC")); + + fireEvent.click(screen.getByText(/Niveau/i)); + await waitFor(() => screen.getByText("Iron 2")); + fireEvent.click(screen.getByText("Iron 2")); fireEvent.click(screen.getByTestId("submit-button")); await waitFor(() => { - expect(screen.getByText(/Le pseudo ne peut contenir que des lettres, chiffres, tirets et underscores/i)).to.exist; + expect(screen.getByText(/Le pseudo ne peut contenir que lettres, chiffres, tirets et underscores/i)).toBeInTheDocument(); }); }); it("shows error if form fields are empty", async () => { render(); - const button = screen.getByTestId("submit-button"); - fireEvent.click(button); + fireEvent.click(screen.getByTestId("submit-button")); await waitFor(() => { - expect(screen.getByText(/Veuillez remplir tous les champs/i)).to.exist; + expect(screen.getByText(/Veuillez remplir tous les champs/i)).toBeInTheDocument; }); }); @@ -138,33 +219,90 @@ describe("SignUpPage", () => { render(); fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); - fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "John" } }); - fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "johnny" } }); - fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "invalidemail" } }); - fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "password123" } }); + fireEvent.change(screen.getByPlaceholderText(/Prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/Pseudo/i), { target: { value: "johnny" } }); + fireEvent.change(screen.getByPlaceholderText(/Adresse mail/i), { target: { value: "invalidemail" } }); + fireEvent.change(screen.getByPlaceholderText(/Mot de passe/i), { target: { value: "pass_word123" } }); + + fireEvent.click(screen.getByText(/École/i)); + await waitFor(() => screen.getByText("EPHEC")); + fireEvent.click(screen.getByText("EPHEC")); + + fireEvent.click(screen.getByText(/Niveau/i)); + await waitFor(() => screen.getByText("Iron 2")); + fireEvent.click(screen.getByText("Iron 2")); fireEvent.click(screen.getByTestId("submit-button")); const errorMessage = await screen.findByText((content, element) => content.includes('Veuillez entrer une adresse email valide') ); - expect(errorMessage).to.exist; + expect(errorMessage).toBeInTheDocument();; }); + it("disables the submit button and shows loading when isLoading is true", () => { + useAuthStore.mockReturnValue({ + signup: mockSignup, + error: '', + isLoading: true, + }); + + render(); + + const button = screen.getByTestId("submit-button"); + expect(button).toBeDisabled(); + expect(screen.getByTestId("loader")).toBeInTheDocument(); + }); + + + it("accepts email with subdomain", async () => { + render(); + + // Renseigne les autres champs valides... + fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); + fireEvent.change(screen.getByPlaceholderText(/Prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/Pseudo/i), { target: { value: "johnny" } }); + fireEvent.change(screen.getByPlaceholderText(/Adresse mail/i), {target: { value: "john@sub.domain.com" }}); + fireEvent.change(screen.getByPlaceholderText(/Mot de passe/i), { target: { value: "Pass_word123!" } }); + + fireEvent.click(screen.getByText(/École/i)); + await waitFor(() => screen.getByText("EPHEC")); + fireEvent.click(screen.getByText("EPHEC")); + + fireEvent.click(screen.getByText(/Niveau/i)); + await waitFor(() => screen.getByText("Iron 2")); + fireEvent.click(screen.getByText("Iron 2")); + + fireEvent.click(screen.getByTestId("submit-button")); + + await waitFor(() => { + expect(mockSignup).toHaveBeenCalled(); + }); + }); + + it("shows error if password is too short", async () => { render(); fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); - fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "John" } }); - fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "johnny" } }); - fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "john@example.com" } }); - fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "123" } }); + fireEvent.change(screen.getByPlaceholderText(/Prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/Pseudo/i), { target: { value: "johnny" } }); + fireEvent.change(screen.getByPlaceholderText(/Adresse mail/i), { target: { value: "john@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/Mot de passe/i), { target: { value: "123" } }); + + fireEvent.click(screen.getByText(/École/i)); + await waitFor(() => screen.getByText("EPHEC")); + fireEvent.click(screen.getByText("EPHEC")); + + fireEvent.click(screen.getByText(/Niveau/i)); + await waitFor(() => screen.getByText("Iron 2")); + fireEvent.click(screen.getByText("Iron 2")); fireEvent.click(screen.getByTestId("submit-button")); await waitFor(() => { - expect(screen.getByText(/Le mot de passe doit contenir au moins 6 caractères/i)).to.exist; + expect(screen.getByText(/Le mot de passe doit contenir au moins 6 caractères/i)).toBeInTheDocument();; }); }); @@ -172,15 +310,23 @@ describe("SignUpPage", () => { render(); fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); - fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "John" } }); - fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "johnny" } }); - fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "john@example.com" } }); - fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "password123!" } }); - + fireEvent.change(screen.getByPlaceholderText(/Prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/Pseudo/i), { target: { value: "johnny" } }); + fireEvent.change(screen.getByPlaceholderText(/Adresse mail/i), { target: { value: "john@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/Mot de passe/i), { target: { value: "password123!" } }); + + fireEvent.click(screen.getByText(/École/i)); + await waitFor(() => screen.getByText("EPHEC")); + fireEvent.click(screen.getByText("EPHEC")); + + fireEvent.click(screen.getByText(/Niveau/i)); + await waitFor(() => screen.getByText("Iron 2")); + fireEvent.click(screen.getByText("Iron 2")); + fireEvent.click(screen.getByTestId("submit-button")); await waitFor(() => { - expect(screen.getByText(/Le mot de passe doit contenir au moins une majuscule/i)).to.exist; + expect(screen.getByText(/Le mot de passe doit contenir au moins une majuscule/i)).toBeInTheDocument();; }); }); @@ -188,15 +334,23 @@ describe("SignUpPage", () => { render(); fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); - fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "John" } }); - fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "johnny" } }); - fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "john@example.com" } }); - fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "Password!" } }); - + fireEvent.change(screen.getByPlaceholderText(/Prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/Pseudo/i), { target: { value: "johnny" } }); + fireEvent.change(screen.getByPlaceholderText(/Adresse mail/i), { target: { value: "john@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/Mot de passe/i), { target: { value: "Password!" } }); + + fireEvent.click(screen.getByText(/École/i)); + await waitFor(() => screen.getByText("EPHEC")); + fireEvent.click(screen.getByText("EPHEC")); + + fireEvent.click(screen.getByText(/Niveau/i)); + await waitFor(() => screen.getByText("Iron 2")); + fireEvent.click(screen.getByText("Iron 2")); + fireEvent.click(screen.getByTestId("submit-button")); await waitFor(() => { - expect(screen.getByText(/Le mot de passe doit contenir au moins un chiffre/i)).to.exist; + expect(screen.getByText(/Le mot de passe doit contenir au moins un chiffre/i)).toBeInTheDocument();; }); }); @@ -204,15 +358,23 @@ describe("SignUpPage", () => { render(); fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); - fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "John" } }); - fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "johnny" } }); - fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "john@example.com" } }); - fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "Password123" } }); - + fireEvent.change(screen.getByPlaceholderText(/Prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/Pseudo/i), { target: { value: "johnny" } }); + fireEvent.change(screen.getByPlaceholderText(/Adresse mail/i), { target: { value: "john@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/Mot de passe/i), { target: { value: "Password123" } }); + + fireEvent.click(screen.getByText(/École/i)); + await waitFor(() => screen.getByText("EPHEC")); + fireEvent.click(screen.getByText("EPHEC")); + + fireEvent.click(screen.getByText(/Niveau/i)); + await waitFor(() => screen.getByText("Iron 2")); + fireEvent.click(screen.getByText("Iron 2")); + fireEvent.click(screen.getByTestId("submit-button")); await waitFor(() => { - expect(screen.getByText(/Le mot de passe doit contenir au moins un caractère spécial/i)).to.exist; + expect(screen.getByText(/Le mot de passe doit contenir au moins un caractère spécial/i)).toBeInTheDocument();; }); }); @@ -220,55 +382,72 @@ describe("SignUpPage", () => { render(); fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); - fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "John" } }); - fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "johnny" } }); - fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "john@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/Prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/Pseudo/i), { target: { value: "John_12" } }); + fireEvent.change(screen.getByPlaceholderText(/Adresse mail/i), { target: { value: "john@example.com" } }); // Cas où mot de passe == pseudo - fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "johnny" } }); + fireEvent.change(screen.getByPlaceholderText(/Mot de passe/i), { target: { value: "John_12" } }); + + fireEvent.click(screen.getByText(/École/i)); + await waitFor(() => screen.getByText("EPHEC")); + fireEvent.click(screen.getByText("EPHEC")); + + fireEvent.click(screen.getByText(/Niveau/i)); + await waitFor(() => screen.getByText("Iron 2")); + fireEvent.click(screen.getByText("Iron 2")); + fireEvent.click(screen.getByTestId("submit-button")); await waitFor(() => { - expect(screen.getByText(/Le mot de passe ne doit pas être identique au pseudo ou à l'email/i)).to.exist; + expect(screen.getByText(/Le mot de passe ne doit pas être identique au pseudo ou à l'email/i)).toBeInTheDocument();; }); // Cas où mot de passe == email - fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "john@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/Mot de passe/i), { target: { value: "john@example.com" } }); fireEvent.click(screen.getByTestId("submit-button")); await waitFor(() => { - expect(screen.getByText(/Le mot de passe ne doit pas être identique au pseudo ou à l'email/i)).to.exist; + expect(screen.getByText(/Le mot de passe ne doit pas être identique au pseudo ou à l'email/i)).toBeInTheDocument();; }); }); - it("calls signup and redirects on valid form submission", async () => { - + it("shows error if password contains spaces", async () => { render(); - + fireEvent.change(screen.getByPlaceholderText(/^Nom$/i), { target: { value: "Doe" } }); - fireEvent.change(screen.getByPlaceholderText(/prenom/i), { target: { value: "John" } }); - fireEvent.change(screen.getByPlaceholderText(/pseudo/i), { target: { value: "johnny" } }); - fireEvent.change(screen.getByPlaceholderText(/adresse mail/i), { target: { value: "john@example.com" } }); - fireEvent.change(screen.getByPlaceholderText(/password/i), { target: { value: "Pass_word123" } }); + fireEvent.change(screen.getByPlaceholderText(/Prenom/i), { target: { value: "John" } }); + fireEvent.change(screen.getByPlaceholderText(/Pseudo/i), { target: { value: "johnny" } }); + fireEvent.change(screen.getByPlaceholderText(/Adresse mail/i), { target: { value: "john@example.com" } }); + fireEvent.change(screen.getByPlaceholderText(/Mot de passe/i), { target: { value: "Pass word123!" } }); - fireEvent.click(screen.getByTestId("submit-button")); + fireEvent.click(screen.getByText(/École/i)); + await waitFor(() => screen.getByText("EPHEC")); + fireEvent.click(screen.getByText("EPHEC")); + fireEvent.click(screen.getByText(/Niveau/i)); + await waitFor(() => screen.getByText("Iron 2")); + fireEvent.click(screen.getByText("Iron 2")); + + fireEvent.click(screen.getByTestId("submit-button")); + await waitFor(() => { - expect(mockSignup).toHaveBeenCalledWith("Doe", "John", "johnny", "john@example.com", "Pass_word123"); + expect(screen.getByText(/Le mot de passe ne doit pas contenir d'espaces/i)).toBeInTheDocument(); }); }); - it("disables button and shows loader when loading", () => { + it("shows backend error if signup fails", async () => { useAuthStore.mockReturnValue({ - signup: vi.fn(), - error: '', - isLoading: true, + signup: mockSignup, + error: "Adresse email déjà utilisée", + isLoading: false, }); - + render(); - - const button = screen.getByTestId("submit-button"); - expect(button).toBeDisabled(); // Vérifie que le bouton est désactivé - expect(screen.getByTestId("loader")).to.exist; // Le loader Lucide génère une balise + + await waitFor(() => { + expect(screen.getByText(/Adresse email déjà utilisée/i)).toBeInTheDocument();; + }); }); + }); diff --git a/web_frontend/src/pages/loginPage.jsx b/web_frontend/src/pages/loginPage.jsx index b7d46f2bd1..28afb0217d 100644 --- a/web_frontend/src/pages/loginPage.jsx +++ b/web_frontend/src/pages/loginPage.jsx @@ -1,13 +1,13 @@ import { useState } from 'react' import { motion } from 'framer-motion' import { Mail, Lock, Loader } from "lucide-react" -import { Link } from 'react-router-dom' +import { Link, useNavigate } from 'react-router-dom' import React from 'react' import { toast } from 'react-hot-toast' import { useAuthStore } from '../store/authStore' import Input from '../components/Input' -import { validateLogin } from '../utils/validation/validationLogin.js'; +import { validateLogin } from '../utils/validation/validationLogin.js'; const LoginPage = () => { @@ -16,6 +16,7 @@ const LoginPage = () => { const [password, setPassword] = useState('') const [localError, setLocalError] = useState('') + const navigate = useNavigate(); const { login, isLoading, error } = useAuthStore() const handleLogin = async (e) => { @@ -79,7 +80,7 @@ const LoginPage = () => { Mot de passe oublier?
- {(localError || error) && (

{localError || error}

)} + {(localError || error) && (

{localError || error}

)} 30) { - errors.pseudo = 'Le pseudo doit contenir entre 3 et 30 caractères'; + // Pseudo + if (trimmedPseudo.length < 3 || trimmedPseudo.length > 20) { + errors.pseudo = 'Le pseudo doit contenir entre 3 et 20 caractères'; } else if (/^\d+$/.test(trimmedPseudo)) { - errors.pseudo = 'Le pseudo ne peut pas être uniquement des chiffres'; + errors.pseudo = 'Le pseudo ne peut pas être uniquement composé de chiffres'; } else if (/[^a-zA-Z0-9_-]/.test(trimmedPseudo)) { - errors.pseudo = 'Le pseudo ne peut contenir que des lettres, chiffres, tirets et underscores'; + errors.pseudo = 'Le pseudo ne peut contenir que lettres, chiffres, tirets et underscores'; } - // Vérification Email + // École + if (!selectedEcoleId || typeof selectedEcoleId !== 'string') { + errors.ecole_id = 'Veuillez sélectionner une école valide'; + } + + // Niveau + if (!selectedNiveau || isNaN(selectedNiveau)) { + console.log(typeof selectedNiveau !== Number); + console.log(selectedNiveau, isNan(selectedNiveau)); + console.log(!selectedNiveau); + errors.niveau = 'Veuillez sélectionner un niveau valide'; + } + + + // Email const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(trimmedEmail)) { errors.email = 'Veuillez entrer une adresse email valide'; } else { const tempEmailDomains = ['yopmail.com', 'mailinator.com', 'tempmail.com', '10minutemail.com']; - const emailDomain = trimmedEmail.split('@')[1]; - if (tempEmailDomains.includes(emailDomain)) { - errors.email = 'Adresse email temporaire non autorisée'; + const domain = trimmedEmail.split('@')[1]; + if (tempEmailDomains.includes(domain)) { + errors.email = 'Les adresses email temporaires ne sont pas autorisées'; } } - // Vérification Mot de passe + // Mot de passe if (trimmedPassword.length < 6) { errors.password = 'Le mot de passe doit contenir au moins 6 caractères'; } else { @@ -56,6 +72,12 @@ export function validateSignup({ lName, fName, pseudo, email, password }) { if (!/[^a-zA-Z0-9]/.test(trimmedPassword)) { errors.password = 'Le mot de passe doit contenir au moins un caractère spécial'; } + if (trimmedPassword.includes(' ')) { + errors.password = 'Le mot de passe ne doit pas contenir d\'espaces'; + } + if (trimmedPassword.length > 20) { + errors.password = 'Le mot de passe ne doit pas dépasser 20 caractères'; + } if (trimmedPassword === trimmedPseudo || trimmedPassword === trimmedEmail) { errors.password = 'Le mot de passe ne doit pas être identique au pseudo ou à l\'email'; } diff --git a/web_frontend/src/utils/valorantRanks.js b/web_frontend/src/utils/valorantRanks.js new file mode 100644 index 0000000000..2a07eb3260 --- /dev/null +++ b/web_frontend/src/utils/valorantRanks.js @@ -0,0 +1,26 @@ +export const valorantRanks = [ + { label: "Iron 1", value: 1, image: "/ranks/Iron_1_Rank.png" }, + { label: "Iron 2", value: 2, image: "/ranks/Iron_2_Rank.png" }, + { label: "Iron 3", value: 3, image: "/ranks/Iron_3_Rank.png" }, + { label: "Bronze 1", value: 4, image: "/ranks/Bronze_1_Rank.png" }, + { label: "Bronze 2", value: 5, image: "/ranks/Bronze_2_Rank.png" }, + { label: "Bronze 3", value: 6, image: "/ranks/Bronze_3_Rank.png" }, + { label: "Silver 1", value: 7, image: "/ranks/Silver_1_Rank.png" }, + { label: "Silver 2", value: 8, image: "/ranks/Silver_2_Rank.png" }, + { label: "Silver 3", value: 9, image: "/ranks/Silver_3_Rank.png" }, + { label: "Gold 1", value: 10, image: "/ranks/Gold_1_Rank.png" }, + { label: "Gold 2", value: 11, image: "/ranks/Gold_2_Rank.png" }, + { label: "Gold 3", value: 12, image: "/ranks/Gold_3_Rank.png" }, + { label: "Platinum 1", value: 13, image: "/ranks/Platinum_1_Rank.png" }, + { label: "Platinum 2", value: 14, image: "/ranks/Platinum_2_Rank.png" }, + { label: "Platinum 3", value: 15, image: "/ranks/Platinum_3_Rank.png" }, + { label: "Diamond 1", value: 16, image: "/ranks/Diamond_1_Rank.png" }, + { label: "Diamond 2", value: 17, image: "/ranks/Diamond_2_Rank.png" }, + { label: "Diamond 3", value: 18, image: "/ranks/Diamond_3_Rank.png" }, + { label: "Ascendant 1", value: 19, image: "/ranks/Ascendant_1_Rank.png" }, + { label: "Ascendant 2", value: 20, image: "/ranks/Ascendant_2_Rank.png" }, + { label: "Ascendant 3", value: 21, image: "/ranks/Ascendant_3_Rank.png" }, + { label: "Immortal 1", value: 22, image: "/ranks/Immortal_1_Rank.png" }, + { label: "Immortal 2", value: 23, image: "/ranks/Immortal_2_Rank.png" }, + { label: "Immortal 3", value: 24, image: "/ranks/Immortal_3_Rank.png" }, +]; From 5ecff851b64f5cd2a26edc9a7a918ed7a67f5e41 Mon Sep 17 00:00:00 2001 From: Hassan-mumu Date: Tue, 20 May 2025 12:21:53 +0200 Subject: [PATCH 20/22] ~update EditableField ajout de label MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit +ajout test PageEditProfilePage ~ update EditeProfilePage, gestion de validation séparé + fix bug des doubles affichage d'erreure ~update du store pour updateProfile, message de succès +ajout de la page de validationEditProfile, gère la validation des différents champs avant d'etre envoyé --- web_frontend/src/components/EditableField.jsx | 26 +- web_frontend/src/pages/EditProfile.test.jsx | 535 ++++++++++++++++++ web_frontend/src/pages/EditProfilePage.jsx | 22 +- web_frontend/src/store/authStore.js | 2 + .../utils/validation/validationEditProfile.js | 54 ++ 5 files changed, 621 insertions(+), 18 deletions(-) create mode 100644 web_frontend/src/pages/EditProfile.test.jsx create mode 100644 web_frontend/src/utils/validation/validationEditProfile.js diff --git a/web_frontend/src/components/EditableField.jsx b/web_frontend/src/components/EditableField.jsx index 7257ebb5df..23c362d64e 100644 --- a/web_frontend/src/components/EditableField.jsx +++ b/web_frontend/src/components/EditableField.jsx @@ -1,17 +1,19 @@ import React, { useState, useEffect } from 'react'; -import { Pencil, Check, Ban, icons } from 'lucide-react'; +import { Pencil, Check, Ban } from 'lucide-react'; + + const EditableField = ({ label, name, value, initialValue, onChange, icon: Icon, type = 'text', options = [] }) => { const [isEditing, setIsEditing] = useState(false); const [tempValue, setTempValue] = useState(value); - // Synchroniser quand la valeur externe change + // Met à jour la valeur temporaire quand la prop `value` change useEffect(() => { setTempValue(value); }, [value]); const handleConfirm = () => { - onChange(name, tempValue); + onChange(name, tempValue); // ✅ corrige ici setIsEditing(false); }; @@ -27,17 +29,20 @@ const EditableField = ({ label, name, value, initialValue, onChange, icon: Icon, }`; return ( -
-