diff --git a/build_modules.sh b/build_modules.sh index 448c7ad2..87c79306 100755 --- a/build_modules.sh +++ b/build_modules.sh @@ -13,9 +13,9 @@ TAG="latest" build_module() { local module=$1 local dockerfile=$2 - + echo "🔹 Construction de $module..." - + if [ -f "$dockerfile" ]; then cd modules/$module && docker build -t "$REGISTRY-$module:$TAG" . && cd ../../ echo "✅ $module construit avec succĂšs" @@ -30,19 +30,11 @@ echo "📩 Construction des modules..." # sdk_signer if [ -d "../sdk_signer" ]; then - echo "📁 Copie du code sdk_signer depuis docker-support-v2..." + echo "🔹 Construction de sdk_signer depuis docker-support-v2..." cd ../sdk_signer git checkout docker-support-v2 git pull origin docker-support-v2 cd ../4NK_node - cp -r ../sdk_signer/* modules/sdk_signer/ - build_module "sdk_signer" "modules/sdk_signer/Dockerfile" -else - echo "⚠ RĂ©pertoire sdk_signer non trouvĂ©" -fi -if [ -d "../sdk_signer" ]; then - echo "📁 Copie du code sdk_signer..." - cp -r ../sdk_signer/* modules/sdk_signer/ build_module "sdk_signer" "modules/sdk_signer/Dockerfile" else echo "⚠ RĂ©pertoire sdk_signer non trouvĂ©" @@ -50,8 +42,11 @@ fi # sdk_storage if [ -d "../sdk_storage" ]; then - echo "📁 Copie du code sdk_storage..." - cp -r ../sdk_storage/* modules/sdk_storage/ + echo "🔹 Construction de sdk_storage depuis docker-support-v2..." + cd ../sdk_storage + git checkout docker-support-v2 + git pull origin docker-support-v2 + cd ../4NK_node build_module "sdk_storage" "modules/sdk_storage/Dockerfile" else echo "⚠ RĂ©pertoire sdk_storage non trouvĂ©" @@ -59,22 +54,53 @@ fi # ihm_client if [ -d "../ihm_client" ]; then - echo "📁 Copie du code ihm_client..." - cp -r ../ihm_client/* modules/ihm_client/ + echo "🔹 Construction de ihm_client depuis docker-support-v2..." + cd ../ihm_client + git checkout docker-support-v2 + git pull origin docker-support-v2 + cd ../4NK_node build_module "ihm_client" "modules/ihm_client/Dockerfile" else echo "⚠ RĂ©pertoire ihm_client non trouvĂ©" fi -# sdk_relay +# sdk_relay1, sdk_relay2, sdk_relay3 if [ -d "../sdk_relay" ]; then - echo "📁 Copie du code sdk_relay..." - cp -r ../sdk_relay/* modules/sdk_relay/ - build_module "sdk-relay" "modules/sdk_relay/Dockerfile" + echo "🔹 Construction des relays depuis docker-support-v2..." + cd ../sdk_relay + git checkout docker-support-v2 + git pull origin docker-support-v2 + cd ../4NK_node + + # Construire les 3 instances de relay + for i in 1 2 3; do + echo "🔹 Construction de sdk_relay$i..." + build_module "sdk_relay$i" "modules/sdk_relay$i/Dockerfile" + done else echo "⚠ RĂ©pertoire sdk_relay non trouvĂ©" fi +# bitcoin +echo "🔹 Construction de bitcoin..." +build_module "bitcoin" "modules/bitcoin/Dockerfile" + +# blindbit +if [ -d "../blindbit" ]; then + echo "🔹 Construction de blindbit depuis docker-support-v2..." + cd ../blindbit + git checkout docker-support-v2 + git pull origin docker-support-v2 + cd ../4NK_node + build_module "blindbit" "modules/blindbit/Dockerfile" +else + echo "⚠ RĂ©pertoire blindbit non trouvĂ©" +fi + +# tor +echo "🔹 Construction de tor..." +build_module "tor" "modules/tor/Dockerfile" + echo "🎉 Construction de tous les modules terminĂ©e !" echo "" echo "📋 Images construites :" diff --git a/modules/bitcoin/Dockerfile b/modules/bitcoin/Dockerfile new file mode 100644 index 00000000..f9918c3c --- /dev/null +++ b/modules/bitcoin/Dockerfile @@ -0,0 +1 @@ +FROM bitcoin/bitcoin-core:25.0 diff --git a/modules/blindbit/Dockerfile b/modules/blindbit/Dockerfile new file mode 100644 index 00000000..96eb3772 --- /dev/null +++ b/modules/blindbit/Dockerfile @@ -0,0 +1 @@ +FROM rust:1.75-alpine AS builder diff --git a/modules/ihm_client/AGENTS.md b/modules/ihm_client/AGENTS.md deleted file mode 100644 index 8951ed03..00000000 --- a/modules/ihm_client/AGENTS.md +++ /dev/null @@ -1,357 +0,0 @@ -# AGENTS.md - ihm_client - -## Table des matiĂšres - -- [Introduction](#introduction) -- [Agents fondamentaux](#agents-fondamentaux) -- [Agents spĂ©cialisĂ©s frontend](#agents-spĂ©cialisĂ©s-frontend) -- [Agents spĂ©cialisĂ©s WASM](#agents-spĂ©cialisĂ©s-wasm) -- [Agents spĂ©cialisĂ©s tests](#agents-spĂ©cialisĂ©s-tests) -- [Agents documentation](#agents-documentation) -- [Agents open source et CI](#agents-open-source-et-ci) -- [Agents complĂ©mentaires](#agents-complĂ©mentaires) -- [Matrice de coordination](#matrice-de-coordination) -- [Conclusion](#conclusion) - ---- - -## Introduction - -Ce document dĂ©finit les agents, leurs rĂŽles et leurs responsabilitĂ©s dans le projet `ihm_client`. -Chaque agent est assignĂ© Ă  un pĂ©rimĂštre clair (frontend, WASM, tests, documentation, CI, gouvernance open source). -L'objectif est d'assurer une maintenance cohĂ©rente de l'interface utilisateur, une traçabilitĂ© complĂšte et une exĂ©cution fiable des bonnes pratiques. -Les rĂšgles dĂ©taillĂ©es de rĂ©alisation et de contrĂŽle sont prĂ©cisĂ©es dans `.cursor/rules/`. - ---- - -## Agents fondamentaux - -### Agent Fondation - -**RĂŽle (Responsable)** : - -- Garantir que toute production est en français. -- VĂ©rifier l'absence d'exemples de code applicatif dans la base de code. -- Imposer l'introduction et/ou conclusion dans chaque contenu. - -**Artefacts :** - -- Tous fichiers. - ---- - -### Agent Structure - -**RĂŽle (Responsable)** : - -- Maintenir l'arborescence canonique du projet. -- DĂ©placer les documents obsolĂštes vers `archive/`. -- Bloquer toute suppression non documentĂ©e. - -**Artefacts :** - -- `archive/`, `docs/`, `tests/`, `.gitea/`, `CHANGELOG.md`. - ---- - -## Agents spĂ©cialisĂ©s frontend - -### Agent Vue.js - -**RĂŽle (Responsable)** : - -- Maintenir la qualitĂ© du code Vue.js. -- Assurer la cohĂ©rence des composants. -- Optimiser les performances de l'interface. - -**Artefacts :** - -- `src/components/`, `src/pages/`, `src/services/`. - ---- - -### Agent TypeScript - -**RĂŽle (Responsable)** : - -- Maintenir la qualitĂ© du code TypeScript. -- Assurer la cohĂ©rence des types. -- Optimiser la compilation TypeScript. - -**Artefacts :** - -- `src/types/`, `tsconfig.json`, `vite.config.ts`. - ---- - -### Agent UI/UX - -**RĂŽle (Responsable)** : - -- Maintenir la cohĂ©rence de l'interface utilisateur. -- Assurer l'accessibilitĂ©. -- Optimiser l'expĂ©rience utilisateur. - -**Artefacts :** - -- `src/components/`, `src/pages/`, `src/assets/`. - ---- - -## Agents spĂ©cialisĂ©s WASM - -### Agent Rust - -**RĂŽle (Responsable)** : - -- Maintenir la qualitĂ© du code Rust. -- Assurer la sĂ©curitĂ© de la mĂ©moire. -- Optimiser les performances WASM. - -**Artefacts :** - -- `temp-deps/sdk_client/`, `temp-deps/sdk_common/`. - ---- - -### Agent WASM - -**RĂŽle (Responsable)** : - -- Maintenir la compilation WASM. -- Assurer l'intĂ©gration avec le frontend. -- Optimiser la taille du bundle WASM. - -**Artefacts :** - -- `pkg/`, `scripts/setup-remote-deps.sh`. - ---- - -### Agent Silent Payments - -**RĂŽle (Responsable)** : - -- Maintenir l'intĂ©gration des Silent Payments. -- Assurer la sĂ©curitĂ© des transactions. -- Optimiser les performances de paiement. - -**Artefacts :** - -- `src/services/`, `src/types/sdk_client.d.ts`. - ---- - -## Agents spĂ©cialisĂ©s tests - -### Agent Tests Frontend - -**RĂŽle (Responsable)** : - -- Maintenir la couverture des tests frontend. -- Assurer la qualitĂ© des tests Vue.js. -- Optimiser l'exĂ©cution des tests. - -**Artefacts :** - -- `tests/unit/`, `tests/integration/`. - ---- - -### Agent Tests WASM - -**RĂŽle (Responsable)** : - -- Maintenir la couverture des tests WASM. -- Assurer la qualitĂ© des tests Rust. -- Optimiser l'exĂ©cution des tests WASM. - -**Artefacts :** - -- `temp-deps/sdk_client/tests/`. - ---- - -### Agent Tests E2E - -**RĂŽle (Responsable)** : - -- Maintenir la couverture des tests end-to-end. -- Assurer la qualitĂ© des tests d'intĂ©gration. -- Optimiser l'exĂ©cution des tests E2E. - -**Artefacts :** - -- `tests/e2e/`, `tests/performance/`. - ---- - -## Agents documentation - -### Agent Documentation - -**RĂŽle (Responsable)** : - -- Mettre Ă  jour les fichiers de `docs/` selon l'impact des changements. -- Maintenir `README.md` comme documentation principale. -- Produire des REX techniques dans `archive/`. - -**Artefacts :** - -- `docs/`, `README.md`, `CHANGELOG.md`. - ---- - -### Agent API Documentation - -**RĂŽle (Responsable)** : - -- Maintenir la documentation des APIs. -- Assurer la cohĂ©rence des types TypeScript. -- Optimiser la documentation des interfaces. - -**Artefacts :** - -- `docs/API.md`, `src/types/`. - ---- - -### Agent User Documentation - -**RĂŽle (Responsable)** : - -- Maintenir la documentation utilisateur. -- Assurer la clartĂ© des guides. -- Optimiser l'expĂ©rience de lecture. - -**Artefacts :** - -- `docs/USAGE.md`, `docs/INSTALLATION.md`. - ---- - -## Agents open source et CI - -### Agent Open Source - -**RĂŽle (Responsable)** : - -- Maintenir la conformitĂ© open source. -- Assurer la qualitĂ© des licences. -- Optimiser la gouvernance open source. - -**Artefacts :** - -- `LICENSE`, `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md`. - ---- - -### Agent CI/CD - -**RĂŽle (Responsable)** : - -- Maintenir la pipeline CI/CD. -- Assurer la qualitĂ© des builds. -- Optimiser l'automatisation. - -**Artefacts :** - -- `.gitea/workflows/`, `scripts/`. - ---- - -### Agent Security - -**RĂŽle (Responsable)** : - -- Maintenir la sĂ©curitĂ© du code. -- Assurer la qualitĂ© des audits de sĂ©curitĂ©. -- Optimiser la gestion des vulnĂ©rabilitĂ©s. - -**Artefacts :** - -- `SECURITY.md`, `docs/SECURITY_AUDIT.md`. - ---- - -## Agents complĂ©mentaires - -### Agent Performance - -**RĂŽle (ConsultĂ©)** : - -- Optimiser les performances frontend. -- Assurer la qualitĂ© des mĂ©triques. -- Optimiser l'expĂ©rience utilisateur. - -**Artefacts :** - -- `src/`, `dist/`. - ---- - -### Agent Accessibility - -**RĂŽle (ConsultĂ©)** : - -- Maintenir l'accessibilitĂ© de l'interface. -- Assurer la conformitĂ© WCAG. -- Optimiser l'expĂ©rience pour tous les utilisateurs. - -**Artefacts :** - -- `src/components/`, `src/pages/`. - ---- - -### Agent Internationalization - -**RĂŽle (ConsultĂ©)** : - -- Maintenir l'internationalisation. -- Assurer la qualitĂ© des traductions. -- Optimiser l'expĂ©rience multilingue. - -**Artefacts :** - -- `src/locales/`, `src/i18n/`. - ---- - -## Matrice de coordination - -| Agent | Frontend | WASM | Tests | Docs | CI/CD | Security | -|-------|----------|------|-------|------|-------|----------| -| **Fondation** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| **Structure** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| **Vue.js** | 🔮 | âšȘ | âšȘ | âšȘ | âšȘ | âšȘ | -| **TypeScript** | 🔮 | âšȘ | 🔮 | âšȘ | âšȘ | âšȘ | -| **UI/UX** | 🔮 | âšȘ | âšȘ | âšȘ | âšȘ | âšȘ | -| **Rust** | âšȘ | 🔮 | âšȘ | âšȘ | âšȘ | 🔮 | -| **WASM** | 🔮 | 🔮 | âšȘ | âšȘ | âšȘ | âšȘ | -| **Silent Payments** | 🔮 | 🔮 | 🔮 | âšȘ | âšȘ | 🔮 | -| **Tests Frontend** | 🔮 | âšȘ | 🔮 | âšȘ | âšȘ | âšȘ | -| **Tests WASM** | âšȘ | 🔮 | 🔮 | âšȘ | âšȘ | âšȘ | -| **Tests E2E** | 🔮 | 🔮 | 🔮 | âšȘ | âšȘ | âšȘ | -| **Documentation** | âšȘ | âšȘ | âšȘ | 🔮 | âšȘ | âšȘ | -| **API Documentation** | 🔮 | 🔮 | âšȘ | 🔮 | âšȘ | âšȘ | -| **User Documentation** | 🔮 | âšȘ | âšȘ | 🔮 | âšȘ | âšȘ | -| **Open Source** | âšȘ | âšȘ | âšȘ | âšȘ | 🔮 | âšȘ | -| **CI/CD** | 🔮 | 🔮 | 🔮 | âšȘ | 🔮 | âšȘ | -| **Security** | 🔮 | 🔮 | 🔮 | âšȘ | âšȘ | 🔮 | -| **Performance** | 🔮 | 🔮 | âšȘ | âšȘ | âšȘ | âšȘ | -| **Accessibility** | 🔮 | âšȘ | âšȘ | âšȘ | âšȘ | âšȘ | -| **Internationalization** | 🔮 | âšȘ | âšȘ | âšȘ | âšȘ | âšȘ | - -**LĂ©gende :** -- 🔮 **Responsable** - Agent principal pour ce domaine -- âšȘ **ConsultĂ©** - Agent consultĂ© si nĂ©cessaire -- ✅ **Tous** - Applicable Ă  tous les domaines - -## Conclusion - -Cette organisation des agents assure une couverture complĂšte du projet `ihm_client` avec des responsabilitĂ©s claires et une coordination efficace. Chaque agent contribue Ă  maintenir la qualitĂ©, la sĂ©curitĂ© et la performance de l'interface utilisateur pour les Silent Payments. - ---- - -**Objectif** : Maintenir `ihm_client` comme une interface utilisateur moderne, sĂ©curisĂ©e et performante pour les Silent Payments. 🚀 diff --git a/modules/ihm_client/CHANGELOG.md b/modules/ihm_client/CHANGELOG.md deleted file mode 100644 index ba21eab6..00000000 --- a/modules/ihm_client/CHANGELOG.md +++ /dev/null @@ -1,179 +0,0 @@ -# Changelog - ihm_client - -Tous les changements notables de ce projet seront documentĂ©s dans ce fichier. - -Le format est basĂ© sur [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/), -et ce projet adhĂšre au [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -## [Unreleased] - -### Added - -### Changed - -### Fixed - -## [1.1.0] - 2025-08-26 - -### Added -- IntĂ©gration complĂšte avec l'infrastructure 4NK_node -- Compilation WASM rĂ©ussie avec sdk_client et sdk_common -- Interface utilisateur moderne avec Vue.js et TypeScript -- SystĂšme de notifications en temps rĂ©el -- Gestion des Silent Payments via WASM -- Scanner QR Code intĂ©grĂ© -- SystĂšme de pairing entre utilisateurs -- Gestion des documents et signatures -- Tests unitaires pour les fonctions de conversion hex -- Documentation d'intĂ©gration avec 4NK_node -- Tests unitaires pour `sp-address.utils` et `html.utils` -- Documentation: `docs/API.md`, `docs/TESTING.md`, `docs/CONFIGURATION.md` -- Documentation fonctionnelle: `docs/FONCTIONNEL.md` et index mis Ă  jour -- SpĂ©cification d’intĂ©gration iframe: `docs/INTEGRATION_IFRAME.md` et index mis Ă  jour -- Tests pour `TokenService` et fallback d’environnement pour tests - -### Changed -- Suppression des vues `chat`, `process`, `process-element`, `signature`; routeur limitĂ© Ă  `home` et `account` -- Nettoyage de `src/main.ts` et `src/utils/notification.store.ts` pour retirer les dĂ©pendances aux vues supprimĂ©es -- Stabilisation des tests unitaires de canal en conditionnant l'Ă©mission `LISTENING` au mode E2E en iframe -- Documentation mise Ă  jour: `docs/USAGE.md`, `docs/INDEX.md` -- Migration vers la branche `docker-support` -- Optimisation du build Docker multi-stage -- AmĂ©lioration des performances de compilation -- Modernisation de l'interface utilisateur -- AmĂ©lioration du script de dĂ©marrage pour une meilleure robustesse -- Suppression des dĂ©pendances critiques pour permettre le dĂ©marrage mĂȘme si certains services ne sont pas prĂȘts -- Ajout de vĂ©rifications WebSocket pour les relays -- `tsconfig.build.json` en module `ES2022` pour supporter `import.meta` et top-level `await` -- Import dynamique des services dans `sp-address.utils` pour allĂ©ger les tests - -### Fixed -- Correction de la configuration Vite pour gĂ©nĂ©rer correctement index.html -- Suppression de la configuration lib qui causait des conflits -- AmĂ©lioration de la configuration Jest (moduleNameMapper, transform) -- CrĂ©ation de tests unitaires fonctionnels pour les conversions hex -- Suppression du fichier de test problĂ©matique avec dĂ©pendances complexes -- Tests de conversion hex passent avec succĂšs (8/8 tests) -- Stabilisation des tests Jest (mock `jose`, polyfills Web APIs dans `tests/setup.ts`) -- Correction de l’index de documentation (liens API et SSH) - -## [1.0.1] - 2025-08-25 - -### Fixed -- Correction de la configuration Vite pour gĂ©nĂ©rer correctement index.html -- Suppression de la configuration lib qui causait des conflits -- AmĂ©lioration de la configuration Jest (moduleNameMapper, transform) -- CrĂ©ation de tests unitaires fonctionnels pour les conversions hex -- Suppression du fichier de test problĂ©matique avec dĂ©pendances complexes -- Tests de conversion hex passent avec succĂšs (8/8 tests) - -### Technical -- Correction de la configuration build pour Ă©viter les conflits entre lib et application -- AmĂ©lioration de la configuration Jest pour une meilleure compatibilitĂ© -- Tests unitaires robustes pour les fonctions de conversion hex -- Suppression des dĂ©pendances complexes dans les tests - -### Changed -- Migration vers la branche `docker-support` -- Optimisation du build Docker multi-stage -- AmĂ©lioration des performances de compilation -- Modernisation de l'interface utilisateur -- AmĂ©lioration du script de dĂ©marrage pour une meilleure robustesse -- Suppression des dĂ©pendances critiques pour permettre le dĂ©marrage mĂȘme si certains services ne sont pas prĂȘts -- Ajout de vĂ©rifications WebSocket pour les relays - -### Fixed -- Correction des erreurs de compilation WASM -- RĂ©solution des problĂšmes de dĂ©pendances TypeScript -- Correction des imports manquants dans sdk_client -- AmĂ©lioration de la gestion des erreurs -- Correction de la fonction `hexToBlob` pour gĂ©rer correctement les types ArrayBuffer -- AmĂ©lioration de la gestion des erreurs de connexion -- Correction des timeouts de dĂ©marrage - -### Technical -- Ajout de tests pour les fonctions de conversion hex -- Mise Ă  jour de la documentation d'intĂ©gration -- AmĂ©lioration des logs de dĂ©marrage - -## [1.0.0] - 2025-08-25 - -### Added -- Interface utilisateur complĂšte pour les Silent Payments -- IntĂ©gration WASM avec sdk_client et sdk_common -- Architecture Vue.js + TypeScript + Vite -- SystĂšme de routing et navigation -- Gestion des profils utilisateurs -- SystĂšme de pairing avec QR codes -- Gestion des processus et documents -- SystĂšme de signatures Ă©lectroniques -- Chat en temps rĂ©el -- Notifications push -- Gestion des wallets Silent Payments -- Interface responsive et moderne - -### Features -- **Interface utilisateur** : Vue.js avec TypeScript -- **WASM** : IntĂ©gration complĂšte avec sdk_client -- **Pairing** : Connexion avec QR codes -- **Documents** : Gestion et signature -- **Chat** : Communication temps rĂ©el -- **Notifications** : SystĂšme de notifications -- **Wallet** : Gestion des Silent Payments - -### Technical -- Architecture frontend moderne avec Vue.js -- Compilation WASM avec Rust et wasm-pack -- Build optimisĂ© avec Vite -- Docker multi-stage pour la production -- IntĂ©gration complĂšte avec 4NK_node -- Variables d'environnement configurĂ©es -- Scripts d'automatisation - -## [0.9.0] - 2025-08-20 - -### Added -- Version initiale de l'interface utilisateur -- Configuration de base Vue.js + TypeScript -- Premiers composants d'interface -- Tests de compilation WASM - -### Changed -- Configuration initiale du projet -- Premiers tests d'intĂ©gration WASM - -### Fixed -- ProblĂšmes de compilation TypeScript -- Configuration des dĂ©pendances - -## [0.8.0] - 2025-08-15 - -### Added -- Support de l'intĂ©gration WASM -- Configuration des dĂ©pendances distantes -- Scripts d'automatisation -- Documentation technique - -### Changed -- AmĂ©lioration de l'architecture WASM -- Optimisation des performances - -### Fixed -- Correction des problĂšmes de compilation -- AmĂ©lioration de la stabilitĂ© - -## [0.7.0] - 2025-08-10 - -### Added -- Support des Silent Payments -- IntĂ©gration avec sdk_client -- Tests de fonctionnalitĂ©s -- Documentation des APIs - -### Changed -- AmĂ©lioration de l'architecture -- Optimisation des performances - -### Fixed -- Correction des bugs d'intĂ©gration -- AmĂ©lioration de la stabilitĂ© diff --git a/modules/ihm_client/CODE_OF_CONDUCT.md b/modules/ihm_client/CODE_OF_CONDUCT.md deleted file mode 100644 index 504a147b..00000000 --- a/modules/ihm_client/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,93 +0,0 @@ -# Code de Conduite - ihm_client - -## Notre Engagement - -Dans l'intĂ©rĂȘt de favoriser un environnement ouvert et accueillant, nous, en tant que contributeurs et mainteneurs, nous engageons Ă  faire de la participation Ă  notre projet et Ă  notre communautĂ© une expĂ©rience sans harcĂšlement pour tous, peu importe l'Ăąge, la taille, le handicap, l'ethnicitĂ©, les caractĂ©ristiques sexuelles, l'identitĂ© et l'expression de genre, le niveau d'expĂ©rience, l'Ă©ducation, le statut socio-Ă©conomique, la nationalitĂ©, l'apparence personnelle, la race, la religion ou l'identitĂ© et l'orientation sexuelles. - -## Nos Standards - -Exemples de comportements qui contribuent Ă  crĂ©er un environnement positif : - -* Utiliser un langage accueillant et inclusif -* Respecter les diffĂ©rents points de vue et expĂ©riences -* Accepter gracieusement les critiques constructives -* Se concentrer sur ce qui est le mieux pour la communautĂ© -* Faire preuve d'empathie envers les autres membres de la communautĂ© - -Exemples de comportements inacceptables : - -* L'utilisation de langage ou d'imagerie sexualisĂ©s et d'attention ou d'avances sexuelles non dĂ©sirĂ©es -* Le trolling, les commentaires insultants/dĂ©sobligeants et les attaques personnelles ou politiques -* Le harcĂšlement public ou privĂ© -* Publier les informations privĂ©es d'autres personnes, telles que des adresses physiques ou Ă©lectroniques, sans permission explicite -* Autres comportements qui pourraient raisonnablement ĂȘtre considĂ©rĂ©s comme inappropriĂ©s dans un contexte professionnel - -## Nos ResponsabilitĂ©s - -Les mainteneurs du projet sont responsables de clarifier les standards de comportement acceptable et sont censĂ©s prendre des mesures correctives appropriĂ©es et Ă©quitables en rĂ©ponse Ă  tout cas de comportement inacceptable. - -Les mainteneurs du projet ont le droit et la responsabilitĂ© de supprimer, modifier ou rejeter les commentaires, commits, code, modifications de wiki, questions et autres contributions qui ne sont pas alignĂ©s avec ce Code de Conduite, et de bannir temporairement ou dĂ©finitivement tout contributeur pour d'autres comportements qu'ils jugent inappropriĂ©s, menaçants, offensants ou nuisibles. - -## PortĂ©e - -Ce Code de Conduite s'applique Ă  la fois dans les espaces du projet et dans les espaces publics lorsqu'un individu reprĂ©sente le projet ou sa communautĂ©. Des exemples de reprĂ©sentation du projet ou de la communautĂ© incluent l'utilisation d'une adresse email officielle du projet, la publication via un compte de mĂ©dia social officiel, ou l'action en tant que reprĂ©sentant dĂ©signĂ© lors d'un Ă©vĂ©nement en ligne ou hors ligne. La reprĂ©sentation du projet peut ĂȘtre davantage dĂ©finie et clarifiĂ©e par les mainteneurs du projet. - -## Application - -Les cas de comportement abusif, harcelant ou autrement inacceptable peuvent ĂȘtre signalĂ©s en contactant l'Ă©quipe du projet Ă  contact@4nkweb5.com. Toutes les plaintes seront examinĂ©es et enquĂȘtĂ©es et se traduiront par une rĂ©ponse jugĂ©e nĂ©cessaire et appropriĂ©e aux circonstances. L'Ă©quipe du projet est obligĂ©e de maintenir la confidentialitĂ© concernant le rapporteur d'un incident. Plus de dĂ©tails sur les politiques d'application spĂ©cifiques peuvent ĂȘtre publiĂ©s sĂ©parĂ©ment. - -Les mainteneurs du projet qui ne suivent pas ou n'appliquent pas le Code de Conduite de bonne foi peuvent faire face Ă  des rĂ©percussions temporaires ou permanentes dĂ©terminĂ©es par d'autres membres de la direction du projet. - -## Attribution - -Ce Code de Conduite est adaptĂ© du [Contributor Covenant](https://www.contributor-covenant.org), version 2.0, disponible Ă  https://www.contributor-covenant.org/fr/version/2/0/code_of_conduct.html. - -## Contact - -Pour signaler un problĂšme ou poser des questions concernant ce Code de Conduite, vous pouvez : - -* CrĂ©er une issue privĂ©e sur le repository -* Contacter l'Ă©quipe de maintenance via les canaux officiels -* Utiliser les canaux de discussion du projet - -## Équipe de ModĂ©ration - -L'Ă©quipe de modĂ©ration est composĂ©e des mainteneurs principaux du projet qui s'engagent Ă  : - -* Traiter tous les signalements avec impartialitĂ© -* Maintenir la confidentialitĂ© des rapports -* Prendre des mesures appropriĂ©es et Ă©quitables -* Documenter les dĂ©cisions prises -* AmĂ©liorer continuellement le processus - -## Processus de Signalement - -1. **Signalement** : Contactez l'Ă©quipe via les canaux appropriĂ©s -2. **AccusĂ© de rĂ©ception** : Vous recevrez une confirmation dans les 48h -3. **EnquĂȘte** : L'Ă©quipe examinera le signalement -4. **DĂ©cision** : Une dĂ©cision sera prise et communiquĂ©e -5. **Appel** : PossibilitĂ© de faire appel de la dĂ©cision - -## Mesures Correctives - -Les mesures correctives peuvent inclure : - -* Avertissement privĂ© -* Avertissement public -* Suspension temporaire -* Bannissement permanent -* Suppression de contenu inappropriĂ© - -## Engagement envers l'AmĂ©lioration - -Nous nous engageons Ă  : - -* RĂ©viser rĂ©guliĂšrement ce Code de Conduite -* Solliciter les retours de la communautĂ© -* AmĂ©liorer les processus de modĂ©ration -* Former l'Ă©quipe de modĂ©ration -* Maintenir un environnement sain et inclusif - ---- - -**Merci de contribuer Ă  maintenir ihm_client comme un projet accueillant et inclusif !** 🌟 diff --git a/modules/ihm_client/CONTRIBUTING.md b/modules/ihm_client/CONTRIBUTING.md deleted file mode 100644 index 6841dbb5..00000000 --- a/modules/ihm_client/CONTRIBUTING.md +++ /dev/null @@ -1,311 +0,0 @@ -# Guide de Contribution - ihm_client - -Merci de votre intĂ©rĂȘt pour contribuer au projet ihm_client ! Ce guide vous aidera Ă  comprendre comment participer au dĂ©veloppement de cette interface utilisateur pour les Silent Payments. - -## 📋 Table des MatiĂšres - -- [🎯 Comment Contribuer](#-comment-contribuer) -- [🚀 Premiers Pas](#-premiers-pas) -- [🔧 Environnement de DĂ©veloppement](#-environnement-de-dĂ©veloppement) -- [📝 Processus de Contribution](#-processus-de-contribution) -- [đŸ§Ș Tests](#-tests) -- [📚 Documentation](#-documentation) -- [🐛 Signaler un Bug](#-signaler-un-bug) -- [💡 Proposer une FonctionnalitĂ©](#-proposer-une-fonctionnalitĂ©) -- [🔍 Code Review](#-code-review) -- [📩 Release](#-release) - -## 🎯 Comment Contribuer - -### Types de Contributions - -Nous accueillons diffĂ©rents types de contributions : - -- **🐛 Bug fixes** - Correction de bugs et problĂšmes -- **✹ Nouvelles fonctionnalitĂ©s** - Ajout de nouvelles capacitĂ©s -- **📚 Documentation** - AmĂ©lioration de la documentation -- **đŸ§Ș Tests** - Ajout ou amĂ©lioration des tests -- **🔧 Outils** - AmĂ©lioration des scripts et outils -- **🌐 Traductions** - Traduction de la documentation -- **📊 Performance** - Optimisations de performance -- **🔒 SĂ©curitĂ©** - AmĂ©liorations de sĂ©curitĂ© - -### Niveaux de Contribution - -- **DĂ©butant** - Documentation, tests, petits bugs -- **IntermĂ©diaire** - Nouvelles fonctionnalitĂ©s, amĂ©liorations UI -- **AvancĂ©** - Architecture WASM, optimisations majeures - -## 🚀 Premiers Pas - -### PrĂ©requis - -- **Node.js 18+** et **npm** -- **Git** configurĂ© -- **Rust** (pour le dĂ©veloppement WASM) -- **Docker** (pour l'intĂ©gration 4NK_node) -- **Connexion Internet** stable - -### Fork et Clone - -```bash -# 1. Fork le repository sur Gitea -# 2. Clone votre fork -git clone https://git.4nkweb.com/votre-username/ihm_client.git -cd ihm_client - -# 3. Ajouter le repository original comme upstream -git remote add upstream https://git.4nkweb.com/4nk/ihm_client.git -``` - -### Branches - -```bash -# CrĂ©er une branche pour votre contribution -git checkout -b feature/nom-de-votre-feature -# ou -git checkout -b fix/nom-du-bug -``` - -## 🔧 Environnement de DĂ©veloppement - -### Installation Locale - -```bash -# 1. Cloner le repository -git clone https://git.4nkweb.com/4nk/ihm_client.git -cd ihm_client - -# 2. Installer les dĂ©pendances -npm install - -# 3. Configurer les dĂ©pendances WASM -./scripts/setup-remote-deps.sh - -# 4. DĂ©marrer le serveur de dĂ©veloppement -npm run dev -``` - -### Configuration de DĂ©veloppement - -```bash -# Variables d'environnement pour le dĂ©veloppement -export NODE_ENV=development -export VITE_DEV_SERVER_PORT=3000 -export VITE_API_URL=http://localhost:8091 -``` - -### Outils de DĂ©veloppement - -```bash -# Tests -npm run test - -# Build de production -npm run build - -# Linting -npm run lint - -# Type checking -npm run type-check -``` - -## 📝 Processus de Contribution - -### 1. PrĂ©paration - -```bash -# Mettre Ă  jour votre branche -git checkout main -git pull upstream main - -# CrĂ©er votre branche de feature -git checkout -b feature/votre-feature -``` - -### 2. DĂ©veloppement - -- Suivez les conventions de code -- Écrivez des tests pour les nouvelles fonctionnalitĂ©s -- Mettez Ă  jour la documentation si nĂ©cessaire -- VĂ©rifiez que les tests passent - -### 3. Commit - -```bash -# Ajouter vos changements -git add . - -# CrĂ©er un commit descriptif -git commit -m "feat: ajout de la fonctionnalitĂ© X - -- Description dĂ©taillĂ©e des changements -- Impact sur l'interface utilisateur -- Tests ajoutĂ©s" -``` - -### 4. Push et Pull Request - -```bash -# Pousser votre branche -git push origin feature/votre-feature - -# CrĂ©er une Pull Request sur Gitea -``` - -## đŸ§Ș Tests - -### Types de Tests - -- **Unit Tests** - Tests des composants individuels -- **Integration Tests** - Tests d'intĂ©gration WASM -- **E2E Tests** - Tests end-to-end de l'interface -- **Performance Tests** - Tests de performance - -### ExĂ©cution des Tests - -```bash -# Tous les tests -npm run test - -# Tests unitaires uniquement -npm run test:unit - -# Tests d'intĂ©gration -npm run test:integration - -# Tests avec couverture -npm run test:coverage -``` - -## 📚 Documentation - -### Mise Ă  Jour de la Documentation - -- **README.md** - Documentation principale -- **docs/** - Documentation technique dĂ©taillĂ©e -- **CHANGELOG.md** - Historique des changements -- **API.md** - Documentation des APIs - -### Standards de Documentation - -- Écrire en français -- Utiliser des exemples concrets -- Inclure des captures d'Ă©cran pour l'UI -- Maintenir la cohĂ©rence du style - -## 🐛 Signaler un Bug - -### Template de Bug Report - -```markdown -**Description du bug** -Description claire et concise du problĂšme. - -**Étapes pour reproduire** -1. Aller Ă  '...' -2. Cliquer sur '...' -3. Voir l'erreur - -**Comportement attendu** -Description de ce qui devrait se passer. - -**Captures d'Ă©cran** -Si applicable, ajouter des captures d'Ă©cran. - -**Environnement** -- OS: [ex: Windows 10, macOS, Linux] -- Navigateur: [ex: Chrome, Firefox, Safari] -- Version: [ex: 1.0.0] - -**Informations supplĂ©mentaires** -Contexte supplĂ©mentaire sur le problĂšme. -``` - -## 💡 Proposer une FonctionnalitĂ© - -### Template de Feature Request - -```markdown -**ProblĂšme Ă  rĂ©soudre** -Description claire du problĂšme que cette fonctionnalitĂ© rĂ©soudrait. - -**Solution proposĂ©e** -Description de la solution souhaitĂ©e. - -**Alternatives considĂ©rĂ©es** -Autres solutions envisagĂ©es. - -**Contexte supplĂ©mentaire** -Informations supplĂ©mentaires, captures d'Ă©cran, etc. -``` - -## 🔍 Code Review - -### CritĂšres de Review - -- **FonctionnalitĂ©** - Le code fait-il ce qu'il doit faire ? -- **QualitĂ©** - Le code est-il propre et maintenable ? -- **Tests** - Y a-t-il des tests appropriĂ©s ? -- **Documentation** - La documentation est-elle mise Ă  jour ? -- **Performance** - L'impact sur les performances est-il acceptable ? - -### Processus de Review - -1. **Automatique** - Tests et linting -2. **Review** - Review par un mainteneur -3. **Approbation** - Approbation requise pour merge -4. **Merge** - IntĂ©gration dans la branche principale - -## 📩 Release - -### Processus de Release - -1. **PrĂ©paration** - Mise Ă  jour du CHANGELOG -2. **Versioning** - IncrĂ©mentation de la version -3. **Build** - Build de production -4. **Tests** - Tests de validation -5. **Tag** - CrĂ©ation du tag de release -6. **DĂ©ploiement** - DĂ©ploiement en production - -### Versioning - -Nous suivons le [Semantic Versioning](https://semver.org/) : - -- **MAJOR** - Changements incompatibles -- **MINOR** - Nouvelles fonctionnalitĂ©s compatibles -- **PATCH** - Corrections de bugs compatibles - -## đŸ€ Code de Conduite - -### Nos Standards - -- Être respectueux et inclusif -- Utiliser un langage accueillant -- Accepter les critiques constructives -- Se concentrer sur ce qui est le mieux pour la communautĂ© - -### Nos ResponsabilitĂ©s - -- Clarifier les standards de comportement acceptable -- Prendre des mesures correctives appropriĂ©es -- Supprimer, Ă©diter ou rejeter les commentaires inappropriĂ©s - -## 📞 Support - -### Obtenir de l'Aide - -- **Issues** - [Git.4nkweb.com](https://git.4nkweb.com/4nk/ihm_client/issues) -- **Documentation** - [docs/](docs/) -- **Discussions** - [Git.4nkweb.com](https://git.4nkweb.com/4nk/ihm_client) - -### Ressources - -- [Documentation Vue.js](https://vuejs.org/guide/) -- [Documentation TypeScript](https://www.typescriptlang.org/docs/) -- [Documentation WASM](https://webassembly.org/docs/) - ---- - -Merci de contribuer Ă  ihm_client ! 🚀 diff --git a/modules/ihm_client/Dockerfile.4nk-node b/modules/ihm_client/Dockerfile.4nk-node deleted file mode 100644 index e3e37402..00000000 --- a/modules/ihm_client/Dockerfile.4nk-node +++ /dev/null @@ -1,53 +0,0 @@ -# Dockerfile optimisĂ© pour l'intĂ©gration dans 4NK_node -FROM node:20-alpine AS builder - -WORKDIR /app - -# Installation des dĂ©pendances systĂšme -RUN apk update && apk add --no-cache \ - git \ - build-base \ - python3 \ - make \ - g++ - -# Copie des fichiers de dĂ©pendances -COPY package*.json ./ - -# Installation des dĂ©pendances -RUN npm ci --only=production - -# Copie du code source -COPY . . - -# Build de l'application -RUN npm run build - -# Image de production -FROM nginx:alpine - -# Installation de Node.js pour les scripts de dĂ©marrage -RUN apk update && apk add --no-cache nodejs npm - -# Copie des fichiers buildĂ©s -COPY --from=builder /app/dist /usr/share/nginx/html -COPY --from=builder /app/package*.json /app/ - -# Copie de la configuration nginx optimisĂ©e pour 4NK_node -COPY nginx.4nk-node.conf /etc/nginx/conf.d/default.conf - -# Script de dĂ©marrage -COPY start-4nk-node.sh /start-4nk-node.sh -RUN chmod +x /start-4nk-node.sh - -# Exposition des ports -EXPOSE 80 3003 - -# Variables d'environnement pour 4NK_node -ENV SDK_RELAY_WS_URL=ws://sdk_relay_1:8090 -ENV SDK_RELAY_HTTP_URL=http://sdk_relay_1:8091 -ENV BITCOIN_RPC_URL=http://bitcoin:18443 -ENV BLINDBIT_URL=http://blindbit:8000 - -# Point d'entrĂ©e -CMD ["/start-4nk-node.sh"] diff --git a/modules/ihm_client/LICENSE b/modules/ihm_client/LICENSE deleted file mode 100644 index b4030a7a..00000000 --- a/modules/ihm_client/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024 4NK Team - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/modules/ihm_client/README.md b/modules/ihm_client/README.md deleted file mode 100755 index 1580017a..00000000 --- a/modules/ihm_client/README.md +++ /dev/null @@ -1,86 +0,0 @@ -# ihm_client - -Interface utilisateur moderne pour les Silent Payments - IntĂ©grĂ©e dans l'infrastructure 4NK_node - -## 🚀 Statut actuel - -**✅ OPÉRATIONNEL ET PRÊT POUR LA PRODUCTION** - -- **Branche** : `docker-support` -- **Compilation WASM** : ✅ RĂ©ussie -- **Compilation TypeScript** : ✅ RĂ©ussie -- **IntĂ©gration 4NK_node** : ✅ ConfigurĂ©e - -## 📋 FonctionnalitĂ©s - -### Interface utilisateur -- 🌐 **Accueil** - Vue d'ensemble et navigation -- đŸ‘€ **Compte** - Gestion du profil utilisateur -- 📄 **Processus** - CrĂ©ation et gestion des processus -- ✍ **Signature** - Signatures de documents -- 💬 **Chat** - Communication entre membres - -### FonctionnalitĂ©s techniques -- 🔗 **Pairing** - Connexion avec d'autres utilisateurs -- 💰 **Wallet** - Gestion des Silent Payments -- 📋 **Documents** - Validation et signature -- 🔔 **Notifications** - SystĂšme temps rĂ©el -- đŸ“± **QR Code** - Scanner et gĂ©nĂ©ration -- ⚡ **WASM** - IntĂ©gration complĂšte avec sdk_client - -## đŸ—ïž Architecture - -- **Frontend** : TypeScript + Vite + Vue.js -- **WASM** : Rust + wasm-pack -- **Build** : Vite + TypeScript Compiler -- **Docker** : Build artefacts dist/ (Nginx gĂ©rĂ© par 4NK_node) - -## 🔗 IntĂ©gration 4NK_node - -L'interface est intĂ©grĂ©e dans l'infrastructure 4NK_node et accessible sur : -- **URL** : http://localhost:8080 -- **Service** : `ihm_client` dans docker-compose.yml - -## 📚 Documentation - -- [RĂ©fĂ©rence rapide](docs/QUICK_REFERENCE.md) - Points d’entrĂ©e et commandes -- [IntĂ©gration iframe](docs/INTEGRATION_IFRAME.md) - Messagerie d’intĂ©gration -- [Configuration SSH](docs/SSH_USAGE.md) - SSH automatisĂ© -- [Architecture](docs/ARCHITECTURE.md) - Architecture technique -- [API](docs/API.md) - Documentation des APIs -- [Tests E2E](docs/TESTING.md) - Playwright (smoke tests) - -## đŸ› ïž DĂ©veloppement - -```bash -# Installation -npm install - -# DĂ©veloppement local -npm run dev - -# Build de production -npm run build - -# Configuration des dĂ©pendances distantes -./scripts/setup-remote-deps.sh -``` - -## 📊 MĂ©triques - -- **WASM** : 3.3 MB -- **CSS** : 711 KB (gzippĂ©) -- **JavaScript** : 4.5 MB (gzippĂ©) -- **Temps de compilation** : ~25s - -## 🎯 Prochaines Ă©tapes - -1. Test complet de l'infrastructure 4NK_node -2. Validation des fonctionnalitĂ©s en production -3. Optimisation des performances - ---- - -**État** : ✅ **PRÊT POUR LA PRODUCTION** -**Version** : docker-support -**DerniĂšre mise Ă  jour** : 25 aoĂ»t 2025 \ No newline at end of file diff --git a/modules/ihm_client/SECURITY.md b/modules/ihm_client/SECURITY.md deleted file mode 100644 index 4b2322f4..00000000 --- a/modules/ihm_client/SECURITY.md +++ /dev/null @@ -1,217 +0,0 @@ -# Politique de SĂ©curitĂ© - ihm_client - -## đŸ›Ąïž Signalement de VulnĂ©rabilitĂ©s - -Nous prenons la sĂ©curitĂ© trĂšs au sĂ©rieux. Si vous dĂ©couvrez une vulnĂ©rabilitĂ© de sĂ©curitĂ©, nous vous demandons de la signaler de maniĂšre responsable. - -### Comment Signaler une VulnĂ©rabilitĂ© - -**NE PAS** crĂ©er d'issue publique pour les vulnĂ©rabilitĂ©s de sĂ©curitĂ©. - -**À la place :** -1. Envoyez un email Ă  [security@4nkweb.com](mailto:security@4nkweb.com) -2. Incluez "SECURITY VULNERABILITY" dans l'objet -3. DĂ©crivez la vulnĂ©rabilitĂ© de maniĂšre dĂ©taillĂ©e -4. Incluez les Ă©tapes pour reproduire le problĂšme -5. Proposez une solution si possible - -### Ce que nous attendons - -- **ConfidentialitĂ©** : Ne divulguez pas la vulnĂ©rabilitĂ© publiquement -- **DĂ©tails** : Fournissez suffisamment d'informations pour reproduire le problĂšme -- **Patience** : Nous examinerons et rĂ©pondrons dans les 48h -- **CoopĂ©ration** : Nous pouvons avoir besoin de clarifications - -### Ce que vous pouvez attendre - -- **RĂ©ponse rapide** : AccusĂ© de rĂ©ception dans les 48h -- **Évaluation** : Analyse de la vulnĂ©rabilitĂ© -- **Mise Ă  jour** : Statut de la correction -- **Reconnaissance** : Mention dans les remerciements (si souhaitĂ©) - -## 🔒 Bonnes Pratiques de SĂ©curitĂ© - -### Pour les Contributeurs - -#### Code Frontend -- Validez toutes les entrĂ©es utilisateur cĂŽtĂ© client et serveur -- Utilisez des requĂȘtes prĂ©parĂ©es pour les APIs -- Évitez les injections XSS et CSRF -- ImplĂ©mentez l'authentification appropriĂ©e -- Utilisez HTTPS pour toutes les communications - -#### WASM et Rust -- Validez les entrĂ©es dans le code Rust -- Évitez les vulnĂ©rabilitĂ©s de mĂ©moire -- Utilisez des types sĂ»rs -- Testez les cas limites -- Maintenez les dĂ©pendances Ă  jour - -#### Configuration -- Ne committez jamais de secrets -- Utilisez des variables d'environnement pour les donnĂ©es sensibles -- VĂ©rifiez les permissions des fichiers -- Maintenez les dĂ©pendances Ă  jour - -#### Tests -- Incluez des tests de sĂ©curitĂ© -- Testez les cas limites -- Validez les entrĂ©es malveillantes -- VĂ©rifiez les fuites de mĂ©moire - -### Pour les Utilisateurs - -#### Installation -- Utilisez des sources officielles -- VĂ©rifiez les checksums -- Maintenez le systĂšme Ă  jour -- Utilisez un pare-feu - -#### Configuration -- Changez les mots de passe par dĂ©faut -- Utilisez des clĂ©s SSH fortes -- Limitez l'accĂšs rĂ©seau -- Surveillez les logs - -#### OpĂ©ration -- Surveillez les connexions -- Sauvegardez rĂ©guliĂšrement -- Testez les sauvegardes -- Documentez les incidents - -## 🔍 Audit de SĂ©curitĂ© - -### Composants Principaux - -#### Interface Utilisateur (Vue.js) -- **Validation** : Validation cĂŽtĂ© client et serveur -- **Authentification** : Gestion sĂ©curisĂ©e des sessions -- **XSS Protection** : Échappement des donnĂ©es -- **CSRF Protection** : Tokens de sĂ©curitĂ© - -#### WASM (sdk_client) -- **MĂ©moire** : Gestion sĂ»re de la mĂ©moire -- **EntrĂ©es** : Validation des paramĂštres -- **Cryptographie** : Utilisation de bibliothĂšques sĂ»res -- **Silent Payments** : Protection des clĂ©s privĂ©es - -#### Communication -- **WebSocket** : Validation des messages -- **HTTPS** : Chiffrement des communications -- **APIs** : Authentification et autorisation -- **CORS** : Configuration sĂ©curisĂ©e - -#### Stockage -- **Local Storage** : Pas de donnĂ©es sensibles -- **Session Storage** : DonnĂ©es temporaires sĂ©curisĂ©es -- **Cookies** : Configuration sĂ©curisĂ©e -- **Cache** : Pas d'informations sensibles - -## 🚹 VulnĂ©rabilitĂ©s Connues - -### VulnĂ©rabilitĂ©s RĂ©solues - -#### [CVE-2024-XXXX] - Injection XSS -- **Statut** : RĂ©solu -- **Version** : 1.0.0 -- **Description** : VulnĂ©rabilitĂ© d'injection XSS dans les champs de saisie -- **Solution** : Validation et Ă©chappement des entrĂ©es utilisateur - -#### [CVE-2024-XXXX] - Fuite de MĂ©moire WASM -- **Statut** : RĂ©solu -- **Version** : 1.0.0 -- **Description** : Fuite de mĂ©moire dans le module WASM -- **Solution** : Gestion correcte de la mĂ©moire Rust - -### VulnĂ©rabilitĂ©s Actives - -Aucune vulnĂ©rabilitĂ© active connue. - -## 🔧 Mesures de SĂ©curitĂ© - -### Authentification - -- **JWT** : Tokens sĂ©curisĂ©s avec expiration -- **Refresh Tokens** : Rotation automatique -- **Multi-Factor** : Support pour l'authentification Ă  deux facteurs -- **Session Management** : Gestion sĂ©curisĂ©e des sessions - -### Autorisation - -- **RBAC** : ContrĂŽle d'accĂšs basĂ© sur les rĂŽles -- **Permissions** : Permissions granulaires -- **Audit** : Logs d'audit complets -- **Validation** : Validation des permissions cĂŽtĂ© serveur - -### Chiffrement - -- **HTTPS** : Chiffrement en transit -- **WASM** : Chiffrement des donnĂ©es sensibles -- **Local Storage** : Chiffrement des donnĂ©es locales -- **APIs** : Chiffrement des communications - -### Monitoring - -- **Logs** : Logs de sĂ©curitĂ© complets -- **Alertes** : Alertes automatiques -- **Audit** : Audit de sĂ©curitĂ© rĂ©gulier -- **Incidents** : Gestion des incidents de sĂ©curitĂ© - -## 📋 Checklist de SĂ©curitĂ© - -### DĂ©veloppement - -- [ ] Validation des entrĂ©es utilisateur -- [ ] Protection contre XSS -- [ ] Protection contre CSRF -- [ ] Authentification sĂ©curisĂ©e -- [ ] Autorisation appropriĂ©e -- [ ] Chiffrement des donnĂ©es sensibles -- [ ] Gestion sĂ»re des erreurs -- [ ] Tests de sĂ©curitĂ© - -### DĂ©ploiement - -- [ ] Configuration HTTPS -- [ ] Headers de sĂ©curitĂ© -- [ ] Variables d'environnement sĂ©curisĂ©es -- [ ] Permissions de fichiers appropriĂ©es -- [ ] Monitoring de sĂ©curitĂ© -- [ ] Sauvegarde sĂ©curisĂ©e -- [ ] Documentation de sĂ©curitĂ© - -### Maintenance - -- [ ] Mise Ă  jour des dĂ©pendances -- [ ] Audit de sĂ©curitĂ© rĂ©gulier -- [ ] Monitoring des vulnĂ©rabilitĂ©s -- [ ] Tests de pĂ©nĂ©tration -- [ ] Formation Ă  la sĂ©curitĂ© -- [ ] Plan de rĂ©ponse aux incidents - -## 📞 Contact SĂ©curitĂ© - -### Équipe de SĂ©curitĂ© - -- **Email** : [security@4nkweb.com](mailto:security@4nkweb.com) -- **PGP** : [ClĂ© publique PGP](https://4nkweb.com/security.asc) -- **Signalement** : [Formulaire de signalement](https://4nkweb.com/security) - -### RĂ©ponse aux Incidents - -1. **DĂ©tection** : Identification de l'incident -2. **Containment** : Limitation de l'impact -3. **Éradication** : Suppression de la cause -4. **RĂ©cupĂ©ration** : Retour Ă  la normale -5. **Post-mortem** : Analyse et amĂ©lioration - -### Communication - -- **Interne** : Communication avec l'Ă©quipe -- **Utilisateurs** : Notification des utilisateurs -- **Public** : Communication publique si nĂ©cessaire -- **AutoritĂ©s** : Notification des autoritĂ©s si requis - ---- - -**La sĂ©curitĂ© est une responsabilitĂ© partagĂ©e. Merci de contribuer Ă  maintenir ihm_client sĂ©curisĂ© !** 🔒 diff --git a/modules/ihm_client/TEMPLATE_VERSION b/modules/ihm_client/TEMPLATE_VERSION deleted file mode 100644 index 264fc296..00000000 --- a/modules/ihm_client/TEMPLATE_VERSION +++ /dev/null @@ -1 +0,0 @@ -v2025.08.5 \ No newline at end of file diff --git a/modules/ihm_client/dist.zip b/modules/ihm_client/dist.zip deleted file mode 100644 index 7ec85d2b..00000000 Binary files a/modules/ihm_client/dist.zip and /dev/null differ diff --git a/modules/ihm_client/docker-compose.4nk-node.yml b/modules/ihm_client/docker-compose.4nk-node.yml deleted file mode 100644 index a35dd3b4..00000000 --- a/modules/ihm_client/docker-compose.4nk-node.yml +++ /dev/null @@ -1,43 +0,0 @@ -version: '3.8' - -services: - ihm_client: - build: - context: . - dockerfile: Dockerfile.4nk-node - container_name: 4nk-ihm-client - ports: - - "8080:80" - - "3003:3003" - environment: - - SDK_RELAY_WS_URL=ws://sdk_relay_1:8090 - - SDK_RELAY_HTTP_URL=http://sdk_relay_1:8091 - - BITCOIN_RPC_URL=http://bitcoin:18443 - - BLINDBIT_URL=http://blindbit:8000 - - NODE_ENV=production - volumes: - - ihm_client_logs:/var/log/nginx - - ihm_client_data:/usr/share/nginx/html/data - networks: - - btcnet - depends_on: - - sdk_relay_1 - - sdk_relay_2 - - sdk_relay_3 - restart: unless-stopped - healthcheck: - test: ["CMD", "wget", "--quiet", "--tries=1", "--timeout=5", "--spider", "http://localhost"] - interval: 30s - timeout: 10s - retries: 3 - start_period: 40s - -volumes: - ihm_client_logs: - driver: local - ihm_client_data: - driver: local - -networks: - btcnet: - external: true diff --git a/modules/ihm_client/docs/AGENTS_INTEGRATION.md b/modules/ihm_client/docs/AGENTS_INTEGRATION.md deleted file mode 100644 index ac4b41d2..00000000 --- a/modules/ihm_client/docs/AGENTS_INTEGRATION.md +++ /dev/null @@ -1,6 +0,0 @@ -# IntĂ©gration des agents 4NK_template - -- Hooks centralisĂ©s: pre-commit / pre-push via ../4NK_template (Docker). -- PrĂ©-requis: ~/.4nk_template/.env montĂ© en RO dans le conteneur. -- ExĂ©cution: scripts/local/precommit.sh ou git push (dĂ©clenche pre-push). -- Rapports: tests/reports/agents/. diff --git a/modules/ihm_client/docs/API.md b/modules/ihm_client/docs/API.md deleted file mode 100644 index a5d0eaac..00000000 --- a/modules/ihm_client/docs/API.md +++ /dev/null @@ -1,49 +0,0 @@ -# API - ihm_client - -Ce document dĂ©crit les interfaces publiques significatives exposĂ©es par l’interface `ihm_client`. Il ne contient aucun exemple d’usage exĂ©cutable et sert de rĂ©fĂ©rence de contrat. - -## Types et modules principaux - -- Services applicatifs - - `src/services/service.ts` (classe `Services`) : opĂ©rations d’app, gestion des relays, pairing, processus, stockage, conversions hex/blob. - - `src/services/token.ts` (classe `TokenService`) : gĂ©nĂ©ration/validation/refresh de jetons de session. -- Utilitaires - - `src/utils/sp-address.utils.ts` : conversions adresse → empreinte d’emojis, gestion du flux d’affichage, QR code. - - `src/utils/html.utils.ts` : rĂ©solution du DOM racine ou `shadowRoot`. - -## Contrats clĂ©s - -- `Services.getInstance(): Promise`: retour singleton initialisĂ©. -- Pairing et processus - - `createPairingProcess(userName: string, pairWith: string[]): Promise` - - `confirmPairing(): Promise` - - `createProcess(...)`, `updateProcess(...)` : gestion des Ă©tats/processus. -- DonnĂ©es chiffrĂ©es - - `getHashForFile(commitedIn: string, label: string, fileBlob: { type: string; data: Uint8Array }): string` - - `getMerkleProofForFile(processState, attributeName): MerkleProofResult` - - `validateMerkleProof(proof, hash): boolean` -- Conversion binaire - - `hexToBlob(hex: string): Blob` - - `hexToUInt8Array(hex: string): Uint8Array` - - `blobToHex(blob: Blob): Promise` -- Tokens - - `TokenService.getInstance(): Promise` - - `generateSessionToken(origin: string): Promise<{ accessToken: string; refreshToken: string }>` - - `validateToken(token: string, origin: string): Promise` - - `refreshAccessToken(refreshToken: string, origin: string): Promise` - -## Invariants - -- Les mĂ©thodes de `Services` supposent l’initialisation du module WASM (`pkg/sdk_client`) lors du `init()`. -- `TokenService` requiert une clĂ© de signature via `VITE_JWT_SECRET_KEY` (Vite ou environnement Node en test). -- Les conversions hex/binaire doivent prĂ©server l’intĂ©gritĂ© des octets (longueur paire pour l’hex). - -## Erreurs et retours - -- Les mĂ©thodes renvoient des erreurs typĂ©es via `throw new Error(message)` si un invariant n’est pas respectĂ© (ex. adresse manquante, Ă©tat introuvable). -- Les fonctions de token retournent `false`/`null` pour les validations/refresh non valides. - -## CompatibilitĂ© - -- Environnement navigateur moderne (WebCrypto, `Blob`, `TextEncoder`). -- Tests sous Jest avec polyfills contrĂŽlĂ©s dans `tests/setup.ts`. diff --git a/modules/ihm_client/docs/ARCHITECTURE.md b/modules/ihm_client/docs/ARCHITECTURE.md deleted file mode 100644 index 1a8abb4e..00000000 --- a/modules/ihm_client/docs/ARCHITECTURE.md +++ /dev/null @@ -1,570 +0,0 @@ -# đŸ—ïž Architecture Technique - ihm_client - -Documentation technique dĂ©taillĂ©e de l'architecture de l'interface utilisateur ihm_client. - -## 📋 Vue d'Ensemble - -### Architecture GĂ©nĂ©rale - -``` -┌─────────────────────────────────────────────────────────────┐ -│ ihm_client │ -├────────────────────────────────────────────────────────────── -│ Frontend (Vue.js + TypeScript) │ -│ ├── Components Vue.js │ -│ ├── Services TypeScript │ -│ ├── Types et Interfaces │ -│ └── Utilitaires │ -├────────────────────────────────────────────────────────────── -│ WASM (Rust + sdk_client) │ -│ ├── Module WebAssembly │ -│ ├── Fonctions Silent Payments │ -│ └── Interface JavaScript │ -├────────────────────────────────────────────────────────────── -│ Build System (Vite) │ -│ ├── Compilation TypeScript │ -│ ├── Bundling et Optimisation │ -│ └── Hot Module Replacement │ -└─────────────────────────────────────────────────────────────┘ -``` - -### Stack Technologique - -| Couche | Technologie | Version | RĂŽle | -|--------|-------------|---------|------| -| **Frontend** | Vue.js | 3.x | Framework UI | -| **Language** | TypeScript | 5.x | Typage statique | -| **Build** | Vite | 5.x | Build tool | -| **WASM** | Rust | 1.70+ | Logique mĂ©tier | -| **WASM Build** | wasm-pack | 0.12+ | Compilation WASM | -| **Styling** | CSS3 | - | Styles | -| **Package Manager** | npm | 8.x+ | Gestion dĂ©pendances | - -## đŸ›ïž Architecture Frontend - -### Structure des Composants - -``` -src/ -├── components/ # Composants rĂ©utilisables -│ ├── header/ # En-tĂȘte de l'application -│ ├── modal/ # Modales et popups -│ ├── qrcode-scanner/ # Scanner QR code -│ └── validation-modal/ # Modales de validation -├── pages/ # Pages de l'application -│ ├── home/ # Page d'accueil -│ ├── account/ # Gestion du compte -│ ├── signature/ # Signatures de documents -│ └── process-element/ # Gestion des processus -├── services/ # Services et APIs -│ ├── service.ts # Service principal -│ ├── modal.service.ts # Gestion des modales -│ ├── storage.service.ts # Gestion du stockage -│ └── token.ts # Gestion des tokens -├── types/ # Types TypeScript -│ ├── sdk_client.d.ts # Types WASM -│ └── raw-imports.d.ts # Types d'imports -└── utils/ # Utilitaires - ├── document.utils.ts # Utilitaires documents - ├── html.utils.ts # Utilitaires HTML - └── sp-address.utils.ts # Utilitaires Silent Payments -``` - -### Architecture Vue.js - -#### Composants Principaux - -##### Header Component -```typescript -interface HeaderProps { - user: User; - notifications: Notification[]; - onLogout: () => void; -} -``` - -**ResponsabilitĂ©s :** -- Navigation principale -- Affichage du profil utilisateur -- Gestion des notifications -- Menu de dĂ©connexion - -##### Modal Components -```typescript -interface ModalProps { - isOpen: boolean; - title: string; - content: string; - onConfirm: () => void; - onCancel: () => void; -} -``` - -**Types de modales :** -- **Confirmation** : Actions critiques -- **Validation** : Validation de donnĂ©es -- **QR Scanner** : Scanner de codes QR -- **Profile** : Édition du profil - -##### QR Code Scanner -```typescript -interface QRScannerProps { - onScan: (data: string) => void; - onError: (error: Error) => void; - onClose: () => void; -} -``` - -**FonctionnalitĂ©s :** -- AccĂšs Ă  la camĂ©ra -- DĂ©tection de QR codes -- Validation des donnĂ©es -- Gestion des erreurs - -### Services et Communication - -#### Service Principal -```typescript -class Service { - // Communication avec sdk_client WASM - async generateWallet(): Promise; - async lockUTXOs(wallet: Wallet, utxos: UTXO[]): Promise; - - // Communication avec les APIs - async sendMessage(message: Message): Promise; - async uploadDocument(file: File): Promise; - - // Gestion des donnĂ©es - async saveData(key: string, data: any): Promise; - async loadData(key: string): Promise; -} -``` - -#### Gestion des États - -```typescript -// Store global (Vuex/Pinia) -interface AppState { - user: User | null; - wallet: Wallet | null; - processes: Process[]; - notifications: Notification[]; - settings: Settings; -} -``` - -## ⚡ Architecture WASM - -### Module sdk_client - -#### Structure du Module -``` -pkg/ -├── sdk_client_bg.wasm # Module WASM principal (3.3 MB) -├── sdk_client.d.ts # Types TypeScript (12.6 KB) -├── sdk_client.js # Wrapper JavaScript (182 B) -├── sdk_client_bg.js # Code JavaScript gĂ©nĂ©rĂ© (38 KB) -└── package.json # MĂ©tadonnĂ©es du package -``` - -#### Fonctions Principales - -##### Gestion des Wallets -```rust -// Rust (sdk_client) -pub fn generate_sp_wallet() -> Wallet { - // GĂ©nĂ©ration d'un nouveau wallet Silent Payment -} - -pub fn lock_freezed_utxos(wallet: Wallet, utxos: Vec) -> bool { - // Verrouillage des UTXOs gelĂ©s -} -``` - -##### Interface JavaScript -```typescript -// TypeScript (ihm_client) -import { generate_sp_wallet, lock_freezed_utxos } from 'pkg/sdk_client'; - -const wallet = generate_sp_wallet(); -const success = lock_freezed_utxos(wallet, utxos); -``` - -### IntĂ©gration WASM-Frontend - -#### Initialisation -```typescript -// Initialisation du module WASM -import init from 'pkg/sdk_client'; - -async function initializeWASM() { - try { - await init(); - console.log('WASM module initialized'); - } catch (error) { - console.error('Failed to initialize WASM:', error); - } -} -``` - -#### Communication -```typescript -// Appel de fonctions WASM -async function createWallet() { - try { - const wallet = generate_sp_wallet(); - return wallet; - } catch (error) { - console.error('WASM error:', error); - throw error; - } -} -``` - -## 🔧 Architecture Build - -### Configuration Vite - -```typescript -// vite.config.ts -import { defineConfig } from 'vite'; -import vue from '@vitejs/plugin-vue'; -import wasm from 'vite-plugin-wasm'; - -export default defineConfig({ - plugins: [ - vue(), - wasm(), - ], - optimizeDeps: { - exclude: ['pkg/sdk_client'] - }, - build: { - target: 'es2020', - rollupOptions: { - output: { - manualChunks: { - 'sdk-client': ['pkg/sdk_client'] - } - } - } - } -}); -``` - -### Processus de Build - -#### DĂ©veloppement -```bash -# Serveur de dĂ©veloppement -npm run dev - -# Hot Module Replacement activĂ© -# Compilation TypeScript en temps rĂ©el -# Chargement WASM Ă  la demande -``` - -#### Production -```bash -# Build optimisĂ© -npm run build - -# Optimisations : -# - Tree shaking -# - Code splitting -# - Minification -# - Compression gzip -``` - -### Optimisations - -#### Code Splitting -```typescript -// Chargement Ă  la demande des composants -const SignatureComponent = () => import('./pages/signature/signature-component.vue'); -const AccountComponent = () => import('./pages/account/account-component.vue'); -``` - -#### Lazy Loading WASM -```typescript -// Chargement diffĂ©rĂ© du module WASM -const loadWASM = async () => { - if (!wasmModule) { - wasmModule = await import('pkg/sdk_client'); - await wasmModule.default(); - } - return wasmModule; -}; -``` - -## 🔄 Flux de DonnĂ©es - -### Flux Principal - -``` -1. Utilisateur → Interface Vue.js -2. Interface → Services TypeScript -3. Services → Module WASM (sdk_client) -4. WASM → APIs externes (si nĂ©cessaire) -5. RĂ©ponse → Services → Interface → Utilisateur -``` - -### Gestion des États - -#### État Local (Composants) -```typescript -// État local d'un composant -const componentState = reactive({ - loading: false, - data: null, - error: null -}); -``` - -#### État Global (Store) -```typescript -// Store global de l'application -const appStore = { - user: ref(null), - wallet: ref(null), - processes: ref([]), - notifications: ref([]) -}; -``` - -#### Persistance -```typescript -// Sauvegarde locale -localStorage.setItem('user-data', JSON.stringify(userData)); - -// Synchronisation avec le serveur -await service.syncData(userData); -``` - -## 🔒 Architecture de SĂ©curitĂ© - -### SĂ©curitĂ© Frontend - -#### Validation des EntrĂ©es -```typescript -// Validation cĂŽtĂ© client -function validateUserInput(input: string): boolean { - return input.length > 0 && input.length < 100; -} - -// Sanitisation HTML -function sanitizeHTML(html: string): string { - return DOMPurify.sanitize(html); -} -``` - -#### Protection XSS -```typescript -// Échappement des donnĂ©es -function escapeHTML(text: string): string { - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; -} -``` - -### SĂ©curitĂ© WASM - -#### Gestion de la MĂ©moire -```rust -// Rust - Gestion sĂ»re de la mĂ©moire -pub fn process_data(data: Vec) -> Result, Error> { - // Validation des donnĂ©es d'entrĂ©e - if data.len() > MAX_SIZE { - return Err(Error::DataTooLarge); - } - - // Traitement sĂ©curisĂ© - let result = process_secure(data)?; - Ok(result) -} -``` - -#### Protection des ClĂ©s -```rust -// Protection des clĂ©s privĂ©es -pub struct SecureWallet { - private_key: SecureString, - public_key: String, -} - -impl SecureWallet { - pub fn new() -> Self { - let private_key = generate_secure_key(); - let public_key = derive_public_key(&private_key); - - Self { - private_key: SecureString::new(private_key), - public_key, - } - } -} -``` - -## 📊 Architecture de Performance - -### MĂ©triques de Performance - -#### Temps de Chargement -- **Premier rendu** : < 2s -- **InteractivitĂ©** : < 3s -- **Chargement complet** : < 5s - -#### Optimisations - -##### Bundle Size -```bash -# Taille des bundles -dist/ -├── index.js # ~300 KB (gzippĂ©) -├── sdk_client.wasm # ~3.3 MB (gzippĂ©) -└── vendor.js # ~200 KB (gzippĂ©) -``` - -##### Lazy Loading -```typescript -// Chargement Ă  la demande -const routes = [ - { - path: '/signature', - component: () => import('./pages/signature.vue') - } -]; -``` - -##### Caching -```typescript -// Cache du module WASM -const wasmCache = new Map(); - -async function getWASMModule() { - if (wasmCache.has('sdk_client')) { - return wasmCache.get('sdk_client'); - } - - const module = await loadWASMModule(); - wasmCache.set('sdk_client', module); - return module; -} -``` - -## 🔍 Monitoring et ObservabilitĂ© - -### Logs et Debugging - -#### Logs Frontend -```typescript -// Logging structurĂ© -const logger = { - info: (message: string, data?: any) => { - console.log(`[INFO] ${message}`, data); - }, - error: (message: string, error?: Error) => { - console.error(`[ERROR] ${message}`, error); - } -}; -``` - -#### Logs WASM -```rust -// Logging Rust -use log::{info, error}; - -pub fn process_wallet() -> Result { - info!("Starting wallet processing"); - - match process_secure() { - Ok(wallet) => { - info!("Wallet processed successfully"); - Ok(wallet) - }, - Err(e) => { - error!("Wallet processing failed: {}", e); - Err(e) - } - } -} -``` - -### MĂ©triques - -#### MĂ©triques Frontend -- **Temps de rendu** : Performance des composants -- **Temps de rĂ©ponse** : RĂ©activitĂ© de l'interface -- **Utilisation mĂ©moire** : Consommation RAM -- **Erreurs JavaScript** : StabilitĂ© de l'application - -#### MĂ©triques WASM -- **Temps d'initialisation** : Chargement du module -- **Temps d'exĂ©cution** : Performance des fonctions -- **Utilisation mĂ©moire** : Gestion de la mĂ©moire -- **Erreurs Rust** : StabilitĂ© du module - -## 🚀 DĂ©ploiement - -### Environnements - -#### DĂ©veloppement -```bash -# Serveur de dĂ©veloppement -npm run dev - -# Variables d'environnement -NODE_ENV=development -VITE_API_URL=http://localhost:8091 -VITE_WS_URL=ws://localhost:8090 -``` - -#### Production -```bash -# Build de production -npm run build - -# Variables d'environnement -NODE_ENV=production -VITE_API_URL=https://api.4nkweb.com -VITE_WS_URL=wss://ws.4nkweb.com -``` - -### IntĂ©gration 4NK_node - -#### Artefacts et serveur -- Le Dockerfile de `ihm_client` produit uniquement les artefacts `dist/`. -- Le serveur (Nginx) est gĂ©rĂ© par `4NK_node` qui consomme `dist/`. - -#### Variables d'Environnement -```bash -# Configuration pour 4NK_node -SDK_RELAY_WS_URL=ws://sdk_relay_1:8090 -SDK_RELAY_HTTP_URL=http://sdk_relay_1:8091 -BITCOIN_RPC_URL=http://bitcoin:18443 -BLINDBIT_URL=http://blindbit:8000 -``` - -## 🔼 Évolutions Futures - -### AmĂ©liorations PlanifiĂ©es - -#### Performance -- **Web Workers** : Traitement en arriĂšre-plan -- **Service Workers** : Cache et offline -- **WebAssembly SIMD** : Optimisations vectorielles - -#### FonctionnalitĂ©s -- **PWA** : Application web progressive -- **Offline Mode** : Fonctionnement hors ligne -- **Real-time Sync** : Synchronisation temps rĂ©el - -#### SĂ©curitĂ© -- **Hardware Security** : IntĂ©gration TPM/SE -- **Multi-factor Auth** : Authentification Ă  deux facteurs -- **Audit Trail** : TraçabilitĂ© complĂšte - ---- - -**đŸ—ïž Architecture ihm_client - Conçue pour la performance et la sĂ©curitĂ©** 🚀 diff --git a/modules/ihm_client/docs/BDD_ihm.drawio.svg b/modules/ihm_client/docs/BDD_ihm.drawio.svg deleted file mode 100644 index d5357a71..00000000 --- a/modules/ihm_client/docs/BDD_ihm.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
Profile_VUE
+ name: string
+ lastname: string
+ sp_adress: string
+ exportUserData(void): json
+ exportRecovery(void): string
+ deleteAccount(void): void
+ logOut(void): void
Pairing_VUE
+ sp_adress: string
+ device_name: string
+ sp_emojis: string
+ add_a_line(string): string
+ rename_device(string): string
Wallet_VUE
+ label: string
+ sp_adress: string
+ wallet: string
+ type: string
+ add_a_line(string): string
Process_VUE
+ sp_adress: string
+ process_name: string
+ role: string
+ notifications: string
+ show_notifications(void): modal
Data_VUE
+ sp_adress: string
+ name: string
+ visibility: string (private, confidential, public)
+ role: string
+ duration: string
+ legal: string
+ contract: array<contract>
+ show_contract(void): modal
Notification
+ messages: messages
notification_messages
+ id: number
+ read: boolean
+ content: string
Wallet
+ label: string
+ wallet: string
+ type: string
Process
+ states: array<ProcessState>
Contract
+ field: type
+ field: type
+ field: type
Device
+ sp_wallet: string
+ pairing_process_commitment: array<id>
+ paired_member: array<member>
service
+ sp_adress: string
+ sendNewTxMessage(message): string
+ sendCommitMessage(message): string
+ sendCiphersMessage(ciphers): string
+ parseCipher(message): string
+ parseNewTx(tx): string
role
+ role: string
ProcessState
+ commited_in: OutPoint
message_page
+ sp_adress: string
+ loadGroupList(sp_adress): role<string>
process_list
+ process: array<process>
+ toggleRoles(group): role<string>
account_page
+ sp_adress: string
+ showPairing(): void
+ showWallet(): void
+ showProcess(): void
+ showData(): void
role_list
+ role: array<role>
message
+ textArea(): list<message>
+ sendMessage(string): string
+ sendFile(any): any
signature_page
+ sp_adress: string
+ loadGroupList(sp_adress): role<string>
process_list
+ process: array<process>
+ toggleRoles(group): role<string>
+ showProcessDetails(group, Id): HTMLElement
role_list
+ role: array<role>
+ showRoleDocuments(role): HTMLElement
message
+ textArea(): list<message>
+ sendMessage(string): string
+ sendFile(any): any
message
+ id: date
+ sender: string
+ text: messageText
+ time: date
+ type: text
file
+ id: date
+ sender: string
+ fileName: fileName
+ fileData: fileData
+ time: date
+ type: string
member_list
+ member: string
+ initMessageEvents(): void
member_list
+ member: string
+ initMessageEvents(): void
Process_VUE
+ member: array<string>
+ contract: array<contract>
+ newRequest(RequestParams): void
+ submitNewDocument(): void
+ submitCommonDocument(): void
+ signDocument(documentId: number, processId: number, isCommonDocument: boolean): void
RequestParams
+ processId: id
+ processName: string
+ roleId: id
+ roleName: role
+ documentId: id
+ documentName: string
sign_modal
+ name: string
+ visibility: string
+ createdAt: string
+ deadline: string
+ signatures: DocumentSignature<file>
+ id: number
+ description: string
+ status: string
+ confirmSignature(documentId: number, processId: number, isCommonDocument: boolean): void
request_modal
+ name: string
+ visibility: string
+ createdAt: string
+ deadline: string
+ signatures: DocumentSignature<file>
+ id: number
+ description: string
+ status: string
+ request(): void
Role_VUE
+ contract: array<contract>
+ newRequest(RequestParams): void
+ submitNewDocument(): void
+ submitCommonDocument(): void
\ No newline at end of file diff --git a/modules/ihm_client/docs/COMMUNITY_GUIDE.md b/modules/ihm_client/docs/COMMUNITY_GUIDE.md deleted file mode 100644 index 1e0c69e9..00000000 --- a/modules/ihm_client/docs/COMMUNITY_GUIDE.md +++ /dev/null @@ -1,5 +0,0 @@ -# Guide de la communautĂ© - ihm_client - -- Comment contribuer (issues, PR, revues) -- Standards de code et de documentation -- Processus de release et de support diff --git a/modules/ihm_client/docs/CONFIGURATION.md b/modules/ihm_client/docs/CONFIGURATION.md deleted file mode 100644 index 5b6e60c1..00000000 --- a/modules/ihm_client/docs/CONFIGURATION.md +++ /dev/null @@ -1,34 +0,0 @@ -# Configuration - ihm_client - -Ce document synthĂ©tise la configuration de l’application et des outils. Il complĂšte `INSTALLATION.md`. - -## Variables d’environnement - -- Variables Vite (navigateur) - - `VITE_API_URL`: URL HTTP du relais/API. - - `VITE_WS_URL`: URL WS du relais. - - `VITE_WASM_PATH`: chemin vers `pkg/sdk_client_bg.wasm`. - - `VITE_JWT_SECRET_KEY`: clĂ© de signature des JWT (utilisĂ©e par `TokenService`). -- IntĂ©gration 4NK_node (serveur gĂ©rĂ© cĂŽtĂ© 4NK_node, artefacts `dist/` produits ici) - - `SDK_RELAY_WS_URL`, `SDK_RELAY_HTTP_URL`, `BITCOIN_RPC_URL`, `BLINDBIT_URL`. - -## Build - -- Outil: Vite 5 + TypeScript 5. -- Ciblage: `es2020`+. -- WASM: `vite-plugin-wasm`, bundle diffĂ©rĂ© conseillĂ©. - -## Tests - -- Jest 29 + `ts-jest`. -- `tests/setup.ts` injecte polyfills et mocks. - -## RĂ©solution des modules - -- Aliases: `~/*` → `src/*` (cf. `tsconfig.json`). -- Mapper: `jest.config.js` mappe `pkg/` vers `pkg/` local. - -## CI/CD - -- Étapes minimales: install, tests, build, artefacts. -- Audit dĂ©pendances Ă  intĂ©grer selon politique sĂ©curitĂ©. diff --git a/modules/ihm_client/docs/FONCTIONNEL.md b/modules/ihm_client/docs/FONCTIONNEL.md deleted file mode 100644 index 913a78e9..00000000 --- a/modules/ihm_client/docs/FONCTIONNEL.md +++ /dev/null @@ -1,99 +0,0 @@ -# Documentation fonctionnelle - ihm_client - -Cette documentation dĂ©crit ce que fait fonctionnellement l’interface `ihm_client`, les parcours utilisateurs, les rĂšgles de gestion et les contraintes associĂ©es. Aucun exemple de code applicatif n’est inclus. - -## Objectif produit - -- Proposer une interface moderne pour la gestion de processus collaboratifs autour des Silent Payments. -- Faciliter le pairing sĂ©curisĂ© entre appareils/utilisateurs et la gestion des transactions associĂ©es. -- Offrir un espace unifiĂ© pour la gestion des membres, documents, signatures et Ă©changes (chat/notifications). - -## Personas et rĂŽles - -- Utilisateur standard: initie/participe Ă  des processus, signe des documents, Ă©change des messages. -- Administrateur de processus: configure les rĂŽles, vĂ©rifie les validations, dĂ©clenche des mises Ă  jour. -- Observateur (lecture seule): consulte les informations publiques/partagĂ©es sans intervenir. - -## Parcours principaux - -### Accueil -- AccĂšs rapide aux sections clĂ©s (Compte, Processus, Signature, Chat, Pairing). -- Indicateurs d’activitĂ©: processus actifs, notifications rĂ©centes, mĂ©triques succinctes. - -### Pairing (mise en relation) -- Objectif: Ă©tablir une relation de confiance entre appareils via adresse Silent Payment. -- Étapes: - 1. Saisir ou scanner l’adresse SP distante (ou URL contenant `sp_address`). - 2. VĂ©rifier l’empreinte visuelle (emojis) dĂ©rivĂ©e de l’adresse pour confirmer l’identitĂ©. - 3. CrĂ©er et confirmer le processus de pairing (flux guidĂ©, confirmation finale). -- RĂ©sultat: l’appareil local est appairĂ©; les Ă©changes sĂ©curisĂ©s sont possibles. - -### Wallet et relays -- Visualiser l’état du wallet (montant disponible, synchro via relays). -- Interagir avec le rĂ©seau via relays (mise Ă  jour des membres/Ă©tats, Ă©change de messages techniques). -- Disposer d’un mĂ©canisme de “faucet” en environnement de test pour provisionner le wallet. - -### Processus -- CrĂ©er un nouveau processus (donnĂ©es publiques et privĂ©es, rĂŽles, rĂšgles de validation). -- Mettre Ă  jour un processus existant (Ă©volution des Ă©tats, validations, preuves). -- Consulter l’historique (Ă©tats validĂ©s, Ă©tats en attente/non committĂ©s). - -### Membres et rĂŽles -- GĂ©rer les membres impliquĂ©s (par adresse SP). -- DĂ©finir des rĂŽles et rĂšgles de validation (quorum, champs soumis Ă  contrĂŽle, seuils). -- VĂ©rifier l’appartenance de l’utilisateur Ă  un rĂŽle (autorisation implicite des actions). - -### Documents et signatures -- Associer des documents aux processus (hashĂ©s et stockĂ©s via mĂ©canismes dĂ©diĂ©s). -- DĂ©clencher des demandes de signature, suivre leur statut (en attente, signĂ©, expirĂ©). -- VĂ©rifier/valider les preuves (ex. Merkle) liĂ©es aux documents Ă©changĂ©s. - -### Chat et notifications -- Échanger des messages dans le contexte des processus. -- Recevoir des notifications liĂ©es aux Ă©vĂ©nements (nouvelle transaction, demande de signature, mise Ă  jour de processus). - -## RĂšgles de gestion clĂ©s - -- Pairing - - Une empreinte visuelle (emojis) dĂ©rivĂ©e de l’adresse SP aide Ă  la confirmation utilisateur. - - Un processus de pairing doit inclure l’adresse de l’appareil local. -- Validation - - Les rĂšgles de validation (quorum, seuils) s’appliquent aux champs dĂ©clarĂ©s. - - Une mise Ă  jour de processus peut ĂȘtre refusĂ©e si les preuves/validations sont insuffisantes. -- DonnĂ©es - - Les donnĂ©es volumineuses (blobs) sont stockĂ©es sĂ©parĂ©ment et rĂ©fĂ©rencĂ©es par hash. - - Les attributs chiffrĂ©s nĂ©cessitent clĂ©s/permissions pour ĂȘtre dĂ©chiffrĂ©s. -- SĂ©curitĂ© - - Les Ă©changes sont consolidĂ©s via relays; l’appairage conditionne l’accĂšs aux donnĂ©es privĂ©es. - - Les tokens de session sont temporaires et rĂ©gĂ©nĂ©rables (Access/Refresh). - -## Contraintes et limites - -- DĂ©pendance au module WASM pour les opĂ©rations de bas niveau (Silent Payments, encodages, preuves). -- NĂ©cessitĂ© d’un ou plusieurs relays disponibles pour la synchronisation et l’échange d’informations. -- Performance dĂ©pendant du contexte (navigateur, rĂ©seau, taille des donnĂ©es). - -## Indicateurs et mĂ©triques - -- DisponibilitĂ© des relays et latence observĂ©e. -- État de synchronisation (hauteur de bloc, mises Ă  jour reçues). -- Taille et temps de manipulation des documents. -- Taux de succĂšs des signatures et validations. - -## Gestion des erreurs et non-rĂ©gression - -- Messages d’erreur explicites pour Ă©tats manquants, adresses invalides, clĂ©s indisponibles, connexions relays. -- Tests unitaires couvrant conversions (hex/blob), DOM utilitaire et tokens. -- StratĂ©gie de test documentĂ©e (voir `docs/TESTING.md`). - -## ConfidentialitĂ© et conformitĂ© - -- Pas de stockage permanent de secrets en clair cĂŽtĂ© client. -- Utilisation stricte de variables d’environnement pour les secrets runtime. -- Revue rĂ©guliĂšre des dĂ©pendances et audits sĂ©curitĂ© (voir `docs/SECURITY_AUDIT.md`). - -## Support et usage - -- Guides d’installation et d’utilisation (voir `docs/INSTALLATION.md`, `docs/USAGE.md`). -- RĂ©fĂ©rentiel contractuel des API (voir `docs/API.md`). -- IntĂ©gration dans un site via iframe (voir `docs/INTEGRATION_IFRAME.md`). diff --git a/modules/ihm_client/docs/GITEA_SETUP.md b/modules/ihm_client/docs/GITEA_SETUP.md deleted file mode 100644 index 547b2a2a..00000000 --- a/modules/ihm_client/docs/GITEA_SETUP.md +++ /dev/null @@ -1,17 +0,0 @@ -# Configuration Gitea - ihm_client - -## Repository -- CrĂ©ation du dĂ©pĂŽt sur `git.4nkweb.com` -- Droits d’écriture/lecture selon rĂŽle - -## SSH -- Ajout de la clĂ© dans Settings > SSH Keys -- Scripts: `scripts/init-ssh-env.sh`, `scripts/auto-ssh-push.sh` - -## CI/CD -- Workflows dans `.gitea/workflows/` (Ă  dĂ©finir selon pipeline) -- Politique de branche: protection de `main`/`docker-support` - -## Permissions -- Maintainers: merge + tags -- Contributeurs: PRs avec validation diff --git a/modules/ihm_client/docs/INDEX.md b/modules/ihm_client/docs/INDEX.md deleted file mode 100644 index d6819643..00000000 --- a/modules/ihm_client/docs/INDEX.md +++ /dev/null @@ -1,219 +0,0 @@ -# 📚 Index de Documentation - ihm_client - -Index complet de la documentation de l'interface utilisateur ihm_client pour les Silent Payments. - -## 📖 Guides Principaux - -### 🚀 [Guide d'Installation](INSTALLATION.md) -Guide complet pour installer et configurer l'interface utilisateur ihm_client. -- **PrĂ©requis systĂšme et logiciels** -- **Installation de Node.js et dĂ©pendances** -- **Configuration Rust et WASM** -- **Configuration des dĂ©pendances distantes** -- **Tests post-installation** -- **DĂ©pannage et monitoring** - -### 📖 [Guide d'Utilisation](USAGE.md) -### 🧭 [Documentation fonctionnelle](FONCTIONNEL.md) -Description fonctionnelle complĂšte (parcours, rĂšgles de gestion, contraintes). -Guide complet pour utiliser l'interface utilisateur ihm_client au quotidien. -- **DĂ©marrage du serveur de dĂ©veloppement** -- **Utilisation de l'interface utilisateur** -- **Navigation Accueil et Compte** -- **OpĂ©rations de pairing et wallet** -- **Tests et validation** - -### ⚙ [Guide de Configuration](CONFIGURATION.md) -Guide complet pour configurer l'interface selon vos besoins. -- **Configuration gĂ©nĂ©rale et variables d'environnement** -- **Configuration Vue.js et TypeScript** -- **Configuration WASM et sdk_client** -- **Configuration de l'intĂ©gration 4NK_node** -- **Configuration Docker et production** -- **Configuration SSL/TLS** -- **Configuration de monitoring et sauvegarde** - -## 🔧 Guides Techniques - -### đŸ—ïž [Architecture Technique](ARCHITECTURE.md) -Documentation technique dĂ©taillĂ©e de l'architecture. -- **Architecture gĂ©nĂ©rale du frontend** -- **Composants principaux (Vue.js, TypeScript, WASM)** -- **IntĂ©gration avec sdk_client et sdk_common** -- **Flux de donnĂ©es entre composants** -- **Architecture des Silent Payments** -- **SĂ©curitĂ© et isolation** -- **Performance et optimisations** -- **Monitoring et observabilitĂ©** - -### 📡 [API](API.md) -Documentation contractuelle des APIs disponibles. -- **API sdk_client WASM** : Interface WebAssembly pour les Silent Payments -- **API Vue.js Components** : Composants rĂ©utilisables -- **API Services** : Services de communication et gestion -- **API Types TypeScript** : Types et interfaces -- **Format des donnĂ©es et payloads** -- **Gestion des erreurs** -- **Exemples d'utilisation** -- **Limites et quotas** - -### 🔒 [SĂ©curitĂ©](SECURITY.md) -Guide de sĂ©curitĂ© et bonnes pratiques. -- **Authentification et autorisation** -- **Protection XSS et CSRF** -- **SĂ©curitĂ© WASM et mĂ©moire** -- **Chiffrement et certificats** -- **Audit et monitoring de sĂ©curitĂ©** -- **Bonnes pratiques frontend** - -### 🐙 [Configuration Gitea](GITEA_SETUP.md) -Guide de configuration spĂ©cifique pour Gitea. -- **Configuration du repository Gitea** -- **Templates d'issues et pull requests** -- **Configuration CI/CD avec Gitea Actions** -- **IntĂ©grations et webhooks** -- **Workflow de contribution** -- **SĂ©curitĂ© et permissions** - -### 🚀 [Plan de Release](RELEASE_PLAN.md) -Plan de lancement open source complet. -- **Phases de prĂ©paration** -- **Communication et marketing** -- **Checklist de lancement** -- **Support communautaire** -- **Gestion des risques** - -### 🌟 [Guide de la CommunautĂ©](COMMUNITY_GUIDE.md) -Guide complet pour la communautĂ©. -- **Comment contribuer** -- **Ressources d'apprentissage** -- **Environnement de dĂ©veloppement** -- **Processus de contribution** -- **Support et reconnaissance** - -### đŸ—ș [Roadmap](ROADMAP.md) -Roadmap de dĂ©veloppement dĂ©taillĂ©e. -- **Timeline de dĂ©veloppement** -- **FonctionnalitĂ©s planifiĂ©es** -- **Évolution de l'architecture** -- **MĂ©triques de succĂšs** - -## đŸ§Ș Guides de Test - -### đŸ§Ș [Guide des Tests](TESTING.md) -Guide complet pour les tests de l'interface utilisateur. -- **Tests unitaires Vue.js** -- **Tests d'intĂ©gration WASM** -- **Tests end-to-end (Playwright)** -- **Tests de performance** -- **Tests de sĂ©curitĂ©** -- **Tests d'accessibilitĂ©** -- **Tests de compatibilitĂ© navigateur** - -### 🔍 [Audit de SĂ©curitĂ©](SECURITY_AUDIT.md) -Audit de sĂ©curitĂ© dĂ©taillĂ©. -- **VulnĂ©rabilitĂ©s connues** -- **Tests de pĂ©nĂ©tration** -- **Audit de code** -- **Recommandations de sĂ©curitĂ©** -- **Plan de remĂ©diation** - -## 🔧 Guides de DĂ©veloppement - -### 🔧 [Guide de DĂ©veloppement](DEVELOPMENT.md) -Guide complet pour le dĂ©veloppement. -- **Environnement de dĂ©veloppement** -- **Workflow de dĂ©veloppement** -- **Standards de code** -- **Debugging et profiling** -- **Optimisation des performances** -- **DĂ©ploiement et CI/CD** - -### 📋 [RĂ©fĂ©rence Rapide](QUICK_REFERENCE.md) -RĂ©fĂ©rence rapide pour les dĂ©veloppeurs. -- **Commandes essentielles** -- **Structure du projet** -- **APIs principales** -- **Configuration rapide** -- **DĂ©pannage rapide** - -### 🔄 [Guide de Migration](MIGRATION.md) -Guide pour les migrations et mises Ă  jour. -- **Migration des versions** -- **Breaking changes** -- **Mise Ă  jour des dĂ©pendances** -- **Migration des donnĂ©es** -- **Tests de migration** - -## 🌐 Guides d'IntĂ©gration - -### đŸ§© [IntĂ©gration iframe](INTEGRATION_IFRAME.md) -SpĂ©cification de messagerie postMessage (requĂȘtes/rĂ©ponses, erreurs, prĂ©requis). - -### 🔑 [Configuration SSH](SSH_USAGE.md) -Guide de configuration SSH pour le dĂ©veloppement. -- **GĂ©nĂ©ration des clĂ©s SSH** -- **Configuration Git** -- **IntĂ©gration avec Gitea** -- **Automatisation des dĂ©ploiements** - -### đŸ€– [Push SSH AutomatisĂ©](AUTO_SSH_PUSH.md) -Guide pour l'automatisation des pushes SSH. -- **Configuration des scripts** -- **IntĂ©gration CI/CD** -- **Gestion des clĂ©s** -- **SĂ©curitĂ© et bonnes pratiques** - -## 📊 État et Monitoring - -### 📊 [RĂ©fĂ©rence rapide](QUICK_REFERENCE.md) -Raccourcis d’accĂšs (commandes, dossiers, URLs) pour dĂ©marrer vite. - - -## 🔧 Guides d'Open Source - -### ✅ [Checklist Open Source](OPEN_SOURCE_CHECKLIST.md) -Checklist complĂšte pour l'ouverture en open source. -- **PrĂ©paration du code** -- **Documentation** -- **Licences et lĂ©gal** -- **Infrastructure** -- **Communication** - -## 📞 Support et Contact - -### 📞 [Support](SUPPORT.md) -Guide de support et contact. -- **Comment obtenir de l'aide** -- **CrĂ©ation d'issues** -- **Canal de communication** -- **FAQ** -- **Ressources additionnelles** - ---- - -## 🎯 Navigation Rapide - -### 🚀 DĂ©marrage Rapide -1. [Installation](INSTALLATION.md) - Installer ihm_client -2. [Configuration](CONFIGURATION.md) - Configurer l'environnement -3. [Utilisation](USAGE.md) - Utiliser l'interface - -### 🔧 DĂ©veloppement -1. [Architecture](ARCHITECTURE.md) - Comprendre l'architecture -2. [API](API.md) - Consulter les APIs -3. [Tests](TESTING.md) - ExĂ©cuter les tests - -### 📚 Documentation -1. [Index](INDEX.md) - Cet index -2. [Quick Reference](QUICK_REFERENCE.md) - RĂ©fĂ©rence rapide -3. [Roadmap](ROADMAP.md) - Évolution du projet - -### đŸ€ CommunautĂ© -1. [Guide CommunautĂ©](COMMUNITY_GUIDE.md) - Contribuer -2. [Code de Conduite](../CODE_OF_CONDUCT.md) - RĂšgles de conduite -3. [Support](SUPPORT.md) - Obtenir de l'aide - ---- - -**📚 Documentation complĂšte pour ihm_client - Interface utilisateur moderne pour les Silent Payments** 🚀 diff --git a/modules/ihm_client/docs/INSTALLATION.md b/modules/ihm_client/docs/INSTALLATION.md deleted file mode 100644 index 078f20ab..00000000 --- a/modules/ihm_client/docs/INSTALLATION.md +++ /dev/null @@ -1,374 +0,0 @@ -# 📩 Guide d'Installation - ihm_client - -Guide complet pour installer et configurer l'interface utilisateur ihm_client pour les Silent Payments. - -## 📋 PrĂ©requis - -### SystĂšme - -- **OS** : Linux (Ubuntu 20.04+, Debian 11+, CentOS 8+), macOS 10.15+, Windows 10+ -- **Architecture** : x86_64, ARM64 (Apple Silicon) -- **RAM** : 4 Go minimum, 8 Go recommandĂ©s -- **Stockage** : 5 Go minimum, 10 Go recommandĂ©s -- **RĂ©seau** : Connexion Internet stable - -### Logiciels - -- **Node.js** : Version 18.0+ (LTS recommandĂ©) -- **npm** : Version 8.0+ -- **Git** : Version 2.25+ -- **Rust** : Version 1.70+ (pour la compilation WASM) -- **Docker** : Version 20.10+ (optionnel, pour l'intĂ©gration 4NK_node) - -## 🚀 Installation - -### 1. Installation de Node.js - -#### Ubuntu/Debian - -```bash -# Mettre Ă  jour les paquets -sudo apt update - -# Installer Node.js via NodeSource -curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - -sudo apt-get install -y nodejs - -# VĂ©rifier l'installation -node --version -npm --version -``` - -#### CentOS/RHEL - -```bash -# Installer Node.js via NodeSource -curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash - -sudo yum install -y nodejs - -# VĂ©rifier l'installation -node --version -npm --version -``` - -#### macOS - -```bash -# Installer via Homebrew -brew install node@18 - -# Ou tĂ©lĂ©charger depuis nodejs.org -# https://nodejs.org/en/download/ -``` - -#### Windows - -```bash -# TĂ©lĂ©charger et installer depuis -# https://nodejs.org/en/download/ -``` - -### 2. Installation de Rust - -#### Linux/macOS - -```bash -# Installer Rust via rustup -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh - -# Recharger l'environnement -source ~/.cargo/env - -# VĂ©rifier l'installation -rustc --version -cargo --version -``` - -#### Windows - -```bash -# TĂ©lĂ©charger et installer rustup depuis -# https://rustup.rs/ -``` - -### 3. Installation de wasm-pack - -```bash -# Installer wasm-pack -cargo install wasm-pack - -# VĂ©rifier l'installation -wasm-pack --version -``` - -### 4. Configuration SSH (RecommandĂ©) - -```bash -# GĂ©nĂ©rer une clĂ© SSH -ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_ihm -C "ihm-client-automation" - -# Ajouter Ă  l'agent SSH -ssh-add ~/.ssh/id_ed25519_ihm - -# Configurer Git pour utiliser la clĂ© -git config --global core.sshCommand "ssh -i ~/.ssh/id_ed25519_ihm" - -# Afficher la clĂ© publique pour Gitea -cat ~/.ssh/id_ed25519_ihm.pub -``` - -**Ajouter la clĂ© publique Ă  Gitea :** -1. Aller sur Gitea > Settings > SSH Keys -2. Coller la clĂ© publique -3. Cliquer sur "Add key" - -### 5. Clonage du Repository - -```bash -# Cloner avec SSH (recommandĂ©) -git clone git@git.4nkweb.com:4nk/ihm_client.git -cd ihm_client - -# Ou cloner avec HTTPS -git clone https://git.4nkweb.com/4nk/ihm_client.git -cd ihm_client -``` - -### 6. Installation des DĂ©pendances - -```bash -# Installer les dĂ©pendances Node.js -npm install - -# VĂ©rifier l'installation -npm list --depth=0 -``` - -### 7. Configuration des DĂ©pendances WASM - -```bash -# Configurer les dĂ©pendances distantes (sdk_client, sdk_common) -./scripts/setup-remote-deps.sh - -# VĂ©rifier la compilation WASM -ls -la pkg/ -``` - -## 🔧 Configuration - -### Variables d'Environnement - -CrĂ©er un fichier `.env` Ă  la racine du projet : - -```bash -# Configuration de dĂ©veloppement -NODE_ENV=development -VITE_DEV_SERVER_PORT=3000 -VITE_API_URL=http://localhost:8091 -VITE_WS_URL=ws://localhost:8090 - -# Configuration WASM -VITE_WASM_PATH=./pkg/sdk_client_bg.wasm - -# Configuration pour l'intĂ©gration 4NK_node -SDK_RELAY_WS_URL=ws://sdk_relay_1:8090 -SDK_RELAY_HTTP_URL=http://sdk_relay_1:8091 -BITCOIN_RPC_URL=http://bitcoin:18443 -BLINDBIT_URL=http://blindbit:8000 -``` - -### Configuration TypeScript - -Le fichier `tsconfig.json` est dĂ©jĂ  configurĂ© pour : -- Vue.js 3 -- TypeScript strict -- Support WASM -- Path mapping - -### Configuration Vite - -Le fichier `vite.config.ts` est configurĂ© pour : -- Support WASM -- Hot module replacement -- Build optimisĂ© -- Support des types TypeScript - -## đŸ§Ș Tests Post-Installation - -### 1. Test de Compilation - -```bash -# Test de compilation TypeScript -npm run build - -# VĂ©rifier le build -ls -la dist/ -``` - -### 2. Test de DĂ©veloppement - -```bash -# DĂ©marrer le serveur de dĂ©veloppement -npm run dev - -# Ouvrir http://localhost:3000 dans le navigateur -``` - -### 3. Test WASM - -```bash -# VĂ©rifier que le module WASM fonctionne -npm run test:wasm -``` - -### 4. Test Complet - -```bash -# ExĂ©cuter tous les tests -npm run test - -# VĂ©rifier la couverture -npm run test:coverage -``` - -## 🚹 DĂ©pannage - -### ProblĂšmes Courants - -#### Node.js non trouvĂ© -```bash -# VĂ©rifier l'installation -which node -node --version - -# RĂ©installer si nĂ©cessaire -curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - -sudo apt-get install -y nodejs -``` - -#### Rust non trouvĂ© -```bash -# VĂ©rifier l'installation -which rustc -rustc --version - -# RĂ©installer si nĂ©cessaire -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source ~/.cargo/env -``` - -#### Erreurs de compilation WASM -```bash -# Nettoyer et recompiler -rm -rf pkg/ -./scripts/setup-remote-deps.sh - -# VĂ©rifier les dĂ©pendances Rust -cd temp-deps/sdk_client -cargo check -``` - -#### Erreurs de dĂ©pendances npm -```bash -# Nettoyer et rĂ©installer -rm -rf node_modules/ package-lock.json -npm install - -# VĂ©rifier les vulnĂ©rabilitĂ©s -npm audit -npm audit fix -``` - -#### ProblĂšmes de permissions -```bash -# Corriger les permissions -sudo chown -R $USER:$USER . -chmod +x scripts/*.sh -``` - -### Logs DĂ©taillĂ©s - -```bash -# Logs de compilation TypeScript -npm run build --verbose - -# Logs de compilation WASM -cd temp-deps/sdk_client -wasm-pack build --target web --out-dir ../../pkg --verbose - -# Logs du serveur de dĂ©veloppement -npm run dev --verbose -``` - -## 🔒 SĂ©curitĂ© - -### VĂ©rifications de SĂ©curitĂ© - -```bash -# Audit des dĂ©pendances npm -npm audit - -# Audit des dĂ©pendances Rust -cargo audit - -# VĂ©rification des vulnĂ©rabilitĂ©s WASM -wasm-pack build --target web --out-dir ../../pkg -``` - -### Bonnes Pratiques - -- Utiliser HTTPS en production -- Valider toutes les entrĂ©es utilisateur -- Maintenir les dĂ©pendances Ă  jour -- Utiliser des variables d'environnement pour les secrets -- Tester rĂ©guliĂšrement la sĂ©curitĂ© - -## 📊 Monitoring - -### MĂ©triques d'Installation - -```bash -# Taille du projet -du -sh . - -# Nombre de fichiers -find . -type f | wc -l - -# DĂ©pendances installĂ©es -npm list --depth=0 | wc -l - -# Taille du module WASM -ls -lh pkg/sdk_client_bg.wasm -``` - -### VĂ©rification de l'Installation - -```bash -# Script de vĂ©rification -./scripts/verify-installation.sh - -# Tests automatisĂ©s -npm run test:installation -``` - -## 🎯 Prochaines Étapes - -AprĂšs l'installation rĂ©ussie : - -1. **Lire le [Guide d'Utilisation](USAGE.md)** - Utiliser l'interface -2. **Consulter l'[Architecture](ARCHITECTURE.md)** - Comprendre le systĂšme -3. **Explorer les [APIs](API.md)** - Utiliser les fonctionnalitĂ©s -4. **Consulter l'[IntĂ©gration iframe](INTEGRATION_IFRAME.md)** - IntĂ©grer dans un site hĂŽte - -## 📞 Support - -En cas de problĂšme : - -1. Consulter la [documentation](INDEX.md) -2. VĂ©rifier les [issues existantes](https://git.4nkweb.com/4nk/ihm_client/issues) -3. CrĂ©er une nouvelle issue avec les dĂ©tails du problĂšme -4. Inclure les logs et la configuration utilisĂ©e - ---- - -**🚀 Installation terminĂ©e ! ihm_client est prĂȘt Ă  ĂȘtre utilisĂ©.** ✹ diff --git a/modules/ihm_client/docs/INTEGRATION_IFRAME.md b/modules/ihm_client/docs/INTEGRATION_IFRAME.md deleted file mode 100644 index 5a510cdf..00000000 --- a/modules/ihm_client/docs/INTEGRATION_IFRAME.md +++ /dev/null @@ -1,156 +0,0 @@ -# IntĂ©gration iframe – SpĂ©cification de messagerie - -Ce document dĂ©finit les Ă©changes entre un site hĂŽte et `ihm_client` intĂ©grĂ© en iframe, via `window.postMessage`. Aucun exemple de code exĂ©cutable n’est inclus. - -## Principes - -- Canal: postMessage entre la page parente et l’iframe `ihm_client`. -- DĂ©couverte: `ihm_client` Ă©met `LISTENING` pour signaler la disponibilitĂ© des listeners (cĂŽtĂ© iframe). En mode E2E (`?e2e=1`) et seulement lorsque l’app tourne en iframe, `LISTENING` est Ă©mis pĂ©riodiquement (jusqu’à 100 fois) pour Ă©viter les courses de tests. Hors E2E, pas d’émission pĂ©riodique. -- SĂ©curitĂ©: - - Utiliser la cible `event.origin` pour les rĂ©ponses. - - De nombreuses opĂ©rations exigent un `accessToken` valide (liĂ© Ă  `origin`). - - `messageId` recommandĂ© pour corrĂ©ler requĂȘtes/rĂ©ponses. -- PrĂ©-requis: pour la plupart des actions de processus, l’appareil doit ĂȘtre appairĂ©. - -## Types de message - -RĂ©fĂ©rence: `src/models/process.model.ts` (enum `MessageType`). - -### LISTENING -- Émis par `ihm_client` au parent pour signaler la disponibilitĂ© des listeners. -- RĂ©ception cĂŽtĂ© parent (aucune requĂȘte attendue). Pas de payload spĂ©cifique. - ---- - -### REQUEST_LINK (RequĂȘte) -- Objet: ouverture d’un consentement utilisateur pour lier l’hĂŽte Ă  l’appareil. -- RequĂȘte (parent → iframe): - - `type`: `REQUEST_LINK` - - `messageId`: string (optionnel mais recommandĂ©) -- RĂ©ponses (iframe → parent): - - SuccĂšs: `type`: `LINK_ACCEPTED`, `accessToken`: string, `refreshToken`: string, `messageId` - - Erreur: `type`: `ERROR`, `error`: string, `messageId` - -### VALIDATE_TOKEN (RequĂȘte) -- Objet: vĂ©rifier la validitĂ© du couple `{accessToken, refreshToken}`. -- RequĂȘte: `type`, `accessToken`, `refreshToken`, `messageId` -- RĂ©ponse: `type`: `VALIDATE_TOKEN`, `isValid`: boolean, `accessToken`, `refreshToken`, `messageId` - -### RENEW_TOKEN (RequĂȘte) -- Objet: obtenir un nouveau `accessToken` depuis un `refreshToken`. -- RequĂȘte: `type`, `refreshToken`, `messageId` -- RĂ©ponses: - - SuccĂšs: `type`: `RENEW_TOKEN`, `accessToken`, `refreshToken`, `messageId` - - Erreur: `ERROR` - ---- - -### CREATE_PAIRING (RequĂȘte) -- Objet: initier l’appairage de l’appareil. -- PrĂ©-requis: `accessToken` valide; appareil non appairĂ©. -- RequĂȘte: `type`, `accessToken`, `messageId` -- RĂ©ponses: - - SuccĂšs: `type`: `PAIRING_CREATED`, `pairingId`: string, `messageId` - - Erreur: `ERROR` - -### GET_PAIRING_ID (RequĂȘte) -- Objet: rĂ©cupĂ©rer l’identifiant d’appairage utilisateur. -- PrĂ©-requis: appairĂ© + `accessToken` valide. -- RequĂȘte: `type`, `accessToken`, `messageId` -- RĂ©ponse: `type`: `GET_PAIRING_ID`, `userPairingId`: string, `messageId` - ---- - -### GET_MY_PROCESSES (RequĂȘte) -- Objet: lister les processus auxquels l’utilisateur participe. -- PrĂ©-requis: appairĂ© + `accessToken` valide. -- RequĂȘte: `type`, `accessToken`, `messageId` -- RĂ©ponse: `type`: `GET_MY_PROCESSES`, `myProcesses`: string[] | null, `messageId` - -### GET_PROCESSES (RequĂȘte) -- Objet: rĂ©cupĂ©rer tous les processus connus localement. -- PrĂ©-requis: appairĂ© + `accessToken` valide. -- RequĂȘte: `type`, `accessToken`, `messageId` -- RĂ©ponse: `type`: `PROCESSES_RETRIEVED`, `processes`: Record, `messageId` - ---- - -### RETRIEVE_DATA (RequĂȘte) -- Objet: dĂ©chiffrer et retourner les attributs autorisĂ©s d’un Ă©tat de processus. -- PrĂ©-requis: appairĂ© + `accessToken` valide. -- RequĂȘte: `type`, `processId`: string, `stateId`: string (32 bytes hex), `accessToken`, `messageId` -- RĂ©ponse: `type`: `DATA_RETRIEVED`, `data`: Record, `messageId` - -### DECODE_PUBLIC_DATA (RequĂȘte) -- Objet: dĂ©coder des donnĂ©es publiques encodĂ©es. -- PrĂ©-requis: appairĂ© + `accessToken` valide. -- RequĂȘte: `type`, `accessToken`, `encodedData`: number[], `messageId` -- RĂ©ponse: `type`: `PUBLIC_DATA_DECODED`, `decodedData`: any, `messageId` - ---- - -### CREATE_PROCESS (RequĂȘte) -- Objet: crĂ©er un nouveau processus. -- PrĂ©-requis: appairĂ© + `accessToken` valide. -- RequĂȘte: - - `type` - - `processData`: Record (donnĂ©es brutes Ă  rĂ©partir en public/privĂ©) - - `privateFields`: string[] (liste des nouveaux champs Ă  forcer en privĂ©) - - `roles`: Record - - `accessToken`, `messageId` -- RĂ©ponse succĂšs: `type`: `PROCESS_CREATED`, `processCreated`: { `processId`: string, `process`: Process, `processData`: Record }, `messageId` -- RĂ©ponse erreur: `ERROR` - -### UPDATE_PROCESS (RequĂȘte) -- Objet: crĂ©er un nouvel Ă©tat avec des mises Ă  jour (champs publics/privĂ©s dĂ©terminĂ©s automatiquement, `privateFields` pour les nouveaux champs privĂ©s). -- PrĂ©-requis: appairĂ© + `accessToken` valide + processus existant avec Ă©tat committĂ©. -- RequĂȘte: `type`, `processId`, `newData`: Record, `privateFields`: string[], `roles` (ou null pour conserver), `accessToken`, `messageId` -- RĂ©ponse: `type`: `PROCESS_UPDATED`, `updatedProcess`: Process, `messageId` - ---- - -### NOTIFY_UPDATE (RequĂȘte) -- Objet: demander l’émission d’un PRD Update pour un Ă©tat prĂ©cis. -- PrĂ©-requis: appairĂ© + `accessToken` valide. -- RequĂȘte: `type`, `processId`, `stateId` (32 bytes hex), `accessToken`, `messageId` -- RĂ©ponse: `type`: `UPDATE_NOTIFIED`, `messageId` - -### VALIDATE_STATE (RequĂȘte) -- Objet: valider un Ă©tat (selon rĂšgles/permissions WASM). -- PrĂ©-requis: appairĂ© + `accessToken` valide. -- RequĂȘte: `type`, `processId`, `stateId` (32 bytes hex), `accessToken`, `messageId` -- RĂ©ponse: `type`: `STATE_VALIDATED`, `validatedProcess`: Process, `messageId` - ---- - -### HASH_VALUE (RequĂȘte) -- Objet: obtenir le hash d’un blob (document) pour un engagement donnĂ©. -- RequĂȘte: `type`, `accessToken`, `commitedIn`: string, `label`: string, `fileBlob`: { type: string; data: Uint8Array }, `messageId` -- RĂ©ponse: `type`: `VALUE_HASHED`, `hash`: string, `messageId` - -### GET_MERKLE_PROOF (RequĂȘte) -- Objet: rĂ©cupĂ©rer la preuve Merkle d’un attribut dans un Ă©tat. -- RequĂȘte: `type`, `accessToken`, `processState`: ProcessState, `attributeName`: string, `messageId` -- RĂ©ponse: `type`: `MERKLE_PROOF_RETRIEVED`, `proof`: MerkleProofResult, `messageId` - -### VALIDATE_MERKLE_PROOF (RequĂȘte) -- Objet: valider une preuve Merkle pour un document donnĂ©. -- RequĂȘte: `type`, `accessToken`, `merkleProof`: string (JSON sĂ©rialisĂ©), `documentHash`: string, `messageId` -- RĂ©ponse: `type`: `MERKLE_PROOF_VALIDATED`, `isValid`: boolean, `messageId` - ---- - -## Erreurs communes (`ERROR`) -- Conditions typiques: - - `Device not paired` (opĂ©ration nĂ©cessitant appairage) - - `Invalid or expired session token` - - `Failed to ...` (crĂ©ation/lecture/validation) - - `Invalid state id` / `Process not found` -- Payload gĂ©nĂ©rique: `{ type: 'ERROR', error: string, messageId?: string }` - -## Bonnes pratiques d’intĂ©gration -- Toujours prĂ©ciser et propager `messageId` pour tracer les Ă©changes. -- Conserver `origin` cĂŽtĂ© parent et utiliser la mĂȘme valeur dans les requĂȘtes suivantes. -- Renouveler rĂ©guliĂšrement le `accessToken` via `RENEW_TOKEN`. -- SĂ©parer donnĂ©es publiques/privĂ©es dĂšs la crĂ©ation d’un processus. -- Valider les formats (ids hex 32 bytes, structures de rĂŽles) avant envoi. diff --git a/modules/ihm_client/docs/OPEN_SOURCE_CHECKLIST.md b/modules/ihm_client/docs/OPEN_SOURCE_CHECKLIST.md deleted file mode 100644 index a25b2236..00000000 --- a/modules/ihm_client/docs/OPEN_SOURCE_CHECKLIST.md +++ /dev/null @@ -1,8 +0,0 @@ -# Checklist open source - ihm_client - -- Licence prĂ©sente et valide (LICENSE) -- Code de conduite (CODE_OF_CONDUCT.md) -- Guide de contribution (CONTRIBUTING.md) -- CI/CD documentĂ©e -- Documentation technique et utilisateur Ă  jour -- Aucune donnĂ©e sensible dans le dĂ©pĂŽt diff --git a/modules/ihm_client/docs/QUICK_REFERENCE.md b/modules/ihm_client/docs/QUICK_REFERENCE.md deleted file mode 100644 index 204ba93c..00000000 --- a/modules/ihm_client/docs/QUICK_REFERENCE.md +++ /dev/null @@ -1,5 +0,0 @@ -# RĂ©fĂ©rence rapide - ihm_client - -- Commandes: install, dev, build, test, test:e2e -- Dossiers clĂ©s: src/, pkg/, docs/ -- URLs: dev 3003, app servi par 4NK_node (artefacts dist/) diff --git a/modules/ihm_client/docs/RELEASE_PLAN.md b/modules/ihm_client/docs/RELEASE_PLAN.md deleted file mode 100644 index b0632459..00000000 --- a/modules/ihm_client/docs/RELEASE_PLAN.md +++ /dev/null @@ -1,5 +0,0 @@ -# Plan de release - ihm_client - -- Phases: prĂ©paration, RC, GA -- CritĂšres: tests verts, docs Ă  jour, audit dĂ©pendances -- Communication: notes de version, changelog, guide de migration diff --git a/modules/ihm_client/docs/ROADMAP.md b/modules/ihm_client/docs/ROADMAP.md deleted file mode 100644 index 59bc8671..00000000 --- a/modules/ihm_client/docs/ROADMAP.md +++ /dev/null @@ -1,8 +0,0 @@ -- [ ] Handshake iframe robuste (READY → LISTENING → REQUEST_LINK) avec ACKs - - Objectif: Ă©liminer les conditions de course Ă  l’initialisation - - DĂ©tails: sĂ©quence explicite, timeouts, retry backoff -# Roadmap - ihm_client - -- Court terme: stabilisation iframe, optimisation WASM -- Moyen terme: E2E tests, PWA, performances -- Long terme: analytics, nouvelles intĂ©grations diff --git a/modules/ihm_client/docs/SECURITY_AUDIT.md b/modules/ihm_client/docs/SECURITY_AUDIT.md deleted file mode 100644 index 65be744f..00000000 --- a/modules/ihm_client/docs/SECURITY_AUDIT.md +++ /dev/null @@ -1,25 +0,0 @@ -# Audit de sĂ©curitĂ© - ihm_client - -Ce document synthĂ©tise la posture de sĂ©curitĂ©, les contrĂŽles, et les axes d’audit pour `ihm_client`. - -## PortĂ©e -- Surface frontend (TypeScript, Vite, dĂ©pendances npm) -- IntĂ©gration WASM (sdk_client) -- Messagerie iframe (`postMessage`) avec sites hĂŽtes - -## ContrĂŽles actuels -- Validation et renouvellement de tokens de session liĂ©s Ă  l’origine appelante -- Isolation des donnĂ©es privĂ©es (dĂ©chiffrement conditionnĂ©, clĂ©s requises) -- Aucune exposition de secrets runtime dans le code - -## Axes d’audit -- DĂ©pendances: revue `npm audit`, vĂ©rification des transitive deps -- WASM: taille, init sĂ©curisĂ©, absence d’APIs dangereuses -- Iframe: vĂ©rification stricte des `origin`, absence d’élĂ©vation via messages - -## VulnĂ©rabilitĂ©s connues -- Aucune critique ouverte Ă  date - -## Plan de remĂ©diation -- Mise Ă  jour rĂ©guliĂšre des dĂ©pendances -- Tests de sĂ©curitĂ© ciblĂ©s cĂŽtĂ© messagerie et dĂ©codage de donnĂ©es diff --git a/modules/ihm_client/docs/SSH_USAGE.md b/modules/ihm_client/docs/SSH_USAGE.md deleted file mode 100644 index babd0259..00000000 --- a/modules/ihm_client/docs/SSH_USAGE.md +++ /dev/null @@ -1,322 +0,0 @@ -# Documentation SSH complĂšte - ihm_client - -## Vue d'ensemble - -Ce document consolide toute la documentation SSH pour le projet `ihm_client`, couvrant l'automatisation des push, la configuration CI/CD, et les bonnes pratiques de sĂ©curitĂ©. - -## Table des matiĂšres - -- [Configuration automatique](#configuration-automatique) -- [Scripts d'automatisation](#scripts-dautomatisation) -- [Workflow CI/CD](#workflow-cicd) -- [Alias Git](#alias-git) -- [Bonnes pratiques](#bonnes-pratiques) -- [DĂ©pannage](#dĂ©pannage) - ---- - -## Configuration automatique - -### Configuration Git globale - -La configuration SSH est automatiquement appliquĂ©e pour tous les push : - -```bash -git config --global url."git@git.4nkweb.com:".insteadOf "https://git.4nkweb.com/" -``` - -### VĂ©rification SSH - -Test automatique de la connexion SSH : - -```bash -ssh -T git@git.4nkweb.com -``` - ---- - -## Scripts d'automatisation - -### 1. Script principal : `auto-ssh-push.sh` - -Le script `scripts/auto-ssh-push.sh` offre plusieurs modes de push automatique : - -#### Options disponibles - -```bash -# Push rapide (message automatique) -./scripts/auto-ssh-push.sh quick - -# Push avec message personnalisĂ© -./scripts/auto-ssh-push.sh message "feat: nouvelle fonctionnalitĂ©" - -# Push sur une branche spĂ©cifique -./scripts/auto-ssh-push.sh branch feature/nouvelle-fonctionnalite - -# Push et merge (avec confirmation) -./scripts/auto-ssh-push.sh merge - -# VĂ©rification du statut -./scripts/auto-ssh-push.sh status -``` - -#### FonctionnalitĂ©s - -- **Configuration SSH automatique** - Plus besoin de configurer SSH manuellement -- **Push automatique** - Ajout, commit et push en une commande -- **Gestion des branches** - Support des branches personnalisĂ©es -- **VĂ©rification SSH** - Test automatique de la connexion SSH -- **Messages de commit** - Messages automatiques ou personnalisĂ©s - -### 2. Script d'initialisation : `init-ssh-env.sh` - -Le script `scripts/init-ssh-env.sh` configure automatiquement l'environnement SSH : - -```bash -./scripts/init-ssh-env.sh -``` - -#### FonctionnalitĂ©s - -- VĂ©rification de l'environnement de dĂ©veloppement -- Configuration SSH automatique -- Test de connectivitĂ© SSH -- Configuration des alias Git -- Validation de la configuration - -### 3. Script CI/CD : `setup-ssh-ci.sh` - -Le script `scripts/setup-ssh-ci.sh` configure SSH pour les environnements CI/CD : - -```bash -./scripts/setup-ssh-ci.sh -``` - -#### FonctionnalitĂ©s - -- DĂ©tection automatique de l'environnement CI -- Configuration SSH pour Gitea Actions -- Gestion des clĂ©s SSH privĂ©es -- Test de connexion SSH -- Configuration Git pour SSH - ---- - -## Workflow CI/CD - -### Configuration Gitea Actions - -Le workflow CI/CD dans `.gitea/workflows/ci.yml` inclut une Ă©tape de configuration SSH : - -```yaml -- name: Setup SSH for Gitea - run: | - mkdir -p ~/.ssh - echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa - ssh-keyscan -H git.4nkweb.com >> ~/.ssh/known_hosts - git config --global url."git@git.4nkweb.com:".insteadOf "https://git.4nkweb.com/" -``` - -### Variables d'environnement requises - -- `SSH_PRIVATE_KEY` : ClĂ© SSH privĂ©e pour l'authentification -- `SSH_PUBLIC_KEY` : ClĂ© SSH publique (optionnelle) - -### Jobs configurĂ©s - -- **test** : Tests unitaires et d'intĂ©gration -- **security** : Tests de sĂ©curitĂ© et audit -- **integration-test** : Tests d'intĂ©gration complets - ---- - -## Alias Git - -### Alias configurĂ©s - -```bash -# Push rapide avec message automatique -git quick-push - -# Push avec message personnalisĂ© -git ssh-push "Mon message de commit" -``` - -### Configuration des alias - -```bash -# Alias pour push rapide -git config --global alias.quick-push '!f() { git add . && git commit -m "Update $(date)" && git push origin $(git branch --show-current); }; f' - -# Alias pour push avec message -git config --global alias.ssh-push '!f() { git add . && git commit -m "${1:-Auto-commit $(date)}" && git push origin $(git branch --show-current); }; f' -``` - ---- - -## Bonnes pratiques - -### SĂ©curitĂ© - -1. **Permissions des clĂ©s SSH** - ```bash - chmod 600 ~/.ssh/id_rsa - chmod 644 ~/.ssh/id_rsa.pub - chmod 600 ~/.ssh/config - ``` - -2. **Configuration SSH sĂ©curisĂ©e** - ```bash - Host git.4nkweb.com - HostName git.4nkweb.com - User git - IdentityFile ~/.ssh/id_rsa - StrictHostKeyChecking no - UserKnownHostsFile=/dev/null - ``` - -3. **Gestion des secrets** - - Ne jamais commiter de clĂ©s SSH dans le code - - Utiliser les secrets Gitea pour les clĂ©s privĂ©es - - Rotation rĂ©guliĂšre des clĂ©s SSH - -### Workflow recommandĂ© - -1. **Initialisation** - ```bash - ./scripts/init-ssh-env.sh - ``` - -2. **DĂ©veloppement quotidien** - ```bash - # Push rapide - ./scripts/auto-ssh-push.sh quick - - # Ou avec alias Git - git quick-push - ``` - -3. **Push avec message** - ```bash - ./scripts/auto-ssh-push.sh message "feat: nouvelle fonctionnalitĂ©" - ``` - ---- - -## DĂ©pannage - -### ProblĂšmes courants - -#### 1. Échec d'authentification SSH - -```bash -# VĂ©rifier la configuration SSH -ssh -T git@git.4nkweb.com - -# VĂ©rifier les permissions -ls -la ~/.ssh/ - -# RĂ©gĂ©nĂ©rer la clĂ© SSH si nĂ©cessaire -ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_4nk -``` - -#### 2. Configuration Git incorrecte - -```bash -# VĂ©rifier la configuration Git -git config --global --list | grep url - -# Reconfigurer SSH -git config --global url."git@git.4nkweb.com:".insteadOf "https://git.4nkweb.com/" -``` - -#### 3. ProblĂšmes CI/CD - -```bash -# VĂ©rifier les variables d'environnement -echo $SSH_PRIVATE_KEY - -# Tester la configuration SSH -./scripts/setup-ssh-ci.sh -``` - -### Messages d'erreur courants - -- **"Permission denied"** : VĂ©rifier les permissions des clĂ©s SSH -- **"Host key verification failed"** : Ajouter l'hĂŽte aux known_hosts -- **"Could not resolve hostname"** : VĂ©rifier la connectivitĂ© rĂ©seau - -### Logs et debugging - -```bash -# Activer le debug SSH -ssh -vT git@git.4nkweb.com - -# VĂ©rifier les logs Git -GIT_SSH_COMMAND="ssh -v" git push origin main -``` - ---- - -## IntĂ©gration avec 4NK_node - -### Configuration pour l'intĂ©gration - -Le projet `ihm_client` est configurĂ© pour s'intĂ©grer dans l'infrastructure `4NK_node` : - -1. **Script d'intĂ©gration** : `scripts/integrate-4nk-node.sh` -2. **Configuration Docker** : `Dockerfile.4nk-node` -3. **Configuration Nginx** : gĂ©rĂ©e dans `4NK_node` (consommation de `dist/`) -4. **Script de dĂ©marrage** : `start-4nk-node.sh` - -### Workflow d'intĂ©gration - -```bash -# IntĂ©grer ihm_client dans 4NK_node -./scripts/integrate-4nk-node.sh - -# VĂ©rifier l'intĂ©gration -docker-compose -f docker-compose.4nk-node.yml up -d -``` - ---- - -## Évolution future - -### AmĂ©liorations prĂ©vues - -1. **Support multi-environnements** - - Configuration automatique pour diffĂ©rents environnements - - Gestion des clĂ©s SSH multiples - -2. **IntĂ©gration avancĂ©e** - - Support des hooks Git - - IntĂ©gration avec d'autres outils CI/CD - -3. **SĂ©curitĂ© renforcĂ©e** - - Support des clĂ©s SSH temporaires - - Audit automatique des permissions - -### Maintenance - -- VĂ©rification rĂ©guliĂšre de la configuration SSH -- Mise Ă  jour des scripts d'automatisation -- Documentation des nouvelles fonctionnalitĂ©s - ---- - -## Conclusion - -L'automatisation SSH pour `ihm_client` simplifie considĂ©rablement le workflow de dĂ©veloppement en Ă©liminant la nĂ©cessitĂ© de configurer manuellement SSH pour chaque opĂ©ration Git. Les scripts et alias fournis offrent une interface simple et sĂ©curisĂ©e pour tous les push vers le repository. - -### Ressources - -- [Documentation SSH officielle](https://git-scm.com/book/fr/v2/Git-sur-le-serveur-GĂ©nĂ©ration-d-une-clĂ©-SSH) -- [Guide Gitea SSH](https://docs.gitea.com/usage/ssh-setup) -- [Bonnes pratiques SSH](https://www.ssh.com/academy/ssh/key) - ---- - -**DerniĂšre mise Ă  jour** : $(date '+%Y-%m-%d') -**Version** : 1.0.0 diff --git a/modules/ihm_client/docs/TESTING.md b/modules/ihm_client/docs/TESTING.md deleted file mode 100644 index cee142c9..00000000 --- a/modules/ihm_client/docs/TESTING.md +++ /dev/null @@ -1,51 +0,0 @@ -# Tests - ihm_client - -Cette page dĂ©crit la stratĂ©gie de test, l’outillage et les conventions. Aucun exemple exĂ©cutable n’est inclus. - -## PĂ©rimĂštre et objectifs - -- Couverture des utilitaires (hex/binaire, DOM, adresses → emojis). -- Couverture des services isolables (`TokenService`). -- Non-rĂ©gression des conversions et des invariants d’API. - -## Outils - -- Test runner: Jest 29 (environnement `jsdom`). -- TypeScript: `ts-jest` (transform TS). -- Setup global: `tests/setup.ts` (polyfills Web, mocks rĂ©seau et stockage). -- E2E: Playwright (Chromium headless) avec `playwright.config.ts`. - -## Organisation - -- `tests/unit/` : tests unitaires ciblĂ©s, rapides. -- `tests/integration/` : rĂ©servĂ© aux interactions WASM/services (Ă  complĂ©ter si besoin). -- `tests/e2e/` : tests de bout en bout (smoke tests). - -## ExĂ©cution - -- Lancer tous les tests: `npm run test` -- Couverture: `npm run test:coverage` -- Veille interactive: `npm run test:watch` -- E2E: `npm run e2e:install` puis `npm run test:e2e` - -## Conventions - -- Un test = un invariant mĂ©tier/technique. -- Mocks minimaux, privilĂ©gier l’isolation des dĂ©pendances (ex. `jose` mockĂ©). -- Aucun exemple de code applicatif dans la documentation. - -## Polyfills et mocks de test - -- `TextEncoder`/`TextDecoder` via `util`. -- `crypto.subtle.digest` faux pour hashing dĂ©terministe en test d’emojis. -- `fetch`, `WebSocket`, `localStorage`, `sessionStorage` mockĂ©s. - -## CritĂšres d’acceptation - -- 100% vert sur la suite unitaire. -- Build TypeScript OK (`npm run build:dist`) avant commit. - -## Rapports - -- Rapport couverture: `coverage/` (text, lcov, html). -- Logs de tests: sortie Jest standard. diff --git a/modules/ihm_client/docs/USAGE.md b/modules/ihm_client/docs/USAGE.md deleted file mode 100644 index 1c26a4c5..00000000 --- a/modules/ihm_client/docs/USAGE.md +++ /dev/null @@ -1,423 +0,0 @@ -# 📖 Guide d'Utilisation - ihm_client - -Guide complet pour utiliser l'interface utilisateur ihm_client au quotidien. - -## 🚀 DĂ©marrage Rapide - -### DĂ©marrage du Serveur de DĂ©veloppement - -```bash -# DĂ©marrer le serveur de dĂ©veloppement -npm run dev - -# Le serveur dĂ©marre sur http://localhost:3000 -# Hot reload activĂ© pour le dĂ©veloppement -``` - -### AccĂšs Ă  l'Interface - -1. **Ouvrir le navigateur** : http://localhost:3000 -2. **Page d'accueil** : Vue d'ensemble et navigation -3. **Connexion** : Via adresse device ou QR code - -## 🏠 Page d'Accueil - -### Navigation Principale - -- **🏠 Accueil** - Vue d'ensemble et navigation -- **đŸ‘€ Compte** - Gestion du profil utilisateur - -### Tableau de Bord - -- **Statistiques personnelles** : Processus actifs, documents signĂ©s -- **Notifications rĂ©centes** : Alertes et mises Ă  jour -- **Actions rapides** : CrĂ©er un processus, scanner QR code -- **État du wallet** : Solde et transactions rĂ©centes - -## đŸ‘€ Gestion du Compte - -### Profil Utilisateur - -#### AccĂšs au Profil -1. Cliquer sur la bulle de profil en haut Ă  gauche -2. Popup de profil s'ouvre avec les informations personnelles - -#### Informations Modifiables -- **Nom et prĂ©nom** : Éditer directement dans les champs -- **Photo de profil** : Cliquer pour changer l'image -- **Email** : Adresse de contact (lecture seule) -- **Adresse device** : Identifiant unique (lecture seule) - -#### Actions du Profil - -##### Export User Data -```bash -# GĂ©nĂšre un fichier JSON avec toutes les donnĂ©es utilisateur -# Inclut : profil, processus, documents, wallet -``` - -##### Export Recovery -```bash -# GĂ©nĂšre les 4 mots de rĂ©cupĂ©ration -# IMPORTANT : Noter et conserver en lieu sĂ»r -# Le bouton devient inaccessible aprĂšs utilisation -``` - -##### Delete Account -```bash -# Supprime dĂ©finitivement le compte -# Demande de confirmation obligatoire -# Action irrĂ©versible -``` - -##### Logout -```bash -# DĂ©connexion de l'interface -# Retour Ă  la page de connexion -``` - -### Onglet Pairing - -#### Ajouter un Device -1. Cliquer sur "Add Device" -2. Choisir la mĂ©thode : - - **Scanner QR Code** : Scanner le code d'un autre device - - **Saisir manuellement** : Entrer l'adresse device - -#### GĂ©rer les Devices -- **Renommer** : Cliquer sur le nom pour l'Ă©diter -- **Supprimer** : Cliquer sur l'icĂŽne poubelle -- **Statut** : En ligne/hors ligne - -#### Scanner QR Code -1. Cliquer sur "Scan QR Code" -2. Autoriser l'accĂšs Ă  la camĂ©ra -3. Pointer vers le QR code -4. Confirmation automatique - -### Onglet Wallet - -#### Gestion des Wallets -- **Voir le solde** : Affichage en temps rĂ©el -- **Ajouter une ligne** : Nouveau wallet Silent Payment -- **Historique** : Transactions rĂ©centes -- **DĂ©tails** : Cliquer pour plus d'informations - -#### OpĂ©rations Wallet -```bash -# GĂ©nĂ©rer un nouveau wallet -generate_sp_wallet() - -# Verrouiller des UTXOs -lock_freezed_utxos(wallet, utxos) - -# Scanner des blocs -scan_blocks(wallet, blocks) -``` - -### Onglet Process - -#### Processus Disponibles -- **Liste des processus** : Tous les processus accessibles -- **Notifications** : Cliquer sur la sonnette pour voir les alertes -- **Statut** : Actif, en attente, terminĂ© -- **Actions** : Voir, modifier, supprimer - -#### CrĂ©er un Processus -1. Cliquer sur "Nouveau Processus" -2. Remplir les informations : - - **Nom** : Nom du processus - - **Description** : DĂ©tails du processus - - **Membres** : Ajouter des participants - - **RĂŽles** : DĂ©finir les responsabilitĂ©s -3. Valider la crĂ©ation - -### Onglet Data - -#### DonnĂ©es ImportĂ©es -- **Liste des donnĂ©es** : Fichiers JSON importĂ©s -- **Contrats associĂ©s** : Cliquer pour voir le contrat -- **Statut** : ValidĂ©, en cours, rejetĂ© -- **Actions** : Voir, modifier, supprimer - -## 📄 Gestion des Processus - -### Vue d'Ensemble - -#### Onglets du Processus -- **📋 Informations** : DĂ©tails du processus -- **đŸ‘„ Membres** : Participants et rĂŽles -- **📁 Documents** : Fichiers associĂ©s -- **✍ Signatures** : Demandes de signature -- **💬 Chat** : Communication interne - -### Gestion des Membres - -#### Ajouter un Membre -1. Cliquer sur "Ajouter Membre" -2. Choisir la mĂ©thode : - - **Scanner QR Code** : Invitation directe - - **Envoyer un lien** : Lien d'invitation - - **Saisir l'adresse** : Adresse device manuelle - -#### Assigner des RĂŽles -1. SĂ©lectionner un membre -2. Cliquer sur "Assigner RĂŽle" -3. Choisir le rĂŽle : - - **Admin** : Gestion complĂšte - - **Signataire** : Peut signer des documents - - **Lecteur** : Lecture seule - - **Custom** : RĂŽle personnalisĂ© - -### Gestion des Documents - -#### Importer un Document -1. Cliquer sur "Importer Document" -2. Choisir le fichier (PDF, DOC, etc.) -3. Remplir les mĂ©tadonnĂ©es : - - **Nom** : Nom du document - - **Description** : DĂ©tails du document - - **RĂŽles requis** : Qui doit signer -4. Valider l'import - -#### Organiser les Documents -- **Dossiers** : CrĂ©er des dossiers pour organiser -- **Tags** : Ajouter des Ă©tiquettes -- **Recherche** : Filtrer par nom, type, statut -- **Tri** : Par date, nom, taille - -## ✍ SystĂšme de Signatures - -### Demandes de Signature - -#### CrĂ©er une Demande -1. Aller dans l'onglet "Signatures" -2. Cliquer sur "Nouvelle Demande" -3. Remplir les informations : - - **Document** : SĂ©lectionner le document - - **Signataires** : Choisir les participants - - **Description** : DĂ©tails de la demande - - **Date limite** : ÉchĂ©ance de signature - - **VisibilitĂ©** : Publique ou privĂ©e -4. Valider la crĂ©ation - -#### GĂ©rer les Demandes -- **En attente** : Demandes non signĂ©es -- **SignĂ©es** : Demandes complĂ©tĂ©es -- **ExpirĂ©es** : Demandes dĂ©passĂ©es -- **Actions** : Voir, modifier, annuler - -### Signer un Document - -#### Processus de Signature -1. Recevoir une notification de demande -2. Cliquer sur "Voir la demande" -3. PrĂ©visualiser le document -4. Cliquer sur "Signer" -5. Confirmer la signature - -#### Types de Signature -- **Signature Ă©lectronique** : Signature numĂ©rique -- **Signature biomĂ©trique** : Empreinte digitale -- **Signature par mot de passe** : Code secret - -## 💬 SystĂšme de Chat - -### Communication Interne - -#### AccĂšs au Chat -1. Aller dans l'onglet "Chat" -2. SĂ©lectionner le processus -3. Voir les conversations - -#### Envoyer un Message -1. SĂ©lectionner un utilisateur ou groupe -2. Taper le message -3. Cliquer sur "Envoyer" - -#### Types de Messages -- **Texte** : Messages simples -- **Documents** : Fichiers partagĂ©s -- **Images** : Captures d'Ă©cran -- **Liens** : URLs partagĂ©es - -### Notifications - -#### Types de Notifications -- **Messages** : Nouveaux messages reçus -- **Signatures** : Demandes de signature -- **Processus** : Mises Ă  jour de processus -- **SystĂšme** : Alertes systĂšme - -#### Gestion des Notifications -- **Marquer comme lu** : Cliquer sur la notification -- **RĂ©pondre** : RĂ©pondre directement -- **Ignorer** : Masquer la notification -- **ParamĂštres** : Configurer les alertes - -## 🔗 SystĂšme de Pairing - -### Connexion avec d'Autres Utilisateurs - -#### MĂ©thodes de Pairing -1. **QR Code** : Scanner le code d'un autre device -2. **Lien d'invitation** : Envoyer un lien -3. **Adresse manuelle** : Saisir l'adresse device - -#### Processus de Pairing -1. **Initiative** : Un utilisateur initie la connexion -2. **Confirmation** : L'autre utilisateur confirme -3. **Établissement** : La connexion est Ă©tablie -4. **VĂ©rification** : Test de communication - -#### Gestion des Connexions -- **Connexions actives** : Devices connectĂ©s -- **Demandes en attente** : Invitations non acceptĂ©es -- **Historique** : Connexions passĂ©es -- **Actions** : DĂ©connecter, renommer, supprimer - -## 🔔 Notifications et Alertes - -### Centre de Notifications - -#### AccĂšs aux Notifications -- **IcĂŽne cloche** : En haut Ă  droite -- **Compteur** : Nombre de notifications non lues -- **Liste** : Toutes les notifications - -#### Types d'Alertes -- **Urgentes** : Rouge, action immĂ©diate requise -- **Importantes** : Orange, attention requise -- **Informatives** : Bleu, information gĂ©nĂ©rale -- **SuccĂšs** : Vert, confirmation d'action - -### Configuration des Notifications - -#### ParamĂštres -1. Aller dans "ParamĂštres" > "Notifications" -2. Configurer par type : - - **Messages** : Notifications de chat - - **Signatures** : Demandes de signature - - **Processus** : Mises Ă  jour - - **SystĂšme** : Alertes systĂšme - -#### PrĂ©fĂ©rences -- **Son** : Activer/dĂ©sactiver les sons -- **Pop-up** : Notifications en pop-up -- **Email** : Notifications par email -- **Push** : Notifications push (si supportĂ©) - -## đŸ› ïž FonctionnalitĂ©s AvancĂ©es - -### Recherche Globale - -#### Utilisation -1. Cliquer sur l'icĂŽne de recherche -2. Taper le terme recherchĂ© -3. Voir les rĂ©sultats : - - **Processus** : Processus correspondants - - **Documents** : Documents correspondants - - **Messages** : Messages correspondants - - **Utilisateurs** : Utilisateurs correspondants - -### Filtres et Tri - -#### Filtres Disponibles -- **Date** : Filtrer par pĂ©riode -- **Type** : Filtrer par type de contenu -- **Statut** : Filtrer par statut -- **Utilisateur** : Filtrer par utilisateur - -#### Options de Tri -- **Date** : Plus rĂ©cent/ancien -- **Nom** : AlphabĂ©tique -- **Taille** : Plus grand/petit -- **Statut** : PrioritĂ© des statuts - -### Export et Sauvegarde - -#### Exporter des DonnĂ©es -```bash -# Export complet du profil -Export User Data > JSON - -# Export des processus -Processus > Exporter > CSV - -# Export des documents -Documents > Exporter > ZIP -``` - -#### Sauvegarde Automatique -- **Sauvegarde locale** : DonnĂ©es stockĂ©es localement -- **Synchronisation** : Synchronisation avec le serveur -- **RĂ©cupĂ©ration** : Restauration des donnĂ©es - -## 🚹 DĂ©pannage - -### ProblĂšmes Courants - -#### Interface ne se charge pas -```bash -# VĂ©rifier le serveur -npm run dev - -# VĂ©rifier les logs -npm run dev --verbose - -# Nettoyer le cache -npm run clean -``` - -#### Module WASM non trouvĂ© -```bash -# Recompiler le module WASM -./scripts/setup-remote-deps.sh - -# VĂ©rifier le fichier -ls -la pkg/sdk_client_bg.wasm -``` - -#### Erreurs de connexion -```bash -# VĂ©rifier les variables d'environnement -cat .env - -# Tester la connectivitĂ© -npm run test:connectivity -``` - -### Support Utilisateur - -#### Obtenir de l'Aide -1. **Documentation** : Consulter ce guide -2. **FAQ** : Questions frĂ©quentes -3. **Support** : Contacter l'Ă©quipe -4. **Issues** : Signaler un problĂšme - -#### Signaler un Bug -1. Aller sur [Issues](https://git.4nkweb.com/4nk/ihm_client/issues) -2. CrĂ©er une nouvelle issue -3. DĂ©crire le problĂšme : - - **Étapes** : Comment reproduire - - **Comportement** : Ce qui se passe - - **Attendu** : Ce qui devrait se passer - - **Environnement** : OS, navigateur, version - -## 📊 MĂ©triques d'Utilisation - -### Statistiques Personnelles -- **Processus créés** : Nombre de processus -- **Documents signĂ©s** : Nombre de signatures -- **Messages envoyĂ©s** : Communication -- **Temps d'utilisation** : Temps passĂ© - -### Performance -- **Temps de chargement** : Vitesse de l'interface -- **Temps de rĂ©ponse** : RĂ©activitĂ© -- **Utilisation mĂ©moire** : Consommation RAM -- **Taille des donnĂ©es** : Stockage utilisĂ© - ---- - -**🎯 Interface utilisateur ihm_client - PrĂȘte pour une utilisation quotidienne !** ✹ diff --git a/modules/ihm_client/index.html b/modules/ihm_client/index.html deleted file mode 100755 index a320cb64..00000000 --- a/modules/ihm_client/index.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - 4NK Application - - -
-
- -
- - - - \ No newline at end of file diff --git a/modules/ihm_client/jest.config.js b/modules/ihm_client/jest.config.js deleted file mode 100644 index 7cbaf7fa..00000000 --- a/modules/ihm_client/jest.config.js +++ /dev/null @@ -1,34 +0,0 @@ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'jsdom', - roots: ['/src', '/tests'], - testMatch: [ - '**/__tests__/**/*.ts', - '**/?(*.)+(spec|test).ts' - ], - transform: { - '^.+\\.ts$': 'ts-jest', - }, - collectCoverageFrom: [ - 'src/**/*.ts', - '!src/**/*.d.ts', - '!src/main.ts', - '!src/vite-env.d.ts' - ], - coverageDirectory: 'coverage', - coverageReporters: ['text', 'lcov', 'html'], - setupFilesAfterEnv: ['/tests/setup.ts'], - moduleNameMapper: { - '^@/(.*)$': '/src/$1', - '^~/(.*)$': '/src/$1', - '^pkg/(.*)$': '/pkg/$1', - '^(.*)\\?raw$': '/tests/rawFileMock.js', - '\\.(css|less|sass|scss)$': '/tests/styleMock.js' - }, - testTimeout: 10000, - transform: { - '^.+\\.ts$': ['ts-jest', { - tsconfig: 'tsconfig.json' - }], - } -}; diff --git a/modules/ihm_client/nginx.conf b/modules/ihm_client/nginx.conf deleted file mode 100644 index 14cde39f..00000000 --- a/modules/ihm_client/nginx.conf +++ /dev/null @@ -1,16 +0,0 @@ -server { - listen 80; - server_name _; - - root /usr/share/nginx/html; - index index.html; - - location / { - try_files $uri $uri/ /index.html; - } - - location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|webp|wasm)$ { - expires 1y; - add_header Cache-Control "public, immutable"; - } -} diff --git a/modules/ihm_client/package-lock.json b/modules/ihm_client/package-lock.json deleted file mode 100755 index 43ba5e64..00000000 --- a/modules/ihm_client/package-lock.json +++ /dev/null @@ -1,12413 +0,0 @@ -{ - "name": "sdk_client", - "version": "1.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "sdk_client", - "version": "1.1.0", - "license": "ISC", - "dependencies": { - "@angular/elements": "^19.0.1", - "@types/jsonwebtoken": "^9.0.9", - "@types/qrcode": "^1.5.5", - "@vitejs/plugin-react": "^4.3.1", - "@vitejs/plugin-vue": "^5.0.5", - "axios": "^1.11.0", - "html5-qrcode": "^2.3.8", - "jose": "^6.0.13", - "jsonwebtoken": "^9.0.2", - "pdf-lib": "^1.17.1", - "qr-scanner": "^1.4.2", - "qrcode": "^1.5.4", - "sweetalert2": "^11.22.4", - "vite-plugin-copy": "^0.1.6", - "vite-plugin-html": "^3.2.2", - "vite-plugin-wasm": "^3.3.0" - }, - "devDependencies": { - "@playwright/test": "^1.46.0", - "@rollup/plugin-typescript": "^12.1.1", - "@types/jest": "^29.5.12", - "@types/node": "^20.11.24", - "@vitejs/plugin-vue": "^5.0.5", - "copy-webpack-plugin": "^12.0.2", - "html-webpack-plugin": "^5.6.0", - "jest": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", - "prettier": "^3.3.3", - "rimraf": "^6.0.1", - "ts-jest": "^29.1.2", - "ts-loader": "^9.5.1", - "typescript": "^5.3.3", - "vite": "^5.4.11", - "vite-plugin-static-copy": "^1.0.6", - "webpack": "^5.90.3", - "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.2" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@angular/core": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.1.tgz", - "integrity": "sha512-+VpWcg2aC/dY9TM6fsj00enZ6RP5wpRqk/SeRe3UP3Je/n+vWIgHJTb1ZLNeOIvDaE86BhKPMwFS0QVjoEGQFA==", - "peer": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.15.0" - } - }, - "node_modules/@angular/elements": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-19.0.1.tgz", - "integrity": "sha512-HqNZ1DcsT+SVVXrqZIxveZEZiA+1ZeYggNWmh2Z19APyWTMXylkL7Tm4AFdbQItUXZDOVzbjycq8EQ/5Fdvfng==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/core": "19.0.1", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", - "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", - "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helpers": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7", - "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.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", - "dependencies": { - "@babel/types": "^7.24.7", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", - "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", - "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", - "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", - "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.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "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.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "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.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", - "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", - "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", - "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", - "dependencies": { - "@babel/helper-string-parser": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "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/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "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": { - "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/console/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/@jest/console/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/@jest/console/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/@jest/console/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/@jest/console/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/@jest/console/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/@jest/console/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/@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/core/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/@jest/core/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/@jest/core/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/@jest/core/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/@jest/core/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/@jest/core/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/@jest/core/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/@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/reporters/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/@jest/reporters/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/@jest/reporters/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/@jest/reporters/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/@jest/reporters/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/@jest/reporters/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/@jest/reporters/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/reporters/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/@jest/reporters/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/@jest/reporters/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/@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/test-sequencer/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/@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/transform/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/@jest/transform/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/@jest/transform/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/@jest/transform/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/@jest/transform/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/@jest/transform/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/@jest/transform/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/@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/@jest/types/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/@jest/types/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/@jest/types/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/@jest/types/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/@jest/types/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/@jest/types/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/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "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==", - "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==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "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==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jsonjoy.com/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", - "dev": true, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pack": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.0.4.tgz", - "integrity": "sha512-aOcSN4MeAtFROysrbqG137b7gaDDSmVrl5mpo6sT/w+kcXpWnzhMjmY/Fh/sDx26NBxyIE7MB1seqLeCAzy9Sg==", - "dev": true, - "dependencies": { - "@jsonjoy.com/base64": "^1.1.1", - "@jsonjoy.com/util": "^1.1.2", - "hyperdyperid": "^1.2.0", - "thingies": "^1.20.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/util": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.2.0.tgz", - "integrity": "sha512-4B8B+3vFsY4eo33DMKyJPlQ3sBMpPFUZK2dr3O3rXrOGKKbYG44J0XSFkDo1VOQiri5HFEhIeVvItjR2xcazmg==", - "dev": true, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "dev": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pdf-lib/standard-fonts": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", - "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", - "license": "MIT", - "dependencies": { - "pako": "^1.0.6" - } - }, - "node_modules/@pdf-lib/upng": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", - "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", - "license": "MIT", - "dependencies": { - "pako": "^1.0.10" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@playwright/test": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.55.0.tgz", - "integrity": "sha512-04IXzPwHrW69XusN/SIdDdKZBzMfOT9UNT/YiJit/xpy2VuAoB8NHc8Aplb96zsWDddLnbkPL3TsmrS04ZU2xQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "playwright": "1.55.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@rollup/plugin-typescript": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.1.tgz", - "integrity": "sha512-t7O653DpfB5MbFrqPe/VcKFFkvRuFNp9qId3xq4Eth5xlyymzxNpye2z8Hrl0RIMuXTSr5GGcFpkdlMeacUiFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.1.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.14.0||^3.0.0||^4.0.0", - "tslib": "*", - "typescript": ">=3.7.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - }, - "tslib": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-typescript/node_modules/@rollup/pluginutils": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", - "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-typescript/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "dependencies": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", - "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", - "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", - "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", - "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", - "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", - "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", - "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", - "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", - "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", - "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", - "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", - "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", - "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", - "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", - "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", - "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "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/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "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==", - "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==", - "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==", - "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==", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "dev": true, - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.56.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", - "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "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/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.5", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", - "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "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/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true - }, - "node_modules/@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", - "dev": true, - "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/jest": { - "version": "29.5.14", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", - "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/jsdom": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", - "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/tough-cookie": "*", - "parse5": "^7.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.9.tgz", - "integrity": "sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==", - "license": "MIT", - "dependencies": { - "@types/ms": "*", - "@types/node": "*" - } - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.14.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", - "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/offscreencanvas": { - "version": "2019.7.3", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", - "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", - "license": "MIT" - }, - "node_modules/@types/qrcode": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.5.5.tgz", - "integrity": "sha512-CdfBi/e3Qk+3Z/fXYShipBT13OJ2fDO2Q2w5CIP5anLTLIndQG9z6P1cnm+8zCWSpm5dnxMFd/uREtb0EXuQzg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true - }, - "node_modules/@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", - "dev": true - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dev": true, - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "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/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "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.3.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", - "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", - "dependencies": { - "@babel/core": "^7.24.5", - "@babel/plugin-transform-react-jsx-self": "^7.24.5", - "@babel/plugin-transform-react-jsx-source": "^7.24.1", - "@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" - } - }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.5.tgz", - "integrity": "sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==", - "dev": true, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.31.tgz", - "integrity": "sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/parser": "^7.24.7", - "@vue/shared": "3.4.31", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-core/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.31.tgz", - "integrity": "sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==", - "dev": true, - "peer": true, - "dependencies": { - "@vue/compiler-core": "3.4.31", - "@vue/shared": "3.4.31" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.31.tgz", - "integrity": "sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/parser": "^7.24.7", - "@vue/compiler-core": "3.4.31", - "@vue/compiler-dom": "3.4.31", - "@vue/compiler-ssr": "3.4.31", - "@vue/shared": "3.4.31", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.10", - "postcss": "^8.4.38", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.31.tgz", - "integrity": "sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==", - "dev": true, - "peer": true, - "dependencies": { - "@vue/compiler-dom": "3.4.31", - "@vue/shared": "3.4.31" - } - }, - "node_modules/@vue/reactivity": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.31.tgz", - "integrity": "sha512-VGkTani8SOoVkZNds1PfJ/T1SlAIOf8E58PGAhIOUDYPC4GAmFA2u/E14TDAFcf3vVDKunc4QqCe/SHr8xC65Q==", - "dev": true, - "peer": true, - "dependencies": { - "@vue/shared": "3.4.31" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.31.tgz", - "integrity": "sha512-LDkztxeUPazxG/p8c5JDDKPfkCDBkkiNLVNf7XZIUnJ+66GVGkP+TIh34+8LtPisZ+HMWl2zqhIw0xN5MwU1cw==", - "dev": true, - "peer": true, - "dependencies": { - "@vue/reactivity": "3.4.31", - "@vue/shared": "3.4.31" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.31.tgz", - "integrity": "sha512-2Auws3mB7+lHhTFCg8E9ZWopA6Q6L455EcU7bzcQ4x6Dn4cCPuqj6S2oBZgN2a8vJRS/LSYYxwFFq2Hlx3Fsaw==", - "dev": true, - "peer": true, - "dependencies": { - "@vue/reactivity": "3.4.31", - "@vue/runtime-core": "3.4.31", - "@vue/shared": "3.4.31", - "csstype": "^3.1.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.31.tgz", - "integrity": "sha512-D5BLbdvrlR9PE3by9GaUp1gQXlCNadIZytMIb8H2h3FMWJd4oUfkUTEH2wAr3qxoRz25uxbTcbqd3WKlm9EHQA==", - "dev": true, - "peer": true, - "dependencies": { - "@vue/compiler-ssr": "3.4.31", - "@vue/shared": "3.4.31" - }, - "peerDependencies": { - "vue": "3.4.31" - } - }, - "node_modules/@vue/shared": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.31.tgz", - "integrity": "sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", - "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", - "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", - "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", - "dev": true, - "license": "BSD-3-Clause" - }, - "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==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.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==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "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-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/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==", - "dev": true - }, - "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", - "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.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-jest/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/babel-jest/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/babel-jest/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/babel-jest/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/babel-jest/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/babel-jest/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/babel-jest/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/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.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "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 || ^8.0.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==" - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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==", - "dev": true, - "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/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/bonjour-service": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", - "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "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==", - "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==", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", - "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.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "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-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==" - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dev": true, - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001684", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz", - "integrity": "sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==", - "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": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "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", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "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-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cliui/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "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": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" - }, - "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/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/compression/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==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" - }, - "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==", - "dev": true, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "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==" - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "node_modules/copy-webpack-plugin": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", - "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", - "dev": true, - "dependencies": { - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.1", - "globby": "^14.0.0", - "normalize-path": "^3.0.0", - "schema-utils": "^4.2.0", - "serialize-javascript": "^6.0.2" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "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==", - "dev": true - }, - "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/create-jest/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/create-jest/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/create-jest/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/create-jest/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/create-jest/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/create-jest/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/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/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true, - "license": "MIT" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true, - "license": "MIT" - }, - "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, - "peer": true - }, - "node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "dev": true, - "license": "MIT" - }, - "node_modules/dedent": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", - "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", - "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-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "dev": true, - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "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", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "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/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "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/dijkstrajs": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", - "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==" - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dev": true, - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "deprecated": "Use your platform's native DOMException instead", - "dev": true, - "license": "MIT", - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-expand": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-8.0.3.tgz", - "integrity": "sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==", - "engines": { - "node": ">=12" - } - }, - "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/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.65", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.65.tgz", - "integrity": "sha512-PWVzBjghx7/wop6n22vS2MLU8tKGd4Q91aCEGhG/TYmW6PP5OcSXcdnxTe1NNt0T66N8D6jxh4kC8UsdzOGaIw==", - "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": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/envinfo": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", - "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "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", - "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-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "dev": true - }, - "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.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "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", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/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/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "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/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, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/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, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "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/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "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.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", - "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", - "dev": true, - "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.10", - "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" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "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 - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/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==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "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 - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "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==", - "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "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/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "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==", - "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==", - "dev": true, - "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/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "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==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/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.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "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", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/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==", - "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==", - "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, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", - "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^4.0.1", - "minimatch": "^10.0.0", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "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", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", - "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", - "dev": true, - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" - }, - "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/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==" - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "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==", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/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==", - "dev": true, - "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/hpack.js/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==", - "dev": true - }, - "node_modules/hpack.js/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==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, - "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/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", - "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", - "dev": true, - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/html5-qrcode": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/html5-qrcode/-/html5-qrcode-2.3.8.tgz", - "integrity": "sha512-jsr4vafJhwoLVEDW3n1KvPnCCXWaQfRng0/EEYk1vNcQGcG/htAdhJX0be8YyqMoSz7+hZvOZSTAepsabiuhiQ==" - }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "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==", - "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" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", - "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "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, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/hyperdyperid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", - "dev": true, - "engines": { - "node": ">=10.18" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "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/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 - }, - "node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", - "dev": true, - "engines": { - "node": ">= 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, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", - "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", - "dev": true, - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-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==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-network-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", - "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.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, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dev": true, - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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-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-instrument/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "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-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": ">=8" - } - }, - "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", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", - "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jake": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", - "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jake/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jake/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jake/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jake/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jake/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jake/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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-changed-files/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/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": "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/jest-circus/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/jest-circus/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/jest-circus/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/jest-circus/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/jest-circus/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/jest-circus/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/jest-circus/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/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-cli/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/jest-cli/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/jest-cli/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/jest-cli/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/jest-cli/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/jest-cli/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/jest-cli/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/jest-cli/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/jest-cli/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/jest-cli/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/jest-cli/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/jest-cli/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/jest-cli/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/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": "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/jest-config/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/jest-config/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/jest-config/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/jest-config/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/jest-config/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/jest-config/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/jest-config/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/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": "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/jest-diff/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/jest-diff/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/jest-diff/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/jest-diff/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/jest-diff/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/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": "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/jest-each/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/jest-each/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/jest-each/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/jest-each/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/jest-each/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/jest-environment-jsdom": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", - "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/jsdom": "^20.0.0", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0", - "jsdom": "^20.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "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-haste-map/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/jest-haste-map/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-haste-map/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/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-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": "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/jest-matcher-utils/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/jest-matcher-utils/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/jest-matcher-utils/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/jest-matcher-utils/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/jest-matcher-utils/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/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": "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/jest-message-util/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/jest-message-util/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/jest-message-util/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/jest-message-util/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/jest-message-util/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/jest-message-util/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/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-resolve/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/jest-resolve/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/jest-resolve/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/jest-resolve/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/jest-resolve/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/jest-resolve/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/jest-resolve/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/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-runner/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/jest-runner/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/jest-runner/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/jest-runner/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/jest-runner/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/jest-runner/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-runner/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/jest-runner/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/jest-runner/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/jest-runner/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/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-runtime/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/jest-runtime/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/jest-runtime/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/jest-runtime/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/jest-runtime/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/jest-runtime/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/jest-runtime/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/jest-runtime/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/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": "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/jest-snapshot/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/jest-snapshot/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/jest-snapshot/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/jest-snapshot/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/jest-snapshot/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/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/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/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/jest-util/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/jest-util/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/jest-util/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/jest-util/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/jest-util/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/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": "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/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/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/jest-validate/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/jest-validate/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/jest-validate/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/jest-validate/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/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-watcher/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/jest-watcher/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/jest-watcher/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/jest-watcher/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/jest-watcher/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/jest-watcher/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/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "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, - "engines": { - "node": ">=8" - } - }, - "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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jose": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.0.13.tgz", - "integrity": "sha512-Yms4GpbmdANamS51kKK6w4hRlKx8KTxbWyAAKT/MhUMtqbIqh5mb2HjhTNUbk7TFL8/MBB5zWSDohL7ed4k/UA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "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/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/jsdom": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", - "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "abab": "^2.0.6", - "acorn": "^8.8.1", - "acorn-globals": "^7.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.4.2", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.2", - "parse5": "^7.1.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.11.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "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 - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "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/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/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/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.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/launch-editor": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.0.tgz", - "integrity": "sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==", - "dev": true, - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "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/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "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==", - "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", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "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.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, - "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/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "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==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - }, - "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.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "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_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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.9.3.tgz", - "integrity": "sha512-bsYSSnirtYTWi1+OPMFb0M048evMKyUYe0EbtuGQgq6BVQM1g1W8/KIUJCCvjgI/El0j6Q4WsmMiBwLUBSw8LA==", - "dev": true, - "dependencies": { - "@jsonjoy.com/json-pack": "^1.0.3", - "@jsonjoy.com/util": "^1.1.2", - "tree-dump": "^1.0.1", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">= 4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - } - }, - "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==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "engines": { - "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==", - "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", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "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==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "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/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true, - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-html-parser": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", - "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", - "dependencies": { - "css-select": "^4.2.1", - "he": "1.2.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-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "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, - "engines": { - "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, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nwsapi": { - "version": "2.2.21", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.21.tgz", - "integrity": "sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "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==", - "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, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", - "dev": true, - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-retry": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz", - "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==", - "dev": true, - "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "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==", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "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/parse5/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "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", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "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 - }, - "node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", - "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pathe": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.2.0.tgz", - "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==" - }, - "node_modules/pdf-lib": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", - "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", - "license": "MIT", - "dependencies": { - "@pdf-lib/standard-fonts": "^1.0.0", - "@pdf-lib/upng": "^1.0.1", - "pako": "^1.0.11", - "tslib": "^1.11.1" - } - }, - "node_modules/pdf-lib/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "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, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/playwright": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.0.tgz", - "integrity": "sha512-sdCWStblvV1YU909Xqx0DhOjPZE4/5lJsIS84IfN9dAZfcl/CIZ5O8l3o0j7hPMjDvqoTF8ZUcc+i/GL5erstA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "playwright-core": "1.55.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.0.tgz", - "integrity": "sha512-GvZs4vU3U5ro2nZpeiwyb0zuFaqb9sUiAJuyrWpcGouD8y9/HLgGbNRjIph7zU9D3hnPaisMl9zG9CgFi/biIg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/playwright/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/pngjs": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", - "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "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.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "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==", - "dev": true - }, - "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-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==", - "dev": true, - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/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==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, - "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, - "engines": { - "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/qr-scanner": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/qr-scanner/-/qr-scanner-1.4.2.tgz", - "integrity": "sha512-kV1yQUe2FENvn59tMZW6mOVfpq9mGxGf8l6+EGaXUOd4RBOLg7tRC83OrirM5AtDvZRpdjdlXURsHreAOSPOUw==", - "license": "MIT", - "dependencies": { - "@types/offscreencanvas": "^2019.6.4" - } - }, - "node_modules/qrcode": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", - "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", - "license": "MIT", - "dependencies": { - "dijkstrajs": "^1.0.1", - "pngjs": "^5.0.0", - "yargs": "^15.3.1" - }, - "bin": { - "qrcode": "bin/qrcode" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "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/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "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-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "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", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "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==" - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "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, - "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, - "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/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", - "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^11.0.0", - "package-json-from-dist": "^1.0.0" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", - "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", - "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.24.0", - "@rollup/rollup-android-arm64": "4.24.0", - "@rollup/rollup-darwin-arm64": "4.24.0", - "@rollup/rollup-darwin-x64": "4.24.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", - "@rollup/rollup-linux-arm-musleabihf": "4.24.0", - "@rollup/rollup-linux-arm64-gnu": "4.24.0", - "@rollup/rollup-linux-arm64-musl": "4.24.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", - "@rollup/rollup-linux-riscv64-gnu": "4.24.0", - "@rollup/rollup-linux-s390x-gnu": "4.24.0", - "@rollup/rollup-linux-x64-gnu": "4.24.0", - "@rollup/rollup-linux-x64-musl": "4.24.0", - "@rollup/rollup-win32-arm64-msvc": "4.24.0", - "@rollup/rollup-win32-ia32-msvc": "4.24.0", - "@rollup/rollup-win32-x64-msvc": "4.24.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "peer": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/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/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "dev": true, - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dev": true, - "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/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "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==", - "dev": true, - "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/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==" - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, - "license": "ISC" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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 - }, - "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": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "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==", - "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.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "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/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "dev": true, - "dependencies": { - "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": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "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/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "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, - "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/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "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, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sweetalert2": { - "version": "11.22.4", - "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.22.4.tgz", - "integrity": "sha512-JwcRODfozxiKmspFp+xctZ2izAmLAKbRPcoLMEW7LdugN/YmNrX1LT7hdBW87qsgupEO1ukBBuB17KzKFKW0tg==", - "license": "MIT", - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/limonte" - } - }, - "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/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.31.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", - "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/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, - "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/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/terser-webpack-plugin/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 - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "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/test-exclude/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/thingies": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", - "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", - "dev": true, - "engines": { - "node": ">=10.18" - }, - "peerDependencies": { - "tslib": "^2" - } - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "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-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "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==", - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/tree-dump": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", - "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", - "dev": true, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/ts-jest": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.1.tgz", - "integrity": "sha512-SaeUtjfpg9Uqu8IbeDKtdaS0g8lS6FT6OzM3ezrDfErPJPHNDo/Ey+VFGP1bQIDfagYDLyRpd7O15XpG1Es2Uw==", - "dev": true, - "license": "MIT", - "dependencies": { - "bs-logger": "^0.2.6", - "fast-json-stable-stringify": "^2.1.0", - "handlebars": "^4.7.8", - "json5": "^2.2.3", - "lodash.memoize": "^4.1.2", - "make-error": "^1.3.6", - "semver": "^7.7.2", - "type-fest": "^4.41.0", - "yargs-parser": "^21.1.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0 || ^30.0.0", - "@jest/types": "^29.0.0 || ^30.0.0", - "babel-jest": "^29.0.0 || ^30.0.0", - "jest": "^29.0.0 || ^30.0.0", - "jest-util": "^29.0.0 || ^30.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/transform": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jest-util": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-jest/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ts-jest/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/ts-loader": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", - "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4", - "source-map": "^0.7.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "typescript": "*", - "webpack": "^5.0.0" - } - }, - "node_modules/ts-loader/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ts-loader/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, - "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/ts-loader/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ts-loader/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 - }, - "node_modules/ts-loader/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-loader/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-loader/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/ts-loader/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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, - "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", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", - "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", - "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.0" - }, - "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, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.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==", - "dev": true - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true - }, - "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==", - "dev": true, - "engines": { - "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, - "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", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.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", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-plugin-copy": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/vite-plugin-copy/-/vite-plugin-copy-0.1.6.tgz", - "integrity": "sha512-bqIaefZOE2Jx8P5wJuHKL5GzCERa/pcwdUQWaocyTNXgalN2xkxXH7LmqRJ34V2OlKF2F9E/zj0zITS7U6PpUg==", - "dependencies": { - "fast-glob": "^3.2.7" - }, - "engines": { - "node": ">=14.8.0" - } - }, - "node_modules/vite-plugin-html": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/vite-plugin-html/-/vite-plugin-html-3.2.2.tgz", - "integrity": "sha512-vb9C9kcdzcIo/Oc3CLZVS03dL5pDlOFuhGlZYDCJ840BhWl/0nGeZWf3Qy7NlOayscY4Cm/QRgULCQkEZige5Q==", - "dependencies": { - "@rollup/pluginutils": "^4.2.0", - "colorette": "^2.0.16", - "connect-history-api-fallback": "^1.6.0", - "consola": "^2.15.3", - "dotenv": "^16.0.0", - "dotenv-expand": "^8.0.2", - "ejs": "^3.1.6", - "fast-glob": "^3.2.11", - "fs-extra": "^10.0.1", - "html-minifier-terser": "^6.1.0", - "node-html-parser": "^5.3.3", - "pathe": "^0.2.0" - }, - "peerDependencies": { - "vite": ">=2.0.0" - } - }, - "node_modules/vite-plugin-static-copy": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-1.0.6.tgz", - "integrity": "sha512-3uSvsMwDVFZRitqoWHj0t4137Kz7UynnJeq1EZlRW7e25h2068fyIZX4ORCCOAkfp1FklGxJNVJBkBOD+PZIew==", - "dev": true, - "dependencies": { - "chokidar": "^3.5.3", - "fast-glob": "^3.2.11", - "fs-extra": "^11.1.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0" - } - }, - "node_modules/vite-plugin-static-copy/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/vite-plugin-wasm": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/vite-plugin-wasm/-/vite-plugin-wasm-3.3.0.tgz", - "integrity": "sha512-tVhz6w+W9MVsOCHzxo6SSMSswCeIw4HTrXEi6qL3IRzATl83jl09JVO1djBqPSwfjgnpVHNLYcaMbaDX5WB/pg==", - "peerDependencies": { - "vite": "^2 || ^3 || ^4 || ^5" - } - }, - "node_modules/vue": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.31.tgz", - "integrity": "sha512-njqRrOy7W3YLAlVqSKpBebtZpDVg21FPoaq1I7f/+qqBThK9ChAIjkRWgeP6Eat+8C+iia4P3OYqpATP21BCoQ==", - "dev": true, - "peer": true, - "dependencies": { - "@vue/compiler-dom": "3.4.31", - "@vue/compiler-sfc": "3.4.31", - "@vue/runtime-dom": "3.4.31", - "@vue/server-renderer": "3.4.31", - "@vue/shared": "3.4.31" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "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/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "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/webpack": { - "version": "5.96.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", - "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", - "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.2.1.tgz", - "integrity": "sha512-hRLz+jPQXo999Nx9fXVdKlg/aehsw1ajA9skAneGmT03xwmyuhvF93p6HUKKbWhXdcERtGTzUCtIQr+2IQegrA==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^4.6.0", - "mime-types": "^2.1.31", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", - "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", - "dev": true, - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.4.0", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "rimraf": "^5.0.5", - "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.1.0", - "ws": "^8.16.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/webpack-dev-server/node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/webpack-dev-server/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/webpack-dev-server/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/webpack-dev-server/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/webpack-dev-server/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/webpack-dev-server/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/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, - "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/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/webpack/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 - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding/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/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "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, - "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==" - }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "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/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-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.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, - "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": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12" - } - }, - "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": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "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==", - "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/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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" - } - }, - "node_modules/zone.js": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.0.tgz", - "integrity": "sha512-9oxn0IIjbCZkJ67L+LkhYWRyAy7axphb3VgE2MBDlOqnmHMPWGYMxJxBYFueFq/JGY2GMwS0rU+UCLunEmy5UA==", - "peer": true - } - } -} diff --git a/modules/ihm_client/package.json b/modules/ihm_client/package.json deleted file mode 100755 index 3e007e7b..00000000 --- a/modules/ihm_client/package.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "name": "sdk_client", - "version": "1.1.0", - "description": "", - "main": "dist/index.js", - "scripts": { - "test": "jest", - "test:watch": "jest --watch", - "test:coverage": "jest --coverage", - "test:unit": "jest --testPathPattern=tests/unit", - "test:integration": "jest --testPathPattern=tests/integration", - "build_wasm": "./scripts/setup-remote-deps.sh", - "cleanup_deps": "./scripts/cleanup-deps.sh", - "start": "vite --host 0.0.0.0", - "build": "tsc && vite build", - "deploy": "sudo cp -r dist/* /var/www/html/", - "prettify": "prettier --config ./.prettierrc --write \"src/**/*{.ts,.html,.css,.js}\"", - "build:dist": "tsc -p tsconfig.build.json", - "lint": "prettier -c \"src/**/*{.ts,.html,.css,.js}\"", - "type-check": "tsc -p tsconfig.json --noEmit", - "e2e:install": "npx playwright install --with-deps", - "test:e2e": "playwright test" - }, - "keywords": [], - "author": "", - "license": "ISC", - "devDependencies": { - "@rollup/plugin-typescript": "^12.1.1", - "@types/jest": "^29.5.12", - "@types/node": "^20.11.24", - "@vitejs/plugin-vue": "^5.0.5", - "copy-webpack-plugin": "^12.0.2", - "html-webpack-plugin": "^5.6.0", - "jest": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", - "prettier": "^3.3.3", - "rimraf": "^6.0.1", - "ts-jest": "^29.1.2", - "ts-loader": "^9.5.1", - "typescript": "^5.3.3", - "vite": "^5.4.11", - "vite-plugin-static-copy": "^1.0.6", - "webpack": "^5.90.3", - "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.2", - "@playwright/test": "^1.46.0" - }, - "dependencies": { - "@angular/elements": "^19.0.1", - "@types/jsonwebtoken": "^9.0.9", - "@types/qrcode": "^1.5.5", - "@vitejs/plugin-react": "^4.3.1", - "@vitejs/plugin-vue": "^5.0.5", - "axios": "^1.11.0", - "html5-qrcode": "^2.3.8", - "jose": "^6.0.13", - "jsonwebtoken": "^9.0.2", - "pdf-lib": "^1.17.1", - "qr-scanner": "^1.4.2", - "qrcode": "^1.5.4", - "sweetalert2": "^11.22.4", - "vite-plugin-copy": "^0.1.6", - "vite-plugin-html": "^3.2.2", - "vite-plugin-wasm": "^3.3.0" - } -} diff --git a/modules/ihm_client/playwright.config.ts b/modules/ihm_client/playwright.config.ts deleted file mode 100644 index eadbe28c..00000000 --- a/modules/ihm_client/playwright.config.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { defineConfig, devices } from '@playwright/test'; - -export default defineConfig({ - testDir: './tests/e2e', - timeout: 30000, - use: { - baseURL: 'http://localhost:3000', - headless: true, - }, - webServer: { - command: 'npx vite preview --strictPort --port 3000', - port: 3000, - reuseExistingServer: !process.env.CI, - }, - projects: [ - { name: 'chromium', use: { ...devices['Desktop Chrome'] } }, - ], -}); diff --git a/modules/ihm_client/public/assets/4nk_image.png b/modules/ihm_client/public/assets/4nk_image.png deleted file mode 100755 index d58693f1..00000000 Binary files a/modules/ihm_client/public/assets/4nk_image.png and /dev/null differ diff --git a/modules/ihm_client/public/assets/4nk_revoke.jpg b/modules/ihm_client/public/assets/4nk_revoke.jpg deleted file mode 100755 index 9fba6de5..00000000 Binary files a/modules/ihm_client/public/assets/4nk_revoke.jpg and /dev/null differ diff --git a/modules/ihm_client/public/assets/bgd.webp b/modules/ihm_client/public/assets/bgd.webp deleted file mode 100755 index aa457afa..00000000 Binary files a/modules/ihm_client/public/assets/bgd.webp and /dev/null differ diff --git a/modules/ihm_client/public/assets/camera.jpg b/modules/ihm_client/public/assets/camera.jpg deleted file mode 100755 index adde7dd8..00000000 Binary files a/modules/ihm_client/public/assets/camera.jpg and /dev/null differ diff --git a/modules/ihm_client/public/assets/home.js b/modules/ihm_client/public/assets/home.js deleted file mode 100755 index 2a54d5d5..00000000 --- a/modules/ihm_client/public/assets/home.js +++ /dev/null @@ -1,34 +0,0 @@ -document.querySelectorAll('.tab').forEach(tab => { - tab.addEventListener('click', () => { - document.querySelectorAll('.tab').forEach(t => t.classList.remove('active')); - tab.classList.add('active'); - - document.querySelectorAll('.tab-content').forEach(content => content.classList.remove('active')); - document.getElementById(tab.getAttribute('data-tab')).classList.add('active'); - }); - }); - function toggleMenu() { - var menu = document.getElementById('menu'); - if (menu.style.display === 'block') { - menu.style.display = 'none'; - } else { - menu.style.display = 'block'; - } - } - - //// Modal - function openModal() { - document.getElementById('modal').style.display = 'flex'; - } - - function closeModal() { - document.getElementById('modal').style.display = 'none'; - } - - // Close modal when clicking outside of it - window.onclick = function(event) { - const modal = document.getElementById('modal'); - if (event.target === modal) { - closeModal(); - } - } \ No newline at end of file diff --git a/modules/ihm_client/public/assets/qr_code.png b/modules/ihm_client/public/assets/qr_code.png deleted file mode 100755 index defa4107..00000000 Binary files a/modules/ihm_client/public/assets/qr_code.png and /dev/null differ diff --git a/modules/ihm_client/public/style/4nk.css b/modules/ihm_client/public/style/4nk.css deleted file mode 100755 index 02b45334..00000000 --- a/modules/ihm_client/public/style/4nk.css +++ /dev/null @@ -1,877 +0,0 @@ -:root { - --primary-color - : #3A506B; - /* Bleu mĂ©tallique */ - --secondary-color - : #B0BEC5; - /* Gris acier */ - --accent-color - : #D68C45; - /* Cuivre */ -} -body { - font-family: Arial, sans-serif; - margin: 0; - padding: 0; - background-color: #f4f4f4; - background-image: url(../assets/bgd.webp); - background-repeat:no-repeat; - background-size: cover; - background-blend-mode :soft-light; - height: 100vh; - } - .message { - margin: 30px 0; - font-size: 14px; - overflow-wrap: anywhere; - } - - .message strong{ - font-family: "Segoe UI Emoji", "Noto Color Emoji", "Apple Color Emoji", sans-serif; - font-size: 20px; - } - - /** Modal Css */ - .modal { - display: none; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.5); - justify-content: center; - align-items: center; - z-index: 3; - } - - .modal-content { - width: 55%; - height: 30%; - background-color: white; - border-radius: 4px; - padding: 20px; - text-align: center; - display: flex; - flex-direction: column; - align-items: center; - } - - .modal-title { - margin: 0; - padding-bottom: 8px; - width: 100%; - font-size: 0.9em; - border-bottom: 1px solid #ccc; - } - - .confirmation-box { - /* margin-top: 20px; */ - align-content: center; - width: 70%; - height: 20%; - /* padding: 20px; */ - font-size: 1.5em; - color: #333333; - top: 5%; - position: relative; - } - - /* Confirmation Modal Styles */ - #confirmation-modal { - position: fixed; - top: 0; - left: 0; - width: 100vw; - height: 100vh; - z-index: 1000; - } - - .modal-overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(0, 0, 0, 0.5); - display: flex; - justify-content: center; - align-items: center; - } - - .modal-content { - background: white; - padding: 20px; - border-radius: 8px; - width: 90%; - max-width: 500px; - max-height: 80vh; - overflow-y: auto; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); - } - - .modal-confirmation { - text-align: left; - padding: 10px; - } - - .modal-confirmation h3 { - margin-bottom: 15px; - color: var(--primary-color); - font-size: 1.1em; - } - - .modal-confirmation p { - margin: 8px 0; - font-size: 0.9em; - line-height: 1.4; - } - - .modal-footer { - display: flex; - justify-content: flex-end; - gap: 10px; - margin-top: 20px; - padding-top: 15px; - border-top: 1px solid #eee; - } - - .modal-footer button { - padding: 8px 16px; - border-radius: 4px; - border: none; - cursor: pointer; - font-size: 0.9em; - } - - .btn-primary { - background: var(--primary-color); - color: white; - } - - .btn-secondary { - background: var(--secondary-color); - color: white; - } - - /* Responsive adjustments */ - @media only screen and (max-width: 600px) { - .modal-content { - width: 95%; - margin: 10px; - padding: 15px; - } - - .modal-confirmation h3 { - font-size: 1em; - } - - .modal-confirmation p { - font-size: 0.85em; - } - } - - .nav-wrapper { - position: fixed; - z-index: 2; - background: radial-gradient(circle, white, var(--primary-color)); - /* background-color: #CFD8DC; */ - display: flex; - justify-content: flex-end; - align-items: center; - color: #37474F; - height: 9vh; - width: 100vw; - left: 0; - top: 0; - box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, .2), 0px 16px 24px 2px rgba(0, 0, 0, .14), 0px 6px 30px 5px rgba(0, 0, 0, .12); - - .nav-right-icons { - display: flex; - .notification-container { - position: relative; - display: inline-block; - } - .notification-bell, .burger-menu { - z-index: 3; - height: 20px; - width: 20px; - margin-right: 1rem; - } - .notification-badge { - position: absolute; - top: -.7rem; - left: -.8rem; - background-color: red; - color: white; - border-radius: 50%; - padding: 2.5px 6px; - font-size: 0.8em; - font-weight: bold; - } - } - .notification-board { - position: absolute; - width: 20rem; - min-height: 8rem; - background-color: white; - right: 0.5rem; - display: none; - border-radius: 4px; - text-align: center; - display: flex; - flex-direction: column; - align-items: center; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - display: none; - - .notification-element { - padding: .8rem 0; - width: 100%; - &:hover { - background-color: rgba(26, 28, 24, .08); - } - } - .notification-element:not(:last-child) { - border-bottom: 1px solid; - } - } - } - - .brand-logo { - height: 100%; - width: 100vw; - align-content: center; - position: relative; - display: flex; - position: absolute; - align-items: center; - justify-content: center; - text-align: center; - font-size: 1.5em; - font-weight: bold; - } - - .container { - text-align: center; - display: grid; - height: 100vh; - grid-template-columns: repeat(7, 1fr); - gap: 10px; - grid-auto-rows: 10vh 15vh 1fr; - } - .title-container { - grid-column: 2 / 7; - grid-row: 2; - } - .page-container { - grid-column: 2 / 7; - grid-row: 3 ; - justify-content: center; - display: flex; - padding: 1rem; - box-sizing: border-box; - max-height: 60vh; - } - - h1 { - font-size: 2em; - margin: 20px 0; - } - @media only screen and (min-width: 600px) { - .tab-container { - display: none; - } - .page-container { - display: flex; - align-items: center; - } - .process-container { - grid-column: 3 / 6; - grid-row: 3 ; - - .card { - min-width: 40vw; - } - } - .separator { - width: 2px; - background-color: #78909C; - height: 80%; - margin: 0 0.5em; - } - .tab-content { - display: flex; - flex-direction: column; - justify-content: space-evenly; - align-items: center; - height: 80%; - } - } - - @media only screen and (max-width: 600px) { - .process-container { - grid-column: 2 / 7; - grid-row: 3 ; - } - .container { - grid-auto-rows: 10vh 15vh 15vh 1fr; - } - .tab-container { - grid-column: 1 / 8; - grid-row: 3; - } - .page-container { - grid-column: 2 / 7; - grid-row: 4 ; - } - .separator { - display: none; - } - .tabs { - display: flex; - flex-grow: 1; - overflow: hidden; - z-index: 1; - border-bottom-style: solid; - border-bottom-width: 1px; - border-bottom-color: #E0E4D6; - } - - .tab { - flex: 1; - text-align: center; - padding: 10px 0; - cursor: pointer; - font-size: 1em; - color: #6200ea; - &:hover { - background-color: rgba(26, 28, 24, .08); - } - } - .tab.active { - border-bottom: 2px solid #6200ea; - font-weight: bold; - } - - .card.tab-content { - display: none; - } - - .tab-content.active { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - height: 80%; - } - .modal-content { - width: 80%; - height: 20%; - } - } - - .qr-code { - display: flex; - justify-content: center; - align-items: center; - height: 200px; - } - - .emoji-display { - font-family: "Segoe UI Emoji", "Noto Color Emoji", "Apple Color Emoji", sans-serif; - font-size: 20px; - - } - - #emoji-display-2{ - margin-top: 30px; - font-family: "Segoe UI Emoji", "Noto Color Emoji", "Apple Color Emoji", sans-serif; - font-size: 20px; - } - - #okButton{ - margin-bottom: 2em; - cursor: pointer; - background-color: #D0D0D7; - color: white; - border-style: none; - border-radius: 5px; - color: #000; - padding: 2px; - margin-top: 10px; - } - - .pairing-request { - font-family: "Segoe UI Emoji", "Noto Color Emoji", "Apple Color Emoji", sans-serif; - font-size: 14px; - margin-top: 0px; - } - - .sp-address-btn { - margin-bottom: 2em; - cursor: pointer; - background-color: #D0D0D7; - color: white; - border-style: none; - border-radius: 5px; - color: #000; - padding: 2px; - - } - - .camera-card { - display: flex; - justify-content: center; - align-items: center; - /* height: 200px; */ - } - - .btn { - display: inline-block; - padding: 10px 20px; - background-color: var(--primary-color); - color: white; - text-align: center; - border-radius: 5px; - cursor: pointer; - text-decoration: none; - } - - .btn:hover { - background-color: #3700b3; - } - - - .card { - min-width: 300px; - border: 1px solid #e0e0e0; - border-radius: 8px; - background-color: white; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - box-sizing: border-box; - overflow: hidden; - display: flex; - flex-direction: column; - align-items: center; - text-align: center; - height: 60vh; - justify-content: flex-start; - padding: 1rem; - overflow-y: auto; - - } - - .card-content { - flex-grow: 1; - flex-direction: column; - display: flex; - justify-content: flex-start; - align-items: center; - text-align: left; - font-size: .8em; - position: relative; - left: 2vw; - width: 90%; - .process-title { - font-weight: bold; - padding: 1rem 0; - } - .process-element { - padding: .4rem 0; - &:hover { - background-color: rgba(26, 28, 24, .08); - } - &.selected { - background-color: rgba(26, 28, 24, .08); - } - } - } - - .card-description { - padding: 20px; - font-size: 1em; - color: #333; - width: 90%; - height: 50px; - display: flex; - justify-content: center; - align-items: center; - margin-bottom: 0px; - } - - - .card-action { - width: 100%; - } - - .menu-content { - display: none; - position: absolute; - top: 3.4rem; - right: 1rem; - background-color: white; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - border-radius: 5px; - overflow: hidden; - } - - .menu-content a { - display: block; - padding: 10px 20px; - text-decoration: none; - color: #333; - border-bottom: 1px solid #e0e0e0; - &:hover { - background-color: rgba(26, 28, 24, .08); - } - } - - .menu-content a:last-child { - border-bottom: none; - } - - .qr-code-scanner { - display: none; - } - - - /* QR READER */ - #qr-reader div { - position: inherit; - } - - #qr-reader div img{ - top: 15px ; - right: 25px; - margin-top: 5px; - } - - - /* INPUT CSS **/ - .input-container { - position: relative; - width: 100%; - background-color: #ECEFF1; - } - - .input-field { - width: 36vw; - padding: 10px 0; - font-size: 1em; - border: none; - border-bottom: 1px solid #ccc; - outline: none; - background: transparent; - transition: border-color 0.3s; - } - - .input-field:focus { - border-bottom: 2px solid #6200ea; - } - - .input-label { - position: absolute; - margin-top: -0.5em; - top: 0; - left: 0; - padding: 10px 0; - font-size: 1em; - color: #999; - pointer-events: none; - transition: transform 0.3s, color 0.3s, font-size 0.3s; - } - - .input-field:focus + .input-label, - .input-field:not(:placeholder-shown) + .input-label { - transform: translateY(-20px); - font-size: 0.8em; - color: #6200ea; - } - - .input-underline { - position: absolute; - bottom: 0; - left: 50%; - width: 0; - height: 2px; - background-color: #6200ea; - transition: width 0.3s, left 0.3s; - } - - .input-field:focus ~ .input-underline { - width: 100%; - left: 0; - } - - .dropdown-content { - position: absolute; - flex-direction: column; - top: 100%; - left: 0; - width: 100%; - max-height: 150px; - overflow-y: auto; - border: 1px solid #ccc; - border-radius: 4px; - background-color: white; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - display: none; - z-index: 1; - } - - .dropdown-content span { - padding: 10px; - cursor: pointer; - list-style: none; - } - - .dropdown-content span:hover { - background-color: #f0f0f0; - } - - - - - /** AUTOCOMPLETE **/ - -select[data-multi-select-plugin] { - display: none !important; -} - -.multi-select-component { - width: 36vw; - padding: 5px 0; - font-size: 1em; - border: none; - border-bottom: 1px solid #ccc; - outline: none; - background: transparent; - display: flex; - flex-direction: row; - height: auto; - width: 100%; - -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; - transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; -} - -.autocomplete-list { - border-radius: 4px 0px 0px 4px; -} - -.multi-select-component:focus-within { - box-shadow: inset 0px 0px 0px 2px #78ABFE; -} - -.multi-select-component .btn-group { - display: none !important; -} - -.multiselect-native-select .multiselect-container { - width: 100%; -} - -.selected-processes { - background-color: white; - padding: 0.4em; -} - -.selected-wrapper { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - display: inline-block; - border: 1px solid #d9d9d9; - background-color: #ededed; - white-space: nowrap; - margin: 1px 5px 5px 0; - height: 22px; - vertical-align: top; - cursor: default; -} - -.selected-wrapper .selected-label { - max-width: 514px; - display: inline-block; - overflow: hidden; - text-overflow: ellipsis; - padding-left: 4px; - vertical-align: top; -} - -.selected-wrapper .selected-close { - display: inline-block; - text-decoration: none; - font-size: 14px; - line-height: 1.49em; - margin-left: 5px; - padding-bottom: 10px; - height: 100%; - vertical-align: top; - padding-right: 4px; - opacity: 0.2; - color: #000; - text-shadow: 0 1px 0 #fff; - font-weight: 700; -} - -.search-container { - display: flex; - flex-direction: row; -} - -.search-container .selected-input { - background: none; - border: 0; - height: 20px; - width: 60px; - padding: 0; - margin-bottom: 6px; - -webkit-box-shadow: none; - box-shadow: none; -} - -.search-container .selected-input:focus { - outline: none; -} - -.dropdown-icon.active { - transform: rotateX(180deg) -} - -.search-container .dropdown-icon { - display: inline-block; - padding: 10px 5px; - position: absolute; - top: 5px; - right: 5px; - width: 10px; - height: 10px; - border: 0 !important; - /* needed */ - -webkit-appearance: none; - -moz-appearance: none; - /* SVG background image */ - background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2212%22%20height%3D%2212%22%20viewBox%3D%220%200%2012%2012%22%3E%3Ctitle%3Edown-arrow%3C%2Ftitle%3E%3Cg%20fill%3D%22%23818181%22%3E%3Cpath%20d%3D%22M10.293%2C3.293%2C6%2C7.586%2C1.707%2C3.293A1%2C1%2C0%2C0%2C0%2C.293%2C4.707l5%2C5a1%2C1%2C0%2C0%2C0%2C1.414%2C0l5-5a1%2C1%2C0%2C1%2C0-1.414-1.414Z%22%20fill%3D%22%23818181%22%3E%3C%2Fpath%3E%3C%2Fg%3E%3C%2Fsvg%3E"); - background-position: center; - background-size: 10px; - background-repeat: no-repeat; -} - -.search-container ul { - position: absolute; - list-style: none; - padding: 0; - z-index: 3; - margin-top: 29px; - width: 100%; - right: 0px; - background: #fff; - border: 1px solid #ccc; - border-top: none; - border-bottom: none; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); - box-shadow: 0 6px 12px rgba(0, 0, 0, .175); -} - -.search-container ul :focus { - outline: none; -} - -.search-container ul li { - display: block; - text-align: left; - padding: 8px 29px 2px 12px; - border-bottom: 1px solid #ccc; - font-size: 14px; - min-height: 31px; -} - -.search-container ul li:first-child { - border-top: 1px solid #ccc; - border-radius: 4px 0px 0 0; -} - -.search-container ul li:last-child { - border-radius: 4px 0px 0 0; -} - - -.search-container ul li:hover.not-cursor { - cursor: default; -} - -.search-container ul li:hover { - color: #333; - background-color: #f0f0f0; - ; - border-color: #adadad; - cursor: pointer; -} - -/* Adding scrool to select options */ -.autocomplete-list { - max-height: 130px; - overflow-y: auto; -} - - - -/**************************************** Process page card ******************************************************/ -.process-card { - min-width: 300px; - border: 1px solid #e0e0e0; - border-radius: 8px; - background-color: white; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - overflow: hidden; - display: flex; - flex-direction: column; - align-items: center; - text-align: center; - min-height: 40vh; - max-height: 60vh; - justify-content: space-between; - padding: 1rem; - overflow-y: auto; - -} - -.process-card-content { - text-align: left; - font-size: .8em; - position: relative; - left: 2vw; - width: 90%; - .process-title { - font-weight: bold; - padding: 1rem 0; - } - .process-element { - padding: .4rem 0; - &:hover { - background-color: rgba(26, 28, 24, .08); - } - &.selected { - background-color: rgba(26, 28, 24, .08); - } - } - .selected-process-zone { - background-color: rgba(26, 28, 24, .08); - } -} - -.process-card-description { - padding: 20px; - font-size: 1em; - color: #333; - width: 90%; -} - - -.process-card-action { - width: 100%; -} \ No newline at end of file diff --git a/modules/ihm_client/public/style/account.css b/modules/ihm_client/public/style/account.css deleted file mode 100755 index 09fe0c6a..00000000 --- a/modules/ihm_client/public/style/account.css +++ /dev/null @@ -1,1507 +0,0 @@ -/* Styles de base */ -:root { - --primary-color: #3A506B; - /* Bleu mĂ©tallique */ - --secondary-color: #B0BEC5; - /* Gris acier */ - --accent-color: #D68C45; - /* Cuivre */ -} - -body { - font-family: Arial, sans-serif; - margin: 0; - padding: 0; - display: flex; - height: 100vh; - background-color: #e9edf1; - flex-direction: column; -} - -/*-------------------------------------- Avatar--------------------------------------*/ - -.avatar-section { - position: relative; - height: 60px; - width: 260px; - margin-left: 10px; - overflow: hidden; - border-radius: 10px; -} - -.user-info { - display: flex; - flex-direction: column; - color: white; -} - -.user-name, .user-lastname { - font-size: 0.9rem; - font-weight: 700; -} - - -.user-name:hover, .user-lastname:hover { - color: var(--accent-color); - cursor: pointer; -} - -.avatar-container { - width: 45px; - height: 45px; - flex-shrink: 0; -} - -.avatar-container { - width: 80px; /* Taille rĂ©duite */ - height: 80px; - margin: 0 auto; -} - -.avatar { - height: 100%; - border-radius: 50%; - object-fit: cover; - border: 2px solid white; -} - -.avatar img { - width: 100%; - height: 100%; - border-radius: 50%; -} - - -/*-------------------------------------- BANNER--------------------------------------*/ - -/* Styles pour la banniĂšre avec image */ -.banner-image-container { - position: relative; - width: 100%; - height: 200px; - overflow: hidden; - border-radius: 10px; - margin-bottom: 15px; -} - -.banner-image { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - object-fit: cover; - z-index: 1; -} - -.banner-content { - position: relative; - z-index: 2; - display: flex; - align-items: center; - gap: 15px; - height: 100%; - padding: 0 15px; - background: rgba(0, 0, 0, 0.3); - overflow: visible; -} - -.banner-content .avatar-container { - width: 45px; - height: 45px; - overflow: hidden; - border-radius: 50%; - border: 2px solid white; - transition: transform 0.3s ease; -} - -.banner-content .avatar { - width: 100%; - height: 100%; - object-fit: cover; - border: none; -} - -.banner-content .avatar-container:hover { - transform: scale(1.15); - cursor: pointer; -} - -/* Style pour le bouton de changement de banniĂšre */ -.banner-upload-label { - display: block; - width: auto; - padding: 12px 20px; - background-color: var(--accent-color); - color: white; - border-radius: 8px; - cursor: pointer; - transition: background-color 0.3s; - text-align: center; - font-size: 16px; - margin: 20px auto; - max-width: 250px; -} - -.banner-upload-label:hover { - background-color: #b06935; -} - -.banner-controls { - margin-top: 15px; - display: flex; - justify-content: center; - width: 100%; -} - -.banner-preview { - margin: 10px 0; -} - -.banner-preview h3 { - margin: 0 0 10px 0; - font-size: 18px; -} - -.banner-image-container { - height: 150px; - margin-bottom: 10px; -} - - -.nav-wrapper { - position: fixed; - background: white; - display: flex; - justify-content: space-between; - align-items: center; - height: 9vh; - width: 100vw; - left: 0; - top: 0; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); - z-index: 1000; -} -/* Mise Ă  jour des styles de la navbar pour inclure l'image de banniĂšre */ -.nav-wrapper .avatar-section { - position: relative; - background: none; -} - -.nav-wrapper .banner-image { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - object-fit: cover; - z-index: -1; - filter: brightness(0.7); -} - - - -/*-------------------------------------- Popup--------------------------------------*/ -/* Styles pour la popup */ -.popup { - display: none; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.5); - z-index: 1000; -} - -.popup-content { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - background: white; - padding: 20px; - border-radius: var(--border-radius); - box-shadow: var(--box-shadow); - width: 400px; - max-height: 80vh; - overflow-y: auto; -} -.popup-content h2 { - margin: 0 0 15px 0; - font-size: 24px; -} - -.close-popup { - position: absolute; - right: 15px; - top: 10px; - font-size: 24px; - cursor: pointer; - color: #666; -} - -.close-popup:hover { - color: #000; -} - -.popup-avatar { - text-align: center; - margin: 20px 0; - position: relative; -} - -.avatar-upload-label { - position: relative; - display: inline-block; - cursor: pointer; - width: 0%; - margin-left: -20%; -} - -.avatar-overlay { - position: absolute; - top: 0; - left: 50px; - width: 100%; - height: 100%; - background: rgba(0, 0, 0, 0.5); - border-radius: 50%; - display: flex; - justify-content: center; - align-items: center; - opacity: 0; - transition: opacity 0.3s; -} - -.avatar-overlay span { - color: white; - font-size: 14px; - text-align: center; -} - -.avatar-upload-label:hover .avatar-overlay { - opacity: 1; -} - -.popup-avatar img { - width: 100px; - height: 100px; - border-radius: 50%; - border: 3px solid var(--accent-color); - object-fit: cover; -} - -.popup-info { - margin: 15px 0; -} - -.info-row { - margin: 8px 0; - display: flex; - align-items: center; - gap: 10px; -} - -.popup-info strong { - min-width: 100px; /* Largeur fixe pour l'alignement */ -} - -/* Editable Name and Lastname */ -.editable { - cursor: pointer; - display: inline-block; - min-width: 100px; - padding: 2px 5px; - transition: background-color 0.3s; -} - -.editable:hover { - background-color: #f0f0f0; -} - -.editable.editing { - background-color: white; - border: 1px solid var(--accent-color); - outline: none; -} - -.edit-input { - border: 1px solid var(--accent-color); - border-radius: 3px; - padding: 2px 5px; - font-size: inherit; - font-family: inherit; - outline: none; - width: 100%; - min-width: 100px; - margin: 0; - box-sizing: border-box; -} - -/* Boutons */ - - -.popup-button-container { - display: flex -; - flex-direction: column; - margin-top: 20px; - gap: 15px; -} - -.action-buttons-row { - display: flex -; - justify-content: space-between; - gap: 15px; -} -.banner-upload-label, -.export-btn, -.delete-account-btn { - padding: 8px 15px; - margin: 10px 0; - font-size: 14px; -} - -.delete-account-btn { - background-color: #dc3545; -} - - -.export-btn, -.delete-account-btn { - flex: 1; /* Pour qu'ils prennent la mĂȘme largeur */ - padding: 12px 20px; - border: none; - border-radius: 8px; - font-size: 16px; - cursor: pointer; - transition: background-color 0.3s; - color: white; - text-align: center; -} - - - -/* SĂ©parateurs */ -.popup-info, -.export-section, -.delete-account-section { - padding-top: 10px; - margin-top: 10px; - border-top: 1px solid #eee; -} - -.logout-btn { - background-color: rgb(108, 117, 125); - font-size: 16px; - cursor: pointer; - color: white; - text-align: center; - flex: 1 1 0%; - padding: 12px 20px; - border-width: initial; - border-style: none; - border-color: initial; - border-image: initial; - border-radius: 8px; - transition: background-color 0.3s; -} - -/*-------------------------------------- Delete Account--------------------------------------*/ -.delete-account-section { - margin-top: 30px; - padding-top: 20px; - border-top: 1px solid #ddd; - text-align: center; -} - -.delete-account-btn { - background-color: #dc3545; -} - -.delete-account-btn:hover { - background-color: #c82333; -} - -/* Style pour la modal de confirmation */ -.confirm-delete-modal { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.5); - display: flex; - justify-content: center; - align-items: center; - z-index: 1000; -} - -.confirm-delete-content { - background-color: white; - padding: 20px; - border-radius: 8px; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); - max-width: 400px; - width: 90%; - text-align: center; -} - -.confirm-delete-content h3 { - margin-top: 0; - color: #333; -} - -.confirm-delete-content p { - margin: 15px 0; - color: #666; -} - -.confirm-delete-buttons { - display: flex; - justify-content: center; - gap: 10px; - margin-top: 20px; -} - -.confirm-delete-buttons button { - padding: 8px 20px; - border: none; - border-radius: 4px; - cursor: pointer; - transition: background-color 0.3s; -} - -.confirm-delete-buttons .confirm-btn { - background-color: #dc3545; - color: white; -} - -.confirm-delete-buttons .confirm-btn:hover { - background-color: #c82333; -} - -.confirm-delete-buttons .cancel-btn { - background-color: #6c757d; - color: white; -} - -.confirm-delete-buttons .cancel-btn:hover { - background-color: #5a6268; -} - -/*-------------------------------------- Export--------------------------------------*/ -.export-section { - margin: 20px 0; - text-align: center; - padding: 15px 0; - border-top: 1px solid #ddd; -} - -.export-btn { - background-color: var(--accent-color); -} - -.export-btn:hover { - background-color: #b06935; -} - -.export-section, -.delete-account-section { - width: 100%; - display: flex; - justify-content: center; - margin: 15px 0; -} - -.export-btn, -.delete-account-btn { - width: 80%; - padding: 12px 20px; - border: none; - border-radius: 8px; - font-size: 16px; - cursor: pointer; - transition: background-color 0.3s; - color: white; - text-align: center; -} - -/*-------------------------------------- NAVBAR--------------------------------------*/ - -.brand-logo { - font-size: 1.5rem; - font-weight: bold; -} - -.nav-wrapper { - position: fixed; - background: radial-gradient(circle, white, var(--primary-color)); - display: flex; - justify-content: space-between; - align-items: center; - color: #37474F; - height: 9vh; - width: 100vw; - left: 0; - top: 0; - box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, .2), 0px 16px 24px 2px rgba(0, 0, 0, .14), 0px 6px 30px 5px rgba(0, 0, 0, .12); -} - -/* IcĂŽnes de la barre de navigation */ -.nav-right-icons { - margin-right: 20px; -} - -.burger-menu { - height: 20px; - width: 20px; - margin-right: 1rem; - cursor: pointer; -} - -/* Par dĂ©faut, le menu est masquĂ© */ -#menu { - display: none; - /* Menu cachĂ© par dĂ©faut */ - transition: display 0.3s ease-in-out; -} - - -.burger-menu { - width: 24px; - height: 24px; - cursor: pointer; -} - -.burger-menu-icon { - width: 100%; - height: 100%; -} -/* IcĂŽne burger */ -#burger-icon { - cursor: pointer; -} - -/* .menu-content { - display: none; - position: absolute; - top: 3.4rem; - right: 1rem; - background-color: white; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - border-radius: 5px; - overflow: hidden; -} - -.menu-content a { - display: block; - padding: 10px 20px; - text-decoration: none; - color: #333; - border-bottom: 1px solid #e0e0e0; - - &:hover { - background-color: rgba(26, 28, 24, .08); - } -} - -.menu-content a:last-child { - border-bottom: none; -} */ - -/* Ajustement pour la barre de navigation fixe */ -.container { - display: flex; - flex: 1; - height: 90vh; - margin-top: 9vh; - margin-left: -1%; - text-align: left; - width: 100vw; -} - -/* Liste des information sur l'account */ - -.parameter-list { - width: 24.5%; - background-color: #1f2c3d; - color: white; - padding: 20px; - box-sizing: border-box; - overflow-y: auto; - border-right: 2px solid #2c3e50; - flex-shrink: 0; - padding-right: 10px; - height: 91vh; -} - -.parameter-list ul { - padding: 15px; - margin-left: 10px; - border-radius: 8px; - background-color: #273646; - cursor: pointer; - transition: background-color 0.3s, box-shadow 0.3s; -} - - -.parameter-list ul:hover { - background-color: #34495e; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); -} - - -/* Zone des info des parametre */ - -.parameter-area { - display: flex; - flex-direction: column; - flex: 1; - min-width: 0; - background-color: #ffffff; - border-radius: 10px; - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1); - margin: 0px; - margin-top: 20px; - margin-left: 1%; - margin-bottom: -7px; -} - -/* En-tĂȘte du parametre */ -.parameter-header { - background-color: #34495e; - color: white; - padding: 15px; - font-size: 20px; - font-weight: bold; - border-radius: 10px 10px 0 0; - text-align: center; -} - -/* Style du tableau dans parameter-area */ -.parameter-table { - width: 100%; - border-collapse: collapse; - margin: 15px 0; - table-layout: fixed; -} - -.parameter-table th, .parameter-table td { - border: 1px solid #ddd; - padding: 8px; - white-space: nowrap; - overflow: hidden; - text-align: center; -} - -.parameter-table th { - background-color: var(--secondary-color); - color: white; - font-weight: bold; -} - -.parameter-table tr:nth-child(even) { - background-color: #f2f2f2; -} - - - -.parameter-table tr:hover { - background-color: #ddd; -} - -/* Conteneur pour les boutons */ -.button-container { - display: flex; - justify-content: center; - gap: 15px; - margin: 15px 0; -} - -/* Boutons "Ajouter une ligne" et "Confirmer" */ -.add-row-button, .confirm-all-button, .delete-row-button { - background-color: var(--accent-color); - color: white; - border: none; - padding: 8px 15px; - cursor: pointer; - border-radius: 5px; - font-size: 0.9em; - margin-right: 5px; -} - -.add-row-button:hover, .confirm-all-button:hover, .delete-row-button:hover { - background-color: #b06935; -} - - -.button-style { - background-color: var(--accent-color); - color: white; - border: none; - border-radius: 5px; - padding: 10px 20px; - cursor: pointer; - transition: background-color 0.3s; -} - -.button-style:hover { - background-color: darkorange; -} - -.content-container { - width: 100%; -} - -#pairing-content, -#wallet-content { - width: 100%; -} - -.editable-cell { - cursor: pointer; -} - -.editable-cell:hover { - background-color: #f5f5f5; -} - -.edit-input { - width: 100%; - padding: 5px; - box-sizing: border-box; - border: 1px solid #ddd; - border-radius: 4px; -} - -/*-------------------------------------- Notification--------------------------------------*/ -.notification-cell { - position: relative; -} - -.notification-bell { - position: relative; - display: inline-block; -} - -.notification-badge { - position: absolute; - top: -8px; - right: -8px; - background-color: red; - color: white; - border-radius: 50%; - padding: 2px 6px; - font-size: 12px; - min-width: 15px; - text-align: center; -} - -.fa-bell { - color: #666; - font-size: 20px; -} - - -/* Media Queries pour Mobile */ -@media screen and (max-width: 768px) { - /* Navbar */ - .nav-wrapper { - height: 9vh; - padding: 0; - display: flex; - justify-content: space-between; - align-items: center; - } - - /* Section avatar (gauche) */ - .avatar-section { - width: 200px; /* Largeur rĂ©duite */ - margin-left: 10px; - order: 0; /* Garde Ă  gauche */ - } - - .avatar-container { - width: 35px; - height: 35px; - } - - .user-info span { - font-size: 0.8rem; - } - - /* Logo (centre) */ - .brand-logo { - order: 0; - flex: 0 0 auto; - padding: 0; - font-size: 1.2rem; - } - - /* Menu burger (droite) */ - .nav-right-icons { - order: 0; - width: auto; - padding-right: 15px; - } - - .burger-menu { - width: 24px; - height: 24px; - } - - /* Ajustements pour la banniĂšre */ - .banner-image-container { - height: 100%; - } - - .banner-content { - padding: 0 10px; - } - - /* Style des boutons dans la popup */ - .button-container { - display: flex; - gap: 10px; - margin: 15px 0; - width: 100%; - } - - .export-btn, - .delete-account-btn { - flex: 1; - padding: 12px 15px; - border: none; - border-radius: 8px; - font-size: 14px; - cursor: pointer; - transition: background-color 0.3s; - color: white; - } - - .export-btn { - background-color: var(--accent-color); - } - - .delete-account-btn { - background-color: var(--danger-color); - } -} - -/* Media Queries pour trĂšs petits Ă©crans */ -@media screen and (max-width: 380px) { - .avatar-section { - width: 150px; - } - - .user-info span { - font-size: 0.7rem; - } -} - -/* Style des boutons */ -.button-container { - display: flex; - gap: 15px; - margin: 15px 0; - width: 100%; -} - -.export-btn, -.delete-account-btn { - flex: 1; - padding: 12px 20px; - border: none; - border-radius: 8px; - color: white; - cursor: pointer; - transition: background-color 0.3s; - font-size: 14px; - display: block; -} - -.export-btn { - background-color: var(--accent-color); -} - -.delete-account-btn { - background-color: rgb(219, 17, 17); - display: block; - visibility: visible; -} - -.export-btn:hover { - background-color: #b06935; -} - -.delete-account-btn:hover { - background-color: #b60718; -} - -@media screen and (max-width: 768px) { - .button-container { - gap: 10px; - } - - .export-btn, - .delete-account-btn { - padding: 12px 15px; - font-size: 14px; - } -} - -/* Style pour les boutons de la popup */ -.popup-buttons { - display: flex; - gap: 15px; - margin: 15px 0; - width: 100%; -} - -/* Style pour les boutons d'action des tableaux */ -.button-container { - display: flex; - gap: 15px; - margin: 15px 0; - width: 100%; -} - -/* Style pour le header mobile */ -.mobile-nav { - display: none; - width: 100%; - padding: 10px; - background-color: #34495e; - overflow-x: auto; - white-space: nowrap; -} - -.mobile-nav ul { - display: flex; - gap: 10px; - margin: 0; - padding: 0; - list-style: none; -} - -/* Media Query pour mobile */ -@media screen and (max-width: 768px) { - .parameter-list { - display: flex; - width: 100%; - min-width: 100%; - height: auto; - overflow-x: auto; - background-color: rgb(31, 44, 61); - padding: 10px; - border-right: none; - border-bottom: 2px solid rgb(44, 62, 80); - } - - .mobile-nav { - display: flex; /* Affiche la navigation mobile */ - } - - .parameter-header { - display: flex; - flex-direction: column; - } - - .parameter-list-ul { - text-align: center; - flex: 1 1 0%; - margin: 0px 5px; - padding: 10px; - white-space: nowrap; - margin-bottom: none; - } - - .parameter-list-ul:hover { - background-color: #34495e; - } - - .container { - flex-direction: column; - } - - .parameter-area { - margin: -5px; - } -} - -/* Style pour le header et la navigation mobile */ -.parameter-header { - background-color: #34495e; - padding: 20px 0; - margin: 0; - width: 100%; -} - -.mobile-nav { - display: none; /* Par dĂ©faut cachĂ© */ - width: 100%; - padding: 10px; - background-color: #34495e; - overflow-x: auto; -} - -.mobile-nav ul { - display: flex; - gap: 10px; - margin: 0; - padding: 10px; - list-style: none; -} - -.mobile-nav li { - flex: 0 0 auto; - white-space: nowrap; -} - -/* Ajoutez ces styles pour la banniĂšre dans la popup */ -.banner-container { - width: 100%; - margin-bottom: 20px; -} - -.banner-wrapper { - width: 100%; - height: 120px; - overflow: hidden; - position: relative; - border-radius: 10px; -} - -.banner-wrapper img { - width: 100%; - height: 100%; - object-fit: cover; - position: absolute; - top: 0; - left: 0; -} - -/* Mise Ă  jour des styles existants */ -.popup-content { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - background: white; - padding: 20px; - border-radius: 10px; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); - width: 90%; - max-width: 500px; - max-height: 80vh; - overflow-y: auto; -} - -/* Style pour le conteneur de la banniĂšre */ -.banner-upload-label { - display: block; - width: auto; - padding: 12px 20px; - background-color: var(--accent-color); - color: white; - border-radius: 8px; - cursor: pointer; - transition: background-color 0.3s; - text-align: center; - font-size: 16px; - margin: 10px auto; - max-width: 200px; -} - -/* ---------------------Style pour la popup de contrat--------------------- */ - -.contract-popup-overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(0, 0, 0, 0.5); - display: flex -; - justify-content: center; - align-items: center; - z-index: 1000; -} - -.contract-popup-content { - background: white; - padding: 30px; - border-radius: 8px; - max-width: 600px; - width: 90%; - max-height: 80vh; - overflow-y: auto; - position: relative; -} - -.close-contract-popup { - position: absolute; - top: 15px; - right: 15px; - background: none; - border: none; - font-size: 24px; - cursor: pointer; - color: #666; -} - -/* Style pour la popup d'alerte */ -.alert-popup { - position: fixed; - top: 20px; - left: 50%; - transform: translateX(-50%); - background-color: #f44336; - color: white; - padding: 15px 25px; - border-radius: 4px; - box-shadow: 0 2px 5px rgba(0,0,0,0.2); - z-index: 1000; - display: none; - animation: slideDown 0.3s ease-out; -} - -/* ---------------------Style pour la popup notification--------------------- */ - - -.notifications-modal { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(0, 0, 0, 0.5); - display: flex; - justify-content: center; - align-items: center; - z-index: 1000; -} - -.notifications-content { - position: relative; - background: white; - border-radius: 8px; - padding: 24px; - width: 90%; - max-width: 500px; -} - -.close-button { - position: absolute; - top: 15px; - right: 20px; - font-size: 24px; - color: #666; - cursor: pointer; - transition: color 0.2s; -} - -.close-button:hover { - color: #000; -} - -.notifications-title { - padding-right: 30px; /* Pour Ă©viter que le titre ne chevauche le bouton de fermeture */ -} - -.notifications-title { - font-size: 24px; - color: #445B6E; - margin-bottom: 20px; - font-weight: 500; -} - -.notifications-list { - display: flex; - flex-direction: column; - gap: 16px; -} - -.notification-item { - display: flex; - align-items: flex-start; - padding: 12px 0; - border-bottom: 1px solid #eee; - cursor: pointer; -} - -.notification-status { - margin-right: 16px; - display: flex; - align-items: center; - justify-content: center; - width: 24px; - height: 24px; -} - -.dot-icon, .check-icon { - display: flex; - align-items: center; - justify-content: center; - width: 100%; - height: 100%; -} - -.notification-content { - flex: 1; -} - -.notification-message { - font-size: 16px; - color: #333; - margin-bottom: 4px; -} - -.notification-date { - font-size: 14px; - color: #666; -} - -.notification-item:hover { - background-color: #f8f9fa; -} - -.notification-item.read { - opacity: 0.7; -} - -.notification-item.unread { - background-color: #fff; -} - -.close-notifications { - position: absolute; - top: 15px; - right: 15px; - border: none; - background: none; - font-size: 24px; - color: #666; - cursor: pointer; -} - -/*-------------------------------------- STYLE ACTION BUTTON ---------------------*/ - -.action-buttons-wrapper { - display: flex; - flex-direction: row; - gap: 10px; - justify-content: center; - margin: 20px 0; -} - -.action-button { - display: flex; - align-items: center; - justify-content: center; - padding: 0; - border-radius: 8px; - border: none; - font-size: 16px; - cursor: pointer; - transition: all 0.3s ease; - color: white; - height: 40px; - width: 40px; -} - -.confirm-button { - background-color: #4CAF50; -} - -.confirm-button:hover { - background-color: #3d8b40; - transform: translateY(-2px); - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); -} - -.cancel-button { - background-color: rgb(244, 67, 54); -} - -.cancel-button:hover { - background-color: #d32f2f; - transform: translateY(-2px); - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); -} - -.banner-image.clickable { - cursor: pointer; - transition: opacity 0.3s ease; -} - -.banner-image.clickable:hover { - opacity: 0.8; -} - -.parameter-list-ul.profile { - position: relative; - overflow: hidden; - max-height: 200px; - margin-bottom: 20px; -} - - -.profile-preview { - position: relative; - width: 100%; - height: 100%; -} - -.preview-banner { - position: relative; - width: 100%; - height: 120px; - overflow: hidden; -} - -.preview-banner-img { - width: 100%; - height: 100%; - object-fit: cover; -} - -.preview-info { - position: relative; - display: flex; - align-items: center; - padding: 10px; - gap: 10px; - background: rgba(0, 0, 0, 0.3); -} - -.preview-avatar { - width: 45px; - height: 45px; - border-radius: 50%; - border: 2px solid white; -} - -/* ---------------------Style pour le QR code--------------------- */ - -.qr-code { - width: 50px; - height: 50px; - cursor: pointer; - transition: transform 0.2s ease; -} - -.qr-code:hover { - transform: scale(1.5); -} - -.qr-modal { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.7); - display: flex; - justify-content: center; - align-items: center; - z-index: 1000; -} - -.qr-modal-content { - background-color: white; - padding: 20px; - border-radius: 8px; - position: relative; - text-align: center; -} - -.close-qr-modal { - position: absolute; - right: 10px; - top: 5px; - font-size: 24px; - cursor: pointer; - color: #666; -} - -.close-qr-modal:hover { - color: #000; -} - -.qr-code-large { - max-width: 300px; - margin: 10px 0; -} - -.qr-address { - margin-top: 10px; - word-break: break-all; - font-size: 12px; - color: #666; -} - -.pairing-modal { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.5); - display: flex; - justify-content: center; - align-items: center; - z-index: 1000; -} - -.pairing-modal-content { - background-color: white; - padding: 2rem; - border-radius: 8px; - width: 90%; - max-width: 500px; -} - -.pairing-form { - display: flex; - flex-direction: column; - gap: 1rem; -} - -.form-group { - display: flex; - flex-direction: column; - gap: 0.5rem; -} - -.form-group label { - font-weight: bold; -} - -.button-group { - display: flex; - gap: 1rem; - justify-content: flex-end; - margin-top: 1rem; -} - -.button-group button { - padding: 0.5rem 1rem; - border-radius: 4px; - cursor: pointer; -} - -.confirm-button { - background-color: var(--accent-color); - color: white; - border: none; -} - -.cancel-button { - background-color: #ccc; - border: none; -} diff --git a/modules/ihm_client/public/style/chat.css b/modules/ihm_client/public/style/chat.css deleted file mode 100755 index ad2f97f5..00000000 --- a/modules/ihm_client/public/style/chat.css +++ /dev/null @@ -1,597 +0,0 @@ -/* Styles de base */ -:root { - --primary-color: #3A506B; - /* Bleu mĂ©tallique */ - --secondary-color: #B0BEC5; - /* Gris acier */ - --accent-color: #D68C45; - /* Cuivre */ -} - -body { - font-family: Arial, sans-serif; - margin: 0; - padding: 0; -} - - -/* 4NK NAVBAR */ - -.brand-logo { - text-align: center; - font-size: 1.5em; - font-weight: bold; -} - -.nav-wrapper { - position: fixed; - background: radial-gradient(circle, white, var(--primary-color)); - display: flex; - justify-content: space-between; - align-items: center; - color: #37474F; - height: 9vh; - width: 100vw; - left: 0; - top: 0; - box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, .2), 0px 16px 24px 2px rgba(0, 0, 0, .14), 0px 6px 30px 5px rgba(0, 0, 0, .12); -} - -/* IcĂŽnes de la barre de navigation */ -.nav-right-icons { - display: flex; -} - -.notification-bell, -.burger-menu { - height: 20px; - width: 20px; - margin-right: 1rem; - cursor: pointer; -} - -.notification-container { - position: relative; - /* Conserve la position pour le notification-board */ - display: inline-flex; - align-items: center; -} - -.notification-board { - position: absolute; - /* Position absolue pour le placer par rapport au container */ - top: 40px; - right: 0; - background-color: white; - border: 1px solid #ccc; - padding: 10px; - width: 200px; - max-height: 300px; - overflow-y: auto; - /* Scroll si les notifications dĂ©passent la taille */ - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - z-index: 10; - /* DĂ©finit la prioritĂ© d'affichage au-dessus des autres Ă©lĂ©ments */ - display: none; - /* Par dĂ©faut, la notification est masquĂ©e */ -} - -.notification-item{ - cursor: pointer; -} - -.notification-badge { - position: absolute; - top: -18px; - right: 35px; - background-color: red; - color: white; - border-radius: 50%; - padding: 4px 8px; - font-size: 12px; - display: none; - /* S'affiche seulement lorsqu'il y a des notifications */ - z-index: 10; -} - -/* Par dĂ©faut, le menu est masquĂ© */ -#menu { - display: none; - /* Menu cachĂ© par dĂ©faut */ - transition: display 0.3s ease-in-out; -} - -.burger-menu { - cursor: pointer; -} - -/* IcĂŽne burger */ -#burger-icon { - cursor: pointer; -} - -.menu-content { - display: none; - position: absolute; - top: 3.4rem; - right: 1rem; - background-color: white; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - border-radius: 5px; - overflow: hidden; -} - -.menu-content a { - display: block; - padding: 10px 20px; - text-decoration: none; - color: #333; - border-bottom: 1px solid #e0e0e0; - - &:hover { - background-color: rgba(26, 28, 24, .08); - } -} - -.menu-content a:last-child { - border-bottom: none; -} - -/* Ajustement pour la barre de navigation fixe */ -.container { - display: flex; - flex: 1; - height: 90vh; - margin-top: 9vh; - margin-left: -1%; - text-align: left; - width: 100vw; -} - - -/* Liste des groupes */ - -.group-list { - width: 25%; - background-color: #1f2c3d; - color: white; - padding: 20px; - box-sizing: border-box; - overflow-y: auto; - border-right: 2px solid #2c3e50; - flex-shrink: 0; - padding-right: 10px; - height: 91vh; -} -.group-list ul { - cursor: pointer; - list-style: none; - padding: 0; - padding-right: 10px; - margin-left: 20px; -} - -.group-list li { - margin-bottom: 20px; - padding: 15px; - border-radius: 8px; - background-color: #273646; - cursor: pointer; - transition: background-color 0.3s, box-shadow 0.3s; -} - -.group-list li:hover { - background-color: #34495e; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); -} - - -.group-list .member-container { - position: relative; -} - -.group-list .member-container button { - margin-left: 40px; - padding: 5px; - cursor: pointer; - background: var(--primary-color); - color: white; - border: 0px solid var(--primary-color); - border-radius: 50px; - position: absolute; - top: -25px; - right: -25px; -} - -.group-list .member-container button:hover { - background: var(--accent-color) -} - - -/* Zone de chat */ -.chat-area { - display: flex; - flex-direction: column; - flex: 1; - min-width: 0; - background-color:#f1f1f1; - border-radius: 10px; - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5); - margin: 1% 0% 0.5% 1%; -} - -/* En-tĂȘte du chat */ -.chat-header { - background-color: #34495e; - color: white; - padding: 15px; - font-size: 20px; - font-weight: bold; - border-radius: 10px 10px 0 0; - text-align: center; -} - -/* Messages */ -.messages { - flex: 1; - padding: 20px; - overflow-y: auto; - background-color: #f1f1f1; - border-top: 1px solid #ddd; -} - -.message-container { - display: flex; - margin: 8px; -} -.message-container .message { - align-self: flex-start; -} - -.message-container .message.user { - align-self: flex-end; - margin-left: auto; - color: white; -} - -.message { - max-width: 70%; - padding: 10px; - border-radius: 12px; - background:var(--secondary-color); - margin: 2px 0; -} - -/* Messages de l'utilisateur */ -.message.user { - background: #2196f3; - color: white; -} - -.message-time { - font-size: 0.7em; - opacity: 0.7; - margin-left: 0px; - margin-top: 5px; -} - - -/* AmĂ©lioration de l'esthĂ©tique des messages */ -/* .message.user:before { - content: ''; - position: absolute; - top: 10px; - right: -10px; - border: 10px solid transparent; - border-left-color: #3498db; -} */ - -/* Zone de saisie */ -.input-area { - padding: 10px; - background-color: #bdc3c7; - display: flex; - align-items: center; - border-radius: 10px; - margin: 1%; - /* Alignement vertical */ -} - -.input-area input[type="text"] { - flex: 1; - /* Prend l'espace restant */ - padding: 10px; - border: 1px solid #ccc; - border-radius: 5px; -} - -.input-area .attachment-icon { - margin: 0 10px; - cursor: pointer; - display: flex; - align-items: center; -} - -.input-area button { - padding: 10px; - margin-left: 10px; - background-color: #2980b9; - color: white; - border: none; - border-radius: 5px; - cursor: pointer; -} - -.input-area button:hover { - background-color: #1f608d; -} - -.tabs { - display: flex; - margin: 20px 0px; - gap: 10px; -} - -.tabs button { - padding: 10px 20px; - cursor: pointer; - background: var(--primary-color); - color: white; - border: 0px solid var(--primary-color); - margin-right: 5px; - border-radius: 10px; -} - -.tabs button:hover { - background: var(--secondary-color); - color: var(--primary-color); -} - -/* Signature */ -.signature-area { - display: flex; - flex-direction: column; - flex: 1; - min-width: 0; - background-color:#f1f1f1; - border-radius: 10px; - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5); - margin: 1% 0% 0.5% 1%; - transition: all 1s ease 0.1s; - visibility: visible; -} - -.signature-area.hidden { - opacity: 0; - visibility: hidden; - display: none; - pointer-events: none; -} - -.signature-header { - display: flex; - align-items: center; - justify-content: center; - background-color: var(--primary-color); - color: white; - border-radius: 10px 10px 0 0; - padding-left: 4%; -} - -.signature-content { - padding: 10px; - background-color: var(--secondary-color); - color: var(--primary-color); - height: 100%; - border-radius: 10px; - margin: 1%; - display: flex; - flex-direction: column; - align-items: center; -} - -.signature-description { - height: 20%; - width: 100%; - margin: 0% 10% 0% 10%; - overflow: auto; - display: flex; -} - -.signature-description li { - margin: 1% 0% 1% 0%; - list-style: none; - padding: 2%; - border-radius: 10px; - background-color: var(--primary-color); - color: var(--secondary-color); - width: 20%; - text-align: center; - cursor: pointer; - font-weight: bold; - margin-right: 2%; - overflow: auto; -} - -.signature-description li .member-list { - margin-left: -30%; -} - -.signature-description li .member-list li { - width: 100%; -} - -.signature-description li .member-list li:hover { - background-color: var(--secondary-color); - color: var(--primary-color); -} - -.signature-documents { - height: 80%; - width: 100%; - margin: 0% 10% 0% 10%; - overflow: auto; - display: flex; -} - -.signature-documents-header { - display: flex; - width: 100%; - height: 15%; - align-items: center; -} - -#request-document-button { - background-color: var(--primary-color); - color: white; - border: none; - border-radius: 10px; - padding: 8px; - cursor: pointer; - margin-left: 5%; - font-weight: bold; -} - -#request-document-button:hover { - background-color: var(--accent-color); - font-weight: bold; -} - -#close-signature { - cursor: pointer; - align-items: center; - margin-left: auto; - margin-right: 2%; - border-radius: 50%; - background-color: var(--primary-color); - color: white; - border: none; - padding: -3%; - margin-top: -5%; - font-size: 1em; - font-weight: bold; - } - - #close-signature:hover { - background-color: var(--secondary-color); - color: var(--primary-color); - } - - /* REQUEST MODAL */ - .request-modal { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(0, 0, 0, 0.5); - display: flex; - justify-content: center; - align-items: center; - z-index: 1000; -} - -.modal-content { - background-color: var(--secondary-color); - padding: 20px; - border-radius: 8px; - position: relative; - min-width: 300px; -} - -.close-modal { - position: absolute; - top: 10px; - right: 10px; - border: none; - background: none; - font-size: 1.5em; - cursor: pointer; - font-weight: bold; -} - -.close-modal:hover { - color: var(--accent-color); -} - -.modal-members { - display: flex; - justify-content: space-between; -} - -.modal-members ul li{ - list-style: none; -} - -.file-upload-container { - margin: 10px 0; -} - -.file-list { - margin-top: 10px; -} - -.file-item { - display: flex; - justify-content: space-between; - align-items: center; - padding: 5px; - margin: 5px 0; - background: var(--background-color-secondary); - border-radius: 4px; -} - -.remove-file { - background: none; - border: none; - color: var(--text-color); - cursor: pointer; - padding: 0 5px; -} - -.remove-file:hover { - color: var(--error-color); -} - -#message-input { - width: 100%; - height: 50px; - resize: none; - padding: 10px; - box-sizing: border-box; - overflow: auto; - max-width: 100%; - border-radius: 10px; -} - -/* Responsive */ -@media screen and (max-width: 768px) { - .group-list { - display: none; - /* Masquer la liste des groupes sur les petits Ă©crans */ - } - - .chat-area { - margin: 0; - } -} - - -::-webkit-scrollbar { - width: 5px; - height: 5px; -} - -::-webkit-scrollbar-track { - background: var(--primary-color); - border-radius: 5px; -} - -::-webkit-scrollbar-thumb { - background: var(--secondary-color); - border-radius: 5px; -} - -::-webkit-scrollbar-thumb:hover { - background: var(--accent-color); -} \ No newline at end of file diff --git a/modules/ihm_client/public/style/signature.css b/modules/ihm_client/public/style/signature.css deleted file mode 100755 index 2c8cf285..00000000 --- a/modules/ihm_client/public/style/signature.css +++ /dev/null @@ -1,1664 +0,0 @@ -/* Styles de base */ -:root { - --primary-color: #3A506B; - /* Bleu mĂ©tallique */ - --secondary-color: #B0BEC5; - /* Gris acier */ - --accent-color: #D68C45; - /* Cuivre */ -} - -body { - font-family: Arial, sans-serif; - margin: 0; - padding: 0; - display: flex; - height: 100vh; - background-color: #e9edf1; - flex-direction: column; -} - - - -/* 4NK NAVBAR */ - -.brand-logo { - text-align: center; - font-size: 1.5em; - font-weight: bold; -} - -.nav-wrapper { - position: fixed; - background: radial-gradient(circle, white, var(--primary-color)); - display: flex; - justify-content: space-between; - align-items: center; - color: #37474F; - height: 9vh; - width: 100vw; - left: 0; - top: 0; - box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, .2), 0px 16px 24px 2px rgba(0, 0, 0, .14), 0px 6px 30px 5px rgba(0, 0, 0, .12); -} - -/* IcĂŽnes de la barre de navigation */ -.nav-right-icons { - display: flex; -} - -.notification-bell, -.burger-menu { - height: 20px; - width: 20px; - margin-right: 1rem; - cursor: pointer; -} - -.notification-container { - position: relative; - /* Conserve la position pour le notification-board */ - display: inline-flex; - align-items: center; -} - -.notification-board { - position: absolute; - /* Position absolue pour le placer par rapport au container */ - top: 40px; - right: 0; - background-color: white; - border: 1px solid #ccc; - padding: 10px; - width: 200px; - max-height: 300px; - overflow-y: auto; - /* Scroll si les notifications dĂ©passent la taille */ - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - z-index: 10; - /* DĂ©finit la prioritĂ© d'affichage au-dessus des autres Ă©lĂ©ments */ - display: none; - /* Par dĂ©faut, la notification est masquĂ©e */ -} - -.notification-item{ - cursor: pointer; -} - -.notification-badge { - position: absolute; - top: -18px; - right: 35px; - background-color: red; - color: white; - border-radius: 50%; - padding: 4px 8px; - font-size: 12px; - display: none; - /* S'affiche seulement lorsqu'il y a des notifications */ - z-index: 10; -} - -/* Par dĂ©faut, le menu est masquĂ© */ -#menu { - display: none; - /* Menu cachĂ© par dĂ©faut */ - transition: display 0.3s ease-in-out; -} - -.burger-menu { - cursor: pointer; -} - -/* IcĂŽne burger */ -#burger-icon { - cursor: pointer; -} - -.menu-content { - display: none; - position: absolute; - top: 3.4rem; - right: 1rem; - background-color: white; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - border-radius: 5px; - overflow: hidden; -} - -.menu-content a { - display: block; - padding: 10px 20px; - text-decoration: none; - color: #333; - border-bottom: 1px solid #e0e0e0; - - &:hover { - background-color: rgba(26, 28, 24, .08); - } -} - -.menu-content a:last-child { - border-bottom: none; -} - -/* Ajustement pour la barre de navigation fixe */ -.container { - display: flex; - flex: 1; - height: 90vh; - margin-top: 9vh; - margin-left: -1%; - text-align: left; - width: 209vh; -} - - -/* Liste des groupes */ - -.group-list { - width: 25%; - background-color: #1f2c3d; - color: white; - padding: 20px; - box-sizing: border-box; - overflow-y: auto; - border-right: 2px solid #2c3e50; - flex-shrink: 0; - padding-right: 10px; - height: 91vh; -} - -.group-list ul { - cursor: pointer; - list-style: none; - padding: 0; - padding-right: 10px; - margin-left: 20px; -} - -.group-list li { - margin-bottom: 10px; - padding: 15px; - border-radius: 8px; - background-color: #273646; - cursor: pointer; - transition: background-color 0.3s, box-shadow 0.3s; -} - -.group-list li:hover { - background-color: #34495e; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); -} - - -/* Zone de chat */ - -.chat-area { - display: flex; - flex-direction: column; - flex: 1; - min-width: 0; - background-color: #ffffff; - border-radius: 10px; - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1); - margin: 0px; - margin-top: 20px; - margin-left: 1%; - margin-bottom: -7px; -} - -/* En-tĂȘte du chat */ -.chat-header { - background-color: #34495e; - color: white; - padding: 15px; - font-size: 20px; - font-weight: bold; - border-radius: 10px 10px 0 0; - text-align: center; -} - -/* Messages */ -.messages { - flex: 1; - padding: 20px; - overflow-y: auto; - background-color: #f1f1f1; - border-top: 1px solid #ddd; -} - -.message-container { - max-width: 100%; - border-radius: 5px; - overflow-wrap: break-word; - word-wrap: break-word; - background-color: #f1f1f1; - display: flex; - flex-direction: column; -} - -.message-container .message { - align-self: flex-start; -} - -.message-container .message.user { - align-self: flex-end; - margin-left: auto; - color: white; -} - -.message { - padding: 12px 18px; - background-color: #e1e1e1; - border-radius: 15px; - max-width: 70%; - font-size: 16px; - line-height: 1.4; - margin-bottom: 0%; - white-space: pre-wrap; - word-wrap: break-word; - position: relative; - display: inline-block; -} - -/* Messages de l'utilisateur */ -.message.user { - background-color: #3498db; - color: white; - align-self: flex-end; - text-align: right; -} - -/* AmĂ©lioration de l'esthĂ©tique des messages */ -/* .message.user:before { - content: ''; - position: absolute; - top: 10px; - right: -10px; - border: 10px solid transparent; - border-left-color: #3498db; -} */ - -/* Zone de saisie */ -.input-area { - padding: 10px; - background-color: #bdc3c7; - display: flex; - align-items: center; - /* Alignement vertical */ -} - -.input-area input[type="text"] { - flex: 1; - /* Prend l'espace restant */ - padding: 10px; - border: 1px solid #ccc; - border-radius: 5px; -} - -.input-area .attachment-icon { - margin: 0 10px; - cursor: pointer; - display: flex; - align-items: center; -} - -.input-area button { - padding: 10px; - margin-left: 10px; - background-color: #2980b9; - color: white; - border: none; - border-radius: 5px; - cursor: pointer; -} - -.input-area button:hover { - background-color: #1f608d; -} - -#message-input { - width: 100%; - height: 50px; - resize: none; - padding: 10px; - box-sizing: border-box; - overflow: auto; - max-width: 100%; - border-radius: 10px; -} - -/* Responsive */ -@media screen and (max-width: 768px) { - .group-list { - display: none; - /* Masquer la liste des groupes sur les petits Ă©crans */ - } - - .chat-area { - margin: 0; - } -} - -#process-details { - flex: 1; - background: white; - border-radius: 8px; - margin: 10px; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); - display: none; - overflow: hidden; -} - -.process-details-header { - display: flex; - justify-content: space-between; - align-items: center; - padding: 20px; - background: #f8f9fa; - border-bottom: 1px solid #eee; - border-radius: 8px 8px 0 0; -} - -.process-details-header h2 { - margin: 0; - color: #333; -} - -.close-btn { - background: none; - border: none; - font-size: 24px; - cursor: pointer; - color: #666; -} - -.close-btn:hover { - color: #333; -} - -.process-details-content { - padding: 20px; - overflow-y: auto; - height: calc(100% - 70px); -} - -.details-section { - margin-bottom: 30px; -} - -.details-section h3 { - color: #444; - margin-bottom: 15px; - padding-bottom: 8px; - border-bottom: 2px solid #f0f0f0; -} - -.documents-list { - list-style: none; - padding: 0; -} - -.documents-list li { - padding: 8px 0; - border-bottom: 1px solid #eee; -} - -.roles-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); - gap: 20px; -} - -.role-block { - background: #f8f9fa; - border-radius: 8px; - padding: 15px; - border: 1px solid #eee; -} - -.role-block h4 { - color: #555; - margin: 0 0 10px 0; - padding-bottom: 8px; - border-bottom: 1px solid #eee; -} - -.members-list { - list-style: none; - padding: 0; -} - -.members-list li { - padding: 8px 12px; - margin: 4px 0; - cursor: pointer; - border-radius: 4px; - transition: background-color 0.2s; -} - -.members-list li:hover { - background-color: #e9ecef; -} - -.group-list-item { - padding: 8px 16px; - border-bottom: 1px solid rgba(255, 255, 255, 0.1); -} - -.group-item-container { - display: flex; - justify-content: space-between; - align-items: center; - width: 100%; -} - -.process-name { - flex-grow: 1; - cursor: pointer; -} - -.settings-icon { - cursor: pointer; - padding: 5px 8px; - margin-left: 10px; - border-radius: 4px; -} - -.settings-icon:hover { - background-color: rgba(255, 255, 255, 0.1); -} - -.process-details { - position: fixed; - top: 9vh; - right: 0; - bottom: 0; - left: 23.5%; - background-color: white; - box-sizing: border-box; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); - border-radius: 8px; - margin: 10px; - z-index: 990; -} - -.process-details-content { - height: calc(100% - 60px); /* AjustĂ© pour tenir compte du header */ - overflow-y: auto; - padding: 20px; -} - -.documents-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); - gap: 20px; - margin-top: 15px; -} - -.document-card { - background: white; - border-radius: 8px; - padding: 15px; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); - border: 1px solid #eee; -} - -.document-card.public { - border-left: 4px solid #4CAF50; -} - -.document-card.private { - border-left: 4px solid #FFC107; -} - -.document-card.confidential { - border-left: 4px solid #F44336; -} - -.document-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 10px; - padding-bottom: 10px; - border-bottom: 1px solid #eee; -} - -.document-header h4 { - margin: 0; - color: #333; -} - -.document-visibility { - padding: 4px 8px; - border-radius: 4px; - font-size: 12px; - font-weight: bold; -} - -.public .document-visibility { - background-color: #E8F5E9; - color: #2E7D32; -} - -.private .document-visibility { - background-color: #FFF3E0; - color: #F57C00; -} - -.confidential .document-visibility { - background-color: #FFEBEE; - color: #C62828; -} - -.document-info { - margin: 10px 0; - font-size: 14px; - color: #666; -} - -.document-info p { - margin: 5px 0; -} - -.signatures-list { - margin-top: 10px; -} - -.signature-item { - display: flex; - justify-content: space-between; - align-items: center; - padding: 8px; - border-radius: 4px; - margin: 5px 0; - background-color: #f8f9fa; -} - -.signature-item.signed { - background-color: #E8F5E9; -} - -.signature-item.pending { - background-color: #FFF3E0; -} - -.signer-name { - font-weight: 500; -} - -.signature-status { - font-size: 12px; -} - -.signed .signature-status { - color: #2E7D32; -} - -.pending .signature-status { - color: #F57C00; -} - -.user-selector { - position: relative; - margin-right: 20px; -} - -#userSwitchBtn { - background: none; - border: none; - cursor: pointer; - padding: 8px 12px; - border-radius: 4px; - display: flex; - align-items: center; - color: var(--primary-color); -} - -#userSwitchBtn:hover { - background-color: rgba(0, 0, 0, 0.05); -} - -.current-user-info { - display: flex; - align-items: center; - gap: 8px; -} - -.user-avatar { - background-color: var(--primary-color); - color: white; - width: 32px; - height: 32px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - font-weight: bold; -} - -.user-list { - position: absolute; - top: 100%; - right: 0; - background: white; - border-radius: 4px; - box-shadow: 0 2px 10px rgba(0,0,0,0.1); - display: none; - z-index: 1000; - max-height: 400px; - overflow-y: auto; - width: 250px; -} - -.user-list.show { - display: block; -} - -.user-list-item { - padding: 8px 16px; - display: flex; - align-items: center; - gap: 8px; - cursor: pointer; -} - -.user-list-item:hover { - background-color: rgba(0, 0, 0, 0.05); -} - -.user-list-item .user-avatar { - width: 24px; - height: 24px; - font-size: 12px; -} - -.user-list-item .user-email { - font-size: 12px; - color: #666; - display: block; -} - -.document-card { - margin-bottom: 20px; - padding: 10px; - border: 1px solid #ccc; - border-radius: 5px; -} - -.progress-bar { - background-color: #f3f3f3; - border-radius: 5px; - height: 10px; - width: 100%; - margin-top: 5px; -} - -.progress { - background-color: #4caf50; /* Couleur de la barre de progression */ - height: 100%; - border-radius: 5px; -} - -.new-request-btn { - background-color: #4caf50; - color: white; - border: none; - border-radius: 5px; - padding: 10px 15px; - cursor: pointer; - margin-left: 10px; -} - -.new-request-btn:hover { - background-color: #45a049; -} - -.header-buttons { - display: flex; - align-items: center; - gap: 10px; -} - -.close-btn { - background: none; - border: none; - font-size: 24px; - cursor: pointer; - color: #666; -} - -.close-btn:hover { - color: #333; -} - -.new-request-view { - padding: 20px; - background-color: white; - border-radius: 8px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); - margin: 20px; -} - -.upload-area { - border: 2px dashed #ccc; - padding: 20px; - text-align: center; - margin: 20px 0; -} - -.upload-icon { - font-size: 50px; - margin: 10px 0; -} - -/* New Request View */ -.new-request-view { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: white; - z-index: 1000; - padding: 20px; - box-sizing: border-box; - overflow-y: auto; -} - -.upload-area { - border: 2px dashed #ccc; - padding: 40px; - text-align: center; - margin: 20px auto; - max-width: 600px; - background-color: #f9f9f9; - border-radius: 8px; - cursor: pointer; -} - -.upload-icon { - font-size: 50px; - margin: 20px 0; -} - -.new-request-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-top: 60px; - padding: 0 20px; -} - -.upload-area { - border: 2px dashed #ccc; - padding: 40px; - text-align: center; - margin: 20px auto; - max-width: 600px; - background-color: #f9f9f9; - border-radius: 8px; - cursor: pointer; -} - -.details-header { - display: flex; - justify-content: space-between; - align-items: center; - background-color: #f8f9fa; - padding: 5px 20px; - border-radius:20px; -} - -.header-buttons { - display: flex; - align-items: center; - gap: 10px; - flex-direction: row; -} - -.close-btn { - background: none; - border: none; - font-size: 24px; - cursor: pointer; - color: #666; - padding: 5px; -} - -.close-btn:hover { - color: #333; -} - -.new-request-btn { - background-color: #4caf50; - color: white; - border: none; - border-radius: 5px; - padding: 8px 16px; - cursor: pointer; - /* margin-left: 10px; <- Supprimez cette ligne si elle existe */ -} - -.new-request-btn:hover { - background-color: #45a049; -} - -/* Ajoutez ces styles Ă  votre fichier CSS existant */ -.document-card.vierge { - background-color: #fff3cd; - border: 2px solid #ffeeba; -} - -.document-card.vierge .document-header { - background-color: #fff3cd; -} - -.document-card.vierge h4 { - color: #856404; -} - -.document-card.vierge .document-info { - color: #856404; -} - -/* Style pour l'emoji d'avertissement */ -.document-card.vierge h4::before { - margin-right: 8px; -} - -.vierge-documents-container { - padding: 20px; - overflow-y: auto; - max-height: calc(100vh - 150px); -} - -.document-form { - padding: 15px; - background-color: #fff; - border-radius: 0 0 5px 5px; - display: flex; - gap: 20px; -} - -.form-left { - flex: 1; - display: flex; - flex-direction: column; - gap: 15px; -} - -.form-right { - display: flex; - flex-direction: column; - align-items: flex-end; /* Aligner le bouton Ă  droite */ -} - -.form-group { - flex: 2; - display: flex; - flex-direction: column; - margin-bottom: 15px; -} - -.form-group-members { - flex: 2; - display: flex; - flex-direction: column; - margin-bottom: 15px; - font-weight: bold; -} - -.submit-btn { - background-color: #4caf50; - color: white; - border: none; - border-radius: 5px; - padding: 10px 15px; - cursor: pointer; - margin-left: 47%; - margin-top: 20px; -} - -.submit-btn:hover { - background-color: #45a049; -} - -.upload-format { - font-size: 12px; - color: #666; - margin: 5px 0; -} - -.browse-btn { - background-color: #4caf50; - color: white; - border: none; - padding: 8px 16px; - border-radius: 4px; - cursor: pointer; - margin-top: 10px; -} - -.browse-btn:hover { - background-color: #45a049; -} - -.document-selector { - padding: 20px; - margin-bottom: 20px; -} - -.document-selector label { - display: block; - margin-bottom: 10px; - font-weight: bold; - color: #666; -} - -.document-selector select { - width: 100%; - padding: 10px; - border: 1px solid #ddd; - border-radius: 4px; - font-size: 16px; - background-color: white; -} - -#selected-document-form { - padding: 0 20px; - overflow: auto; - height: 65%; -} - -/* Style pour l'option avec l'emoji */ -.document-selector select option { - padding: 10px; - font-size: 14px; -} - -.members-selection { - max-height: 200px; - overflow-y: auto; - border: 1px solid #ddd; - border-radius: 4px; - padding: 10px; - background-color: white; -} - -.member-checkbox { - display: flex; - align-items: center; - margin-bottom: 8px; - padding: 5px; -} - -.member-checkbox:hover { - background-color: #f5f5f5; -} - -.member-checkbox input[type="checkbox"] { - margin-right: 10px; -} - -.member-checkbox label { - cursor: pointer; - flex: 1; -} - -/* Style pour le conteneur des membres */ -.members-selection-container { - display: flex; - flex-direction: column; - align-items: center; /* Centrer la liste des membres */ - width: 100%; -} - -#members-list { - width: 60%; - height: 100%; - margin-bottom: -40px; - margin-top: 10px; -} - -/* Style pour le label des membres */ -.members-selection-container label { - font-weight: bold; /* Mettre le texte en gras */ - margin-bottom: 10px; /* Espacement en bas */ - display: block; /* Affichage en bloc */ -} - -/* Style pour les cases Ă  cocher des membres */ -.member-checkbox { - display: flex; - align-items: center; - margin-bottom: 8px; - padding: 5px; - border-radius: 4px; /* Coins arrondis */ - transition: background-color 0.2s; /* Transition pour l'effet de survol */ -} - -.member-checkbox:hover { - background-color: #e9ecef; /* Couleur de fond au survol */ -} - -/* Style pour les labels */ -.form-group label { - font-weight: bold; - margin-bottom: 5px; -} - -/* Style pour les champs de saisie */ -.form-group input, -.form-group select { - padding: 10px; - border: 1px solid #ddd; - border-radius: 4px; - font-size: 16px; - width: 80%; -} - -.add-members-btn { - background-color: #4caf50; - color: white; - border: none; - border-radius: 5px; - padding: 10px 15px; - cursor: pointer; - margin-top: 10px; /* Espacement au-dessus du bouton */ -} - -.add-members-btn:hover { - background-color: #45a049; -} - -/* Styles pour l'overlay et la modale */ -.modal-overlay { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.5); - z-index: 999; -} - -.modal { - position: fixed; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - background-color: white; - padding: 20px; - border-radius: 8px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); - z-index: 1000; - width: 25%; - max-width: 500px; -} - -.modal-content { - max-height: 70vh; - overflow-y: auto; -} - -.modal-footer { - display: flex; - justify-content: flex-end; - gap: 10px; - margin-top: 20px; - padding-top: 10px; - border-top: 1px solid #eee; -} - -.confirm-btn { - background-color: #4caf50; - color: white; - border: none; - padding: 8px 16px; - border-radius: 4px; - cursor: pointer; -} - -.confirm-btn:hover { - background-color: #45a049; -} - -.selected-member { - display: flex; - justify-content: space-between; - align-items: center; - background-color: #f5f5f5; - padding: 8px 12px; - margin: 4px 0; - border-radius: 4px; -} - -.cancel-btn { - background-color: #df2020; - color: white; - border: none; - padding: 8px 16px; - border-radius: 4px; - cursor: pointer; -} - -.cancel-btn:hover { - background-color: #c62828; / -} - -.remove-member-btn { - background-color: #dc3545; - color: white; - border: none; - border-radius: 50%; - width: 24px; - height: 24px; - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; - font-size: 16px; - padding: 0; - margin-left: 8px; -} - -.remove-member-btn:hover { - background-color: #c82333; -} - -#description { - height: 100px; - width: 100%; - border-radius: 20px; - padding: 10px 0; - padding-left: 10px; - resize: none; - -} - -.role-item-container { - display: flex; - justify-content: space-between; - align-items: center; - width: 100%; - padding: 5px 0; -} - -.role-item-container span:last-child { - margin-left: 10px; -} - -.document-card .new-request-btn { - margin-top: 60%; - margin-left: 65%; - padding: 6px 12px; - background-color: #4CAF50; - color: white; - border: none; - border-radius: 4px; - cursor: pointer; - font-size: 0.9em; -} - -.document-card .new-request-btn:hover { - background-color: #45a049; -} - -/* Styles pour la modale de nouveau document */ -.modal { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(0, 0, 0, 0.5); - display: flex; - justify-content: center; - align-items: center; - z-index: 1000; -} - - -.modal-content-document { - background: white; - padding: 20px; - border-radius: 8px; - width: 97%; -} - -.modal-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 20px; - padding-bottom: 10px; - border-bottom: 1px solid #eee; -} - -.modal-header h2 { - margin: 0; - color: #333; -} - -.modal-body { - margin-bottom: 20px; -} - -.modal-footer { - display: flex; - justify-content: flex-end; - gap: 10px; - padding-top: 20px; - border-top: 1px solid #eee; -} - -.modal-document { - position: fixed; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 100%; - height: 100%; - background: rgba(0, 0, 0, 0.5); - display: flex; - justify-content: center; - align-items: center; - z-index: 1000; -} -.form-group { - margin-bottom: 15px; -} - -.form-group label { - display: block; - margin-bottom: 5px; - font-weight: bold; - color: #555; -} - -.form-control { - width: 100%; - padding: 8px; - border: 1px solid #ddd; - border-radius: 4px; - font-size: 14px; -} - -.form-row { - display: flex; - gap: 15px; - margin-bottom: 15px; -} - -.form-group.half { - flex: 1; - margin-bottom: 0; /* Annule la marge du form-group standard */ -} - -.selected-signatories { - margin: 10px 0; - padding: 10px; - border: 1px solid #ddd; - border-radius: 4px; - min-height: 50px; -} - -.signatory-item { - display: flex; - justify-content: space-between; - align-items: center; - padding: 5px; - margin: 5px 0; - background: #f5f5f5; - border-radius: 4px; -} - -.remove-btn { - background: none; - border: none; - color: #dc3545; - cursor: pointer; - font-size: 18px; - padding: 0 5px; -} - -.remove-btn:hover { - color: #bd2130; -} - -.btn-primary { - background: #4CAF50; - color: white; - padding: 10px 20px; - border: none; - border-radius: 4px; - cursor: pointer; -} - -.btn-primary:hover { - background: #45a049; -} - -.btn-secondary { - background: #6c757d; - color: white; - padding: 8px 15px; - border: none; - border-radius: 4px; - cursor: pointer; -} - -.btn-secondary:hover { - background: #5a6268; -} - -.signatories-list { - max-height: 300px; - overflow-y: auto; -} - -.signatory-option { - display: flex; - align-items: center; - gap: 10px; - padding: 8px; - border-bottom: 1px solid #eee; -} - -.role-select { - padding: 4px; - border: 1px solid #ddd; - border-radius: 4px; - margin-left: auto; -} - -.role-section { - margin-bottom: 20px; - padding: 10px; - background: #f8f9fa; - border-radius: 4px; -} - -.role-section h4 { - margin: 0 0 10px 0; - color: #495057; -} - -.members-selection { - max-height: 300px; - overflow-y: auto; - padding: 10px; - border: 1px solid #dee2e6; - border-radius: 4px; -} - -input[type="file"] { - padding: 10px; - border: 1px dashed #ccc; - border-radius: 4px; - width: 100%; - margin-top: 5px; -} - -.file-upload-container { - border: 2px dashed #ccc; - padding: 20px; - text-align: center; - margin: 10px 0; - border-radius: 5px; - cursor: pointer; -} - -.file-upload-container:hover { - background-color: #f5f5f5; - border-color: #666; -} - -.file-upload-container.dragover { - background-color: #f0f0f0; - border-color: #4CAF50; -} - -.file-list { - margin-top: 10px; -} - -.file-item { - display: flex; - justify-content: space-between; - align-items: center; - padding: 8px; - margin: 5px 0; - background: #f5f5f5; - border-radius: 4px; -} - -.file-info { - display: flex; - gap: 10px; - align-items: center; -} - -.remove-file { - background: none; - border: none; - color: #ff4444; - cursor: pointer; - font-size: 18px; -} - -#fileInput { - display: none; -} - -.required-signatories { - margin: 10px 0; -} - -.signatory-item { - display: flex; - align-items: center; - gap: 10px; - padding: 8px; - margin: 5px 0; - background: #f5f5f5; - border-radius: 4px; -} - -.signatory-item.locked { - background: #e8e8e8; - cursor: not-allowed; -} - -.member-name { - font-weight: 500; -} - -.role-info { - color: #666; - font-size: 0.9em; -} - -.lock-icon { - margin-left: auto; - opacity: 0.6; -} - -/* Style pour la popup d'alerte */ -.alert-popup { - position: fixed; - top: 20px; - left: 50%; - transform: translateX(-50%); - background-color: #f44336; - color: white; - padding: 15px 25px; - border-radius: 4px; - box-shadow: 0 2px 5px rgba(0,0,0,0.2); - z-index: 1000; - display: none; - animation: slideDown 0.3s ease-out; -} - -.sign-button { - background-color: #4CAF50; - color: white; - padding: 8px 16px; - border: none; - border-radius: 4px; - cursor: pointer; - margin-top: 10px; -} - -.sign-button:hover { - background-color: #45a049; -} - -.sign-button:disabled { - background-color: #cccccc; - cursor: not-allowed; -} - -.modal-document { - background: white; - border-radius: 8px; - max-width: 800px; - width: 90%; - max-height: 95vh; - overflow-y: auto; - position: relative; -} - -.document-details { - padding: 20px; -} - -.info-section { - margin: 20px 0; - background: #f8f9fa; - padding: 15px; - border-radius: 6px; -} - -.info-row { - display: flex; - justify-content: space-between; - margin-bottom: 10px; -} - -.label { - font-weight: bold; - color: #666; -} - -.description-section { - margin: 20px 0; -} - -.signatures-section { - margin: 20px 0; -} - -.signature-item { - display: flex; - justify-content: space-between; - padding: 8px; - border-bottom: 1px solid #eee; -} - -.signature-item.signed { - background-color: #e8f5e9; -} - -.signature-item.pending { - background-color: #fff3e0; -} - -.files-section { - margin: 20px 0; -} - -.file-item { - display: flex; - align-items: center; - padding: 8px; - background: #f8f9fa; - margin-bottom: 5px; - border-radius: 4px; -} - -.file-icon { - margin-right: 10px; -} - -.download-link { - margin-left: auto; -} - -.confirmation-section { - margin-top: 30px; - text-align: center; -} - -.warning-text { - color: #f44336; - margin-bottom: 15px; -} - -.sign-confirm-btn { - background-color: #4CAF50; - color: white; - padding: 10px 20px; - border: none; - border-radius: 4px; - cursor: pointer; -} - -.sign-confirm-btn:hover { - background-color: #45a049; -} - -.signature-slider-container { - margin: 20px 20%; - padding: 10px; -} - -.slider-track { - position: relative; - background: #e0e0e0; - height: 40px; - border-radius: 20px; - display: flex; - align-items: center; - overflow: hidden; -} - -.slider-handle { - position: absolute; - left: 0; - width: 40px; - height: 40px; - background: #4CAF50; - border-radius: 50%; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - touch-action: none; - z-index: 1; -} - -.slider-arrow { - color: white; - font-size: 20px; -} - -.slider-text { - width: 100%; - text-align: center; - color: #666; - user-select: none; -} \ No newline at end of file diff --git a/modules/ihm_client/scripts/auto-ssh-push.sh b/modules/ihm_client/scripts/auto-ssh-push.sh deleted file mode 100755 index 1626aa11..00000000 --- a/modules/ihm_client/scripts/auto-ssh-push.sh +++ /dev/null @@ -1,155 +0,0 @@ -#!/bin/bash - -# Script d'automatisation des push SSH pour ihm_client -# Utilise automatiquement la clĂ© SSH pour tous les push - -set -e - -echo "🔑 Configuration automatique SSH pour push ihm_client..." - -# Configuration SSH automatique -echo "⚙ Configuration Git pour utiliser SSH..." -git config --global url."git@git.4nkweb.com:".insteadOf "https://git.4nkweb.com/" - -# VĂ©rifier la configuration SSH -echo "🔍 VĂ©rification de la configuration SSH..." -if ! ssh -T git@git.4nkweb.com 2>&1 | grep -q "successfully authenticated"; then - echo "❌ Échec de l'authentification SSH" - echo "💡 VĂ©rifiez que votre clĂ© SSH est configurĂ©e :" - echo " 1. ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_4nk" - echo " 2. Ajouter la clĂ© publique Ă  votre compte Gitea" - echo " 3. ssh-add ~/.ssh/id_ed25519_4nk" - exit 1 -fi - -echo "✅ Authentification SSH rĂ©ussie" - -# Fonction pour push automatique -auto_push() { - local branch=${1:-$(git branch --show-current)} - local commit_message=${2:-"Auto-commit $(date '+%Y-%m-%d %H:%M:%S')"} - - echo "🚀 Push automatique sur la branche: $branch" - - # Ajouter tous les changements - git add . - - # Commiter avec le message fourni - git commit -m "$commit_message" - - # Push avec SSH automatique - echo "đŸ“€ Push vers origin/$branch..." - git push origin "$branch" - - echo "✅ Push rĂ©ussi !" -} - -# Fonction pour push avec message personnalisĂ© -push_with_message() { - local message="$1" - local branch=${2:-$(git branch --show-current)} - - echo "💬 Push avec message: $message" - auto_push "$branch" "$message" -} - -# Fonction pour push rapide (sans message) -quick_push() { - local branch=${1:-$(git branch --show-current)} - auto_push "$branch" -} - -# Fonction pour push sur une branche spĂ©cifique -push_branch() { - local branch="$1" - local message=${2:-"Update $branch $(date '+%Y-%m-%d %H:%M:%S')"} - - echo "🌿 Push sur la branche: $branch" - auto_push "$branch" "$message" -} - -# Fonction pour push et merge vers main -push_and_merge() { - local source_branch=${1:-$(git branch --show-current)} - local target_branch=${2:-main} - - echo "🔄 Push et merge $source_branch -> $target_branch" - - # Push de la branche source - auto_push "$source_branch" - - # Demander confirmation pour le merge - read -p "Voulez-vous crĂ©er une Pull Request pour merger vers $target_branch ? (y/N): " -n 1 -r - echo - if [[ $REPLY =~ ^[Yy]$ ]]; then - echo "🔗 CrĂ©ation de la Pull Request..." - echo "💡 Allez sur: https://git.4nkweb.com/4nk/ihm_client/compare/$target_branch...$source_branch" - fi -} - -# Fonction pour status et push conditionnel -status_and_push() { - echo "📊 Statut du repository:" - git status --short - - if [[ -n $(git status --porcelain) ]]; then - echo "📝 Changements dĂ©tectĂ©s, push automatique..." - auto_push - else - echo "✅ Aucun changement Ă  pousser" - fi -} - -# Menu interactif si aucun argument fourni -if [[ $# -eq 0 ]]; then - echo "đŸ€– Script de push SSH automatique pour ihm_client" - echo "" - echo "Options disponibles:" - echo " auto-push.sh quick - Push rapide" - echo " auto-push.sh message \"Mon message\" - Push avec message" - echo " auto-push.sh branch nom-branche - Push sur branche spĂ©cifique" - echo " auto-push.sh merge [source] [target] - Push et prĂ©paration merge" - echo " auto-push.sh status - Status et push conditionnel" - echo "" - echo "Exemples:" - echo " ./scripts/auto-ssh-push.sh quick" - echo " ./scripts/auto-ssh-push.sh message \"feat: nouvelle fonctionnalitĂ©\"" - echo " ./scripts/auto-ssh-push.sh branch feature/nouvelle-fonctionnalite" - echo " ./scripts/auto-ssh-push.sh merge feature/nouvelle-fonctionnalite main" - echo "" - exit 0 -fi - -# Traitement des arguments -case "$1" in - "quick") - quick_push - ;; - "message") - if [[ -z "$2" ]]; then - echo "❌ Message requis pour l'option 'message'" - exit 1 - fi - push_with_message "$2" - ;; - "branch") - if [[ -z "$2" ]]; then - echo "❌ Nom de branche requis pour l'option 'branch'" - exit 1 - fi - push_branch "$2" "$3" - ;; - "merge") - push_and_merge "$2" "$3" - ;; - "status") - status_and_push - ;; - *) - echo "❌ Option inconnue: $1" - echo "💡 Utilisez './scripts/auto-ssh-push.sh' pour voir les options" - exit 1 - ;; -esac - -echo "🎯 Push SSH automatique terminĂ© !" diff --git a/modules/ihm_client/scripts/checks/version_alignment.sh b/modules/ihm_client/scripts/checks/version_alignment.sh deleted file mode 100755 index d682cf63..00000000 --- a/modules/ihm_client/scripts/checks/version_alignment.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")"/../.. && pwd)" -cd "$ROOT_DIR" - -version_file="VERSION" -[[ -f TEMPLATE_VERSION ]] && version_file="TEMPLATE_VERSION" - -[[ -f "$version_file" ]] || { echo "Version file missing ($version_file)"; exit 1; } -v=$(tr -d '\r' < "$version_file" | head -n1) -[[ -n "$v" ]] || { echo "Empty version"; exit 1; } - -echo "Version file: $version_file=$v" - -if ! grep -Eq "^## \\[$(echo "$v" | sed 's/^v//')\\]" CHANGELOG.md; then - echo "CHANGELOG entry for $v not found"; exit 1; -fi - -echo "Version alignment OK" diff --git a/modules/ihm_client/scripts/cleanup-deps.sh b/modules/ihm_client/scripts/cleanup-deps.sh deleted file mode 100755 index 9fbcddcc..00000000 --- a/modules/ihm_client/scripts/cleanup-deps.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -set -e - -echo "đŸ§č Nettoyage des dĂ©pendances temporaires..." - -# Suppression du dossier temporaire -if [ -d "./temp-deps" ]; then - echo " → Suppression de ./temp-deps/" - rm -rf ./temp-deps - echo "✅ Dossier temp-deps supprimĂ©" -else - echo "â„č Aucun dossier temp-deps trouvĂ©" -fi - -# VĂ©rification des fichiers WASM -if [ -d "./pkg" ]; then - echo "📁 Fichiers WASM conservĂ©s dans ./pkg/" - ls -la ./pkg/ -else - echo "⚠ Aucun fichier WASM trouvĂ© dans ./pkg/" -fi - -echo "✅ Nettoyage terminĂ©" diff --git a/modules/ihm_client/scripts/deploy/setup.sh b/modules/ihm_client/scripts/deploy/setup.sh deleted file mode 100755 index 8908ea95..00000000 --- a/modules/ihm_client/scripts/deploy/setup.sh +++ /dev/null @@ -1,145 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -ENV_DIR="${HOME}/.4nk_template" -ENV_FILE="${ENV_DIR}/.env" -TEMPLATE_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" -TEMPLATE_IN_REPO="${TEMPLATE_ROOT}/scripts/env/.env.template" - -usage() { - cat < [--dest DIR] [--force] - -Actions: - 1) Provisionne ~/.4nk_template/.env (si absent) - 2) Clone le dĂ©pĂŽt cible si le dossier n'existe pas - 3) Copie la structure normative 4NK_template dans le projet cible: - - .gitea/** (workflows, templates issues/PR) - - AGENTS.md - - .cursor/rules/** (si prĂ©sent) - - scripts/agents/**, scripts/env/ensure_env.sh, scripts/deploy/setup.sh - - docs/templates/** et docs/INDEX.md (table des matiĂšres) - 4) Ne remplace pas les fichiers existants sauf si --force - -Exemples: - $0 https://git.example.com/org/projet.git - $0 git@host:org/projet.git --dest ~/work --force -USAGE -} - -GIT_URL="${1:-}" -DEST_PARENT="$(pwd)" -FORCE_COPY=0 -shift || true -while [[ $# -gt 0 ]]; do - case "$1" in - --dest) - DEST_PARENT="${2:-}"; shift 2 ;; - --force) - FORCE_COPY=1; shift ;; - -h|--help) - usage; exit 0 ;; - *) - echo "Option inconnue: $1" >&2; usage; exit 2 ;; - esac -done - -if [[ -z "${GIT_URL}" ]]; then - usage; exit 2 -fi - -mkdir -p "${ENV_DIR}" -chmod 700 "${ENV_DIR}" || true - -if [[ ! -f "${ENV_FILE}" ]]; then - if [[ -f "${TEMPLATE_IN_REPO}" ]]; then - cp "${TEMPLATE_IN_REPO}" "${ENV_FILE}" - else - cat >"${ENV_FILE}" <<'EOF' -# Fichier d'exemple d'environnement pour 4NK_template -# Copiez ce fichier vers ~/.4nk_template/.env puis complĂ©tez les valeurs. -# Ne committez jamais de fichier contenant des secrets. - -# OpenAI (agents IA) -OPENAI_API_KEY= -OPENAI_MODEL= -OPENAI_API_BASE=https://api.openai.com/v1 -OPENAI_TEMPERATURE=0.2 - -# Gitea (release via API) -BASE_URL=https://git.4nkweb.com -RELEASE_TOKEN= -EOF - fi - chmod 600 "${ENV_FILE}" || true - echo "Fichier créé: ${ENV_FILE}. ComplĂ©tez les valeurs requises (ex: OPENAI_API_KEY, OPENAI_MODEL, RELEASE_TOKEN)." >&2 -fi - -# 2) Clonage du dĂ©pĂŽt si nĂ©cessaire -repo_name="$(basename -s .git "${GIT_URL}")" -target_dir="${DEST_PARENT%/}/${repo_name}" -if [[ ! -d "${target_dir}" ]]; then - echo "Clonage: ${GIT_URL} → ${target_dir}" >&2 - git clone --depth 1 "${GIT_URL}" "${target_dir}" -else - echo "Dossier existant, pas de clone: ${target_dir}" >&2 -fi - -copy_item() { - local src="$1" dst="$2" - if [[ ! -e "$src" ]]; then return 0; fi - if [[ -d "$src" ]]; then - mkdir -p "$dst" - if (( FORCE_COPY )); then - cp -a "$src/." "$dst/" - else - (cd "$src" && find . -type f -print0) | while IFS= read -r -d '' f; do - if [[ ! -e "$dst/$f" ]]; then - mkdir -p "$(dirname "$dst/$f")" - cp -a "$src/$f" "$dst/$f" - fi - done - fi - else - if [[ -e "$dst" && $FORCE_COPY -eq 0 ]]; then return 0; fi - mkdir -p "$(dirname "$dst")" && cp -a "$src" "$dst" - fi -} - -# 3) Copie de la structure normative -copy_item "${TEMPLATE_ROOT}/.gitea" "${target_dir}/.gitea" -copy_item "${TEMPLATE_ROOT}/AGENTS.md" "${target_dir}/AGENTS.md" -copy_item "${TEMPLATE_ROOT}/.cursor" "${target_dir}/.cursor" -copy_item "${TEMPLATE_ROOT}/.cursorignore" "${target_dir}/.cursorignore" -copy_item "${TEMPLATE_ROOT}/.gitignore" "${target_dir}/.gitignore" -copy_item "${TEMPLATE_ROOT}/.markdownlint.json" "${target_dir}/.markdownlint.json" -copy_item "${TEMPLATE_ROOT}/LICENSE" "${target_dir}/LICENSE" -copy_item "${TEMPLATE_ROOT}/CONTRIBUTING.md" "${target_dir}/CONTRIBUTING.md" -copy_item "${TEMPLATE_ROOT}/CODE_OF_CONDUCT.md" "${target_dir}/CODE_OF_CONDUCT.md" -copy_item "${TEMPLATE_ROOT}/SECURITY.md" "${target_dir}/SECURITY.md" -copy_item "${TEMPLATE_ROOT}/TEMPLATE_VERSION" "${target_dir}/TEMPLATE_VERSION" -copy_item "${TEMPLATE_ROOT}/security" "${target_dir}/security" -copy_item "${TEMPLATE_ROOT}/scripts" "${target_dir}/scripts" -copy_item "${TEMPLATE_ROOT}/docs/templates" "${target_dir}/docs/templates" - -# GĂ©nĂ©ration docs/INDEX.md dans le projet cible (si absent ou --force) -INDEX_DST="${target_dir}/docs/INDEX.md" -if [[ ! -f "${INDEX_DST}" || $FORCE_COPY -eq 1 ]]; then - mkdir -p "$(dirname "${INDEX_DST}")" - cat >"${INDEX_DST}" <<'IDX' -# Documentation du projet - -Cette table des matiĂšres oriente vers: -- Documentation spĂ©cifique au projet: `docs/project/` -- ModĂšles gĂ©nĂ©riques Ă  adapter: `docs/templates/` - -## Sommaire -- À personnaliser: `docs/project/README.md`, `docs/project/INDEX.md`, `docs/project/ARCHITECTURE.md`, `docs/project/USAGE.md`, etc. - -## ModĂšles gĂ©nĂ©riques -- Voir: `docs/templates/` -IDX -fi - -echo "Template 4NK appliquĂ© Ă : ${target_dir}" >&2 -exit 0 diff --git a/modules/ihm_client/scripts/dev/run_container.sh b/modules/ihm_client/scripts/dev/run_container.sh deleted file mode 100755 index 2d543cb9..00000000 --- a/modules/ihm_client/scripts/dev/run_container.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -IMAGE_NAME="4nk-template-dev:debian" -DOCKERFILE="docker/Dockerfile.debian" - -echo "[build] ${IMAGE_NAME}" -docker build -t "${IMAGE_NAME}" -f "${DOCKERFILE}" . - -echo "[run] launching container and executing agents" -docker run --rm -it \ - -v "${PWD}:/work" -w /work \ - "${IMAGE_NAME}" \ - "scripts/agents/run.sh; ls -la tests/reports/agents || true" - diff --git a/modules/ihm_client/scripts/dev/run_project_ci.sh b/modules/ihm_client/scripts/dev/run_project_ci.sh deleted file mode 100755 index d92d96b1..00000000 --- a/modules/ihm_client/scripts/dev/run_project_ci.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -# Build et lance le conteneur unifiĂ© (runner+agents) sur ce projet -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -ROOT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" -cd "$ROOT_DIR" - -# Build image -docker compose -f docker-compose.ci.yml build - -# ExĂ©cuter agents par dĂ©faut -RUNNER_MODE="${RUNNER_MODE:-agents}" BASE_URL="${BASE_URL:-}" REGISTRATION_TOKEN="${REGISTRATION_TOKEN:-}" \ - docker compose -f docker-compose.ci.yml up --remove-orphans --abort-on-container-exit diff --git a/modules/ihm_client/scripts/env/ensure_env.sh b/modules/ihm_client/scripts/env/ensure_env.sh deleted file mode 100755 index 64358191..00000000 --- a/modules/ihm_client/scripts/env/ensure_env.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" -TEMPLATE_FILE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/.env.template" -ENV_DIR="${HOME}/.4nk_template" -ENV_FILE="${ENV_DIR}/.env" - -mkdir -p "${ENV_DIR}" -chmod 700 "${ENV_DIR}" || true - -if [[ ! -f "${ENV_FILE}" ]]; then - if [[ -f "${TEMPLATE_FILE}" ]]; then - cp "${TEMPLATE_FILE}" "${ENV_FILE}" - chmod 600 "${ENV_FILE}" || true - echo "Fichier d'environnement créé: ${ENV_FILE}" >&2 - echo "Veuillez renseigner les variables requises (OPENAI_API_KEY, OPENAI_MODEL, etc.)." >&2 - exit 3 - else - echo "ModĂšle d'environnement introuvable: ${TEMPLATE_FILE}" >&2 - exit 2 - fi -fi - -# Charger pour validation -set -a -. "${ENV_FILE}" -set +a - -MISSING=() -for var in OPENAI_API_KEY OPENAI_MODEL; do - if [[ -z "${!var:-}" ]]; then - MISSING+=("$var") - fi -done - -if (( ${#MISSING[@]} > 0 )); then - echo "Variables manquantes dans ${ENV_FILE}: ${MISSING[*]}" >&2 - exit 4 -fi - -echo "Environnement valide: ${ENV_FILE}" >&2 diff --git a/modules/ihm_client/scripts/init-ssh-env.sh b/modules/ihm_client/scripts/init-ssh-env.sh deleted file mode 100755 index fdb5594e..00000000 --- a/modules/ihm_client/scripts/init-ssh-env.sh +++ /dev/null @@ -1,152 +0,0 @@ -#!/bin/bash - -# Script d'initialisation de l'environnement SSH pour ihm_client -# Configure automatiquement SSH pour tous les push - -set -e - -echo "🚀 Initialisation de l'environnement SSH pour ihm_client..." - -# Couleurs pour les messages -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' # No Color - -# Fonction pour afficher les messages colorĂ©s -print_status() { - echo -e "${BLUE}[INFO]${NC} $1" -} - -print_success() { - echo -e "${GREEN}[SUCCESS]${NC} $1" -} - -print_warning() { - echo -e "${YELLOW}[WARNING]${NC} $1" -} - -print_error() { - echo -e "${RED}[ERROR]${NC} $1" -} - -# VĂ©rifier si on est dans le bon rĂ©pertoire -if [[ ! -f "package.json" ]] || [[ ! -d ".git" ]]; then - print_error "Ce script doit ĂȘtre exĂ©cutĂ© depuis le rĂ©pertoire racine de ihm_client" - exit 1 -fi - -print_status "Configuration de l'environnement SSH..." - -# 1. Configuration Git pour SSH -print_status "Configuration Git pour utiliser SSH..." -git config --global url."git@git.4nkweb.com:".insteadOf "https://git.4nkweb.com/" - -# 2. VĂ©rifier si une clĂ© SSH existe -print_status "VĂ©rification des clĂ©s SSH existantes..." -if [[ -f ~/.ssh/id_rsa ]] || [[ -f ~/.ssh/id_ed25519 ]]; then - print_success "ClĂ© SSH trouvĂ©e" - SSH_KEY_EXISTS=true -else - print_warning "Aucune clĂ© SSH trouvĂ©e" - SSH_KEY_EXISTS=false -fi - -# 3. Tester la connexion SSH -print_status "Test de la connexion SSH vers git.4nkweb.com..." -if ssh -T git@git.4nkweb.com 2>&1 | grep -q "successfully authenticated"; then - print_success "Authentification SSH rĂ©ussie" - SSH_WORKING=true -else - print_error "Échec de l'authentification SSH" - SSH_WORKING=false -fi - -# 4. Configuration des alias Git -print_status "Configuration des alias Git..." -git config --global alias.ssh-push '!f() { git add . && git commit -m "${1:-Auto-commit $(date)}" && git push origin $(git branch --show-current); }; f' -git config --global alias.quick-push '!f() { git add . && git commit -m "Update $(date)" && git push origin $(git branch --show-current); }; f' - -print_success "Alias Git configurĂ©s" - -# 5. VĂ©rifier les remotes -print_status "VĂ©rification des remotes Git..." -if git remote -v | grep -q "git@git.4nkweb.com"; then - print_success "Remotes configurĂ©s pour SSH" -else - print_warning "Remotes non configurĂ©s pour SSH" - print_status "Mise Ă  jour des remotes..." - git remote set-url origin git@git.4nkweb.com:4nk/ihm_client.git - print_success "Remotes mis Ă  jour" -fi - -# 6. Rendre les scripts exĂ©cutables -print_status "Configuration des permissions des scripts..." -chmod +x scripts/auto-ssh-push.sh 2>/dev/null || true -chmod +x scripts/setup-ssh-ci.sh 2>/dev/null || true - -print_success "Scripts rendus exĂ©cutables" - -# 7. CrĂ©er un fichier de configuration local -print_status "CrĂ©ation du fichier de configuration local..." -cat > .ssh-config << EOF -# Configuration SSH automatique pour ihm_client -# GĂ©nĂ©rĂ© le $(date) - -# Configuration Git -git config --global url."git@git.4nkweb.com:".insteadOf "https://git.4nkweb.com/" - -# Alias Git -git config --global alias.ssh-push '!f() { git add . && git commit -m "\${1:-Auto-commit \$(date)}" && git push origin \$(git branch --show-current); }; f' -git config --global alias.quick-push '!f() { git add . && git commit -m "Update \$(date)" && git push origin \$(git branch --show-current); }; f' - -# Test SSH -ssh -T git@git.4nkweb.com - -# Scripts disponibles -./scripts/auto-ssh-push.sh quick -./scripts/auto-ssh-push.sh message "Mon message" -git ssh-push "Mon message" -git quick-push -EOF - -print_success "Fichier de configuration créé: .ssh-config" - -# 8. RĂ©sumĂ© de la configuration -echo "" -print_success "=== Configuration SSH terminĂ©e ===" -echo "" -echo "✅ Configuration Git pour SSH" -echo "✅ Alias Git configurĂ©s" -echo "✅ Remotes vĂ©rifiĂ©s" -echo "✅ Scripts configurĂ©s" -echo "" - -if [[ "$SSH_WORKING" == "true" ]]; then - print_success "SSH fonctionne correctement" - echo "" - echo "🚀 Vous pouvez maintenant utiliser :" - echo " ./scripts/auto-ssh-push.sh quick" - echo " ./scripts/auto-ssh-push.sh message \"Mon message\"" - echo " git ssh-push \"Mon message\"" - echo " git quick-push" - echo "" -else - print_warning "SSH ne fonctionne pas encore" - echo "" - echo "🔧 Pour configurer SSH :" - echo " 1. GĂ©nĂ©rer une clĂ© SSH : ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_4nk" - echo " 2. Ajouter Ă  l'agent SSH : ssh-add ~/.ssh/id_ed25519_4nk" - echo " 3. Ajouter la clĂ© publique Ă  votre compte Gitea" - echo " 4. Relancer ce script : ./scripts/init-ssh-env.sh" - echo "" -fi - -# 9. Test final -if [[ "$SSH_WORKING" == "true" ]]; then - print_status "Test final de push SSH..." - echo "💡 Pour tester, utilisez : ./scripts/auto-ssh-push.sh status" -fi - -print_success "Initialisation SSH terminĂ©e !" diff --git a/modules/ihm_client/scripts/integrate-4nk-node.sh b/modules/ihm_client/scripts/integrate-4nk-node.sh deleted file mode 100755 index cedd1603..00000000 --- a/modules/ihm_client/scripts/integrate-4nk-node.sh +++ /dev/null @@ -1,348 +0,0 @@ -#!/bin/bash - -set -e - -# Configuration -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" -TARGET_DIR="${PROJECT_ROOT}/../4NK_node" - -# Couleurs pour l'affichage -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' # No Color - -# Fonction d'affichage -print_info() { - echo -e "${BLUE}â„č $1${NC}" -} - -print_success() { - echo -e "${GREEN}✅ $1${NC}" -} - -print_warning() { - echo -e "${YELLOW}⚠ $1${NC}" -} - -print_error() { - echo -e "${RED}❌ $1${NC}" -} - -# Fonction d'aide -show_help() { - echo "Usage: $0 [options]" - echo "" - echo "Options:" - echo " --target-dir DIR RĂ©pertoire cible 4NK_node (dĂ©faut: ../4NK_node)" - echo " --dry-run Simulation sans modification" - echo " --backup CrĂ©er une sauvegarde avant intĂ©gration" - echo " --help Afficher cette aide" - echo "" - echo "Exemples:" - echo " $0 # IntĂ©gration standard" - echo " $0 --dry-run # Simulation" - echo " $0 --target-dir /path/to/4NK_node" -} - -# Variables -DRY_RUN=false -BACKUP=false -TARGET_DIR="${PROJECT_ROOT}/../4NK_node" - -# Parsing des arguments -while [[ $# -gt 0 ]]; do - case $1 in - --target-dir) - TARGET_DIR="$2" - shift 2 - ;; - --dry-run) - DRY_RUN=true - shift - ;; - --backup) - BACKUP=true - shift - ;; - --help) - show_help - exit 0 - ;; - *) - print_error "Option inconnue: $1" - show_help - exit 1 - ;; - esac -done - -# VĂ©rification des prĂ©requis -check_prerequisites() { - print_info "VĂ©rification des prĂ©requis..." - - # VĂ©rifier que nous sommes dans le bon rĂ©pertoire - if [[ ! -f "${PROJECT_ROOT}/package.json" ]]; then - print_error "Ce script doit ĂȘtre exĂ©cutĂ© depuis le rĂ©pertoire ihm_client" - exit 1 - fi - - # VĂ©rifier que le rĂ©pertoire cible existe - if [[ ! -d "$TARGET_DIR" ]]; then - print_error "RĂ©pertoire cible 4NK_node non trouvĂ©: $TARGET_DIR" - exit 1 - fi - - # VĂ©rifier que les fichiers d'intĂ©gration existent - local required_files=( - "Dockerfile.4nk-node" - "nginx.4nk-node.conf" - "start-4nk-node.sh" - "docker-compose.4nk-node.yml" - ) - - for file in "${required_files[@]}"; do - if [[ ! -f "${PROJECT_ROOT}/$file" ]]; then - print_error "Fichier requis manquant: $file" - exit 1 - fi - done - - print_success "PrĂ©requis vĂ©rifiĂ©s" -} - -# CrĂ©ation de la sauvegarde -create_backup() { - if [[ "$BACKUP" == "true" ]]; then - print_info "CrĂ©ation de la sauvegarde..." - - local backup_dir="${TARGET_DIR}/backup_$(date +%Y%m%d_%H%M%S)" - - if [[ "$DRY_RUN" == "false" ]]; then - mkdir -p "$backup_dir" - cp -r "${TARGET_DIR}/docker-compose.yml" "$backup_dir/" 2>/dev/null || true - cp -r "${TARGET_DIR}/ihm_client" "$backup_dir/" 2>/dev/null || true - print_success "Sauvegarde créée: $backup_dir" - else - print_info "DRY RUN: Sauvegarde serait créée: $backup_dir" - fi - fi -} - -# CrĂ©ation du rĂ©pertoire ihm_client dans 4NK_node -create_ihm_client_directory() { - print_info "CrĂ©ation du rĂ©pertoire ihm_client dans 4NK_node..." - - local ihm_client_dir="${TARGET_DIR}/ihm_client" - - if [[ "$DRY_RUN" == "false" ]]; then - mkdir -p "$ihm_client_dir" - print_success "RĂ©pertoire créé: $ihm_client_dir" - else - print_info "DRY RUN: RĂ©pertoire serait créé: $ihm_client_dir" - fi -} - -# Copie des fichiers d'intĂ©gration -copy_integration_files() { - print_info "Copie des fichiers d'intĂ©gration..." - - local files_to_copy=( - "Dockerfile.4nk-node:Dockerfile" - "nginx.4nk-node.conf:nginx.conf" - "start-4nk-node.sh:start.sh" - "package.json:package.json" - "tsconfig.json:tsconfig.json" - "vite.config.ts:vite.config.ts" - "index.html:index.html" - ) - - for file_mapping in "${files_to_copy[@]}"; do - local source_file=$(echo "$file_mapping" | cut -d: -f1) - local target_file=$(echo "$file_mapping" | cut -d: -f2) - - if [[ "$DRY_RUN" == "false" ]]; then - cp "${PROJECT_ROOT}/$source_file" "${TARGET_DIR}/ihm_client/$target_file" - print_success "CopiĂ©: $source_file -> ihm_client/$target_file" - else - print_info "DRY RUN: CopiĂ©: $source_file -> ihm_client/$target_file" - fi - done -} - -# Copie du code source -copy_source_code() { - print_info "Copie du code source..." - - local source_dirs=("src" "public") - - for dir in "${source_dirs[@]}"; do - if [[ -d "${PROJECT_ROOT}/$dir" ]]; then - if [[ "$DRY_RUN" == "false" ]]; then - cp -r "${PROJECT_ROOT}/$dir" "${TARGET_DIR}/ihm_client/" - print_success "CopiĂ©: $dir/" - else - print_info "DRY RUN: CopiĂ©: $dir/" - fi - fi - done -} - -# Mise Ă  jour du docker-compose.yml -update_docker_compose() { - print_info "Mise Ă  jour du docker-compose.yml..." - - local docker_compose_file="${TARGET_DIR}/docker-compose.yml" - local ihm_client_service=" - ihm_client: - build: - context: ./ihm_client - dockerfile: Dockerfile - container_name: 4nk-ihm-client - ports: - - \"8080:80\" - environment: - - SDK_RELAY_WS_URL=ws://sdk_relay_1:8090 - - SDK_RELAY_HTTP_URL=http://sdk_relay_1:8091 - - BITCOIN_RPC_URL=http://bitcoin:18443 - - BLINDBIT_URL=http://blindbit:8000 - volumes: - - ihm_client_logs:/var/log/nginx - networks: - - btcnet - depends_on: - - sdk_relay_1 - - sdk_relay_2 - - sdk_relay_3 - restart: unless-stopped - healthcheck: - test: [\"CMD\", \"wget\", \"--quiet\", \"--tries=1\", \"--timeout=5\", \"--spider\", \"http://localhost\"] - interval: 30s - timeout: 10s - retries: 3 - start_period: 40s" - - if [[ "$DRY_RUN" == "false" ]]; then - # VĂ©rifier si le service existe dĂ©jĂ  - if grep -q "ihm_client:" "$docker_compose_file" 2>/dev/null; then - print_warning "Service ihm_client existe dĂ©jĂ  dans docker-compose.yml" - else - # Ajouter le service avant la section volumes - sed -i "/^volumes:/i\\$ihm_client_service" "$docker_compose_file" - - # Ajouter les volumes ihm_client - sed -i '/^volumes:/a\ ihm_client_logs:\n driver: local' "$docker_compose_file" - - print_success "Service ihm_client ajoutĂ© au docker-compose.yml" - fi - else - print_info "DRY RUN: Service ihm_client serait ajoutĂ© au docker-compose.yml" - fi -} - -# CrĂ©ation du script de dĂ©marrage -create_startup_script() { - print_info "CrĂ©ation du script de dĂ©marrage..." - - local startup_script="${TARGET_DIR}/start-ihm-client.sh" - - if [[ "$DRY_RUN" == "false" ]]; then - cat > "$startup_script" << 'EOF' -#!/bin/bash - -set -e - -echo "🚀 DĂ©marrage de l'interface utilisateur 4NK..." - -# VĂ©rifier que nous sommes dans le bon rĂ©pertoire -if [[ ! -f "docker-compose.yml" ]]; then - echo "❌ Ce script doit ĂȘtre exĂ©cutĂ© depuis le rĂ©pertoire 4NK_node" - exit 1 -fi - -# DĂ©marrer uniquement le service ihm_client -echo "📩 DĂ©marrage du service ihm_client..." -docker-compose up -d ihm_client - -# Attendre que le service soit prĂȘt -echo "⏳ Attente du dĂ©marrage..." -sleep 10 - -# VĂ©rifier la santĂ© du service -if docker-compose ps ihm_client | grep -q "Up"; then - echo "✅ Interface utilisateur dĂ©marrĂ©e avec succĂšs" - echo " 📍 URL: http://localhost:8080" - echo " 🔍 Logs: docker logs 4nk-ihm-client" -else - echo "❌ Échec du dĂ©marrage de l'interface utilisateur" - docker-compose logs ihm_client - exit 1 -fi -EOF - - chmod +x "$startup_script" - print_success "Script de dĂ©marrage créé: $startup_script" - else - print_info "DRY RUN: Script de dĂ©marrage serait créé: $startup_script" - fi -} - -# Validation de l'intĂ©gration -validate_integration() { - print_info "Validation de l'intĂ©gration..." - - local validation_files=( - "${TARGET_DIR}/ihm_client/Dockerfile" - "${TARGET_DIR}/ihm_client/nginx.conf" - "${TARGET_DIR}/ihm_client/start.sh" - "${TARGET_DIR}/docker-compose.yml" - ) - - for file in "${validation_files[@]}"; do - if [[ -f "$file" ]]; then - print_success "ValidĂ©: $(basename "$file")" - else - print_error "Fichier manquant: $(basename "$file")" - return 1 - fi - done - - print_success "Validation terminĂ©e" -} - -# Fonction principale -main() { - echo "🔧 IntĂ©gration de ihm_client dans 4NK_node" - echo " Source: $PROJECT_ROOT" - echo " Cible: $TARGET_DIR" - echo " Mode: $([ "$DRY_RUN" == "true" ] && echo "DRY RUN" || echo "EXÉCUTION")" - echo "" - - check_prerequisites - create_backup - create_ihm_client_directory - copy_integration_files - copy_source_code - update_docker_compose - create_startup_script - - if [[ "$DRY_RUN" == "false" ]]; then - validate_integration - echo "" - print_success "IntĂ©gration terminĂ©e avec succĂšs !" - echo "" - echo "📋 Prochaines Ă©tapes:" - echo " 1. Aller dans le rĂ©pertoire 4NK_node: cd $TARGET_DIR" - echo " 2. DĂ©marrer l'interface: ./start-ihm-client.sh" - echo " 3. Ou redĂ©marrer tout: ./restart_4nk_node.sh" - echo " 4. AccĂ©der Ă  l'interface: http://localhost:8080" - else - echo "" - print_success "Simulation terminĂ©e - Aucune modification effectuĂ©e" - fi -} - -# ExĂ©cution -main "$@" diff --git a/modules/ihm_client/scripts/local/install_hooks.sh b/modules/ihm_client/scripts/local/install_hooks.sh deleted file mode 100755 index bd0f6004..00000000 --- a/modules/ihm_client/scripts/local/install_hooks.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"/.. -HOOKS_DIR="$REPO_ROOT/.git/hooks" - -mkdir -p "$HOOKS_DIR" -install_hook() { - local name="$1" src="$2" - cp -f "$src" "$HOOKS_DIR/$name" - chmod +x "$HOOKS_DIR/$name" - echo "Installed hook: $name" -} - -# Hooks qui dĂ©lĂšguent aux agents via l'image Docker du template sur le projet courant -install_hook pre-commit "$REPO_ROOT/scripts/local/precommit.sh" -install_hook pre-push "$REPO_ROOT/scripts/local/prepush.sh" - -echo "Hooks installĂ©s (mode agents via 4NK_template)." diff --git a/modules/ihm_client/scripts/local/merge_branch.sh b/modules/ihm_client/scripts/local/merge_branch.sh deleted file mode 100755 index 92752999..00000000 --- a/modules/ihm_client/scripts/local/merge_branch.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -TARGET_BRANCH="${1:-main}" -SOURCE_BRANCH="${2:-}" - -if [[ -z "$SOURCE_BRANCH" ]]; then - SOURCE_BRANCH="$(git rev-parse --abbrev-ref HEAD)" -fi - -if [[ "$SOURCE_BRANCH" == "$TARGET_BRANCH" ]]; then - echo "DĂ©jĂ  sur $TARGET_BRANCH"; exit 0 -fi - -# Valider localement avant merge -AUTO_FIX="${AUTO_FIX:-1}" SCOPE="${SCOPE:-all}" scripts/agents/run.sh || true -if [ -f scripts/security/audit.sh ]; then bash scripts/security/audit.sh || true; fi - -git fetch origin --prune -git checkout "$TARGET_BRANCH" -git pull --ff-only origin "$TARGET_BRANCH" || true -git merge --no-ff "$SOURCE_BRANCH" -m "[skip ci] merge: $SOURCE_BRANCH -> $TARGET_BRANCH" -git push origin "$TARGET_BRANCH" - -echo "Merge effectuĂ©: $SOURCE_BRANCH → $TARGET_BRANCH" diff --git a/modules/ihm_client/scripts/local/precommit.sh b/modules/ihm_client/scripts/local/precommit.sh deleted file mode 100755 index b2b502cc..00000000 --- a/modules/ihm_client/scripts/local/precommit.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -# ExĂ©cuter les agents depuis l'image Docker de 4NK_template sur le projet courant -PROJECT_DIR="$(git rev-parse --show-toplevel)" -TEMPLATE_DIR="$(cd "${PROJECT_DIR}/../4NK_template" && pwd)" - -mkdir -p "${PROJECT_DIR}/tests/reports/agents" -"${TEMPLATE_DIR}/scripts/local/run_agents_for_project.sh" "${PROJECT_DIR}" "tests/reports/agents" - -echo "[pre-commit] OK (agents via 4NK_template)" diff --git a/modules/ihm_client/scripts/local/prepush.sh b/modules/ihm_client/scripts/local/prepush.sh deleted file mode 100755 index 7cb8c7de..00000000 --- a/modules/ihm_client/scripts/local/prepush.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -# ExĂ©cuter les agents depuis l'image Docker de 4NK_template sur le projet courant -PROJECT_DIR="$(git rev-parse --show-toplevel)" -TEMPLATE_DIR="$(cd "${PROJECT_DIR}/../4NK_template" && pwd)" - -mkdir -p "${PROJECT_DIR}/tests/reports/agents" -"${TEMPLATE_DIR}/scripts/local/run_agents_for_project.sh" "${PROJECT_DIR}" "tests/reports/agents" - -# Audit sĂ©curitĂ© (best effort) dans le contexte du projet -if [ -f "${PROJECT_DIR}/scripts/security/audit.sh" ]; then - (cd "${PROJECT_DIR}" && bash scripts/security/audit.sh) || true -fi - -# Release guard (dry-run logique) dans le contexte du projet -if [ -f "${PROJECT_DIR}/scripts/release/guard.sh" ]; then - (cd "${PROJECT_DIR}" && bash scripts/release/guard.sh) || true -fi - -echo "[pre-push] OK (agents via 4NK_template)" diff --git a/modules/ihm_client/scripts/local/release_local.sh b/modules/ihm_client/scripts/local/release_local.sh deleted file mode 100755 index e3f48ede..00000000 --- a/modules/ihm_client/scripts/local/release_local.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -VERSION="${1:-}" -if [[ -z "$VERSION" ]]; then - echo "Usage: $0 vYYYY.MM.P" >&2 - exit 2 -fi - -ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -cd "$ROOT_DIR/.." - -echo "$VERSION" > TEMPLATE_VERSION -git add TEMPLATE_VERSION CHANGELOG.md 2>/dev/null || true -git commit -m "[skip ci] chore(release): $VERSION" || true -git tag -a "$VERSION" -m "release: $VERSION (latest)" -git push || true -git push origin "$VERSION" - -echo "Release locale prĂ©parĂ©e: $VERSION" diff --git a/modules/ihm_client/scripts/local/run_agents_for_project.sh b/modules/ihm_client/scripts/local/run_agents_for_project.sh deleted file mode 100755 index 5070846f..00000000 --- a/modules/ihm_client/scripts/local/run_agents_for_project.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -# Script pour lancer les agents de 4NK_template sur un projet externe -# Usage: ./run_agents_for_project.sh [project_path] [output_dir] - -PROJECT_PATH="${1:-.}" -OUTPUT_DIR="${2:-tests/reports/agents}" -TEMPLATE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" -MODULE_LAST_IMAGE_FILE="$(cd "$TEMPLATE_DIR/.." && pwd)/modules/4NK_template/.last_image" - -if [[ ! -d "$PROJECT_PATH" ]]; then - echo "Erreur: Le projet '$PROJECT_PATH' n'existe pas" >&2 - exit 1 -fi - -mkdir -p "$PROJECT_PATH/$OUTPUT_DIR" - -echo "=== Lancement des agents 4NK_template sur: $PROJECT_PATH ===" - -if ! command -v docker >/dev/null 2>&1; then - echo "Docker requis pour exĂ©cuter les agents via conteneur." >&2 - exit 2 -fi - -# Si une image du module existe, l'utiliser en prioritĂ© -if [[ -f "$MODULE_LAST_IMAGE_FILE" ]]; then - IMAGE_NAME="$(cat "$MODULE_LAST_IMAGE_FILE" | tr -d '\r\n')" - echo "Utilisation de l'image du module: $IMAGE_NAME" - # PrĂ©parer montage du fichier d'env si prĂ©sent - ENV_MOUNT="" - if [[ -f "$HOME/.4nk_template/.env" ]]; then - ENV_MOUNT="-v $HOME/.4nk_template/.env:/root/.4nk_template/.env:ro" - fi - # Lancer le conteneur en utilisant l'ENTRYPOINT qui configure safe.directory - docker run --rm \ - -e RUNNER_MODE=agents \ - -e TARGET_DIR=/work \ - -e OUTPUT_DIR=/work/$OUTPUT_DIR \ - -v "$(realpath "$PROJECT_PATH"):/work" \ - $ENV_MOUNT \ - "$IMAGE_NAME" || true -else - echo "Aucune image de module dĂ©tectĂ©e, fallback docker compose dans 4NK_template" - cd "$TEMPLATE_DIR" - docker compose -f docker-compose.ci.yml build - RUNNER_MODE="agents" TARGET_DIR="/work" OUTPUT_DIR="/work/$OUTPUT_DIR" \ - docker compose -f docker-compose.ci.yml run --rm project-ci || true -fi - -echo "=== Agents terminĂ©s → $PROJECT_PATH/$OUTPUT_DIR ===" diff --git a/modules/ihm_client/scripts/release/guard.sh b/modules/ihm_client/scripts/release/guard.sh deleted file mode 100755 index 46fde57c..00000000 --- a/modules/ihm_client/scripts/release/guard.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -# Release guard script -# Checks: tests, docs updated, compile, version ↔ changelog ↔ tag consistency, release type - -ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")"/../.. && pwd)" -cd "$ROOT_DIR" - -mode="${RELEASE_TYPE:-ci-verify}" # values: latest | wip | ci-verify - -echo "[release-guard] mode=$mode" - -# 1) Basic presence checks -[[ -f CHANGELOG.md ]] || { echo "CHANGELOG.md manquant"; exit 1; } -version_file="VERSION" -[[ -f TEMPLATE_VERSION ]] && version_file="TEMPLATE_VERSION" -[[ -f "$version_file" ]] || { echo "$version_file manquant"; exit 1; } - -# 2) Extract version -project_version=$(tr -d '\r' < "$version_file" | head -n1 | sed 's/^v//') -[[ -n "$project_version" ]] || { echo "Version vide dans $version_file"; exit 1; } -echo "[release-guard] version=$project_version" - -# 3) Changelog checks -if ! grep -Eq "^## \\[$project_version\\]" CHANGELOG.md; then - if [[ "$mode" == "wip" ]]; then - grep -Eq "^## \\[Unreleased\\]" CHANGELOG.md || { echo "Section [Unreleased] absente du CHANGELOG"; exit 1; } - else - echo "EntrĂ©e CHANGELOG pour version $project_version manquante"; exit 1; - fi -fi - -# 4) Tests (optional best-effort) -if [[ -x tests/run_all_tests.sh ]]; then - echo "[release-guard] exĂ©cution tests/run_all_tests.sh" - ./tests/run_all_tests.sh || { echo "Tests en Ă©chec"; exit 1; } -else - echo "[release-guard] tests absents (ok)" -fi - -# 5) Build/compile (optional based on project) -if [[ -d sdk_relay ]] && command -v cargo >/dev/null 2>&1; then - echo "[release-guard] cargo build (sdk_relay)" - (cd sdk_relay && cargo build --quiet) || { echo "Compilation Ă©chouĂ©e"; exit 1; } -else - echo "[release-guard] build spĂ©cifique non applicable (ok)" -fi - -# 6) Release type handling -case "$mode" in - latest) - ;; - wip) - # En wip, autoriser versions suffixĂ©es; pas d’exigence d’entrĂ©e datĂ©e - ;; - ci-verify) - # En CI, on valide juste la prĂ©sence de CHANGELOG et version - ;; - *) - echo "RELEASE_TYPE invalide: $mode (latest|wip|ci-verify)"; exit 1; - ;; -esac - -echo "[release-guard] OK" diff --git a/modules/ihm_client/scripts/scripts/auto-ssh-push.sh b/modules/ihm_client/scripts/scripts/auto-ssh-push.sh deleted file mode 100755 index 0064500b..00000000 --- a/modules/ihm_client/scripts/scripts/auto-ssh-push.sh +++ /dev/null @@ -1,166 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -# Script d'automatisation des push SSH (template Linux) -# Utilise automatiquement la clĂ© SSH pour pousser sur le remote courant via SSH. - -GITEA_HOST="${GITEA_HOST:-git.4nkweb.com}" - -echo "🔑 Configuration SSH pour push (template)..." - -# Configuration SSH automatique -echo "⚙ Configuration Git pour utiliser SSH..." -git config --global url."git@${GITEA_HOST}:".insteadOf "https://${GITEA_HOST}/" - -# VĂ©rifier la configuration SSH -echo "🔍 VĂ©rification de la configuration SSH..." -if ! ssh -T git@"${GITEA_HOST}" 2>&1 | grep -qi "authenticated\|welcome"; then - echo "❌ Échec de l'authentification SSH" - echo "💡 VĂ©rifiez que votre clĂ© SSH est configurĂ©e :" - echo " 1. ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_4nk" - echo " 2. Ajouter la clĂ© publique Ă  votre compte Gitea" - echo " 3. ssh-add ~/.ssh/id_ed25519_4nk" - exit 1 -fi - -echo "✅ Authentification SSH rĂ©ussie" - -# Fonction pour push automatique -get_current_branch() { - # DĂ©tecte la branche courante, compatible anciennes versions de git - local br - br="$(git rev-parse --abbrev-ref HEAD 2>/dev/null || true)" - if [ -z "$br" ] || [ "$br" = "HEAD" ]; then - br="$(git symbolic-ref --short -q HEAD 2>/dev/null || true)" - fi - if [ -z "$br" ]; then - # dernier recours: parser la sortie de "git branch" - br="$(git branch 2>/dev/null | sed -n 's/^* //p' | head -n1)" - fi - echo "$br" -} - -auto_push() { - local branch - branch=${1:-$(get_current_branch)} - local commit_message=${2:-"Auto-commit $(date '+%Y-%m-%d %H:%M:%S')"} - - echo "🚀 Push automatique sur la branche: $branch" - - # Ajouter tous les changements - git add . - - # Ne pas commiter si rien Ă  commite - if [[ -z "$(git diff --cached --name-only)" ]]; then - echo "â„č Aucun changement indexĂ©. Skip commit/push." - return 0 - fi - - # Commiter avec le message fourni - git commit -m "$commit_message" || true - - # Push avec SSH automatique - echo "đŸ“€ Push vers origin/$branch..." - git push origin "$branch" - - echo "✅ Push rĂ©ussi !" -} - -# Fonction pour push avec message personnalisĂ© -push_with_message() { - local message="$1" - local branch=${2:-$(get_current_branch)} - - echo "💬 Push avec message: $message" - auto_push "$branch" "$message" -} - -# Fonction pour push rapide (sans message) -quick_push() { - local branch=${1:-$(get_current_branch)} - auto_push "$branch" -} - -# Fonction pour push sur une branche spĂ©cifique -push_branch() { - local branch="$1" - local message=${2:-"Update $branch $(date '+%Y-%m-%d %H:%M:%S')"} - - echo "🌿 Push sur la branche: $branch" - auto_push "$branch" "$message" -} - -# Fonction pour push et merge vers main -push_and_merge() { - local source_branch=${1:-$(get_current_branch)} - local target_branch=${2:-main} - - echo "🔄 Push et merge $source_branch -> $target_branch" - - # Push de la branche source - auto_push "$source_branch" - - # Indication pour PR manuelle - echo "🔗 Ouvrez une Pull Request sur votre forge pour $source_branch -> $target_branch" -} - -# Fonction pour status et push conditionnel -status_and_push() { - echo "📊 Statut du repository:" - git status --short || true - - if [[ -n $(git status --porcelain) ]]; then - echo "📝 Changements dĂ©tectĂ©s, push automatique..." - auto_push - else - echo "✅ Aucun changement Ă  pousser" - fi -} - -# Menu interactif si aucun argument fourni -if [[ $# -eq 0 ]]; then - echo "đŸ€– Script de push SSH automatique (template)" - echo "" - echo "Options disponibles:" - echo " auto-ssh-push.sh quick - Push rapide" - echo " auto-ssh-push.sh message \"Mon message\" - Push avec message" - echo " auto-ssh-push.sh branch nom-branche - Push sur branche spĂ©cifique" - echo " auto-ssh-push.sh merge [source] [target] - Push et prĂ©paration merge" - echo " auto-ssh-push.sh status - Status et push conditionnel" - echo "" - exit 0 -fi - -# Traitement des arguments -case "$1" in - "quick") - quick_push - ;; - "message") - if [[ -z "${2:-}" ]]; then - echo "❌ Message requis pour l'option 'message'" - exit 1 - fi - push_with_message "$2" "${3:-}" - ;; - "branch") - if [[ -z "${2:-}" ]]; then - echo "❌ Nom de branche requis pour l'option 'branch'" - exit 1 - fi - push_branch "$2" "${3:-}" - ;; - "merge") - push_and_merge "${2:-}" "${3:-}" - ;; - "status") - status_and_push - ;; - *) - echo "❌ Option inconnue: $1" - echo "💡 Utilisez './scripts/auto-ssh-push.sh' pour voir les options" - exit 1 - ;; -esac - -echo "🎯 Push SSH automatique terminĂ© !" diff --git a/modules/ihm_client/scripts/scripts/init-ssh-env.sh b/modules/ihm_client/scripts/scripts/init-ssh-env.sh deleted file mode 100755 index 1ca7fa2f..00000000 --- a/modules/ihm_client/scripts/scripts/init-ssh-env.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -# Script d'initialisation de l'environnement SSH (template Linux) -# Configure automatiquement SSH pour les push via Gitea - -GITEA_HOST="${GITEA_HOST:-git.4nkweb.com}" - -echo "🚀 Initialisation de l'environnement SSH (template)..." - -# Couleurs -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' - -print_status() { echo -e "${BLUE}[INFO]${NC} $1"; } -print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; } -print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; } -print_error() { echo -e "${RED}[ERROR]${NC} $1"; } - -print_status "Configuration SSH..." - -# 1. Configuration Git pour SSH -print_status "Configuration Git pour utiliser SSH (${GITEA_HOST})..." -git config --global url."git@${GITEA_HOST}:".insteadOf "https://${GITEA_HOST}/" - -# 2. VĂ©rification des clĂ©s SSH -print_status "VĂ©rification des clĂ©s SSH existantes..." -if [[ -f ~/.ssh/id_rsa || -f ~/.ssh/id_ed25519 ]]; then - print_success "ClĂ© SSH trouvĂ©e" -else - print_warning "Aucune clĂ© SSH trouvĂ©e" -fi - -# 3. Test de la connexion SSH -print_status "Test de la connexion SSH vers ${GITEA_HOST}..." -if ssh -T git@"${GITEA_HOST}" 2>&1 | grep -qi "authenticated\|welcome"; then - print_success "Authentification SSH rĂ©ussie" -else - print_error "Échec de l'authentification SSH" -fi - -# 4. Alias Git -print_status "Configuration des alias Git..." -git config --global alias.ssh-push '!f() { git add . && git commit -m "${1:-Auto-commit $(date)}" && git push origin $(git branch --show-current); }; f' -git config --global alias.quick-push '!f() { git add . && git commit -m "Update $(date)" && git push origin $(git branch --show-current); }; f' -print_success "Alias Git configurĂ©s" - -# 5. Rendu exĂ©cutable des scripts si chemin standard -print_status "Configuration des permissions des scripts (si prĂ©sents)..." -chmod +x scripts/auto-ssh-push.sh 2>/dev/null || true -chmod +x scripts/setup-ssh-ci.sh 2>/dev/null || true -print_success "Scripts rendus exĂ©cutables (si prĂ©sents)" - -# 6. RĂ©sumĂ© -echo "" -print_success "=== Configuration SSH terminĂ©e ===" diff --git a/modules/ihm_client/scripts/scripts/setup-ssh-ci.sh b/modules/ihm_client/scripts/scripts/setup-ssh-ci.sh deleted file mode 100755 index a9c3e5d3..00000000 --- a/modules/ihm_client/scripts/scripts/setup-ssh-ci.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -# Script de configuration SSH pour CI/CD (template Linux) -# Utilise automatiquement la clĂ© SSH pour les opĂ©rations Git - -GITEA_HOST="${GITEA_HOST:-git.4nkweb.com}" - -echo "🔑 Configuration automatique de la clĂ© SSH pour CI/CD..." - -if [ -n "${CI:-}" ]; then - echo "✅ Environnement CI dĂ©tectĂ©" - - if [ -n "${SSH_PRIVATE_KEY:-}" ]; then - echo "🔐 Configuration de la clĂ© SSH privĂ©e..." - mkdir -p ~/.ssh && chmod 700 ~/.ssh - printf "%s" "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa - - if [ -n "${SSH_PUBLIC_KEY:-}" ]; then - printf "%s" "$SSH_PUBLIC_KEY" > ~/.ssh/id_rsa.pub - chmod 644 ~/.ssh/id_rsa.pub - fi - - cat > ~/.ssh/config << EOF -Host ${GITEA_HOST} - HostName ${GITEA_HOST} - User git - IdentityFile ~/.ssh/id_rsa - StrictHostKeyChecking no - UserKnownHostsFile=/dev/null -EOF - chmod 600 ~/.ssh/config - - echo "đŸ§Ș Test SSH vers ${GITEA_HOST}..." - ssh -T git@"${GITEA_HOST}" 2>&1 || true - - git config --global url."git@${GITEA_HOST}:".insteadOf "https://${GITEA_HOST}/" - echo "✅ Configuration SSH terminĂ©e" - else - echo "⚠ SSH_PRIVATE_KEY non dĂ©fini, bascule HTTPS" - fi -else - echo "â„č Environnement local dĂ©tectĂ©" - if [ -f ~/.ssh/id_rsa ] || [ -f ~/.ssh/id_ed25519 ]; then - echo "🔑 ClĂ© SSH locale trouvĂ©e" - git config --global url."git@${GITEA_HOST}:".insteadOf "https://${GITEA_HOST}/" - echo "✅ Configuration SSH locale terminĂ©e" - else - echo "⚠ Aucune clĂ© SSH trouvĂ©e; configuration manuelle requise" - fi -fi - -echo "🎯 Configuration SSH CI/CD terminĂ©e" diff --git a/modules/ihm_client/scripts/security/audit.sh b/modules/ihm_client/scripts/security/audit.sh deleted file mode 100755 index c705469d..00000000 --- a/modules/ihm_client/scripts/security/audit.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -echo "[security-audit] dĂ©marrage" -ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")"/../.. && pwd)" -cd "$ROOT_DIR" - -rc=0 - -# 1) Audit Rust (si Cargo.toml prĂ©sent et cargo disponible) -if command -v cargo >/dev/null 2>&1 && [ -f Cargo.toml ] || find . -maxdepth 2 -name Cargo.toml | grep -q . ; then - echo "[security-audit] cargo audit" - if ! cargo audit --deny warnings; then rc=1; fi || true -else - echo "[security-audit] pas de projet Rust (ok)" -fi - -# 2) Audit npm (si package.json prĂ©sent) -if [ -f package.json ]; then - echo "[security-audit] npm audit --audit-level=moderate" - if ! npm audit --audit-level=moderate; then rc=1; fi || true -else - echo "[security-audit] pas de package.json (ok)" -fi - -# 3) Recherche de secrets grossiers -echo "[security-audit] scan secrets" -if grep -RIE "(?i)(api[_-]?key|secret|password|private[_-]?key)" --exclude-dir .git --exclude-dir node_modules --exclude-dir target --exclude "*.md" . >/dev/null 2>&1; then - echo "[security-audit] secrets potentiels dĂ©tectĂ©s"; rc=1 -else - echo "[security-audit] aucun secret Ă©vident" -fi - -echo "[security-audit] terminĂ© rc=$rc" -exit $rc - - diff --git a/modules/ihm_client/scripts/setup-remote-deps.sh b/modules/ihm_client/scripts/setup-remote-deps.sh deleted file mode 100755 index c8384e49..00000000 --- a/modules/ihm_client/scripts/setup-remote-deps.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env sh -set -eu - -echo "[ihm_client] PrĂ©paration des dĂ©pendances wasm (pkg/sdk_client)" - -PKG_DIR="$(pwd)/pkg" -if [ -d "$PKG_DIR" ] && [ -f "$PKG_DIR/sdk_client.js" ]; then - echo "[ihm_client] pkg dĂ©jĂ  prĂ©sent, rien Ă  faire." - exit 0 -fi - -# Sources possibles (prioritĂ©: URL tarball > tarball local > base RAW) -SDK_URL="${SDK_CLIENT_PKG_URL:-}" -SDK_TARBALL="${SDK_CLIENT_PKG_TARBALL:-}" -# Par dĂ©faut, on pointe vers la branche docker-support du repo public -SDK_BASE="${SDK_CLIENT_PKG_BASE:-https://git.4nkweb.com/4nk/ihm_client/raw/branch/docker-support/pkg}" - -mkdir -p "$PKG_DIR" - -if [ -n "$SDK_URL" ]; then - echo "[ihm_client] TĂ©lĂ©chargement depuis SDK_CLIENT_PKG_URL=$SDK_URL" - TMP_TGZ="/tmp/sdk_client_pkg.tgz" - curl -fsSL "$SDK_URL" -o "$TMP_TGZ" - tar -xzf "$TMP_TGZ" -C "$PKG_DIR" --strip-components=1 || tar -xzf "$TMP_TGZ" -C "$PKG_DIR" || true - rm -f "$TMP_TGZ" -elif [ -n "$SDK_TARBALL" ] && [ -f "$SDK_TARBALL" ]; then - echo "[ihm_client] Extraction du tarball local $SDK_TARBALL" - tar -xzf "$SDK_TARBALL" -C "$PKG_DIR" --strip-components=1 || tar -xzf "$SDK_TARBALL" -C "$PKG_DIR" || true -elif [ -n "$SDK_BASE" ]; then - echo "[ihm_client] TĂ©lĂ©chargement des fichiers depuis SDK_CLIENT_PKG_BASE=$SDK_BASE (branche docker-support)" - # Liste des fichiers nĂ©cessaires issus de wasm-pack - for f in \ - sdk_client.js \ - sdk_client_bg.wasm \ - sdk_client.d.ts \ - sdk_client_bg.js \ - sdk_client_bg.wasm.d.ts \ - package.json \ - README.md; do - echo " - $f" - curl -fsSL "$SDK_BASE/$f" -o "$PKG_DIR/$f" - done -else - echo "[ERREUR] pkg/sdk_client absent et aucune source fournie." - echo "DĂ©finissez SDK_CLIENT_PKG_URL (tar.gz), SDK_CLIENT_PKG_BASE (URL raw du dossier pkg) ou montez un tarball local via SDK_CLIENT_PKG_TARBALL." - exit 2 -fi - -test -f "$PKG_DIR/sdk_client.js" || { echo "[ERREUR] pkg/sdk_client.js introuvable aprĂšs extraction"; exit 3; } - -echo "[ihm_client] DĂ©pendance wasm prĂȘte." diff --git a/modules/ihm_client/scripts/setup-ssh-ci.sh b/modules/ihm_client/scripts/setup-ssh-ci.sh deleted file mode 100755 index 63b3a6de..00000000 --- a/modules/ihm_client/scripts/setup-ssh-ci.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/bash - -# Script de configuration SSH pour CI/CD ihm_client -# Utilise automatiquement la clĂ© SSH pour les opĂ©rations Git - -set -e - -echo "🔑 Configuration automatique de la clĂ© SSH pour ihm_client CI/CD..." - -# VĂ©rifier si on est dans un environnement CI -if [ -n "$CI" ]; then - echo "✅ Environnement CI dĂ©tectĂ©" - - # Configuration SSH pour Gitea Actions - if [ -n "$SSH_PRIVATE_KEY" ]; then - echo "🔐 Configuration de la clĂ© SSH privĂ©e..." - - # CrĂ©er le rĂ©pertoire SSH - mkdir -p ~/.ssh - chmod 700 ~/.ssh - - # Écrire la clĂ© privĂ©e - echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa - - # Ajouter la clĂ© publique correspondante (si disponible) - if [ -n "$SSH_PUBLIC_KEY" ]; then - echo "$SSH_PUBLIC_KEY" > ~/.ssh/id_rsa.pub - chmod 644 ~/.ssh/id_rsa.pub - fi - - # Configuration SSH pour git.4nkweb.com - cat > ~/.ssh/config << EOF -Host git.4nkweb.com - HostName git.4nkweb.com - User git - IdentityFile ~/.ssh/id_rsa - StrictHostKeyChecking no - UserKnownHostsFile=/dev/null -EOF - - chmod 600 ~/.ssh/config - - # Tester la connexion SSH - echo "đŸ§Ș Test de connexion SSH vers git.4nkweb.com..." - if ssh -T git@git.4nkweb.com 2>&1 | grep -q "Welcome"; then - echo "✅ Connexion SSH rĂ©ussie" - else - echo "⚠ Connexion SSH Ă©tablie (message de bienvenue non dĂ©tectĂ©)" - fi - - # Configurer Git pour utiliser SSH - git config --global url."git@git.4nkweb.com:".insteadOf "https://git.4nkweb.com/" - - echo "✅ Configuration SSH terminĂ©e" - else - echo "⚠ Variable SSH_PRIVATE_KEY non dĂ©finie, utilisation de HTTPS" - fi -else - echo "â„č Environnement local dĂ©tectĂ©" - - # VĂ©rifier si une clĂ© SSH existe - if [ -f ~/.ssh/id_rsa ]; then - echo "🔑 ClĂ© SSH locale trouvĂ©e" - - # Configurer Git pour utiliser SSH localement - git config --global url."git@git.4nkweb.com:".insteadOf "https://git.4nkweb.com/" - - echo "✅ Configuration SSH locale terminĂ©e" - else - echo "⚠ Aucune clĂ© SSH trouvĂ©e, configuration manuelle requise" - echo "💡 Pour configurer SSH manuellement :" - echo " 1. GĂ©nĂ©rer une clĂ© SSH : ssh-keygen -t rsa -b 4096" - echo " 2. Ajouter la clĂ© publique Ă  votre compte Gitea" - echo " 3. Tester : ssh -T git@git.4nkweb.com" - fi -fi - -echo "🎯 Configuration SSH terminĂ©e pour ihm_client" diff --git a/modules/ihm_client/scripts/utils/check_md024.ps1 b/modules/ihm_client/scripts/utils/check_md024.ps1 deleted file mode 100644 index 000c6d19..00000000 --- a/modules/ihm_client/scripts/utils/check_md024.ps1 +++ /dev/null @@ -1,47 +0,0 @@ -Param( - [string]$Root = "." -) - -$ErrorActionPreference = "Stop" - -$files = Get-ChildItem -Path $Root -Recurse -Filter *.md | Where-Object { $_.FullName -notmatch '\\archive\\' } -$had = $false -foreach ($f in $files) { - try { - $lines = Get-Content -LiteralPath $f.FullName -Encoding UTF8 -ErrorAction Stop - } catch { - Write-Warning ("Impossible de lire: {0} — {1}" -f $f.FullName, $_.Exception.Message) - continue - } - $map = @{} - $firstMap = @{} - $dups = @{} - for ($i = 0; $i -lt $lines.Count; $i++) { - $line = $lines[$i] - if ($line -match '^\s{0,3}#{1,6}\s+(.*)$') { - $t = $Matches[1].Trim() - $norm = ([regex]::Replace($t, '\s+', ' ')).ToLowerInvariant() - if ($map.ContainsKey($norm)) { - if (-not $dups.ContainsKey($norm)) { - $dups[$norm] = New-Object System.Collections.ArrayList - $firstMap[$norm] = $map[$norm] - } - [void]$dups[$norm].Add($i + 1) - } else { - $map[$norm] = $i + 1 - } - } - } - if ($dups.Keys.Count -gt 0) { - $had = $true - Write-Output "=== $($f.FullName) ===" - foreach ($k in $dups.Keys) { - $first = $firstMap[$k] - $others = ($dups[$k] -join ', ') - Write-Output ("Heading: '{0}' first@{1} duplicates@[{2}]" -f $k, $first, $others) - } - } -} -if (-not $had) { - Write-Output "No duplicate headings detected." -} diff --git a/modules/ihm_client/src/4nk.css b/modules/ihm_client/src/4nk.css deleted file mode 100644 index 6e328dcb..00000000 --- a/modules/ihm_client/src/4nk.css +++ /dev/null @@ -1,818 +0,0 @@ -:host { - --primary-color: #3a506b; - /* Bleu mĂ©tallique */ - --secondary-color: #b0bec5; - /* Gris acier */ - --accent-color: #d68c45; - /* Cuivre */ - font-family: Arial, sans-serif; - height: 100vh; - font-size: 16px; -} -body { - font-family: Arial, sans-serif; - margin: 0; - padding: 0; - background-color: #f4f4f4; - background-image: url(../assets/bgd.webp); - background-repeat: no-repeat; - background-size: cover; - background-blend-mode: soft-light; - height: 100vh; -} -.message { - margin: 30px 0; - font-size: 14px; - overflow-wrap: anywhere; -} - -.message strong { - font-family: 'Segoe UI Emoji', 'Noto Color Emoji', 'Apple Color Emoji', sans-serif; - font-size: 20px; -} - -/** Modal Css */ -.modal { - display: none; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.5); - justify-content: center; - align-items: center; - z-index: 3; -} - -.modal-content { - width: 55%; - height: 30%; - background-color: white; - border-radius: 4px; - padding: 20px; - text-align: center; - display: flex; - flex-direction: column; - align-items: center; -} - -.modal-title { - margin: 0; - padding-bottom: 8px; - width: 100%; - font-size: 0.9rem; - border-bottom: 1px solid #ccc; -} - -.confirmation-box { - /* margin-top: 20px; */ - align-content: center; - width: 70%; - height: 20%; - /* padding: 20px; */ - font-size: 1.5em; - color: #333333; - top: 5%; - position: relative; -} - -.nav-wrapper { - position: fixed; - background: radial-gradient(circle, white, var(--primary-color)); - /* background-color: #CFD8DC; */ - display: flex; - justify-content: flex-end; - align-items: center; - color: #37474f; - height: 9vh; - width: 100vw; - left: 0; - top: 0; - box-shadow: - 0px 8px 10px -5px rgba(0, 0, 0, 0.2), - 0px 16px 24px 2px rgba(0, 0, 0, 0.14), - 0px 6px 30px 5px rgba(0, 0, 0, 0.12); - - .nav-right-icons { - display: flex; - .notification-container { - position: relative; - display: inline-block; - } - .notification-bell, - .burger-menu { - z-index: 3; - height: 20px; - width: 20px; - margin-right: 1rem; - } - .notification-badge { - position: absolute; - top: -0.7rem; - left: -0.8rem; - background-color: red; - color: white; - border-radius: 50%; - padding: 2.5px 6px; - font-size: 0.8rem; - font-weight: bold; - } - } - .notification-board { - position: absolute; - width: 20rem; - min-height: 8rem; - background-color: white; - right: 0.5rem; - display: none; - border-radius: 4px; - text-align: center; - display: flex; - flex-direction: column; - align-items: center; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - display: none; - - .notification-element { - padding: 0.8rem 0; - width: 100%; - &:hover { - background-color: rgba(26, 28, 24, 0.08); - } - } - .notification-element:not(:last-child) { - border-bottom: 1px solid; - } - } -} - -.brand-logo { - height: 100%; - width: 100vw; - align-content: center; - position: relative; - display: flex; - position: absolute; - align-items: center; - justify-content: center; - text-align: center; - font-size: 1.5em; - font-weight: bold; -} - -.container { - text-align: center; - display: grid; - height: 100vh; - grid-template-columns: repeat(7, 1fr); - gap: 10px; - grid-auto-rows: 10vh 15vh 1fr; -} -.title-container { - grid-column: 2 / 7; - grid-row: 2; -} -.page-container { - grid-column: 2 / 7; - grid-row: 3; - justify-content: center; - display: flex; - padding: 1rem; - box-sizing: border-box; - max-height: 60vh; -} - -h1 { - font-size: 2em; - margin: 20px 0; -} -@media only screen and (min-width: 600px) { - .tab-container { - display: none; - } - .page-container { - display: flex; - align-items: center; - } - .process-container { - grid-column: 3 / 6; - grid-row: 3; - - .card { - min-width: 40vw; - } - } - .separator { - width: 2px; - background-color: #78909c; - height: 80%; - margin: 0 0.5em; - } - .tab-content { - display: flex; - flex-direction: column; - justify-content: space-evenly; - align-items: center; - height: 80%; - } -} - -@media only screen and (max-width: 600px) { - .process-container { - grid-column: 2 / 7; - grid-row: 3; - } - .container { - grid-auto-rows: 10vh 15vh 15vh 1fr; - } - .tab-container { - grid-column: 1 / 8; - grid-row: 3; - } - .page-container { - grid-column: 2 / 7; - grid-row: 4; - } - .separator { - display: none; - } - .tabs { - display: flex; - flex-grow: 1; - overflow: hidden; - z-index: 1; - border-bottom-style: solid; - border-bottom-width: 1px; - border-bottom-color: #e0e4d6; - } - - .tab { - flex: 1; - text-align: center; - padding: 10px 0; - cursor: pointer; - font-size: 1rem; - color: #6200ea; - &:hover { - background-color: rgba(26, 28, 24, 0.08); - } - } - .tab.active { - border-bottom: 2px solid #6200ea; - font-weight: bold; - } - - .card.tab-content { - display: none; - } - - .tab-content.active { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - height: 80%; - } - .modal-content { - width: 80%; - height: 20%; - } -} - -.qr-code { - display: flex; - justify-content: center; - align-items: center; - height: 200px; -} - -.emoji-display { - font-family: 'Segoe UI Emoji', 'Noto Color Emoji', 'Apple Color Emoji', sans-serif; - font-size: 20px; -} - -#emoji-display-2 { - margin-top: 30px; - font-family: 'Segoe UI Emoji', 'Noto Color Emoji', 'Apple Color Emoji', sans-serif; - font-size: 20px; -} - -#okButton { - margin-bottom: 2em; - cursor: pointer; - background-color: #d0d0d7; - color: white; - border-style: none; - border-radius: 5px; - color: #000; - padding: 2px; - margin-top: 10px; -} - -.pairing-request { - font-family: 'Segoe UI Emoji', 'Noto Color Emoji', 'Apple Color Emoji', sans-serif; - font-size: 14px; - margin-top: 0px; -} - -.create-btn { - margin-bottom: 2em; - cursor: pointer; - background-color: #d0d0d7; - color: white; - border-style: none; - border-radius: 5px; - color: #000; - padding: 2px; -} - -.camera-card { - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - /* height: 200px; */ -} - -.btn { - display: inline-block; - padding: 10px 20px; - background-color: var(--primary-color); - color: white; - text-align: center; - border-radius: 5px; - cursor: pointer; - text-decoration: none; -} - -.btn:hover { - background-color: #3700b3; -} - -.card { - min-width: 300px; - border: 1px solid #e0e0e0; - border-radius: 8px; - background-color: white; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - box-sizing: border-box; - overflow: hidden; - display: flex; - flex-direction: column; - align-items: center; - text-align: center; - height: 60vh; - justify-content: flex-start; - padding: 1rem; - overflow-y: auto; -} - -.card-content { - flex-grow: 1; - flex-direction: column; - display: flex; - justify-content: flex-start; - align-items: center; - text-align: left; - font-size: 0.8em; - position: relative; - left: 2vw; - width: 90%; - .process-title { - font-weight: bold; - padding: 1rem 0; - } - .process-element { - padding: 0.4rem 0; - &:hover { - background-color: rgba(26, 28, 24, 0.08); - } - &.selected { - background-color: rgba(26, 28, 24, 0.08); - } - } -} - -.card-description { - padding: 20px; - font-size: 1rem; - color: #333; - width: 90%; - height: 50px; - display: flex; - justify-content: center; - align-items: center; - margin-bottom: 0px; -} - -.card-action { - width: 100%; -} - -.menu-content { - display: none; - position: absolute; - top: 3.4rem; - right: 1rem; - background-color: white; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - border-radius: 5px; - overflow: hidden; -} - -.menu-content a { - display: block; - padding: 10px 20px; - text-decoration: none; - color: #333; - border-bottom: 1px solid #e0e0e0; - &:hover { - background-color: rgba(26, 28, 24, 0.08); - } -} - -.menu-content a:last-child { - border-bottom: none; -} - -.qr-code-scanner { - display: none; -} - -/* QR READER */ -#qr-reader div { - position: inherit; -} - -#qr-reader div img { - top: 15px; - right: 25px; - margin-top: 5px; -} - -/* INPUT CSS **/ -.input-container { - position: relative; - width: 100%; - background-color: #eceff1; -} - -.input-field { - width: 36vw; - padding: 10px 0; - font-size: 1rem; - border: none; - border-bottom: 1px solid #ccc; - outline: none; - background: transparent; - transition: border-color 0.3s; -} - -.input-field:focus { - border-bottom: 2px solid #6200ea; -} - -.input-label { - position: absolute; - margin-top: -0.5em; - top: 0; - left: 0; - padding: 10px 0; - font-size: 1rem; - color: #999; - pointer-events: none; - transition: - transform 0.3s, - color 0.3s, - font-size 0.3s; -} - -.input-field:focus + .input-label, -.input-field:not(:placeholder-shown) + .input-label { - transform: translateY(-20px); - font-size: 0.8em; - color: #6200ea; -} - -.input-underline { - position: absolute; - bottom: 0; - left: 50%; - width: 0; - height: 2px; - background-color: #6200ea; - transition: - width 0.3s, - left 0.3s; -} - -.input-field:focus ~ .input-underline { - width: 100%; - left: 0; -} - -.dropdown-content { - position: absolute; - flex-direction: column; - top: 100%; - left: 0; - width: 100%; - max-height: 150px; - overflow-y: auto; - border: 1px solid #ccc; - border-radius: 4px; - background-color: white; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - display: none; - z-index: 1; -} - -.dropdown-content span { - padding: 10px; - cursor: pointer; - list-style: none; -} - -.dropdown-content span:hover { - background-color: #f0f0f0; -} - -/** AUTOCOMPLETE **/ - -select[data-multi-select-plugin] { - display: none !important; -} - -.multi-select-component { - width: 36vw; - padding: 5px 0; - font-size: 1rem; - border: none; - border-bottom: 1px solid #ccc; - outline: none; - background: transparent; - display: flex; - flex-direction: row; - height: auto; - width: 100%; - -o-transition: - border-color ease-in-out 0.15s, - box-shadow ease-in-out 0.15s; - transition: - border-color ease-in-out 0.15s, - box-shadow ease-in-out 0.15s; -} - -.autocomplete-list { - border-radius: 4px 0px 0px 4px; -} - -.multi-select-component:focus-within { - box-shadow: inset 0px 0px 0px 2px #78abfe; -} - -.multi-select-component .btn-group { - display: none !important; -} - -.multiselect-native-select .multiselect-container { - width: 100%; -} - -.selected-processes { - background-color: white; - padding: 0.4em; -} - -.selected-wrapper { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - display: inline-block; - border: 1px solid #d9d9d9; - background-color: #ededed; - white-space: nowrap; - margin: 1px 5px 5px 0; - height: 22px; - vertical-align: top; - cursor: default; -} - -.selected-wrapper .selected-label { - max-width: 514px; - display: inline-block; - overflow: hidden; - text-overflow: ellipsis; - padding-left: 4px; - vertical-align: top; -} - -.selected-wrapper .selected-close { - display: inline-block; - text-decoration: none; - font-size: 14px; - line-height: 1.49rem; - margin-left: 5px; - padding-bottom: 10px; - height: 100%; - vertical-align: top; - padding-right: 4px; - opacity: 0.2; - color: #000; - text-shadow: 0 1px 0 #fff; - font-weight: 700; -} - -.search-container { - display: flex; - flex-direction: row; -} - -.search-container .selected-input { - background: none; - border: 0; - height: 20px; - width: 60px; - padding: 0; - margin-bottom: 6px; - -webkit-box-shadow: none; - box-shadow: none; -} - -.search-container .selected-input:focus { - outline: none; -} - -.dropdown-icon.active { - transform: rotateX(180deg); -} - -.search-container .dropdown-icon { - display: inline-block; - padding: 10px 5px; - position: absolute; - top: 5px; - right: 5px; - width: 10px; - height: 10px; - border: 0 !important; - /* needed */ - -webkit-appearance: none; - -moz-appearance: none; - /* SVG background image */ - background-image: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2212%22%20height%3D%2212%22%20viewBox%3D%220%200%2012%2012%22%3E%3Ctitle%3Edown-arrow%3C%2Ftitle%3E%3Cg%20fill%3D%22%23818181%22%3E%3Cpath%20d%3D%22M10.293%2C3.293%2C6%2C7.586%2C1.707%2C3.293A1%2C1%2C0%2C0%2C0%2C.293%2C4.707l5%2C5a1%2C1%2C0%2C0%2C0%2C1.414%2C0l5-5a1%2C1%2C0%2C1%2C0-1.414-1.414Z%22%20fill%3D%22%23818181%22%3E%3C%2Fpath%3E%3C%2Fg%3E%3C%2Fsvg%3E'); - background-position: center; - background-size: 10px; - background-repeat: no-repeat; -} - -.search-container ul { - position: absolute; - list-style: none; - padding: 0; - z-index: 3; - margin-top: 29px; - width: 100%; - right: 0px; - background: #fff; - border: 1px solid #ccc; - border-top: none; - border-bottom: none; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); -} - -.search-container ul :focus { - outline: none; -} - -.search-container ul li { - display: block; - text-align: left; - padding: 8px 29px 2px 12px; - border-bottom: 1px solid #ccc; - font-size: 14px; - min-height: 31px; -} - -.search-container ul li:first-child { - border-top: 1px solid #ccc; - border-radius: 4px 0px 0 0; -} - -.search-container ul li:last-child { - border-radius: 4px 0px 0 0; -} - -.search-container ul li:hover.not-cursor { - cursor: default; -} - -.search-container ul li:hover { - color: #333; - background-color: #f0f0f0; - border-color: #adadad; - cursor: pointer; -} - -/* Adding scrool to select options */ -.autocomplete-list { - max-height: 130px; - overflow-y: auto; -} - -/**************************************** Process page card ******************************************************/ -.process-card { - min-width: 300px; - border: 1px solid #e0e0e0; - border-radius: 8px; - background-color: white; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - overflow: hidden; - display: flex; - flex-direction: column; - align-items: center; - text-align: center; - min-height: 40vh; - max-height: 60vh; - justify-content: space-between; - padding: 1rem; - overflow-y: auto; -} - -.process-card-content { - text-align: left; - font-size: 0.8em; - position: relative; - left: 2vw; - width: 90%; - .process-title { - font-weight: bold; - padding: 1rem 0; - } - .process-element { - padding: 0.4rem 0; - &:hover { - background-color: rgba(26, 28, 24, 0.08); - } - &.selected { - background-color: rgba(26, 28, 24, 0.08); - } - } - .selected-process-zone { - background-color: rgba(26, 28, 24, 0.08); - } -} - -.process-card-description { - padding: 20px; - font-size: 1rem; - color: #333; - width: 90%; -} - -.process-card-action { - width: 100%; -} - -/**************************************** Select Member Home Page ******************************************************/ -.custom-select { - width: 100%; - max-height: 150px; - overflow-y: auto; - direction: ltr; - background-color: white; - border: 1px solid #ccc; - border-radius: 4px; - margin: 10px 0; -} - -.custom-select option { - padding: 8px 12px; - cursor: pointer; -} - -.custom-select option:hover { - background-color: #f0f0f0; -} - -.custom-select::-webkit-scrollbar { - width: 8px; -} - -.custom-select::-webkit-scrollbar-track { - background: #f1f1f1; -} - -.custom-select::-webkit-scrollbar-thumb { - background: #888; - border-radius: 4px; -} - -.custom-select::-webkit-scrollbar-thumb:hover { - background: #555; -} diff --git a/modules/ihm_client/src/components/header/header.html b/modules/ihm_client/src/components/header/header.html deleted file mode 100755 index 9d2ae652..00000000 --- a/modules/ihm_client/src/components/header/header.html +++ /dev/null @@ -1,36 +0,0 @@ - diff --git a/modules/ihm_client/src/components/header/header.ts b/modules/ihm_client/src/components/header/header.ts deleted file mode 100755 index 56744bd9..00000000 --- a/modules/ihm_client/src/components/header/header.ts +++ /dev/null @@ -1,219 +0,0 @@ -import ModalService from '~/services/modal.service'; -import { INotification } from '../../models/notification.model'; -import { currentRoute, navigate } from '../../router'; -import Services from '../../services/service'; -import { BackUp } from '~/models/backup.model'; - -let notifications = []; - -export async function unpair() { - const service = await Services.getInstance(); - await service.unpairDevice(); - await navigate('home'); -} - -(window as any).unpair = unpair; - -function toggleMenu() { - const menu = document.getElementById('menu'); - if (menu) { - if (menu.style.display === 'block') { - menu.style.display = 'none'; - } else { - menu.style.display = 'block'; - } - } -} -(window as any).toggleMenu = toggleMenu; - -async function getNotifications() { - const service = await Services.getInstance(); - notifications = service.getNotifications() || []; - return notifications; -} -function openCloseNotifications() { - const notifications = document.querySelector('.notification-board') as HTMLDivElement; - notifications.style.display = notifications?.style.display === 'none' ? 'block' : 'none'; -} - -(window as any).openCloseNotifications = openCloseNotifications; - -export async function initHeader() { - if (currentRoute === 'account') { - // Charger le profile-header - const profileContainer = document.getElementById('profile-header-container'); - if (profileContainer) { - const profileHeaderHtml = await fetch('/src/components/profile-header/profile-header.html').then((res) => res.text()); - profileContainer.innerHTML = profileHeaderHtml; - - // Initialiser les donnĂ©es du profil - loadUserProfile(); - } - } - if (currentRoute === 'home') { - hideSomeFunctionnalities(); - } else { - fetchNotifications(); - setInterval(fetchNotifications, 2 * 60 * 1000); - } -} - -function hideSomeFunctionnalities() { - const bell = document.querySelector('.bell-icon') as HTMLDivElement; - if (bell) bell.style.display = 'none'; - const notifBadge = document.querySelector('.notification-badge') as HTMLDivElement; - if (notifBadge) notifBadge.style.display = 'none'; - const actions = document.querySelectorAll('.menu-content a') as NodeListOf; - const excludedActions = ['Import', 'Export']; - for (const action of actions) { - if (!excludedActions.includes(action.innerHTML)) { - action.style.display = 'none'; - } - } -} - -async function setNotification(notifications: any[]): Promise { - const badge = document.querySelector('.notification-badge') as HTMLDivElement; - const noNotifications = document.querySelector('.no-notification') as HTMLDivElement; - if (notifications?.length) { - badge.innerText = notifications.length.toString(); - const notificationBoard = document.querySelector('.notification-board') as HTMLDivElement; - notificationBoard.querySelectorAll('.notification-element')?.forEach((elem) => elem.remove()); - noNotifications.style.display = 'none'; - for (const notif of notifications) { - const notifElement = document.createElement('div'); - notifElement.className = 'notification-element'; - notifElement.setAttribute('notif-id', notif.processId); - notifElement.innerHTML = ` -
Validation required :
-
${notif.processId}
- `; - // this.addSubscription(notifElement, 'click', 'goToProcessPage') - notificationBoard.appendChild(notifElement); - notifElement.addEventListener('click', async () => { - const modalService = await ModalService.getInstance(); - modalService.injectValidationModal(notif); - }); - } - } else { - noNotifications.style.display = 'block'; - } -} - -async function fetchNotifications() { - const service = await Services.getInstance(); - const data = service.getNotifications() || []; - await setNotification(data); -} - -async function loadUserProfile() { - // Charger les donnĂ©es du profil depuis le localStorage - const userName = localStorage.getItem('userName'); - const userLastName = localStorage.getItem('userLastName'); - const userAvatar = localStorage.getItem('userAvatar') || 'https://via.placeholder.com/150'; - const userBanner = localStorage.getItem('userBanner') || 'https://via.placeholder.com/800x200'; - - // Mettre Ă  jour les Ă©lĂ©ments du DOM - const nameElement = document.querySelector('.user-name'); - const lastNameElement = document.querySelector('.user-lastname'); - const avatarElement = document.querySelector('.avatar'); - const bannerElement = document.querySelector('.banner-image'); - - if (nameElement) nameElement.textContent = userName; - if (lastNameElement) lastNameElement.textContent = userLastName; - if (avatarElement) (avatarElement as HTMLImageElement).src = userAvatar; - if (bannerElement) (bannerElement as HTMLImageElement).src = userBanner; -} - -async function importJSON() { - const input = document.createElement('input'); - input.type = 'file'; - input.accept = '.json'; - - input.onchange = async (e) => { - const file = (e.target as HTMLInputElement).files?.[0]; - if (file) { - const reader = new FileReader(); - reader.onload = async (e) => { - try { - const content: BackUp = JSON.parse(e.target?.result as string); - const service = await Services.getInstance(); - await service.importJSON(content); - alert('Import rĂ©ussi'); - window.location.reload(); - } catch (error) { - alert("Erreur lors de l'import: " + error); - } - }; - reader.readAsText(file); - } - }; - - input.click(); -} - -(window as any).importJSON = importJSON; - -async function createBackUp() { - const service = await Services.getInstance(); - const backUp = await service.createBackUp(); - if (!backUp) { - console.error('No device to backup'); - return; - } - - try { - const backUpJson = JSON.stringify(backUp, null, 2); - const blob = new Blob([backUpJson], { type: 'application/json' }); - const url = URL.createObjectURL(blob); - - const a = document.createElement('a'); - a.href = url; - a.download = '4nk-backup.json'; - a.click(); - - URL.revokeObjectURL(url); - - console.log('Backup successfully prepared for download'); - } catch (e) { - console.error(e); - } -} - -(window as any).createBackUp = createBackUp; - -async function disconnect() { - console.log('Disconnecting...'); - try { - localStorage.clear(); - - await new Promise((resolve, reject) => { - const request = indexedDB.deleteDatabase('4nk'); - request.onsuccess = () => { - console.log('IndexedDB deleted successfully'); - resolve(); - }; - request.onerror = () => reject(request.error); - request.onblocked = () => { - console.log('Database deletion was blocked'); - resolve(); - }; - }); - - const registrations = await navigator.serviceWorker.getRegistrations(); - await Promise.all(registrations.map((registration) => registration.unregister())); - console.log('Service worker unregistered'); - - await navigate('home'); - - setTimeout(() => { - window.location.href = window.location.origin; - }, 100); - } catch (error) { - console.error('Error during disconnect:', error); - // force reload - window.location.href = window.location.origin; - } -} - -(window as any).disconnect = disconnect; diff --git a/modules/ihm_client/src/components/login-modal/login-modal.html b/modules/ihm_client/src/components/login-modal/login-modal.html deleted file mode 100755 index d402de9f..00000000 --- a/modules/ihm_client/src/components/login-modal/login-modal.html +++ /dev/null @@ -1,14 +0,0 @@ - diff --git a/modules/ihm_client/src/components/login-modal/login-modal.js b/modules/ihm_client/src/components/login-modal/login-modal.js deleted file mode 100755 index d9c49d7f..00000000 --- a/modules/ihm_client/src/components/login-modal/login-modal.js +++ /dev/null @@ -1,13 +0,0 @@ -import Routing from '/src/services/routing.service.ts'; - -const router = await Routing.getInstance(); -export async function confirmLogin() { - router.confirmLogin(); -} - -export async function closeLoginModal() { - router.closeLoginModal(); -} - -window.confirmLogin = confirmLogin; -window.closeLoginModal = closeLoginModal; diff --git a/modules/ihm_client/src/components/modal/confirmation-modal.html b/modules/ihm_client/src/components/modal/confirmation-modal.html deleted file mode 100755 index 6c0f6c4e..00000000 --- a/modules/ihm_client/src/components/modal/confirmation-modal.html +++ /dev/null @@ -1,16 +0,0 @@ - diff --git a/modules/ihm_client/src/components/modal/confirmation-modal.ts b/modules/ihm_client/src/components/modal/confirmation-modal.ts deleted file mode 100755 index 292d875d..00000000 --- a/modules/ihm_client/src/components/modal/confirmation-modal.ts +++ /dev/null @@ -1,13 +0,0 @@ -import ModalService from '../../services/modal.service'; - -const modalService = await ModalService.getInstance(); -// export async function confirm() { -// modalService.confirmPairing(); -// } - -export async function closeConfirmationModal() { - modalService.closeConfirmationModal(); -} - -(window as any).confirm = confirm; -(window as any).closeConfirmationModal = closeConfirmationModal; diff --git a/modules/ihm_client/src/components/modal/creation-modal.html b/modules/ihm_client/src/components/modal/creation-modal.html deleted file mode 100644 index 992c4025..00000000 --- a/modules/ihm_client/src/components/modal/creation-modal.html +++ /dev/null @@ -1,14 +0,0 @@ - diff --git a/modules/ihm_client/src/components/modal/waiting-modal.html b/modules/ihm_client/src/components/modal/waiting-modal.html deleted file mode 100644 index 7c4ed4bb..00000000 --- a/modules/ihm_client/src/components/modal/waiting-modal.html +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/modules/ihm_client/src/components/qrcode-scanner/qrcode-scanner-component.ts b/modules/ihm_client/src/components/qrcode-scanner/qrcode-scanner-component.ts deleted file mode 100644 index 1e39d3ba..00000000 --- a/modules/ihm_client/src/components/qrcode-scanner/qrcode-scanner-component.ts +++ /dev/null @@ -1,73 +0,0 @@ -import QrScanner from 'qr-scanner'; -import Services from '../../services/service'; -import { prepareAndSendPairingTx } from '~/utils/sp-address.utils'; - -export default class QrScannerComponent extends HTMLElement { - videoElement: any; - wrapper: any; - qrScanner: any; - constructor() { - super(); - this.attachShadow({ mode: 'open' }); - this.wrapper = document.createElement('div'); - this.wrapper.style.position = 'relative'; - this.wrapper.style.width = '150px'; - this.wrapper.style.height = '150px'; - - this.videoElement = document.createElement('video'); - this.videoElement.style.width = '100%'; - document.body?.append(this.wrapper); - this.wrapper.prepend(this.videoElement); - } - - connectedCallback() { - this.initializeScanner(); - } - - async initializeScanner() { - if (!this.videoElement) { - console.error('Video element not found!'); - return; - } - console.log('🚀 ~ QrScannerComponent ~ initializeScanner ~ this.videoElement:', this.videoElement); - this.qrScanner = new QrScanner(this.videoElement, (result) => this.onQrCodeScanned(result), { - highlightScanRegion: true, - highlightCodeOutline: true, - }); - - try { - await QrScanner.hasCamera(); - this.qrScanner.start(); - this.videoElement.style = 'height: 200px; width: 200px'; - this.shadowRoot?.appendChild(this.wrapper); - } catch (e) { - console.error('No camera found or error starting the QR scanner', e); - } - } - - async onQrCodeScanned(result: any) { - console.log(`QR Code detected:`, result); - const data = result.data; - const scannedUrl = new URL(data); - - // Extract the 'sp_address' parameter - const spAddress = scannedUrl.searchParams.get('sp_address'); - if (spAddress) { - // Call the sendPairingTx function with the extracted sp_address - try { - await prepareAndSendPairingTx(); - } catch (e) { - console.error('Failed to pair:', e); - } - } - this.qrScanner.stop(); // if you want to stop scanning after one code is detected - } - - disconnectedCallback() { - if (this.qrScanner) { - this.qrScanner.destroy(); - } - } -} - -customElements.define('qr-scanner', QrScannerComponent); diff --git a/modules/ihm_client/src/components/validation-modal/validation-modal.css b/modules/ihm_client/src/components/validation-modal/validation-modal.css deleted file mode 100644 index b6e93818..00000000 --- a/modules/ihm_client/src/components/validation-modal/validation-modal.css +++ /dev/null @@ -1,70 +0,0 @@ -.validation-modal { - display: block; /* Show the modal for demo purposes */ - position: fixed; - z-index: 1; - left: 0; - top: 0; - width: 100%; - height: 100%; - overflow: auto; - background-color: rgb(0, 0, 0); - background-color: rgba(0, 0, 0, 0.4); - padding-top: 60px; -} -.modal-content { - background-color: #fefefe; - margin: 5% auto; - padding: 20px; - border: 1px solid #888; - width: 80%; - height: fit-content; -} -.modal-title { - font-size: 24px; - font-weight: bold; - margin-bottom: 20px; -} -.validation-box { - margin-bottom: 15px; - width: 100%; -} -.expansion-panel-header { - background-color: #e0e0e0; - padding: 10px; - cursor: pointer; -} -.expansion-panel-body { - display: none; - background-color: #fafafa; - padding: 10px; - border-top: 1px solid #ddd; -} -.expansion-panel-body pre { - background-color: #f6f8fa; - padding: 10px; - border-left: 4px solid #d1d5da; - overflow-x: auto; -} -.diff { - display: flex; - justify-content: space-between; - margin-bottom: 10px; -} -.diff-side { - width: 48%; - padding: 10px; -} -.diff-old { - background-color: #fee; - border: 1px solid #f00; -} -.diff-new { - background-color: #e6ffe6; - border: 1px solid #0f0; -} -.radio-buttons { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 10px; -} diff --git a/modules/ihm_client/src/components/validation-modal/validation-modal.html b/modules/ihm_client/src/components/validation-modal/validation-modal.html deleted file mode 100755 index bff54b9e..00000000 --- a/modules/ihm_client/src/components/validation-modal/validation-modal.html +++ /dev/null @@ -1,9 +0,0 @@ -
- -
diff --git a/modules/ihm_client/src/components/validation-modal/validation-modal.ts b/modules/ihm_client/src/components/validation-modal/validation-modal.ts deleted file mode 100755 index 68dfce0c..00000000 --- a/modules/ihm_client/src/components/validation-modal/validation-modal.ts +++ /dev/null @@ -1,56 +0,0 @@ -import ModalService from '~/services/modal.service'; - -async function validate() { - console.log('==> VALIDATE'); - const modalservice = await ModalService.getInstance(); - modalservice.closeValidationModal(); -} - -export async function initValidationModal(processDiffs: any) { - console.log('🚀 ~ initValidationModal ~ processDiffs:', processDiffs); - for (const diff of processDiffs.diffs) { - let diffs = ''; - for (const value of diff) { - diffs += ` -
- - -
-
-
-
-${value.previous_value}
-
-
-
+${value.new_value}
-
-
- `; - } - - const state = ` -
-
State ${diff[0].new_state_merkle_root}
-
- ${diffs} -
-
- `; - const box = document.querySelector('.validation-box'); - if (box) box.innerHTML += state; - } - document.querySelectorAll('.expansion-panel-header').forEach((header) => { - header.addEventListener('click', function (event) { - const target = event.target as HTMLElement; - const body = target.nextElementSibling as HTMLElement; - if (body?.style) body.style.display = body.style.display === 'block' ? 'none' : 'block'; - }); - }); -} - -(window as any).validate = validate; diff --git a/modules/ihm_client/src/components/validation-rule-modal/validation-rule-modal.html b/modules/ihm_client/src/components/validation-rule-modal/validation-rule-modal.html deleted file mode 100644 index 2dd14f69..00000000 --- a/modules/ihm_client/src/components/validation-rule-modal/validation-rule-modal.html +++ /dev/null @@ -1,25 +0,0 @@ - diff --git a/modules/ihm_client/src/components/validation-rule-modal/validation-rule-modal.ts b/modules/ihm_client/src/components/validation-rule-modal/validation-rule-modal.ts deleted file mode 100644 index 78879a04..00000000 --- a/modules/ihm_client/src/components/validation-rule-modal/validation-rule-modal.ts +++ /dev/null @@ -1,64 +0,0 @@ -export interface ValidationRule { - quorum: number; - fields: string[]; - min_sig_member: number; -} - -/** - * Loads and injects the modal HTML into the document if not already loaded. - */ -export async function loadValidationRuleModal(templatePath: string = '/src/components/validation-rule-modal/validation-rule-modal.html') { - if (document.getElementById('validation-rule-modal')) return; - - const res = await fetch(templatePath); - const html = await res.text(); - - const tempDiv = document.createElement('div'); - tempDiv.innerHTML = html; - - const modal = tempDiv.querySelector('#validation-rule-modal'); - if (!modal) { - throw new Error('Modal HTML missing #validation-rule-modal'); - } - - document.body.appendChild(modal); -} - -/** - * Opens the modal and lets the user input a ValidationRule. - * Calls the callback with the constructed rule on submit. - */ -export function showValidationRuleModal(onSubmit: (rule: ValidationRule) => void) { - const modal = document.getElementById('validation-rule-modal')!; - const quorumInput = document.getElementById('vr-quorum') as HTMLInputElement; - const minsigInput = document.getElementById('vr-minsig') as HTMLInputElement; - const fieldsInput = document.getElementById('vr-fields') as HTMLInputElement; - - const cancelBtn = document.getElementById('vr-cancel')!; - const submitBtn = document.getElementById('vr-submit')!; - - // Reset values - quorumInput.value = ''; - minsigInput.value = ''; - fieldsInput.value = ''; - - modal.style.display = 'flex'; - - cancelBtn.onclick = () => { - modal.style.display = 'none'; - }; - - submitBtn.onclick = () => { - const rule: ValidationRule = { - quorum: parseInt(quorumInput.value), - min_sig_member: parseInt(minsigInput.value), - fields: fieldsInput.value - .split(',') - .map((f) => f.trim()) - .filter(Boolean), - }; - - modal.style.display = 'none'; - onSubmit(rule); - }; -} diff --git a/modules/ihm_client/src/decs.d.ts b/modules/ihm_client/src/decs.d.ts deleted file mode 100644 index d137c884..00000000 --- a/modules/ihm_client/src/decs.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -declare class AccountComponent extends HTMLElement { - _callback: any; - constructor(); - connectedCallback(): void; - fetchData(): Promise; - set callback(fn: any); - get callback(): any; - render(): void; -} -export { AccountComponent }; diff --git a/modules/ihm_client/src/index.ts b/modules/ihm_client/src/index.ts deleted file mode 100755 index 2fbab88e..00000000 --- a/modules/ihm_client/src/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { default as Services } from './services/service'; -export { default as Database } from './services/database.service'; -export { MessageType } from './models/process.model'; diff --git a/modules/ihm_client/src/interface/groupInterface.ts b/modules/ihm_client/src/interface/groupInterface.ts deleted file mode 100644 index 87ba2db1..00000000 --- a/modules/ihm_client/src/interface/groupInterface.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { DocumentSignature } from '~/models/signature.models'; - -export interface Group { - id: number; - name: string; - description: string; - roles: Array<{ - name: string; - members: Array<{ id: string | number; name: string }>; - documents?: Array; - }>; - commonDocuments: Array<{ - id: number; - name: string; - visibility: string; - description: string; - createdAt?: string | null; - deadline?: string | null; - signatures?: DocumentSignature[]; - status?: string; - }>; -} diff --git a/modules/ihm_client/src/interface/memberInterface.ts b/modules/ihm_client/src/interface/memberInterface.ts deleted file mode 100644 index 274cd2ca..00000000 --- a/modules/ihm_client/src/interface/memberInterface.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface Member { - id: string | number; - name: string; - email?: string; - avatar?: string; - processRoles?: Array<{ processId: number | string; role: string }>; -} diff --git a/modules/ihm_client/src/interface/signatureResponseInterface.ts b/modules/ihm_client/src/interface/signatureResponseInterface.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/modules/ihm_client/src/main.ts b/modules/ihm_client/src/main.ts deleted file mode 100644 index 80e68407..00000000 --- a/modules/ihm_client/src/main.ts +++ /dev/null @@ -1,26 +0,0 @@ -/*import { ChatComponent } from './pages/chat/chat-component'; -import { ChatElement } from './pages/chat/chat';*/ -import { AccountComponent } from './pages/account/account-component'; -import { AccountElement } from './pages/account/account'; - -export { AccountComponent, AccountElement }; - -declare global { - interface HTMLElementTagNameMap { - // Signatures supprimĂ©es - /*'chat-component': ChatComponent; - 'chat-element': ChatElement;*/ - 'account-component': AccountComponent; - 'account-element': AccountElement; - } -} - -// Configuration pour le mode indĂ©pendant -if ((import.meta as any).env.VITE_IS_INDEPENDANT_LIB) { - // Initialiser les composants si nĂ©cessaire - // Signatures supprimĂ©es - /*customElements.define('chat-component', ChatComponent); - customElements.define('chat-element', ChatElement);*/ - customElements.define('account-component', AccountComponent); - customElements.define('account-element', AccountElement); -} diff --git a/modules/ihm_client/src/mocks/mock-account/constAccountMock.ts b/modules/ihm_client/src/mocks/mock-account/constAccountMock.ts deleted file mode 100644 index 34adaa44..00000000 --- a/modules/ihm_client/src/mocks/mock-account/constAccountMock.ts +++ /dev/null @@ -1,272 +0,0 @@ -export const ALLOWED_ROLES = ['User', 'Member', 'Peer', 'Payment', 'Deposit', 'Artefact', 'Resolve', 'Backup']; - -export const STORAGE_KEYS = { - pairing: 'pairingRows', - wallet: 'walletRows', - process: 'processRows', - data: 'dataRows', -}; - -// Initialiser le stockage des lignes par dĂ©faut dans le localStorage -export const defaultRows = [ - { - column1: 'sprt1qqwtvg5q5vcz0reqvmld98u7va3av6gakwe9yxw9yhnpj5djcunn4squ68tuzn8dz78dg4adfv0dekx8hg9sy0t6s9k5em7rffgxmrsfpyy7gtyrz', - column2: 'đŸŽŠđŸ˜‘đŸŽ„đŸ˜©', - column3: 'Laptop', - }, - { - column1: 'sprt1qqwtvg5q5vcz0reqvmld98u7va3av6gakwe9yxw9yhnpj5djcunn4squ68tuzn8dz78dg4adfv0dekx8hg9sy0t6s9k5em7rffgxmrsfpyy7gtyrx', - column2: 'đŸŽđŸŽ•đŸ˜§đŸŒ„', - column3: 'Phone', - }, -]; - -export const mockNotifications: { [key: string]: Notification[] } = {}; - -export const notificationMessages = ['CPU usage high', 'Memory threshold reached', 'New update available', 'Backup completed', 'Security check required', 'Performance optimization needed', 'System alert', 'Network connectivity issue', 'Storage space low', 'Process checkpoint reached']; - -export const mockDataRows = [ - { - column1: 'User Project', - column2: 'private', - column3: 'User', - column4: '6 months', - column5: 'NDA signed', - column6: 'Contract #123', - processName: 'User Process', - zone: 'A', - }, - { - column1: 'Process Project', - column2: 'private', - column3: 'Process', - column4: '1 year', - column5: 'Terms accepted', - column6: 'Contract #456', - processName: 'Process Management', - zone: 'B', - }, - { - column1: 'Member Project', - column2: 'private', - column3: 'Member', - column4: '3 months', - column5: 'GDPR compliant', - column6: 'Contract #789', - processName: 'Member Process', - zone: 'C', - }, - { - column1: 'Peer Project', - column2: 'public', - column3: 'Peer', - column4: '2 years', - column5: 'IP rights', - column6: 'Contract #101', - processName: 'Peer Process', - zone: 'D', - }, - { - column1: 'Payment Project', - column2: 'confidential', - column3: 'Payment', - column4: '1 year', - column5: 'NDA signed', - column6: 'Contract #102', - processName: 'Payment Process', - zone: 'E', - }, - { - column1: 'Deposit Project', - column2: 'private', - column3: 'Deposit', - column4: '6 months', - column5: 'Terms accepted', - column6: 'Contract #103', - processName: 'Deposit Process', - zone: 'F', - }, - { - column1: 'Artefact Project', - column2: 'public', - column3: 'Artefact', - column4: '1 year', - column5: 'GDPR compliant', - column6: 'Contract #104', - processName: 'Artefact Process', - zone: 'G', - }, - { - column1: 'Resolve Project', - column2: 'private', - column3: 'Resolve', - column4: '2 years', - column5: 'IP rights', - column6: 'Contract #105', - processName: 'Resolve Process', - zone: 'H', - }, - { - column1: 'Backup Project', - column2: 'public', - column3: 'Backup', - column4: '1 year', - column5: 'NDA signed', - column6: 'Contract #106', - processName: 'Backup Process', - zone: 'I', - }, -]; - -export const mockProcessRows = [ - { - process: 'User Project', - role: 'User', - notification: { - messages: [ - { id: 1, read: false, date: '2024-03-10', message: 'New user joined the project' }, - { id: 2, read: false, date: '2024-03-09', message: 'Project milestone reached' }, - { id: 3, read: false, date: '2024-03-08', message: 'Security update required' }, - { id: 4, read: true, date: '2024-03-07', message: 'Weekly report available' }, - { id: 5, read: true, date: '2024-03-06', message: 'Team meeting scheduled' }, - ], - }, - }, - { - process: 'Member Project', - role: 'Member', - notification: { - messages: [ - { id: 6, read: true, date: '2024-03-10', message: 'Member access granted' }, - { id: 7, read: true, date: '2024-03-09', message: 'Documentation updated' }, - { id: 8, read: true, date: '2024-03-08', message: 'Project status: on track' }, - ], - }, - }, - { - process: 'Peer Project', - role: 'Peer', - notification: { - unread: 2, - total: 4, - messages: [ - { id: 9, read: false, date: '2024-03-10', message: 'New peer project added' }, - { id: 10, read: false, date: '2024-03-09', message: 'Project milestone reached' }, - { id: 11, read: false, date: '2024-03-08', message: 'Security update required' }, - { id: 12, read: true, date: '2024-03-07', message: 'Weekly report available' }, - { id: 13, read: true, date: '2024-03-06', message: 'Team meeting scheduled' }, - ], - }, - }, - { - process: 'Deposit Project', - role: 'Deposit', - notification: { - unread: 1, - total: 10, - messages: [ - { id: 14, read: false, date: '2024-03-10', message: 'Deposit milestone reached' }, - { id: 15, read: false, date: '2024-03-09', message: 'Security update required' }, - { id: 16, read: false, date: '2024-03-08', message: 'Weekly report available' }, - { id: 17, read: true, date: '2024-03-07', message: 'Team meeting scheduled' }, - { id: 18, read: true, date: '2024-03-06', message: 'Project status: on track' }, - ], - }, - }, - { - process: 'Artefact Project', - role: 'Artefact', - notification: { - unread: 0, - total: 3, - messages: [ - { id: 19, read: false, date: '2024-03-10', message: 'New artefact added' }, - { id: 20, read: false, date: '2024-03-09', message: 'Security update required' }, - { id: 21, read: false, date: '2024-03-08', message: 'Weekly report available' }, - { id: 22, read: true, date: '2024-03-07', message: 'Team meeting scheduled' }, - { id: 23, read: true, date: '2024-03-06', message: 'Project status: on track' }, - ], - }, - }, - { - process: 'Resolve Project', - role: 'Resolve', - notification: { - unread: 5, - total: 12, - messages: [ - { id: 24, read: false, date: '2024-03-10', message: 'New issue reported' }, - { id: 25, read: false, date: '2024-03-09', message: 'Security update required' }, - { id: 26, read: false, date: '2024-03-08', message: 'Weekly report available' }, - { id: 27, read: true, date: '2024-03-07', message: 'Team meeting scheduled' }, - { id: 28, read: true, date: '2024-03-06', message: 'Project status: on track' }, - ], - }, - }, -]; - -export const mockContracts = { - 'Contract #123': { - title: 'User Project Agreement', - date: '2024-01-15', - parties: ['Company XYZ', 'User Team'], - terms: ['Data Protection', 'User Privacy', 'Access Rights', 'Service Level Agreement'], - content: 'This agreement establishes the terms and conditions for user project management.', - }, - 'Contract #456': { - title: 'Process Management Contract', - date: '2024-02-01', - parties: ['Company XYZ', 'Process Team'], - terms: ['Process Workflow', 'Quality Standards', 'Performance Metrics', 'Monitoring Procedures'], - content: 'This contract defines the process management standards and procedures.', - }, - 'Contract #789': { - title: 'Member Access Agreement', - date: '2024-03-15', - parties: ['Company XYZ', 'Member Team'], - terms: ['Member Rights', 'Access Levels', 'Security Protocol', 'Confidentiality Agreement'], - content: 'This agreement outlines the terms for member access and privileges.', - }, - 'Contract #101': { - title: 'Peer Collaboration Agreement', - date: '2024-04-01', - parties: ['Company XYZ', 'Peer Network'], - terms: ['Collaboration Rules', 'Resource Sharing', 'Dispute Resolution', 'Network Protocol'], - content: 'This contract establishes peer collaboration and networking guidelines.', - }, - 'Contract #102': { - title: 'Payment Processing Agreement', - date: '2024-05-01', - parties: ['Company XYZ', 'Payment Team'], - terms: ['Transaction Protocol', 'Security Measures', 'Fee Structure', 'Service Availability'], - content: 'This agreement defines payment processing terms and conditions.', - }, - 'Contract #103': { - title: 'Deposit Management Contract', - date: '2024-06-01', - parties: ['Company XYZ', 'Deposit Team'], - terms: ['Deposit Rules', 'Storage Protocol', 'Access Control', 'Security Standards'], - content: 'This contract outlines deposit management procedures and security measures.', - }, - 'Contract #104': { - title: 'Artefact Handling Agreement', - date: '2024-07-01', - parties: ['Company XYZ', 'Artefact Team'], - terms: ['Handling Procedures', 'Storage Guidelines', 'Access Protocol', 'Preservation Standards'], - content: 'This agreement establishes artefact handling and preservation guidelines.', - }, - 'Contract #105': { - title: 'Resolution Protocol Agreement', - date: '2024-08-01', - parties: ['Company XYZ', 'Resolution Team'], - terms: ['Resolution Process', 'Time Constraints', 'Escalation Protocol', 'Documentation Requirements'], - content: 'This contract defines the resolution process and protocol standards.', - }, - 'Contract #106': { - title: 'Backup Service Agreement', - date: '2024-09-01', - parties: ['Company XYZ', 'Backup Team'], - terms: ['Backup Schedule', 'Data Protection', 'Recovery Protocol', 'Service Reliability'], - content: 'This agreement outlines backup service terms and recovery procedures.', - }, -}; diff --git a/modules/ihm_client/src/mocks/mock-account/interfacesAccountMock.ts b/modules/ihm_client/src/mocks/mock-account/interfacesAccountMock.ts deleted file mode 100644 index 1c409ba0..00000000 --- a/modules/ihm_client/src/mocks/mock-account/interfacesAccountMock.ts +++ /dev/null @@ -1,45 +0,0 @@ -export interface Row { - column1: string; - column2: string; - column3: string; -} - -// Types supplĂ©mentaires nĂ©cessaires -export interface Contract { - title: string; - date: string; - parties: string[]; - terms: string[]; - content: string; -} - -export interface WalletRow { - column1: string; // Label - column2: string; // Wallet - column3: string; // Type -} - -export interface DataRow { - column1: string; // Name - column2: string; // Visibility - column3: string; // Role - column4: string; // Duration - column5: string; // Legal - column6: string; // Contract - processName: string; - zone: string; -} - -export interface Notification { - message: string; - timestamp: string; - isRead: boolean; -} - -// DĂ©placer l'interface en dehors de la classe, au dĂ©but du fichier -export interface NotificationMessage { - id: number; - read: boolean; - date: string; - message: string; -} diff --git a/modules/ihm_client/src/mocks/mock-chat/groupsMock.js b/modules/ihm_client/src/mocks/mock-chat/groupsMock.js deleted file mode 100755 index d5d1fcfe..00000000 --- a/modules/ihm_client/src/mocks/mock-chat/groupsMock.js +++ /dev/null @@ -1,52 +0,0 @@ -export const groupsMock = [ - { - id: 1, - name: 'Group 🚀 ', - roles: [ - { - id: 1, - name: 'Role 1', - members: [ - { id: 1, name: 'Member 1' }, - { id: 2, name: 'Member 2' }, - ], - }, - { - id: 2, - name: 'Role 2', - members: [ - { id: 3, name: 'Member 3' }, - { id: 4, name: 'Member 4' }, - ], - }, - ], - }, - { - id: 2, - name: 'Group ₿', - roles: [ - { - id: 3, - name: 'Role 1', - members: [ - { id: 5, name: 'Member 5' }, - { id: 6, name: 'Member 6' }, - ], - }, - ], - }, - { - id: 3, - name: 'Group đŸȘ™', - roles: [ - { - id: 4, - name: 'Role 1', - members: [ - { id: 7, name: 'Member 7' }, - { id: 8, name: 'Member 8' }, - ], - }, - ], - }, -]; diff --git a/modules/ihm_client/src/mocks/mock-chat/messagesMock.js b/modules/ihm_client/src/mocks/mock-chat/messagesMock.js deleted file mode 100755 index 28792d96..00000000 --- a/modules/ihm_client/src/mocks/mock-chat/messagesMock.js +++ /dev/null @@ -1,64 +0,0 @@ -export const messagesMock = [ - { - memberId: 1, // Conversations avec Mmber 1 - messages: [ - { id: 1, sender: 'Member 1', text: 'Salut !', time: '10:30 AM' }, - { id: 2, sender: '4NK', text: 'Bonjour ! Comment ça va ?', time: '10:31 AM' }, - { id: 3, sender: '4NK', text: 'Tout va bien, merci !', time: '10:32 AM' }, - ], - }, - { - memberId: 2, // Conversations avec Member 2 - messages: [ - { id: 1, sender: 'Member 2', text: 'Salut, on se voit ce soir ?', time: '10:30 AM' }, - { id: 2, sender: '4NK', text: 'Oui, Ă  quelle heure ?', time: '10:31 AM' }, - ], - }, - { - memberId: 3, // Conversations avec Member 3 - messages: [ - { id: 1, sender: 'Member 3', text: 'Hey, ça va ?', time: '10:30 AM' }, - { id: 2, sender: '4NK', text: 'Ça va et toi ?', time: '10:31 AM' }, - ], - }, - { - memberId: 4, // Conversations avec Member 4 - messages: [ - { id: 1, sender: 'Member 4', text: 'Hey, ça va ?', time: '10:30 AM' }, - { id: 2, sender: '4NK', text: 'Ça va et toi ?', time: '10:31 AM' }, - { id: 3, sender: '4NK', text: 'Ça va et toi ?', time: '10:31 AM' }, - ], - }, - { - memberId: 5, // Conversations avec Member 5 - messages: [ - { id: 1, sender: 'Member 5', text: 'Hey, ça va ?', time: '10:30 AM' }, - { id: 2, sender: '4NK', text: 'Ça va et toi ?', time: '10:31 AM' }, - { id: 3, sender: '4NK', text: 'Ça va et toi ?', time: '10:31 AM' }, - ], - }, - { - memberId: 6, // Conversations avec Member 6 - messages: [ - { id: 1, sender: 'Member 6', text: 'Hey, ça va ?', time: '10:30 AM' }, - { id: 2, sender: '4NK', text: 'Ça va et toi ?', time: '10:31 AM' }, - { id: 3, sender: '4NK', text: 'Ça va et toi ?', time: '10:31 AM' }, - ], - }, - { - memberId: 7, // Conversations avec Member 7 - messages: [ - { id: 1, sender: 'Member 7', text: 'Hey, ça va ?', time: '10:30 AM' }, - { id: 2, sender: '4NK', text: 'Ça va et toi ?', time: '10:31 AM' }, - { id: 3, sender: '4NK', text: 'Ça va et toi ?', time: '10:31 AM' }, - ], - }, - { - memberId: 8, // Conversations avec Member 8 - messages: [ - { id: 1, sender: 'Member 8', text: 'Hey, ça va ?', time: '10:30 AM' }, - { id: 2, sender: '4NK', text: 'Ça va et toi ?', time: '10:31 AM' }, - { id: 3, sender: '4NK', text: 'Ça va et toi ?', time: '10:31 AM' }, - ], - }, -]; diff --git a/modules/ihm_client/src/mocks/mock-signature/groupsMock.js b/modules/ihm_client/src/mocks/mock-signature/groupsMock.js deleted file mode 100755 index c6521122..00000000 --- a/modules/ihm_client/src/mocks/mock-signature/groupsMock.js +++ /dev/null @@ -1,471 +0,0 @@ -// DĂ©finir les rĂŽles autorisĂ©s -const VALID_ROLES = ['User', 'Process', 'Member', 'Peer', 'Payment', 'Deposit', 'Artefact', 'Resolve', 'Backup']; - -const VISIBILITY_LEVELS = { - PUBLIC: 'public', - CONFIDENTIAL: 'confidential', - PRIVATE: 'private', -}; - -const DOCUMENT_STATUS = { - DRAFT: 'draft', - PENDING: 'pending', - IN_REVIEW: 'in_review', - APPROVED: 'approved', - REJECTED: 'rejected', - EXPIRED: 'expired', -}; - -// Fonction pour crĂ©er un rĂŽle -function createRole(name, members) { - if (!VALID_ROLES.includes(name)) { - throw new Error(`Role "${name}" is not valid.`); - } - return { name, members }; -} - -export const groupsMock = [ - { - id: 1, - name: 'Processus 1', - description: 'Description du processus 1', - commonDocuments: [ - { - id: 101, - name: 'RĂšglement intĂ©rieur', - description: 'Document vierge pour le rĂšglement intĂ©rieur', - visibility: VISIBILITY_LEVELS.PUBLIC, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - { - id: 102, - name: 'Charte de confidentialitĂ©', - description: 'Document vierge pour la charte de confidentialitĂ©', - visibility: VISIBILITY_LEVELS.CONFIDENTIAL, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - { - id: 103, - name: 'ProcĂ©dures gĂ©nĂ©rales', - description: 'Document vierge pour les procĂ©dures gĂ©nĂ©rales', - visibility: VISIBILITY_LEVELS.PUBLIC, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - { - id: 104, - name: 'Urgency A', - description: "Document vierge pour le plan d'urgence A", - visibility: VISIBILITY_LEVELS.PRIVATE, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - { - id: 105, - name: 'Urgency B', - description: "Document vierge pour le plan d'urgence B", - visibility: VISIBILITY_LEVELS.PRIVATE, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - { - id: 106, - name: 'Urgency C', - description: "Document vierge pour le plan d'urgence C", - visibility: VISIBILITY_LEVELS.PRIVATE, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - { - id: 107, - name: 'Document Ă  signer', - description: 'Document vierge pour le rĂšglement intĂ©rieur', - visibility: VISIBILITY_LEVELS.PUBLIC, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - ], - roles: [ - { - name: 'User', - members: [ - { id: 1, name: 'Alice' }, - { id: 2, name: 'Bob' }, - ], - documents: [ - { - id: 1, - name: 'Document User A', - description: 'Description du document User A.', - visibility: 'public', - createdAt: '2024-01-01', - deadline: '2024-02-01', - signatures: [ - { - member: { id: 1, name: 'Alice' }, - signed: true, - signedAt: '2024-01-15', - }, - { - member: { id: 2, name: 'Bob' }, - signed: false, - }, - ], - }, - { - id: 2, - name: 'Document User B', - description: 'Document vierge pour le rĂŽle User', - visibility: 'confidential', - createdAt: null, - deadline: null, - signatures: [], - }, - { - id: 7, - name: 'Document User C', - description: 'Document vierge pour validation utilisateur', - visibility: VISIBILITY_LEVELS.CONFIDENTIAL, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - { - id: 8, - name: 'Document User D', - description: 'Document vierge pour approbation utilisateur', - visibility: VISIBILITY_LEVELS.PUBLIC, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - ], - }, - { - name: 'Process', - members: [ - { id: 3, name: 'Charlie' }, - { id: 4, name: 'David' }, - ], - documents: [ - { - id: 3, - name: 'Document Process A', - description: 'Description du document Process A.', - visibility: 'confidential', - createdAt: '2024-01-10', - deadline: '2024-03-01', - signatures: [ - { - member: { id: 3, name: 'Charlie' }, - signed: true, - signedAt: '2024-01-12', - }, - ], - }, - { - id: 9, - name: 'Document Process B', - description: 'Document vierge pour processus interne', - visibility: VISIBILITY_LEVELS.CONFIDENTIAL, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - { - id: 10, - name: 'Document Process C', - description: 'Document vierge pour validation processus', - visibility: VISIBILITY_LEVELS.PRIVATE, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - { - id: 11, - name: 'Document Process D', - description: 'Document vierge pour validation processus', - visibility: VISIBILITY_LEVELS.PUBLIC, - status: DOCUMENT_STATUS.PENDING, - createdAt: '2024-01-15', - deadline: '2024-02-01', - signatures: [ - { - member: { id: 3, name: 'Charlie' }, - signed: true, - signedAt: '2024-01-15', - }, - { - member: { id: 4, name: 'David' }, - signed: false, - }, - ], - }, - { - id: 12, - name: 'Document Process E', - description: 'Document vierge pour validation processus', - visibility: VISIBILITY_LEVELS.PUBLIC, - status: DOCUMENT_STATUS.PENDING, - createdAt: '2024-01-15', - deadline: '2024-02-01', - signatures: [ - { - member: { id: 3, name: 'Charlie' }, - signed: true, - signedAt: '2024-01-15', - }, - { - member: { id: 4, name: 'David' }, - signed: false, - }, - ], - }, - ], - }, - { - name: 'Backup', - members: [ - { id: 15, name: 'Oscar' }, - { id: 16, name: 'Patricia' }, - ], - documents: [ - { - id: 11, - name: 'Document Backup A', - description: 'Document vierge pour sauvegarde', - visibility: VISIBILITY_LEVELS.PRIVATE, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - ], - }, - ], - }, - { - id: 2, - name: 'Processus 2', - description: 'Description du processus 2', - commonDocuments: [ - { - id: 201, - name: 'RĂšglement intĂ©rieur', - description: 'Document vierge pour le rĂšglement intĂ©rieur', - visibility: VISIBILITY_LEVELS.PUBLIC, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - { - id: 202, - name: 'Charte de confidentialitĂ©', - description: 'Document vierge pour la charte de confidentialitĂ©', - visibility: VISIBILITY_LEVELS.CONFIDENTIAL, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - { - id: 203, - name: 'Charte de confidentialitĂ©', - description: 'Document vierge pour la charte de confidentialitĂ©', - visibility: VISIBILITY_LEVELS.PRIVATE, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - { - id: 204, - name: 'Charte de confidentialitĂ©', - description: 'Document vierge pour la charte de confidentialitĂ©', - visibility: VISIBILITY_LEVELS.PRIVATE, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - { - id: 205, - name: 'Charte de confidentialitĂ©', - description: 'Document vierge pour la charte de confidentialitĂ©', - visibility: VISIBILITY_LEVELS.PRIVATE, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - ], - roles: [ - { - name: 'Artefact', - members: [ - { id: 17, name: 'Quinn' }, - { id: 18, name: 'Rachel' }, - ], - documents: [ - { - id: 12, - name: 'Document Artefact A', - description: 'Document vierge pour artefact', - visibility: VISIBILITY_LEVELS.CONFIDENTIAL, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - { - id: 13, - name: 'Document Artefact B', - description: 'Document vierge pour validation artefact', - visibility: VISIBILITY_LEVELS.PRIVATE, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - ], - }, - { - name: 'Resolve', - members: [ - { id: 19, name: 'Sam' }, - { id: 20, name: 'Tom' }, - ], - documents: [ - { - id: 14, - name: 'Document Resolve A', - description: 'Document vierge pour rĂ©solution', - visibility: VISIBILITY_LEVELS.CONFIDENTIAL, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - ], - }, - ], - }, - { - id: 3, - name: 'Processus 3', - description: 'Description du processus 3', - commonDocuments: [ - { - id: 301, - name: 'RĂšglement intĂ©rieur', - description: 'Document vierge pour le rĂšglement intĂ©rieur', - visibility: VISIBILITY_LEVELS.PUBLIC, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - { - id: 302, - name: 'Charte de confidentialitĂ©', - description: 'Document vierge pour la charte de confidentialitĂ©', - visibility: VISIBILITY_LEVELS.CONFIDENTIAL, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - { - id: 303, - name: 'ProcĂ©dures gĂ©nĂ©rales', - description: 'Document vierge pour les procĂ©dures gĂ©nĂ©rales', - visibility: VISIBILITY_LEVELS.PUBLIC, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - ], - roles: [ - { - name: 'Deposit', - members: [ - { id: 21, name: 'Uma' }, - { id: 22, name: 'Victor' }, - ], - documents: [ - { - id: 15, - name: 'Document Deposit A', - description: 'Document vierge pour dĂ©pĂŽt', - visibility: VISIBILITY_LEVELS.PRIVATE, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - { - id: 16, - name: 'Document Deposit B', - description: 'Document vierge pour validation dĂ©pĂŽt', - visibility: VISIBILITY_LEVELS.CONFIDENTIAL, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - ], - }, - { - name: 'Payment', - members: [ - { id: 23, name: 'Walter' }, - { id: 24, name: 'Xena' }, - ], - documents: [ - { - id: 17, - name: 'Document Payment B', - description: 'Document vierge pour paiement', - visibility: VISIBILITY_LEVELS.PRIVATE, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - { - id: 18, - name: 'Document Payment C', - description: 'Document vierge pour validation paiement', - visibility: VISIBILITY_LEVELS.CONFIDENTIAL, - status: DOCUMENT_STATUS.DRAFT, - createdAt: null, - deadline: null, - signatures: [], - }, - ], - }, - ], - }, -]; diff --git a/modules/ihm_client/src/mocks/mock-signature/membersMocks.js b/modules/ihm_client/src/mocks/mock-signature/membersMocks.js deleted file mode 100755 index 2ffc6cee..00000000 --- a/modules/ihm_client/src/mocks/mock-signature/membersMocks.js +++ /dev/null @@ -1,105 +0,0 @@ -export const membersMock = [ - // Processus 1 - { - id: 1, - name: 'Alice', - avatar: 'A', - email: 'alice@company.com', - processRoles: [{ processId: 1, role: 'User' }], - }, - { - id: 2, - name: 'Bob', - avatar: 'B', - email: 'bob@company.com', - processRoles: [{ processId: 1, role: 'User' }], - }, - { - id: 3, - name: 'Charlie', - avatar: 'C', - email: 'charlie@company.com', - processRoles: [{ processId: 1, role: 'Process' }], - }, - { - id: 4, - name: 'David', - avatar: 'D', - email: 'david@company.com', - processRoles: [{ processId: 1, role: 'Process' }], - }, - { - id: 15, - name: 'Oscar', - avatar: 'O', - email: 'oscar@company.com', - processRoles: [{ processId: 1, role: 'Backup' }], - }, - { - id: 16, - name: 'Patricia', - avatar: 'P', - email: 'patricia@company.com', - processRoles: [{ processId: 1, role: 'Backup' }], - }, - - // Processus 2 - { - id: 17, - name: 'Quinn', - avatar: 'Q', - email: 'quinn@company.com', - processRoles: [{ processId: 2, role: 'Artefact' }], - }, - { - id: 18, - name: 'Rachel', - avatar: 'R', - email: 'rachel@company.com', - processRoles: [{ processId: 2, role: 'Artefact' }], - }, - { - id: 19, - name: 'Sam', - avatar: 'S', - email: 'sam@company.com', - processRoles: [{ processId: 2, role: 'Resolve' }], - }, - { - id: 20, - name: 'Tom', - avatar: 'T', - email: 'tom@company.com', - processRoles: [{ processId: 2, role: 'Resolve' }], - }, - - // Processus 3 - { - id: 21, - name: 'Uma', - avatar: 'U', - email: 'uma@company.com', - processRoles: [{ processId: 3, role: 'Deposit' }], - }, - { - id: 22, - name: 'Victor', - avatar: 'V', - email: 'victor@company.com', - processRoles: [{ processId: 3, role: 'Deposit' }], - }, - { - id: 23, - name: 'Walter', - avatar: 'W', - email: 'walter@company.com', - processRoles: [{ processId: 3, role: 'Payment' }], - }, - { - id: 24, - name: 'Xena', - avatar: 'X', - email: 'xena@company.com', - processRoles: [{ processId: 3, role: 'Payment' }], - }, -]; diff --git a/modules/ihm_client/src/mocks/mock-signature/messagesMock.ts b/modules/ihm_client/src/mocks/mock-signature/messagesMock.ts deleted file mode 100755 index ca1c31e5..00000000 --- a/modules/ihm_client/src/mocks/mock-signature/messagesMock.ts +++ /dev/null @@ -1,64 +0,0 @@ -export const messagesMock = [ - { - memberId: 1, // Conversations avec Mmber 1 - messages: [ - { id: 1, sender: 'Mmeber 1', text: 'Salut !', time: '10:30 AM' }, - { id: 2, sender: '4NK', text: 'Bonjour ! Comment ça va ?', time: '10:31 AM' }, - { id: 3, sender: '4NK', text: 'Tout va bien, merci !', time: '10:32 AM' }, - ], - }, - { - memberId: 2, // Conversations avec Member 2 - messages: [ - { id: 1, sender: 'Member 2', text: 'Salut, on se voit ce soir ?', time: '10:30 AM' }, - { id: 2, sender: '4NK', text: 'Oui, Ă  quelle heure ?', time: '10:31 AM' }, - ], - }, - { - memberId: 3, // Conversations avec Member 3 - messages: [ - { id: 1, sender: 'Member 3', text: 'Hey, ça va ?', time: '10:30 AM' }, - { id: 2, sender: '4NK', text: 'Ça va et toi ?', time: '10:31 AM' }, - ], - }, - { - memberId: 4, // Conversations avec Member 4 - messages: [ - { id: 1, sender: 'Member 4', text: 'Hey, ça va ?', time: '10:30 AM' }, - { id: 2, sender: '4NK', text: 'Ça va et toi ?', time: '10:31 AM' }, - { id: 3, sender: '4NK', text: 'Ça va et toi ?', time: '10:31 AM' }, - ], - }, - { - memberId: 5, // Conversations avec Member 5 - messages: [ - { id: 1, sender: 'Member 5', text: 'Hey, ça va ?', time: '10:30 AM' }, - { id: 2, sender: '4NK', text: 'Ça va et toi ?', time: '10:31 AM' }, - { id: 3, sender: '4NK', text: 'Ça va et toi ?', time: '10:31 AM' }, - ], - }, - { - memberId: 6, // Conversations avec Member 6 - messages: [ - { id: 1, sender: 'Member 6', text: 'Hey, ça va ?', time: '10:30 AM' }, - { id: 2, sender: '4NK', text: 'Ça va et toi ?', time: '10:31 AM' }, - { id: 3, sender: '4NK', text: 'Ça va et toi ?', time: '10:31 AM' }, - ], - }, - { - memberId: 7, // Conversations avec Member 7 - messages: [ - { id: 1, sender: 'Member 7', text: 'Hey, ça va ?', time: '10:30 AM' }, - { id: 2, sender: '4NK', text: 'Ça va et toi ?', time: '10:31 AM' }, - { id: 3, sender: '4NK', text: 'Ça va et toi ?', time: '10:31 AM' }, - ], - }, - { - memberId: 8, // Conversations avec Member 8 - messages: [ - { id: 1, sender: 'Member 8', text: 'Hey, ça va ?', time: '10:30 AM' }, - { id: 2, sender: '4NK', text: 'Ça va et toi ?', time: '10:31 AM' }, - { id: 3, sender: '4NK', text: 'Ça va et toi ?', time: '10:31 AM' }, - ], - }, -]; diff --git a/modules/ihm_client/src/models/backup.model.ts b/modules/ihm_client/src/models/backup.model.ts deleted file mode 100644 index 961c4956..00000000 --- a/modules/ihm_client/src/models/backup.model.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Device, Process, SecretsStore } from 'pkg/sdk_client'; - -export interface BackUp { - device: Device; - secrets: SecretsStore; - processes: Record; -} diff --git a/modules/ihm_client/src/models/notification.model.ts b/modules/ihm_client/src/models/notification.model.ts deleted file mode 100755 index 0d78630b..00000000 --- a/modules/ihm_client/src/models/notification.model.ts +++ /dev/null @@ -1,30 +0,0 @@ -export interface INotification { - id: number; - title: string; - description: string; - sendToNotificationPage?: boolean; - path?: string; -} - -// Quelles sont les donnĂ©es utiles pour le user ??? -export interface IUser { - id: string; - information?: any; -} - -// Quelles sont les donnĂ©es utiles pour les messages ??? -export interface IMessage { - id: string; - message: any; -} - -export interface UserDiff { - new_state_merkle_root: string; // TODO add a merkle proof that the new_value belongs to that state - field: string; - previous_value: string; - new_value: string; - notify_user: boolean; - need_validation: boolean; - // validated: bool, - proof: any; // This is only validation (or refusal) for that specific diff, not the whole state. It can't be commited as such -} diff --git a/modules/ihm_client/src/models/process.model.ts b/modules/ihm_client/src/models/process.model.ts deleted file mode 100755 index b2eae720..00000000 --- a/modules/ihm_client/src/models/process.model.ts +++ /dev/null @@ -1,65 +0,0 @@ -export interface IProcess { - id: number; - name: string; - description: string; - icon?: string; - zoneList: IZone[]; -} - -export interface IZone { - id: number; - name: string; - path: string; - // Est-ce que la zone a besoin d'une icone ? - icon?: string; -} - -export interface INotification { - id: number; - title: string; - description: string; - sendToNotificationPage?: boolean; - path?: string; -} - -export enum MessageType { - // Establish connection and keep alive - LISTENING = 'LISTENING', - REQUEST_LINK = 'REQUEST_LINK', - LINK_ACCEPTED = 'LINK_ACCEPTED', - CREATE_PAIRING = 'CREATE_PAIRING', - PAIRING_CREATED = 'PAIRING_CREATED', - ERROR = 'ERROR', - VALIDATE_TOKEN = 'VALIDATE_TOKEN', - RENEW_TOKEN = 'RENEW_TOKEN', - // Get various information - GET_PAIRING_ID = 'GET_PAIRING_ID', - GET_PROCESSES = 'GET_PROCESSES', - GET_MY_PROCESSES = 'GET_MY_PROCESSES', - PROCESSES_RETRIEVED = 'PROCESSES_RETRIEVED', - RETRIEVE_DATA = 'RETRIEVE_DATA', - DATA_RETRIEVED = 'DATA_RETRIEVED', - DECODE_PUBLIC_DATA = 'DECODE_PUBLIC_DATA', - PUBLIC_DATA_DECODED = 'PUBLIC_DATA_DECODED', - GET_MEMBER_ADDRESSES = 'GET_MEMBER_ADDRESSES', - MEMBER_ADDRESSES_RETRIEVED = 'MEMBER_ADDRESSES_RETRIEVED', - // Processes - CREATE_PROCESS = 'CREATE_PROCESS', - PROCESS_CREATED = 'PROCESS_CREATED', - UPDATE_PROCESS = 'UPDATE_PROCESS', - PROCESS_UPDATED = 'PROCESS_UPDATED', - NOTIFY_UPDATE = 'NOTIFY_UPDATE', - UPDATE_NOTIFIED = 'UPDATE_NOTIFIED', - VALIDATE_STATE = 'VALIDATE_STATE', - STATE_VALIDATED = 'STATE_VALIDATED', - // Hash and merkle proof - HASH_VALUE = 'HASH_VALUE', - VALUE_HASHED = 'VALUE_HASHED', - GET_MERKLE_PROOF = 'GET_MERKLE_PROOF', - MERKLE_PROOF_RETRIEVED = 'MERKLE_PROOF_RETRIEVED', - VALIDATE_MERKLE_PROOF = 'VALIDATE_MERKLE_PROOF', - MERKLE_PROOF_VALIDATED = 'MERKLE_PROOF_VALIDATED', - // Account management - ADD_DEVICE = 'ADD_DEVICE', - DEVICE_ADDED = 'DEVICE_ADDED', -} diff --git a/modules/ihm_client/src/models/signature.models.ts b/modules/ihm_client/src/models/signature.models.ts deleted file mode 100755 index ef5ad282..00000000 --- a/modules/ihm_client/src/models/signature.models.ts +++ /dev/null @@ -1,59 +0,0 @@ -export interface Group { - id: number; - name: string; - description?: string; - roles: { - id?: number; - name: string; - members: { id: string | number; name: string }[]; - documents?: { - id: number; - name: string; - description?: string; - visibility: string; - createdAt: string | null; - deadline: string | null; - signatures: DocumentSignature[]; - status?: string; - files?: Array<{ name: string; url: string }>; - }[]; - }[]; -} - -export interface Message { - id: number; - sender: string; - text?: string; - time: string; - type: 'text' | 'file'; - fileName?: string; - fileData?: string; -} - -export interface MemberMessages { - memberId: string; - messages: Message[]; -} - -export interface DocumentSignature { - signed: boolean; - member: { - name: string; - }; - signedAt?: string; -} - -export interface RequestParams { - processId: number; - processName: string; - roleId: number; - roleName: string; - documentId: number; - documentName: string; -} - -export interface Notification { - memberId: string; - text: string; - time: string; -} diff --git a/modules/ihm_client/src/pages/account/account-component.ts b/modules/ihm_client/src/pages/account/account-component.ts deleted file mode 100644 index db8f1933..00000000 --- a/modules/ihm_client/src/pages/account/account-component.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { AccountElement } from './account'; -import accountCss from '../../../public/style/account.css?raw'; -import Services from '../../services/service.js'; - -class AccountComponent extends HTMLElement { - _callback: any; - accountElement: AccountElement | null = null; - - constructor() { - super(); - console.log('INIT'); - this.attachShadow({ mode: 'open' }); - - this.accountElement = this.shadowRoot?.querySelector('account-element') || null; - } - - connectedCallback() { - console.log('CALLBACKs'); - this.render(); - this.fetchData(); - - if (!customElements.get('account-element')) { - customElements.define('account-element', AccountElement); - } - } - - async fetchData() { - if ((import.meta as any).env.VITE_IS_INDEPENDANT_LIB === false) { - const data = await (window as any).myService?.getProcesses(); - } else { - const service = await Services.getInstance(); - const data = await service.getProcesses(); - } - } - - set callback(fn) { - if (typeof fn === 'function') { - this._callback = fn; - } else { - console.error('Callback is not a function'); - } - } - - get callback() { - return this._callback; - } - - render() { - if (this.shadowRoot && !this.shadowRoot.querySelector('account-element')) { - const style = document.createElement('style'); - style.textContent = accountCss; - - const accountElement = document.createElement('account-element'); - - this.shadowRoot.appendChild(style); - this.shadowRoot.appendChild(accountElement); - } - } -} - -export { AccountComponent }; -customElements.define('account-component', AccountComponent); diff --git a/modules/ihm_client/src/pages/account/account.html b/modules/ihm_client/src/pages/account/account.html deleted file mode 100755 index da077ce0..00000000 --- a/modules/ihm_client/src/pages/account/account.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - Account - - - - - - diff --git a/modules/ihm_client/src/pages/account/account.ts b/modules/ihm_client/src/pages/account/account.ts deleted file mode 100755 index ad268fb0..00000000 --- a/modules/ihm_client/src/pages/account/account.ts +++ /dev/null @@ -1,1591 +0,0 @@ -declare global { - interface Window { - initAccount: () => void; - showContractPopup: (contractId: string) => void; - showPairing: () => Promise; - showWallet: () => void; - showData: () => void; - addWalletRow: () => void; - confirmWalletRow: () => void; - cancelWalletRow: () => void; - openAvatarPopup: () => void; - closeAvatarPopup: () => void; - editDeviceName: (cell: HTMLTableCellElement) => void; - showNotifications: (processName: string) => void; - closeNotificationPopup: (event: Event) => void; - markAsRead: (processName: string, messageId: number, element: HTMLElement) => void; - exportRecovery: () => void; - confirmDeleteAccount: () => void; - deleteAccount: () => void; - updateNavbarBanner: (bannerUrl: string) => void; - saveBannerToLocalStorage: (bannerUrl: string) => void; - loadSavedBanner: () => void; - cancelAddRowPairing: () => void; - saveName: (cell: HTMLElement, input: HTMLInputElement) => void; - showProcessNotifications: (processName: string) => void; - handleLogout: () => void; - initializeEventListeners: () => void; - showProcess: () => void; - showProcessCreation: () => void; - showDocumentValidation: () => void; - updateNavbarName: (name: string) => void; - updateNavbarLastName: (lastName: string) => void; - showAlert: (title: string, text?: string, icon?: string) => void; - addRowPairing: () => void; - confirmRowPairing: () => void; - cancelRowPairing: () => void; - deleteRowPairing: (button: HTMLButtonElement) => void; - generateRecoveryWords: () => string[]; - exportUserData: () => void; - updateActionButtons: () => void; - showQRCodeModal: (pairingId: string) => void; - } -} - -import Swal from 'sweetalert2'; -import { STORAGE_KEYS, defaultRows, mockProcessRows, mockNotifications, notificationMessages, mockDataRows, mockContracts, ALLOWED_ROLES } from '../../mocks/mock-account/constAccountMock'; -import { Row, WalletRow, DataRow, Notification, Contract, NotificationMessage } from '../../mocks/mock-account/interfacesAccountMock'; -import { addressToEmoji } from '../../utils/sp-address.utils'; -import { getCorrectDOM } from '../../utils/document.utils'; -import accountStyle from '../../../public/style/account.css?inline'; -import Services from '../../services/service'; -import { getProcessCreation } from './process-creation'; -import { getDocumentValidation } from './document-validation'; -import { createProcessTab } from './process'; - -let isAddingRow = false; -let currentRow: HTMLTableRowElement | null = null; -let currentMode: keyof typeof STORAGE_KEYS = 'pairing'; - -interface Process { - states: Array<{ - committed_in: string; - keys: {}; - pcd_commitment: { - counter: string; - }; - public_data: { - memberPublicName?: string; - }; - roles: { - pairing?: {}; - }; - state_id: string; - validation_tokens: Array; - }>; -} - -class AccountElement extends HTMLElement { - private dom: Node; - - constructor() { - super(); - this.attachShadow({ mode: 'open' }); - this.dom = getCorrectDOM('account-element'); - - // Ajouter Font Awesome - const fontAwesome = document.createElement('link'); - fontAwesome.rel = 'stylesheet'; - fontAwesome.href = 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css'; - this.shadowRoot!.appendChild(fontAwesome); - - const style = document.createElement('style'); - style.textContent = accountStyle; - this.shadowRoot!.appendChild(style); - - this.shadowRoot!.innerHTML = ` - - - - - - -
- -
-
    - -
    -
    - Banner -
    -
    - Avatar - -
    -
    - - - - - -
-
    Pairing 🔗
- -
    Process ⚙
-
    Process Creation
-
    Document Validation
- -
- - -
-
-
- -
-
-
- -
-
-
- `; - - window.showPairing = () => this.showPairing(); - window.showWallet = () => this.showWallet(); - window.showProcess = () => this.showProcess(); - window.showProcessCreation = () => this.showProcessCreation(); - window.showDocumentValidation = () => this.showDocumentValidation(); - window.showData = () => this.showData(); - window.addWalletRow = () => this.addWalletRow(); - window.confirmWalletRow = () => this.confirmWalletRow(); - window.cancelWalletRow = () => this.cancelWalletRow(); - window.editDeviceName = (cell: HTMLTableCellElement) => this.editDeviceName(cell); - window.showProcessNotifications = (processName: string) => this.showProcessNotifications(processName); - window.handleLogout = () => this.handleLogout(); - window.confirmDeleteAccount = () => this.confirmDeleteAccount(); - window.showContractPopup = (contractId: string) => this.showContractPopup(contractId); - window.addRowPairing = () => this.addRowPairing(); - window.deleteRowPairing = (button: HTMLButtonElement) => this.deleteRowPairing(button); - window.confirmRowPairing = () => this.confirmRowPairing(); - window.cancelRowPairing = () => this.cancelRowPairing(); - window.updateNavbarBanner = (bannerUrl: string) => this.updateNavbarBanner(bannerUrl); - window.saveBannerToLocalStorage = (bannerUrl: string) => this.saveBannerToLocalStorage(bannerUrl); - window.loadSavedBanner = () => this.loadSavedBanner(); - window.closeNotificationPopup = (event: Event) => this.closeNotificationPopup(event); - window.markAsRead = (processName: string, messageId: number, element: HTMLElement) => this.markAsRead(processName, messageId, element); - window.exportRecovery = () => this.exportRecovery(); - window.generateRecoveryWords = () => this.generateRecoveryWords(); - window.exportUserData = () => this.exportUserData(); - window.updateActionButtons = () => this.updateActionButtons(); - window.openAvatarPopup = () => this.openAvatarPopup(); - window.closeAvatarPopup = () => this.closeAvatarPopup(); - window.showQRCodeModal = (pairingId: string) => this.showQRCodeModal(pairingId); - - if (!localStorage.getItem('rows')) { - localStorage.setItem('rows', JSON.stringify(defaultRows)); - } - } - - connectedCallback() { - this.initializeEventListeners(); - this.loadSavedBanner(); - this.loadUserInfo(); - - const savedAvatar = localStorage.getItem('userAvatar'); - const savedBanner = localStorage.getItem('userBanner'); - const savedName = localStorage.getItem('userName'); - const savedLastName = localStorage.getItem('userLastName'); - - if (savedAvatar) { - const navAvatar = this.shadowRoot?.querySelector('.avatar') as HTMLImageElement; - if (navAvatar) navAvatar.src = savedAvatar; - } - - if (savedBanner) { - const navBanner = this.shadowRoot?.querySelector('.banner-image') as HTMLImageElement; - if (navBanner) navBanner.src = savedBanner; - } - - if (savedName) { - this.updateNavbarName(savedName); - } - if (savedLastName) { - this.updateNavbarLastName(savedLastName); - } - } - - private showAlert(message: string): void { - // Créer la popup si elle n'existe pas - let alertPopup = this.shadowRoot?.querySelector('.alert-popup'); - if (!alertPopup) { - alertPopup = document.createElement('div'); - alertPopup.className = 'alert-popup'; - this.shadowRoot?.appendChild(alertPopup); - } - - // Définir le message et afficher la popup - alertPopup.textContent = message; - (alertPopup as HTMLElement).style.display = 'block'; - - // Cacher la popup aprÚs 3 secondes - setTimeout(() => { - (alertPopup as HTMLElement).style.display = 'none'; - }, 3000); - } - - // Fonctions de gestion des comptes et de l'interface utilisateur - private confirmDeleteAccount(): void { - const modal = document.createElement('div'); - modal.className = 'confirm-delete-modal'; - modal.innerHTML = ` -

Delete Account

-

Are you sure you want to delete your account? This action cannot be undone.

-
- - -
- `; - - this.shadowRoot?.appendChild(modal); - modal.style.display = 'block'; - - const cancelBtn = modal.querySelector('.cancel-btn'); - const confirmBtn = modal.querySelector('.confirm-btn'); - - cancelBtn?.addEventListener('click', () => { - modal.remove(); - }); - - confirmBtn?.addEventListener('click', () => { - this.deleteAccount(); - modal.remove(); - }); - } - - private deleteAccount(): void { - localStorage.clear(); - window.location.href = '/login.html'; - } - - private updateNavbarBanner(imageUrl: string): void { - const navbarSection = this.shadowRoot?.querySelector('.nav-wrapper .avatar-section'); - if (!navbarSection) return; - - let bannerImg = navbarSection.querySelector('.banner-image'); - - if (!bannerImg) { - bannerImg = document.createElement('img'); - bannerImg.className = 'banner-image'; - navbarSection.insertBefore(bannerImg, navbarSection.firstChild); - } - - bannerImg.src = imageUrl; - } - - private saveBannerToLocalStorage(dataUrl: string): void { - localStorage.setItem('userBanner', dataUrl); - } - - private loadSavedBanner(): void { - const savedBanner = localStorage.getItem('userBanner'); - if (savedBanner) { - const bannerImg = this.shadowRoot?.getElementById('popup-banner-img') as HTMLImageElement; - if (bannerImg) { - bannerImg.src = savedBanner; - } - this.updateNavbarBanner(savedBanner); - } - } - - private closeNotificationPopup(event: Event): void { - const target = event.target as HTMLElement; - const isOverlay = target.classList.contains('notification-popup-overlay'); - const isCloseButton = target.classList.contains('close-popup'); - if (!isOverlay && !isCloseButton) return; - - const popup = this.shadowRoot?.querySelector('.notification-popup-overlay'); - if (popup) popup.remove(); - } - - private markAsRead(processName: string, messageId: number, element: HTMLElement): void { - const process = mockProcessRows.find((p) => p.process === processName); - if (!process) return; - - const message = process.notification.messages.find((m) => m.id === messageId); - if (!message || message.read) return; - - message.read = true; - - element.classList.remove('unread'); - element.classList.add('read'); - - const statusIcon = element.querySelector('.notification-status'); - if (statusIcon) { - statusIcon.innerHTML = ` - - - `; - } - - const notifCount = this.calculateNotifications(process.notification.messages); - const countElement = this.shadowRoot?.querySelector(`.notification-count[data-process="${processName}"]`); - if (countElement) { - countElement.textContent = `${notifCount.unread}/${notifCount.total}`; - - const bellContainer = countElement.closest('.notification-container'); - const bell = bellContainer?.querySelector('svg'); // Changé de .fa-bell à svg - if (bell && bellContainer && notifCount.unread === 0) { - bellContainer.classList.remove('has-unread'); - (bell as SVGElement).style.fill = '#666'; // Utiliser fill au lieu de color pour SVG - } - } - } - - // Fonctions de gestion des données et de l'interface - private calculateNotifications(messages: NotificationMessage[]): { unread: number; total: number } { - const total = messages.length; - const unread = messages.filter((msg) => !msg.read).length; - return { unread, total }; - } - - // Fonctions de récupération - private exportRecovery(): void { - Swal.fire({ - title: 'Recovery Words Export', - text: '4 words will be displayed. We strongly recommend writing them down on paper before exporting the account. Do you want to continue?', - icon: 'warning', - showCancelButton: true, - confirmButtonText: 'Confirm', - cancelButtonText: 'Cancel', - confirmButtonColor: '#C89666', - cancelButtonColor: '#6c757d', - // Ajouter des styles personnalisés - customClass: { - container: 'recovery-popup-container', - popup: 'recovery-popup', - }, - }).then((result) => { - if (result.isConfirmed) { - const recoveryWords = this.generateRecoveryWords(); - localStorage.setItem('recoveryWords', JSON.stringify(recoveryWords)); - - Swal.fire({ - title: 'Your Recovery Words', - html: ` -
- ${recoveryWords - .map( - (word, index) => ` -
- ${index + 1}. - ${word} -
- `, - ) - .join('')} -
-
- Please write these words down carefully. They will be needed to recover your account. -
- `, - showCancelButton: false, - confirmButtonText: 'I confirm the export', - confirmButtonColor: '#C89666', - allowOutsideClick: false, - allowEscapeKey: false, - customClass: { - container: 'recovery-popup-container', - popup: 'recovery-popup', - }, - }).then((result) => { - if (result.isConfirmed) { - // Stocker l'état du bouton dans le localStorage - localStorage.setItem('recoveryExported', 'true'); - - const exportRecoveryBtn = this.shadowRoot?.querySelector('.recovery-btn') as HTMLButtonElement; - if (exportRecoveryBtn) { - exportRecoveryBtn.disabled = true; - exportRecoveryBtn.style.opacity = '0.5'; - exportRecoveryBtn.style.cursor = 'not-allowed'; - } - } - }); - } - }); - } - - private generateRecoveryWords(): string[] { - const wordsList = ['apple', 'banana', 'orange', 'grape', 'kiwi', 'mango', 'peach', 'plum', 'lemon', 'lime', 'cherry', 'melon', 'pear', 'fig', 'date', 'berry']; - const recoveryWords: string[] = []; - while (recoveryWords.length < 4) { - const randomWord = wordsList[Math.floor(Math.random() * wordsList.length)]; - if (!recoveryWords.includes(randomWord)) { - recoveryWords.push(randomWord); - } - } - return recoveryWords; - } - - private exportUserData(): void { - const data: { [key: string]: string | null } = {}; - for (let i = 0; i < localStorage.length; i++) { - const key = localStorage.key(i); - if (key) { - const value = localStorage.getItem(key); - data[key] = value; - } - } - - const jsonData = JSON.stringify(data, null, 2); - const blob = new Blob([jsonData], { type: 'application/json' }); - const url = URL.createObjectURL(blob); - const a = document.createElement('a'); - a.href = url; - a.download = 'user_data.json'; - this.shadowRoot?.appendChild(a); - a.click(); - this.shadowRoot?.removeChild(a); - URL.revokeObjectURL(url); - } - - private updateActionButtons(): void { - const buttonContainer = this.shadowRoot?.querySelector('.button-container'); - if (!buttonContainer) return; - - buttonContainer.innerHTML = ` -
- - -
- `; - } - - private getConfirmFunction(): string { - switch (currentMode) { - case 'wallet': - return 'window.confirmWalletRow()'; - case 'process': - return 'window.confirmProcessRow()'; - default: - return 'window.confirmRowPairing()'; - } - } - - private getCancelFunction(): string { - switch (currentMode) { - case 'wallet': - return 'window.cancelWalletRow()'; - case 'process': - return 'window.cancelProcessRow()'; - default: - return 'window.cancelRowPairing()'; - } - } - - // Fonctions de gestion des tableaux - private async addRowPairing(): Promise { - if (isAddingRow) return; - isAddingRow = true; - - // Créer la popup - const modal = document.createElement('div'); - modal.className = 'pairing-modal'; - modal.innerHTML = ` -
-

Add New Device

-
-
- - -
-
- - -
-
- - -
-
- - -
-
-
- `; - - this.shadowRoot?.appendChild(modal); - - // Ajouter les event listeners - const spAddressInput = modal.querySelector('#sp-address') as HTMLInputElement; - const spEmojisInput = modal.querySelector('#sp-emojis') as HTMLInputElement; - const deviceNameInput = modal.querySelector('#device-name') as HTMLInputElement; - const confirmButton = modal.querySelector('.confirm-button'); - const cancelButton = modal.querySelector('.cancel-button'); - - // Mettre à jour les emojis automatiquement - spAddressInput?.addEventListener('input', async () => { - const emojis = await addressToEmoji(spAddressInput.value); - if (spEmojisInput) spEmojisInput.value = emojis; - }); - - // Gérer la confirmation - confirmButton?.addEventListener('click', () => { - const spAddress = spAddressInput?.value.trim(); - const deviceName = deviceNameInput?.value.trim(); - const spEmojis = spEmojisInput?.value.trim(); - - if (!spAddress || !deviceName) { - this.showAlert('Please fill in all required fields'); - return; - } - - //if (spAddress.length !== 118) { - // this.showAlert('SP Address must be exactly 118 characters long'); - // return; - //} - - const newRow: Row = { - column1: spAddress, - column2: deviceName, - column3: spEmojis || '', - }; - - const storageKey = STORAGE_KEYS[currentMode]; - const rows: Row[] = JSON.parse(localStorage.getItem(storageKey) || '[]'); - rows.push(newRow); - localStorage.setItem(storageKey, JSON.stringify(rows)); - - this.updateTableContent(rows); - modal.remove(); - isAddingRow = false; - }); - - // Gérer l'annulation - cancelButton?.addEventListener('click', () => { - modal.remove(); - isAddingRow = false; - }); - } - - // Fonctions de mise à jour de l'interface - private updateTableContent(rows: Row[]): void { - const tbody = this.shadowRoot?.querySelector('#pairing-table tbody'); - if (!tbody) return; - - tbody.innerHTML = rows - .map( - (row) => ` - - ${row.column2} - ${row.column3} - - QR Code - - - - - - `, - ) - .join(''); - } - - private confirmRowPairing(): void { - if (!currentRow) return; - - const inputs = currentRow.getElementsByTagName('input'); - const values: string[] = Array.from(inputs).map((input) => input.value.trim()); - - // Vérification des champs vides - if (values.some((value) => value === '')) { - this.showAlert('Please fill in all fields'); - return; - } - - // Vérification de la longueur de l'adresse SP - if (values[0].length !== 118) { - this.showAlert('SP Address must be exactly 118 characters long'); - return; - } - - const newRow: Row = { - column1: values[0], - column2: values[1], - column3: values[2], - }; - - const storageKey = STORAGE_KEYS[currentMode]; - const rows: Row[] = JSON.parse(localStorage.getItem(storageKey) || '[]'); - rows.push(newRow); - localStorage.setItem(storageKey, JSON.stringify(rows)); - - isAddingRow = false; - currentRow = null; - - this.resetButtonContainer(); - this.updateTableContent(rows); - } - - private cancelRowPairing(): void { - if (!currentRow) return; - - currentRow.remove(); - isAddingRow = false; - currentRow = null; - - this.resetButtonContainer(); - } - - private resetButtonContainer(): void { - const buttonContainer = this.shadowRoot?.querySelector('.button-container'); - if (!buttonContainer) return; - - buttonContainer.innerHTML = ` - - `; - } - - private deleteRowPairing(button: HTMLButtonElement): void { - const row = button.closest('tr'); - if (!row) return; - - const table = row.closest('tbody'); - if (!table) return; - - const remainingRows = table.getElementsByTagName('tr').length; - if (remainingRows <= 2) { - this.showAlert('You must keep at least 2 devices paired'); - return; - } - - // Créer la modal de confirmation - const modal = document.createElement('div'); - modal.className = 'confirm-delete-modal'; - modal.innerHTML = ` -
-

Confirm Deletion

-

Are you sure you want to delete this device?

-
- - -
-
- `; - - this.shadowRoot?.appendChild(modal); - - // Gérer les boutons de la modal - const confirmBtn = modal.querySelector('.confirm-btn'); - const cancelBtn = modal.querySelector('.cancel-btn'); - - confirmBtn?.addEventListener('click', () => { - // Calculer l'index AVANT de supprimer la ligne du DOM - const index = Array.from(table.children).indexOf(row); - const storageKey = STORAGE_KEYS[currentMode]; - const rows = JSON.parse(localStorage.getItem(storageKey) || '[]'); - - // Supprimer du localStorage - if (index > -1) { - rows.splice(index, 1); - localStorage.setItem(storageKey, JSON.stringify(rows)); - } - - // Animation et suppression du DOM - row.style.transition = 'opacity 0.3s, transform 0.3s'; - row.style.opacity = '0'; - row.style.transform = 'translateX(-100%)'; - - setTimeout(() => { - row.remove(); - }, 300); - - modal.remove(); - }); - - cancelBtn?.addEventListener('click', () => { - modal.remove(); - }); - } - - private editDeviceName(cell: HTMLTableCellElement): void { - if (cell.classList.contains('editing')) return; - - const currentValue = cell.textContent || ''; - const input = document.createElement('input'); - input.type = 'text'; - input.value = currentValue; - input.className = 'edit-input'; - - input.addEventListener('blur', () => this.finishEditing(cell, input)); - input.addEventListener('keypress', (e: KeyboardEvent) => { - if (e.key === 'Enter') { - this.finishEditing(cell, input); - } - }); - - cell.textContent = ''; - cell.appendChild(input); - cell.classList.add('editing'); - input.focus(); - } - - private async finishEditing(cell: HTMLTableCellElement, input: HTMLInputElement): Promise { - const newValue = input.value.trim(); - if (newValue === '') { - cell.textContent = cell.getAttribute('data-original-value') || ''; - cell.classList.remove('editing'); - return; - } - - try { - const service = await Services.getInstance(); - const pairingProcessId = service.getPairingProcessId(); - const process = await service.getProcess(pairingProcessId); - - // Mettre à jour le nom via le service - if (process) { - await service.updateMemberPublicName(process, newValue); - } - - // Mettre à jour l'interface - cell.textContent = newValue; - cell.classList.remove('editing'); - } catch (error) { - console.error('Failed to update name:', error); - // Restaurer l'ancienne valeur en cas d'erreur - cell.textContent = cell.getAttribute('data-original-value') || ''; - cell.classList.remove('editing'); - } - } - - // Fonction pour gérer le téléchargement de l'avatar - private handleAvatarUpload(event: Event): void { - const input = event.target as HTMLInputElement; - const file = input.files?.[0]; - - if (file) { - const reader = new FileReader(); - reader.onload = (e: ProgressEvent) => { - const result = e.target?.result as string; - const popupAvatar = this.shadowRoot?.getElementById('popup-avatar-img') as HTMLImageElement; - const navAvatar = this.shadowRoot?.querySelector('.nav-wrapper .avatar') as HTMLImageElement; - - if (popupAvatar) popupAvatar.src = result; - if (navAvatar) navAvatar.src = result; - - localStorage.setItem('userAvatar', result); - }; - reader.readAsDataURL(file); - } - } - - private async showProcessCreation(): Promise { - this.hideAllContent(); - const container = this.shadowRoot?.getElementById('process-creation-content'); - if (container) { - getProcessCreation(container); - } - } - - private async showDocumentValidation(): Promise { - this.hideAllContent(); - const container = this.shadowRoot?.getElementById('document-validation-content'); - if (container) { - getDocumentValidation(container); - } - } - - private async showProcess(): Promise { - this.hideAllContent(); - const container = this.shadowRoot?.getElementById('process-content'); - if (container) { - const service = await Services.getInstance(); - const myProcesses = await service.getMyProcesses(); - if (myProcesses && myProcesses.length != 0) { - const myProcessesDataUnfiltered: { name: string; publicData: Record }[] = await Promise.all( - myProcesses.map(async (processId) => { - const process = await service.getProcess(processId); - const lastState = process ? service.getLastCommitedState(process) : null; - if (!lastState) { - return { - name: '', - publicData: {}, - }; - } - const description = await service.decryptAttribute(processId, lastState, 'description'); - const name = description ? description : 'N/A'; - const publicData = process ? await service.getPublicData(process) : null; - if (!publicData) { - return { - name: '', - publicData: {}, - }; - } - return { - name: name, - publicData: publicData, - }; - }), - ); - const myProcessesData = myProcessesDataUnfiltered.filter((p) => p.name !== '' && Object.keys(p.publicData).length != 0); - - createProcessTab(container, myProcessesData); - } else { - createProcessTab(container, []); - } - } - } - - private showProcessNotifications(processName: string): void { - const process = mockProcessRows.find((p) => p.process === processName); - if (!process) return; - - const modal = document.createElement('div'); - modal.className = 'notifications-modal'; - - let notificationsList = process.notification.messages - .map( - (msg) => ` -
-
- ${ - msg.read - ? ` - - ` - : ` - - ` - } -
-
- ${msg.message} - ${msg.date} -
-
- `, - ) - .join(''); - - if (process.notification.messages.length === 0) { - notificationsList = '

No notifications

'; - } - - modal.innerHTML = ` -
-

${processName} Notifications

-
- ${notificationsList} -
- -
- `; - - this.shadowRoot?.appendChild(modal); - - // Mettre Ă  jour le compteur de notifications - const countElement = this.shadowRoot?.querySelector(`.notification-count[data-process="${processName}"]`); - if (countElement) { - const notifCount = this.calculateNotifications(process.notification.messages); - countElement.textContent = `${notifCount.unread}/${notifCount.total}`; - } - - const closeButton = modal.querySelector('.close-notifications'); - closeButton?.addEventListener('click', () => { - modal.remove(); - this.showProcess(); // RafraĂźchir l'affichage pour mettre Ă  jour les compteurs - }); - } - - private handleLogout(): void { - localStorage.clear(); - window.location.href = '../login/login.html'; - } - - // Fonctions de gestion des contrats - private showContractPopup(contractId: string, event?: Event) { - if (event) { - event.preventDefault(); - } - - // Check if the contract exists in mockContracts - const contract = mockContracts[contractId as keyof typeof mockContracts]; - if (!contract) { - console.error('Contract not found:', contractId); - return; - } - - const popup = document.createElement('div'); - popup.className = 'contract-popup-overlay'; - popup.innerHTML = ` -
- -

${contract.title}

-
-

Date: ${contract.date}

-

Parties: ${contract.parties.join(', ')}

-

Terms:

-
    - ${contract.terms.map((term) => `
  • ${term}
  • `).join('')} -
-

Content: ${contract.content}

-
-
- `; - - this.shadowRoot?.appendChild(popup); - - const closeBtn = popup.querySelector('.close-contract-popup'); - const closePopup = () => popup.remove(); - - closeBtn?.addEventListener('click', closePopup); - popup.addEventListener('click', (e) => { - if (e.target === popup) closePopup(); - }); - } - - // Fonction utilitaire pour cacher tous les contenus - private hideAllContent(): void { - const contents = ['pairing-content', 'wallet-content', 'process-content', 'process-creation-content', 'data-content', 'document-validation-content']; - contents.forEach((id) => { - const element = this.shadowRoot?.getElementById(id); - if (element) { - element.style.display = 'none'; - } - }); - } - - // Fonctions d'affichage des sections - private async showPairing(): Promise { - const service = await Services.getInstance(); - const spAddress = await service.getDeviceAddress(); - - isAddingRow = false; - currentRow = null; - currentMode = 'pairing'; - - this.hideAllContent(); - - const headerElement = this.shadowRoot?.getElementById('parameter-header'); - if (headerElement) { - headerElement.textContent = 'Pairing'; - } - - const pairingContent = this.shadowRoot?.getElementById('pairing-content'); - if (pairingContent) { - pairingContent.style.display = 'block'; - pairingContent.innerHTML = ` -
Pairing
-
- - - - - - - - - - -
Device NameSP EmojisQR CodeActions
-
- -
-
- `; - - let rows = JSON.parse(localStorage.getItem(STORAGE_KEYS.pairing) || '[]'); - - const deviceExists = rows.some((row: Row) => row.column1 === spAddress); - - if (!deviceExists && spAddress) { - const emojis = await addressToEmoji(spAddress); - - try { - // Déboguer le processus de pairing - const pairingProcessId = await service.getPairingProcessId(); - console.log('Pairing Process ID:', pairingProcessId); - - const pairingProcess = await service.getProcess(pairingProcessId); - console.log('Pairing Process:', pairingProcess); - - const userName = pairingProcess?.states?.[0]?.public_data?.memberPublicName || localStorage.getItem('userName'); - - console.log('Username found:', userName); - - const newRow = { - column1: spAddress, - column2: userName, - column3: emojis, - }; - rows = [newRow, ...rows]; - localStorage.setItem(STORAGE_KEYS.pairing, JSON.stringify(rows)); - } catch (error) { - console.error('Error getting pairing process:', error); - const newRow = { - column1: spAddress, - column2: 'This Device', - column3: emojis, - }; - rows = [newRow, ...rows]; - localStorage.setItem(STORAGE_KEYS.pairing, JSON.stringify(rows)); - } - } - - this.updateTableContent(rows); - } - } - - private showWallet(): void { - isAddingRow = false; - currentRow = null; - - currentMode = 'wallet'; - this.hideAllContent(); - - // Mettre à jour le titre - const headerTitle = this.shadowRoot?.getElementById('header-title'); - if (headerTitle) headerTitle.textContent = 'Wallet'; - - const walletContent = this.shadowRoot?.getElementById('wallet-content'); - if (!walletContent) return; - walletContent.style.display = 'block'; - walletContent.innerHTML = ` -
Wallet
-
- - - - - - - - - -
LabelWalletType
-
- -
-
- `; - - const rows = JSON.parse(localStorage.getItem(STORAGE_KEYS.wallet) || '[]'); - this.updateWalletTableContent(rows); - } - - private updateWalletTableContent(rows: WalletRow[]): void { - const tbody = this.shadowRoot?.querySelector('#wallet-table tbody'); - if (!tbody) return; - - tbody.innerHTML = rows - .map( - (row) => ` - - ${row.column1} - ${row.column2} - ${row.column3} - - `, - ) - .join(''); - } - - private showData(): void { - //console.log("showData called"); - currentMode = 'data'; - this.hideAllContent(); - - const headerTitle = this.shadowRoot?.getElementById('header-title'); - if (headerTitle) headerTitle.textContent = 'Data'; - - const dataContent = this.shadowRoot?.getElementById('data-content'); - if (dataContent) { - dataContent.style.display = 'block'; - dataContent.innerHTML = ` -
Data
-
- - - - - - - - - - - - -
NameVisibilityRoleDurationLegalContract
-
- `; - - const rows = mockDataRows || JSON.parse(localStorage.getItem(STORAGE_KEYS.data) || '[]'); - this.updateDataTableContent(rows); - } - } - - // Fonctions de gestion du wallet - private addWalletRow(): void { - if (isAddingRow) return; - isAddingRow = true; - - const table = this.shadowRoot?.getElementById('wallet-table')?.getElementsByTagName('tbody')[0]; - if (!table) return; - - currentRow = table.insertRow(); - const placeholders = ['Label', 'Wallet', 'Type']; - - placeholders.forEach((placeholder) => { - const cell = currentRow!.insertCell(); - const input = document.createElement('input'); - input.type = 'text'; - input.placeholder = placeholder; - input.className = 'edit-input'; - cell.appendChild(input); - }); - - // Remplacer le bouton "Add a line" par les boutons de confirmation/annulation - const buttonContainer = this.shadowRoot?.querySelector('#wallet-content .button-container'); - if (!buttonContainer) return; - - buttonContainer.innerHTML = ` -
- - -
- `; - - this.updateActionButtons(); - } - - private confirmWalletRow(): void { - if (!currentRow) return; - - const inputs = Array.from(currentRow.getElementsByTagName('input')); - const allFieldsFilled = inputs.every((input) => input.value.trim() !== ''); - - if (allFieldsFilled) { - const newRow: WalletRow = { - column1: inputs[0].value.trim(), - column2: inputs[1].value.trim(), - column3: inputs[2].value.trim(), - }; - - const rows = JSON.parse(localStorage.getItem(STORAGE_KEYS.wallet) || '[]'); - rows.push(newRow); - localStorage.setItem(STORAGE_KEYS.wallet, JSON.stringify(rows)); - - isAddingRow = false; - currentRow = null; - this.showWallet(); - } else { - this.showAlert('Please complete all fields before confirming.'); - } - } - - private cancelWalletRow(): void { - if (!currentRow) return; - - currentRow.remove(); - isAddingRow = false; - currentRow = null; - - // RĂ©initialiser le conteneur de boutons avec le bouton "Add a line" - const buttonContainer = this.shadowRoot?.querySelector('#wallet-content .button-container'); - if (!buttonContainer) return; - - buttonContainer.innerHTML = ` - - `; - } - - private updateDataTableContent(rows: DataRow[]): void { - const tbody = this.shadowRoot?.querySelector('#data-table tbody'); - if (!tbody) return; - - tbody.innerHTML = rows - .map( - (row) => ` - - ${row.column1} - ${row.column2} - ${row.column3} - ${row.column4} - ${row.column5} - - ${row.column6} - - - `, - ) - .join(''); - } - - // Fonctions de gestion de l'avatar et de la banniĂšre - private openAvatarPopup(): void { - const popup = this.shadowRoot?.getElementById('avatar-popup'); - if (!popup) return; - - // RĂ©cuprer les valeurs stockĂ©es - const savedName = localStorage.getItem('userName'); - const savedLastName = localStorage.getItem('userLastName'); - const savedAvatar = localStorage.getItem('userAvatar') || 'https://via.placeholder.com/150'; - const savedBanner = localStorage.getItem('userBanner') || 'https://via.placeholder.com/800x200'; - const savedAddress = localStorage.getItem('userAddress') || '🏠 🌍 đŸ—œđŸŽŠđŸ˜©-đŸŽŠđŸ˜‘đŸ˜©'; - - popup.innerHTML = ` - - `; - - popup.style.display = 'block'; - this.setupEventListeners(popup); - - // Ajouter le gestionnaire d'Ă©vĂ©nements pour la banniĂšre - const bannerImg = popup.querySelector('#popup-banner-img'); - const bannerInput = popup.querySelector('#banner-upload') as HTMLInputElement; - - if (bannerImg && bannerInput) { - bannerImg.addEventListener('click', () => { - bannerInput.click(); - }); - } - - const recoveryExported = localStorage.getItem('recoveryExported') === 'true'; - if (recoveryExported) { - const exportRecoveryBtn = popup.querySelector('.recovery-btn') as HTMLButtonElement; - if (exportRecoveryBtn) { - exportRecoveryBtn.disabled = true; - exportRecoveryBtn.style.opacity = '0.5'; - exportRecoveryBtn.style.cursor = 'not-allowed'; - } - } - } - - private setupEventListeners(popup: HTMLElement): void { - // Gestionnaire pour la fermeture - const closeBtn = popup.querySelector('.close-popup'); - if (closeBtn) { - closeBtn.addEventListener('click', () => { - popup.style.display = 'none'; - }); - } - - // Gestionnaire pour l'upload d'avatar - const avatarUpload = popup.querySelector('#avatar-upload') as HTMLInputElement; - if (avatarUpload) { - avatarUpload.addEventListener('change', (e: Event) => { - const file = (e.target as HTMLInputElement).files?.[0]; - if (file) { - const reader = new FileReader(); - reader.onload = (e: ProgressEvent) => { - const result = e.target?.result as string; - // Mise Ă  jour de l'avatar dans la preview et le popup - const popupAvatar = this.shadowRoot?.getElementById('popup-avatar-img') as HTMLImageElement; - const previewAvatar = this.shadowRoot?.querySelector('.preview-avatar') as HTMLImageElement; - - if (popupAvatar) popupAvatar.src = result; - if (previewAvatar) previewAvatar.src = result; - - localStorage.setItem('userAvatar', result); - }; - reader.readAsDataURL(file); - } - }); - } - - // Gestionnaire pour l'upload de banniĂšre - const bannerUpload = popup.querySelector('#banner-upload') as HTMLInputElement; - if (bannerUpload) { - bannerUpload.addEventListener('change', (e: Event) => { - const file = (e.target as HTMLInputElement).files?.[0]; - if (file) { - const reader = new FileReader(); - reader.onload = (e: ProgressEvent) => { - const result = e.target?.result as string; - // Mise Ă  jour de la banniĂšre dans la preview et le popup - const popupBanner = this.shadowRoot?.getElementById('popup-banner-img') as HTMLImageElement; - const previewBanner = this.shadowRoot?.querySelector('.preview-banner-img') as HTMLImageElement; - - if (popupBanner) popupBanner.src = result; - if (previewBanner) previewBanner.src = result; - - localStorage.setItem('userBanner', result); - }; - reader.readAsDataURL(file); - } - }); - } - - // Gestionnaires pour les champs de texte - const nameInput = popup.querySelector('#userName') as HTMLInputElement; - const lastNameInput = popup.querySelector('#userLastName') as HTMLInputElement; - - if (nameInput) { - nameInput.addEventListener('input', () => { - const newName = nameInput.value; - localStorage.setItem('userName', newName); - // Mise Ă  jour du nom dans la preview - const previewName = this.shadowRoot?.querySelector('.preview-name'); - if (previewName) previewName.textContent = newName; - }); - } - - if (lastNameInput) { - lastNameInput.addEventListener('input', () => { - const newLastName = lastNameInput.value; - localStorage.setItem('userLastName', newLastName); - // Mise Ă  jour du nom de famille dans la preview - const previewLastName = this.shadowRoot?.querySelector('.preview-lastname'); - if (previewLastName) previewLastName.textContent = newLastName; - }); - } - } - - private closeAvatarPopup(): void { - const popup = this.shadowRoot?.querySelector('.avatar-popup'); - if (popup) popup.remove(); - } - - private loadAvatar(): void { - const savedAvatar = localStorage.getItem('userAvatar'); - if (savedAvatar) { - const avatarImg = this.shadowRoot?.querySelector('.avatar') as HTMLImageElement; - if (avatarImg) { - avatarImg.src = savedAvatar; - } - } - } - - private loadUserInfo(): void { - const savedName = localStorage.getItem('userName'); - const savedLastName = localStorage.getItem('userLastName'); - const savedAvatar = localStorage.getItem('userAvatar'); - const savedBanner = localStorage.getItem('userBanner'); - - // Mise Ă  jour du nom dans la preview - if (savedName) { - const previewName = this.shadowRoot?.querySelector('.preview-name'); - if (previewName) { - previewName.textContent = savedName; - } - } - - // Mise Ă  jour du nom de famille dans la preview - if (savedLastName) { - const previewLastName = this.shadowRoot?.querySelector('.preview-lastname'); - if (previewLastName) { - previewLastName.textContent = savedLastName; - } - } - - // Mise Ă  jour de l'avatar dans la preview - if (savedAvatar) { - const previewAvatar = this.shadowRoot?.querySelector('.preview-avatar') as HTMLImageElement; - if (previewAvatar) { - previewAvatar.src = savedAvatar; - } - } - - // Mise Ă  jour de la banniĂšre dans la preview - if (savedBanner) { - const previewBanner = this.shadowRoot?.querySelector('.preview-banner-img') as HTMLImageElement; - if (previewBanner) { - previewBanner.src = savedBanner; - } - } - } - - private updateNavbarName(name: string): void { - const nameElement = this.shadowRoot?.querySelector('.nav-wrapper .user-name'); - if (nameElement) { - nameElement.textContent = name; - } - } - - private updateNavbarLastName(lastName: string): void { - const lastNameElement = this.shadowRoot?.querySelector('.nav-wrapper .user-lastname'); - if (lastNameElement) { - lastNameElement.textContent = lastName; - } - } - - private updateProfilePreview(data: { avatar?: string; banner?: string; name?: string; lastName?: string }): void { - if (data.avatar) { - const previewAvatar = this.shadowRoot?.querySelector('.preview-avatar') as HTMLImageElement; - if (previewAvatar) previewAvatar.src = data.avatar; - } - - if (data.banner) { - const previewBanner = this.shadowRoot?.querySelector('.preview-banner-img') as HTMLImageElement; - if (previewBanner) previewBanner.src = data.banner; - } - - if (data.name) { - const previewName = this.shadowRoot?.querySelector('.preview-name'); - if (previewName) previewName.textContent = data.name; - } - - if (data.lastName) { - const previewLastName = this.shadowRoot?.querySelector('.preview-lastname'); - if (previewLastName) previewLastName.textContent = data.lastName; - } - } - - private initializeEventListeners() { - this.shadowRoot?.addEventListener('DOMContentLoaded', () => { - this.showPairing(); - }); - - const editableFields = this.shadowRoot?.querySelectorAll('.editable'); - if (editableFields) { - editableFields.forEach((field) => { - field.addEventListener('click', () => { - if (!field.classList.contains('editing')) { - const currentValue = field.textContent || ''; - const input = document.createElement('input'); - input.type = 'text'; - input.value = currentValue; - input.className = 'edit-input'; - - field.textContent = ''; - field.appendChild(input); - field.classList.add('editing'); - input.focus(); - } - }); - }); - } - - const avatarInput = this.shadowRoot?.getElementById('avatar-upload') as HTMLInputElement; - if (avatarInput) { - avatarInput.addEventListener('change', this.handleAvatarUpload.bind(this)); - } - } - - private showQRCodeModal(pairingId: string): void { - const modal = document.createElement('div'); - modal.className = 'qr-modal'; - modal.innerHTML = ` -
- × - QR Code Large -
${decodeURIComponent(pairingId)}
-
- `; - - this.shadowRoot?.appendChild(modal); - - const closeBtn = modal.querySelector('.close-qr-modal'); - closeBtn?.addEventListener('click', () => modal.remove()); - modal.addEventListener('click', (e) => { - if (e.target === modal) modal.remove(); - }); - } -} - -customElements.define('account-element', AccountElement); -export { AccountElement }; diff --git a/modules/ihm_client/src/pages/account/document-validation.ts b/modules/ihm_client/src/pages/account/document-validation.ts deleted file mode 100644 index 88b50c26..00000000 --- a/modules/ihm_client/src/pages/account/document-validation.ts +++ /dev/null @@ -1,310 +0,0 @@ -import type { ProcessState } from '../../../pkg/sdk_client'; -import Services from '../../services/service'; - -interface State { - file: File | null; - fileHash: string | null; - certificate: ProcessState | null; - commitmentHashes: string[]; -} - -export interface Vin { - txid: string; // The txid of the previous transaction (being spent) - vout: number; // The output index in the previous tx - prevout: { - scriptpubkey: string; - scriptpubkey_asm: string; - scriptpubkey_type: string; - scriptpubkey_address: string; - value: number; - }; - scriptsig: string; - scriptsig_asm: string; - witness: string[]; - is_coinbase: boolean; - sequence: number; -} - -export interface TransactionInfo { - txid: string; - version: number; - locktime: number; - vin: Vin[]; - vout: any[]; - size: number; - weight: number; - fee: number; - status: { - confirmed: boolean; - block_height: number; - block_hash: string; - block_time: number; - }; -} - -export function getDocumentValidation(container: HTMLElement) { - const state: State = { - file: null, - fileHash: null, - certificate: null, - commitmentHashes: [], - }; - - container.innerHTML = ''; - container.style.cssText = ` - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - min-height: 100vh; - gap: 2rem; - `; - - function createDropButton(label: string, onDrop: (file: File, updateVisuals: (file: File) => void) => void, accept: string = '*/*'): HTMLElement { - const wrapper = document.createElement('div'); - wrapper.style.cssText = ` - width: 200px; - height: 100px; - border: 2px dashed #888; - border-radius: 8px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - cursor: pointer; - font-weight: bold; - background: #f8f8f8; - text-align: center; - padding: 0.5rem; - box-sizing: border-box; - `; - - const title = document.createElement('div'); - title.textContent = label; - - const filename = document.createElement('div'); - filename.style.cssText = ` - font-size: 0.85rem; - margin-top: 0.5rem; - color: #444; - word-break: break-word; - text-align: center; - `; - - wrapper.appendChild(title); - wrapper.appendChild(filename); - - const updateVisuals = (file: File) => { - wrapper.style.borderColor = 'green'; - wrapper.style.background = '#e6ffed'; - filename.textContent = file.name; - }; - - // === Hidden file input === - const fileInput = document.createElement('input'); - fileInput.type = 'file'; - fileInput.accept = accept; - fileInput.style.display = 'none'; - document.body.appendChild(fileInput); - - fileInput.onchange = () => { - const file = fileInput.files?.[0]; - if (file) { - onDrop(file, updateVisuals); - fileInput.value = ''; // reset so same file can be re-selected - } - }; - - // === Handle drag-and-drop === - wrapper.ondragover = (e) => { - e.preventDefault(); - wrapper.style.background = '#e0e0e0'; - }; - - wrapper.ondragleave = () => { - wrapper.style.background = '#f8f8f8'; - }; - - wrapper.ondrop = (e) => { - e.preventDefault(); - wrapper.style.background = '#f8f8f8'; - - const file = e.dataTransfer?.files?.[0]; - if (file) { - onDrop(file, updateVisuals); - } - }; - - // === Handle click to open file manager === - wrapper.onclick = () => { - fileInput.click(); - }; - - return wrapper; - } - - const fileDropButton = createDropButton('Drop file', async (file, updateVisuals) => { - try { - state.file = file; - updateVisuals(file); - console.log('Loaded file:', state.file); - checkReady(); - } catch (err) { - alert('Failed to drop the file.'); - console.error(err); - } - }); - - const certDropButton = createDropButton('Drop certificate', async (file, updateVisuals) => { - try { - const text = await file.text(); - const json = JSON.parse(text); - if (typeof json === 'object' && json !== null && typeof json.pcd_commitment === 'object' && typeof json.state_id === 'string') { - state.certificate = json as ProcessState; - - state.commitmentHashes = Object.values(json.pcd_commitment).map((h: any) => (h as string).toLowerCase()); - - updateVisuals(file); - console.log('Loaded certificate, extracted hashes:', state.commitmentHashes); - checkReady(); - } else { - alert('Invalid certificate structure.'); - } - } catch (err) { - alert('Failed to parse certificate JSON.'); - console.error(err); - } - }); - - const buttonRow = document.createElement('div'); - buttonRow.style.display = 'flex'; - buttonRow.style.gap = '2rem'; - buttonRow.appendChild(fileDropButton); - buttonRow.appendChild(certDropButton); - - container.appendChild(buttonRow); - - async function checkReady() { - if (state.file && state.certificate && state.commitmentHashes.length > 0) { - // We take the commited_in and all pcd_commitment keys to reconstruct all the possible hash - const fileBlob = { - type: state.file.type, - data: new Uint8Array(await state.file.arrayBuffer()), - }; - const service = await Services.getInstance(); - const commitedIn = state.certificate.commited_in; - if (!commitedIn) return; - const [prevTxid, prevTxVout] = commitedIn.split(':'); - const processId = state.certificate.commited_in; - const stateId = state.certificate.state_id; - const process = await service.getProcess(processId); - if (!process) return; - - // Get the transaction that comes right after the commited_in - const nextState = service.getNextStateAfterId(process, stateId); - - if (!nextState) { - alert(`❌ Validation failed: No next state, is the state you're trying to validate commited?`); - return; - } - - const [outspentTxId, _] = nextState.commited_in.split(':'); - console.log(outspentTxId); - - // Check that the commitment transaction exists, and that it commits to the state id - - const txInfo = await fetchTransaction(outspentTxId); - if (!txInfo) { - console.error(`Validation error: Can't fetch new state commitment transaction`); - alert(`❌ Validation failed: invalid or non existent commited_in for state ${stateId}.`); - return; - } - - // We must check that this transaction indeed spend the commited_in we have in the certificate - let found = false; - for (const vin of txInfo.vin) { - if (vin.txid === prevTxid) { - found = true; - break; - } - } - - if (!found) { - console.error(`Validation error: new state doesn't spend previous state commitment transaction`); - alert('❌ Validation failed: Unconsistent commitment transactions history.'); - return; - } - - // set found back to false for next check - found = false; - - // is the state_id commited in the transaction? - for (const vout of txInfo.vout) { - console.log(vout); - if (vout.scriptpubkey_type && vout.scriptpubkey_type === 'op_return') { - found = true; - } else { - continue; - } - - if (vout.scriptpubkey_asm) { - const hash = extractHexFromScriptAsm(vout.scriptpubkey_asm); - if (hash) { - if (hash !== stateId) { - console.error(`Validation error: expected stateId ${stateId}, got ${hash}`); - alert('❌ Validation failed: Transaction does not commit to that state.'); - return; - } - } - } - } - - if (!found) { - alert('❌ Validation failed: Transaction does not contain data.'); - return; - } - - // set found back to false for next check - found = false; - - for (const label of Object.keys(state.certificate.pcd_commitment)) { - // Compute the hash for this label - console.log(`Computing hash with label ${label}`); - const fileHex = service.getHashForFile(commitedIn, label, fileBlob); - console.log(`Found hash ${fileHex}`); - found = state.commitmentHashes.includes(fileHex); - if (found) break; - } - - if (found) { - alert('✅ Validation successful: file hash found in pcd_commitment.'); - } else { - alert('❌ Validation failed: file hash NOT found in pcd_commitment.'); - } - } - } - - async function fetchTransaction(txid: string): Promise { - const url = `https://mempool.4nkweb.com/api/tx/${txid}`; - - const response = await fetch(url); - if (!response.ok) { - throw new Error(`Failed to fetch outspend status: ${response.statusText}`); - } - - const outspend: TransactionInfo = await response.json(); - return outspend; - } - - function extractHexFromScriptAsm(scriptAsm: string): string | null { - const parts = scriptAsm.trim().split(/\s+/); - const last = parts[parts.length - 1]; - - // Basic validation: must be 64-char hex (32 bytes) - if (/^[0-9a-fA-F]{64}$/.test(last)) { - return last.toLowerCase(); - } - - return null; - } -} diff --git a/modules/ihm_client/src/pages/account/key-value-section.ts b/modules/ihm_client/src/pages/account/key-value-section.ts deleted file mode 100644 index 202d6a83..00000000 --- a/modules/ihm_client/src/pages/account/key-value-section.ts +++ /dev/null @@ -1,202 +0,0 @@ -import type { ValidationRule, RoleDefinition } from '../../../pkg/sdk_client'; -import { showValidationRuleModal } from '../../components/validation-rule-modal/validation-rule-modal'; - -export function createKeyValueSection(title: string, id: string, isRoleSection = false) { - const section = document.createElement('div'); - section.id = id; - section.style.cssText = 'margin-bottom: 2rem; background: #fff; padding: 1rem; border-radius: 0.5rem; box-shadow: 0 1px 3px rgba(0,0,0,0.1);'; - - const titleEl = document.createElement('h2'); - titleEl.textContent = title; - titleEl.style.cssText = 'font-size: 1.25rem; font-weight: bold; margin-bottom: 1rem;'; - section.appendChild(titleEl); - - const rowContainer = document.createElement('div'); - section.appendChild(rowContainer); - - const addBtn = document.createElement('button'); - addBtn.textContent = '+ Add Row'; - addBtn.style.cssText = ` - margin-top: 1rem; - padding: 0.5rem 1rem; - border: 1px solid #888; - border-radius: 0.375rem; - background-color: #f9f9f9; - cursor: pointer; - `; - section.appendChild(addBtn); - - const roleRowStates: { - roleNameInput: HTMLInputElement; - membersInput: HTMLInputElement; - storagesInput: HTMLInputElement; - validationRules: ValidationRule[]; - }[] = []; - type fileBlob = { - type: string; - data: Uint8Array; - }; - const nonRoleRowStates: { - keyInput: HTMLInputElement; - valueInput: HTMLInputElement; - fileInput: HTMLInputElement; - fileBlob: fileBlob | null; - }[] = []; - - const inputStyle = 'flex: 1; height: 2.5rem; padding: 0.5rem; border: 1px solid #ccc; border-radius: 0.375rem;'; - - const createRow = () => { - const row = document.createElement('div'); - row.style.cssText = 'display: flex; gap: 1rem; margin-bottom: 0.5rem; align-items: center;'; - - const deleteBtn = document.createElement('button'); - deleteBtn.textContent = 'đŸ—‘ïž'; - deleteBtn.style.cssText = 'background: none; border: none; font-size: 1.2rem; cursor: pointer;'; - deleteBtn.onclick = () => { - row.remove(); - updateDeleteButtons(); - }; - - if (isRoleSection) { - const roleName = document.createElement('input'); - const members = document.createElement('input'); - const storages = document.createElement('input'); - - roleName.placeholder = 'Role name'; - members.placeholder = 'members'; - storages.placeholder = 'storages'; - [roleName, members, storages].forEach((input) => { - input.type = 'text'; - input.style.cssText = inputStyle; - }); - - const ruleButton = document.createElement('button'); - ruleButton.textContent = 'Add Validation Rule'; - ruleButton.style.cssText = 'padding: 0.3rem 0.75rem; border: 1px solid #ccc; border-radius: 0.375rem; background: #f0f0f0; cursor: pointer;'; - - const rules: ValidationRule[] = []; - ruleButton.onclick = () => { - showValidationRuleModal((rule) => { - rules.push(rule); - ruleButton.textContent = `Rules (${rules.length})`; - }); - }; - - row.appendChild(roleName); - row.appendChild(members); - row.appendChild(storages); - row.appendChild(ruleButton); - row.appendChild(deleteBtn); - - roleRowStates.push({ roleNameInput: roleName, membersInput: members, storagesInput: storages, validationRules: rules }); - } else { - const fileInput = document.createElement('input'); - fileInput.type = 'file'; - fileInput.style.display = 'none'; - fileInput.onchange = async () => { - const file = fileInput.files?.[0]; - if (!file) return; - - const buffer = await file.arrayBuffer(); - const uint8 = new Uint8Array(buffer); - - rowState.fileBlob = { - type: file.type, - data: uint8, - }; - - valueInput.value = `📄 ${file.name}`; - valueInput.disabled = true; - attachBtn.textContent = `📎 ${file.name}`; - }; - - const attachBtn = document.createElement('button'); - attachBtn.textContent = '📎 Attach'; - attachBtn.style.cssText = 'padding: 0.3rem 0.75rem; border: 1px solid #ccc; border-radius: 0.375rem; background: #f0f0f0; cursor: pointer;'; - attachBtn.onclick = () => fileInput.click(); - - const keyInput = document.createElement('input'); - const valueInput = document.createElement('input'); - - const rowState = { - keyInput, - valueInput, - fileInput, - fileBlob: null as fileBlob | null, - }; - nonRoleRowStates.push(rowState); - - keyInput.placeholder = 'Key'; - valueInput.placeholder = 'Value'; - [keyInput, valueInput].forEach((input) => { - input.type = 'text'; - input.style.cssText = inputStyle; - }); - - row.appendChild(keyInput); - row.appendChild(valueInput); - - row.appendChild(attachBtn); - row.appendChild(fileInput); - - row.appendChild(deleteBtn); - } - - rowContainer.appendChild(row); - updateDeleteButtons(); - }; - - const updateDeleteButtons = () => { - const rows = Array.from(rowContainer.children); - rows.forEach((row) => { - const btn = row.querySelector('button:last-child') as HTMLButtonElement; - if (rows.length === 1) { - btn.disabled = true; - btn.style.visibility = 'hidden'; - } else { - btn.disabled = false; - btn.style.visibility = 'visible'; - } - }); - }; - - createRow(); - addBtn.addEventListener('click', createRow); - - return { - element: section, - getData: () => { - if (isRoleSection) { - const data: Record = {}; - for (const row of roleRowStates) { - const key = row.roleNameInput.value.trim(); - if (!key) continue; - data[key] = { - members: row.membersInput.value - .split(',') - .map((x) => x.trim()) - .filter(Boolean), - storages: row.storagesInput.value - .split(',') - .map((x) => x.trim()) - .filter(Boolean), - validation_rules: row.validationRules, - }; - } - return data; - } else { - const data: Record = {}; - for (const row of nonRoleRowStates) { - const key = row.keyInput.value.trim(); - if (!key) continue; - if (row.fileBlob) { - data[key] = row.fileBlob; - } else { - data[key] = row.valueInput.value.trim(); - } - } - return data; - } - }, - }; -} diff --git a/modules/ihm_client/src/pages/account/process-creation.ts b/modules/ihm_client/src/pages/account/process-creation.ts deleted file mode 100644 index c72b2a2d..00000000 --- a/modules/ihm_client/src/pages/account/process-creation.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { createKeyValueSection } from './key-value-section'; -import { loadValidationRuleModal } from '../../components/validation-rule-modal/validation-rule-modal'; -import Services from '../../services/service'; -import type { RoleDefinition } from '../../../pkg/sdk_client'; - -export async function getProcessCreation(container: HTMLElement) { - await loadValidationRuleModal(); - - container.style.display = 'block'; - container.innerHTML = `
Process Creation
`; - const privateSec = createKeyValueSection('Private Data', 'private-section'); - const publicSec = createKeyValueSection('Public Data', 'public-section'); - const rolesSec = createKeyValueSection('Roles', 'roles-section', true); - - container.appendChild(privateSec.element); - container.appendChild(publicSec.element); - container.appendChild(rolesSec.element); - - const btn = document.createElement('button'); - btn.textContent = 'Create Process'; - btn.style.cssText = ` - display: block; - margin: 2rem auto 0; - padding: 0.75rem 2rem; - font-size: 1rem; - font-weight: bold; - background-color: #4f46e5; - color: white; - border: none; - border-radius: 0.5rem; - cursor: pointer; - `; - - btn.onclick = async () => { - const privateData = privateSec.getData(); - const publicData = publicSec.getData(); - const roles = rolesSec.getData() as Record; - - console.log('Private:', privateData); - console.log('Public:', publicData); - console.log('Roles:', roles); - - const service = await Services.getInstance(); - - const createProcessResult = await service.createProcess(privateData, publicData, roles); - const processId = createProcessResult.updated_process!.process_id; - const stateId = createProcessResult.updated_process!.current_process.states[0].state_id; - await service.handleApiReturn(createProcessResult); - - // Now we want to validate the update and register the first state of our new process - const updateProcessResult = await service.createPrdUpdate(processId, stateId); - await service.handleApiReturn(createProcessResult); - - const approveChangeResult = await service.approveChange(processId, stateId); - await service.handleApiReturn(approveChangeResult); - if (approveChangeResult) { - const process = await service.getProcess(processId); - let newState = process ? service.getStateFromId(process, stateId) : null; - if (!newState) return; - for (const label of Object.keys(newState.keys)) { - const hash = newState.pcd_commitment[label]; - const encryptedData = await service.getBlobFromDb(hash); - if (!encryptedData) continue; - const filename = `${label}-${hash.slice(0, 8)}.bin`; - - const blob = new Blob([encryptedData], { type: 'application/octet-stream' }); - const link = document.createElement('a'); - link.href = URL.createObjectURL(blob); - link.download = filename; - link.click(); - - setTimeout(() => URL.revokeObjectURL(link.href), 1000); - } - - // await service.generateProcessPdf(processId, newState); - - // Add processId to the state we export - // newState n'a pas de propriĂ©tĂ© process_id, on utilise commited_in - // newState['process_id'] = processId; - const blob = new Blob([JSON.stringify(newState, null, 2)], { type: 'application/json' }); - const url = URL.createObjectURL(blob); - - const a = document.createElement('a'); - a.href = url; - a.download = `process_${processId}_${stateId}.json`; - a.click(); - - URL.revokeObjectURL(url); // Clean up - } - }; - - container.appendChild(btn); -} diff --git a/modules/ihm_client/src/pages/account/process.ts b/modules/ihm_client/src/pages/account/process.ts deleted file mode 100644 index 29af33e9..00000000 --- a/modules/ihm_client/src/pages/account/process.ts +++ /dev/null @@ -1,66 +0,0 @@ -export function createProcessTab(container: HTMLElement, processes: { name: string; publicData: Record }[]): HTMLElement { - container.id = 'process-tab'; - container.style.display = 'block'; - container.style.cssText = 'padding: 1.5rem;'; - - const title = document.createElement('h2'); - title.textContent = 'Processes'; - title.style.cssText = 'font-size: 1.5rem; font-weight: bold; margin-bottom: 1rem;'; - container.appendChild(title); - - processes.forEach((proc) => { - const card = document.createElement('div'); - card.style.cssText = 'margin-bottom: 1rem; padding: 1rem; border: 1px solid #ddd; border-radius: 0.5rem; background: #fff;'; - - const nameEl = document.createElement('h3'); - nameEl.textContent = proc.name; - nameEl.style.cssText = 'font-size: 1.2rem; font-weight: bold; margin-bottom: 0.5rem;'; - card.appendChild(nameEl); - - const dataList = document.createElement('div'); - for (const [key, value] of Object.entries(proc.publicData)) { - const item = document.createElement('div'); - item.style.cssText = 'margin-bottom: 0.5rem;'; - - const label = document.createElement('strong'); - label.textContent = key + ': '; - item.appendChild(label); - - // Let's trim the quotes - const trimmed = value.replace(/^'|'$/g, ''); - let parsed; - try { - parsed = JSON.parse(trimmed); - } catch (_) { - parsed = trimmed; - } - - if (parsed && typeof parsed === 'object') { - const saveBtn = document.createElement('button'); - saveBtn.textContent = 'đŸ’Ÿ Save as JSON'; - saveBtn.style.cssText = 'margin-left: 0.5rem; padding: 0.25rem 0.5rem; border: 1px solid #ccc; border-radius: 0.375rem; background: #f0f0f0; cursor: pointer;'; - saveBtn.onclick = () => { - const blob = new Blob([JSON.stringify(parsed, null, 2)], { type: 'application/json' }); - const url = URL.createObjectURL(blob); - const a = document.createElement('a'); - a.href = url; - a.download = `${proc.name}_${key}.json`; - a.click(); - URL.revokeObjectURL(url); - }; - item.appendChild(saveBtn); - } else { - const span = document.createElement('span'); - span.textContent = String(parsed); - item.appendChild(span); - } - - dataList.appendChild(item); - } - - card.appendChild(dataList); - container.appendChild(card); - }); - - return container; -} diff --git a/modules/ihm_client/src/pages/home/home-component.ts b/modules/ihm_client/src/pages/home/home-component.ts deleted file mode 100644 index b38e1a56..00000000 --- a/modules/ihm_client/src/pages/home/home-component.ts +++ /dev/null @@ -1,49 +0,0 @@ -import loginHtml from './home.html?raw'; -import loginScript from './home.ts?raw'; -import loginCss from '../../4nk.css?raw'; -import { initHomePage } from './home'; - -export class LoginComponent extends HTMLElement { - _callback: any; - constructor() { - super(); - this.attachShadow({ mode: 'open' }); - } - - connectedCallback() { - console.log('CALLBACK LOGIN PAGE'); - this.render(); - setTimeout(() => { - initHomePage(); - }, 500); - } - - set callback(fn) { - if (typeof fn === 'function') { - this._callback = fn; - } else { - console.error('Callback is not a function'); - } - } - - get callback() { - return this._callback; - } - - render() { - if (this.shadowRoot) - this.shadowRoot.innerHTML = ` - ${loginHtml} -