From 6da5996340988c3e9d6289d27953859d9f941478 Mon Sep 17 00:00:00 2001 From: Mathias STRASSER Date: Fri, 30 Jan 2026 09:55:58 +0100 Subject: [PATCH] feat: Setup projet Classeo avec infrastructure Docker et architecture DDD MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Configure l'environnement de développement complet avec Docker Compose, structure DDD 4 Bounded Contexts, et pipeline CI/CD GitHub Actions. Corrections compatibilité CI: - Symfony 8 nécessite monolog-bundle ^4.0 (la v3.x ne supporte que jusqu'à Symfony 7) - ESLint v9 nécessite flat config (eslint.config.js) - le format .eslintrc.cjs est obsolète --- .github/workflows/ci.yml | 186 + .gitignore | 15 + CONTRIBUTING.md | 145 + Makefile | 99 + README.md | 140 + backend/.env | 54 + backend/.gitignore | 72 + backend/.php-cs-fixer.php | 60 + backend/Dockerfile | 107 + backend/bin/console | 19 + backend/composer.json | 109 + backend/config/packages/api_platform.yaml | 31 + backend/config/packages/cache.yaml | 13 + backend/config/packages/doctrine.yaml | 52 + .../config/packages/doctrine_migrations.yaml | 8 + backend/config/packages/framework.yaml | 25 + .../packages/lexik_jwt_authentication.yaml | 17 + backend/config/packages/messenger.yaml | 44 + backend/config/packages/monolog.yaml | 57 + backend/config/packages/security.yaml | 41 + backend/config/packages/twig.yaml | 6 + backend/config/packages/validator.yaml | 8 + backend/config/routes.yaml | 5 + backend/config/routes/api_platform.yaml | 4 + backend/config/services.yaml | 27 + backend/phpstan.neon | 12 + backend/public/index.php | 11 + .../Application/Command/.gitkeep | 0 .../Application/EventHandler/.gitkeep | 0 .../Administration/Application/Port/.gitkeep | 0 .../Administration/Application/Query/.gitkeep | 0 .../src/Administration/Domain/Event/.gitkeep | 0 .../Administration/Domain/Exception/.gitkeep | 0 .../src/Administration/Domain/Model/.gitkeep | 0 .../src/Administration/Domain/Policy/.gitkeep | 0 .../Administration/Domain/Repository/.gitkeep | 0 .../Administration/Domain/Service/.gitkeep | 0 .../Infrastructure/Api/.gitkeep | 0 .../Infrastructure/Messaging/.gitkeep | 0 .../Infrastructure/Outbox/.gitkeep | 0 .../Persistence/Mapping/.gitkeep | 0 .../Application/Command/.gitkeep | 0 .../Application/EventHandler/.gitkeep | 0 .../Communication/Application/Port/.gitkeep | 0 .../Communication/Application/Query/.gitkeep | 0 .../src/Communication/Domain/Event/.gitkeep | 0 .../Communication/Domain/Exception/.gitkeep | 0 .../src/Communication/Domain/Model/.gitkeep | 0 .../src/Communication/Domain/Policy/.gitkeep | 0 .../Communication/Domain/Repository/.gitkeep | 0 .../src/Communication/Domain/Service/.gitkeep | 0 .../Communication/Infrastructure/Api/.gitkeep | 0 .../Infrastructure/Messaging/.gitkeep | 0 .../Infrastructure/Outbox/.gitkeep | 0 .../Persistence/Mapping/.gitkeep | 0 backend/src/Kernel.php | 13 + .../Scolarite/Application/Command/.gitkeep | 0 .../Application/EventHandler/.gitkeep | 0 .../src/Scolarite/Application/Port/.gitkeep | 0 .../src/Scolarite/Application/Query/.gitkeep | 0 backend/src/Scolarite/Domain/Event/.gitkeep | 0 .../src/Scolarite/Domain/Exception/.gitkeep | 0 backend/src/Scolarite/Domain/Model/.gitkeep | 0 backend/src/Scolarite/Domain/Policy/.gitkeep | 0 .../src/Scolarite/Domain/Repository/.gitkeep | 0 backend/src/Scolarite/Domain/Service/.gitkeep | 0 .../src/Scolarite/Infrastructure/Api/.gitkeep | 0 .../Infrastructure/Messaging/.gitkeep | 0 .../Scolarite/Infrastructure/Outbox/.gitkeep | 0 .../Persistence/Mapping/.gitkeep | 0 backend/src/Shared/Contracts/.gitkeep | 0 backend/src/Shared/Domain/AggregateRoot.php | 25 + backend/src/Shared/Domain/Clock.php | 12 + backend/src/Shared/Domain/CorrelationId.php | 35 + backend/src/Shared/Domain/DomainEvent.php | 15 + backend/src/Shared/Domain/EntityId.php | 39 + .../Infrastructure/Clock/SystemClock.php | 16 + .../src/Shared/Infrastructure/Tenant/.gitkeep | 0 .../VieScolaire/Application/Command/.gitkeep | 0 .../Application/EventHandler/.gitkeep | 0 .../src/VieScolaire/Application/Port/.gitkeep | 0 .../VieScolaire/Application/Query/.gitkeep | 0 backend/src/VieScolaire/Domain/Event/.gitkeep | 0 .../src/VieScolaire/Domain/Exception/.gitkeep | 0 backend/src/VieScolaire/Domain/Model/.gitkeep | 0 .../src/VieScolaire/Domain/Policy/.gitkeep | 0 .../VieScolaire/Domain/Repository/.gitkeep | 0 .../src/VieScolaire/Domain/Service/.gitkeep | 0 .../VieScolaire/Infrastructure/Api/.gitkeep | 0 .../Infrastructure/Messaging/.gitkeep | 0 .../Infrastructure/Outbox/.gitkeep | 0 .../Persistence/Mapping/.gitkeep | 0 .../Unit/Shared/Domain/AggregateRootTest.php | 87 + .../Unit/Shared/Domain/CorrelationIdTest.php | 51 + .../tests/Unit/Shared/Domain/EntityIdTest.php | 58 + backend/tests/bootstrap.php | 13 + compose.yaml | 199 + docs/adr/index.md | 40 + frontend/.gitignore | 37 + frontend/.prettierrc | 15 + frontend/Dockerfile | 61 + frontend/e2e/home.test.ts | 21 + frontend/eslint.config.js | 96 + frontend/package.json | 55 + frontend/playwright.config.ts | 41 + frontend/pnpm-lock.yaml | 7144 +++++++++++++++++ frontend/postcss.config.js | 6 + frontend/src/app.css | 62 + frontend/src/app.html | 16 + frontend/src/lib/index.ts | 2 + frontend/src/lib/types/api.ts | 35 + frontend/src/lib/types/index.ts | 2 + frontend/src/lib/types/shared.ts | 27 + frontend/src/routes/+layout.svelte | 23 + frontend/src/routes/+page.svelte | 28 + frontend/static/pwa-192x192.png | Bin 0 -> 28612 bytes frontend/static/pwa-512x512.png | Bin 0 -> 120176 bytes frontend/svelte.config.js | 21 + frontend/tailwind.config.js | 53 + frontend/tests/unit/example.test.ts | 21 + frontend/tests/unit/page.test.ts | 23 + frontend/tsconfig.json | 18 + frontend/vite.config.ts | 74 + scripts/check-bc-isolation.sh | 67 + scripts/check-naming.sh | 114 + 125 files changed, 10032 insertions(+) create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 CONTRIBUTING.md create mode 100644 Makefile create mode 100644 README.md create mode 100644 backend/.env create mode 100644 backend/.gitignore create mode 100644 backend/.php-cs-fixer.php create mode 100644 backend/Dockerfile create mode 100755 backend/bin/console create mode 100644 backend/composer.json create mode 100644 backend/config/packages/api_platform.yaml create mode 100644 backend/config/packages/cache.yaml create mode 100644 backend/config/packages/doctrine.yaml create mode 100644 backend/config/packages/doctrine_migrations.yaml create mode 100644 backend/config/packages/framework.yaml create mode 100644 backend/config/packages/lexik_jwt_authentication.yaml create mode 100644 backend/config/packages/messenger.yaml create mode 100644 backend/config/packages/monolog.yaml create mode 100644 backend/config/packages/security.yaml create mode 100644 backend/config/packages/twig.yaml create mode 100644 backend/config/packages/validator.yaml create mode 100644 backend/config/routes.yaml create mode 100644 backend/config/routes/api_platform.yaml create mode 100644 backend/config/services.yaml create mode 100644 backend/phpstan.neon create mode 100644 backend/public/index.php create mode 100644 backend/src/Administration/Application/Command/.gitkeep create mode 100644 backend/src/Administration/Application/EventHandler/.gitkeep create mode 100644 backend/src/Administration/Application/Port/.gitkeep create mode 100644 backend/src/Administration/Application/Query/.gitkeep create mode 100644 backend/src/Administration/Domain/Event/.gitkeep create mode 100644 backend/src/Administration/Domain/Exception/.gitkeep create mode 100644 backend/src/Administration/Domain/Model/.gitkeep create mode 100644 backend/src/Administration/Domain/Policy/.gitkeep create mode 100644 backend/src/Administration/Domain/Repository/.gitkeep create mode 100644 backend/src/Administration/Domain/Service/.gitkeep create mode 100644 backend/src/Administration/Infrastructure/Api/.gitkeep create mode 100644 backend/src/Administration/Infrastructure/Messaging/.gitkeep create mode 100644 backend/src/Administration/Infrastructure/Outbox/.gitkeep create mode 100644 backend/src/Administration/Infrastructure/Persistence/Mapping/.gitkeep create mode 100644 backend/src/Communication/Application/Command/.gitkeep create mode 100644 backend/src/Communication/Application/EventHandler/.gitkeep create mode 100644 backend/src/Communication/Application/Port/.gitkeep create mode 100644 backend/src/Communication/Application/Query/.gitkeep create mode 100644 backend/src/Communication/Domain/Event/.gitkeep create mode 100644 backend/src/Communication/Domain/Exception/.gitkeep create mode 100644 backend/src/Communication/Domain/Model/.gitkeep create mode 100644 backend/src/Communication/Domain/Policy/.gitkeep create mode 100644 backend/src/Communication/Domain/Repository/.gitkeep create mode 100644 backend/src/Communication/Domain/Service/.gitkeep create mode 100644 backend/src/Communication/Infrastructure/Api/.gitkeep create mode 100644 backend/src/Communication/Infrastructure/Messaging/.gitkeep create mode 100644 backend/src/Communication/Infrastructure/Outbox/.gitkeep create mode 100644 backend/src/Communication/Infrastructure/Persistence/Mapping/.gitkeep create mode 100644 backend/src/Kernel.php create mode 100644 backend/src/Scolarite/Application/Command/.gitkeep create mode 100644 backend/src/Scolarite/Application/EventHandler/.gitkeep create mode 100644 backend/src/Scolarite/Application/Port/.gitkeep create mode 100644 backend/src/Scolarite/Application/Query/.gitkeep create mode 100644 backend/src/Scolarite/Domain/Event/.gitkeep create mode 100644 backend/src/Scolarite/Domain/Exception/.gitkeep create mode 100644 backend/src/Scolarite/Domain/Model/.gitkeep create mode 100644 backend/src/Scolarite/Domain/Policy/.gitkeep create mode 100644 backend/src/Scolarite/Domain/Repository/.gitkeep create mode 100644 backend/src/Scolarite/Domain/Service/.gitkeep create mode 100644 backend/src/Scolarite/Infrastructure/Api/.gitkeep create mode 100644 backend/src/Scolarite/Infrastructure/Messaging/.gitkeep create mode 100644 backend/src/Scolarite/Infrastructure/Outbox/.gitkeep create mode 100644 backend/src/Scolarite/Infrastructure/Persistence/Mapping/.gitkeep create mode 100644 backend/src/Shared/Contracts/.gitkeep create mode 100644 backend/src/Shared/Domain/AggregateRoot.php create mode 100644 backend/src/Shared/Domain/Clock.php create mode 100644 backend/src/Shared/Domain/CorrelationId.php create mode 100644 backend/src/Shared/Domain/DomainEvent.php create mode 100644 backend/src/Shared/Domain/EntityId.php create mode 100644 backend/src/Shared/Infrastructure/Clock/SystemClock.php create mode 100644 backend/src/Shared/Infrastructure/Tenant/.gitkeep create mode 100644 backend/src/VieScolaire/Application/Command/.gitkeep create mode 100644 backend/src/VieScolaire/Application/EventHandler/.gitkeep create mode 100644 backend/src/VieScolaire/Application/Port/.gitkeep create mode 100644 backend/src/VieScolaire/Application/Query/.gitkeep create mode 100644 backend/src/VieScolaire/Domain/Event/.gitkeep create mode 100644 backend/src/VieScolaire/Domain/Exception/.gitkeep create mode 100644 backend/src/VieScolaire/Domain/Model/.gitkeep create mode 100644 backend/src/VieScolaire/Domain/Policy/.gitkeep create mode 100644 backend/src/VieScolaire/Domain/Repository/.gitkeep create mode 100644 backend/src/VieScolaire/Domain/Service/.gitkeep create mode 100644 backend/src/VieScolaire/Infrastructure/Api/.gitkeep create mode 100644 backend/src/VieScolaire/Infrastructure/Messaging/.gitkeep create mode 100644 backend/src/VieScolaire/Infrastructure/Outbox/.gitkeep create mode 100644 backend/src/VieScolaire/Infrastructure/Persistence/Mapping/.gitkeep create mode 100644 backend/tests/Unit/Shared/Domain/AggregateRootTest.php create mode 100644 backend/tests/Unit/Shared/Domain/CorrelationIdTest.php create mode 100644 backend/tests/Unit/Shared/Domain/EntityIdTest.php create mode 100644 backend/tests/bootstrap.php create mode 100644 compose.yaml create mode 100644 docs/adr/index.md create mode 100644 frontend/.gitignore create mode 100644 frontend/.prettierrc create mode 100644 frontend/Dockerfile create mode 100644 frontend/e2e/home.test.ts create mode 100644 frontend/eslint.config.js create mode 100644 frontend/package.json create mode 100644 frontend/playwright.config.ts create mode 100644 frontend/pnpm-lock.yaml create mode 100644 frontend/postcss.config.js create mode 100644 frontend/src/app.css create mode 100644 frontend/src/app.html create mode 100644 frontend/src/lib/index.ts create mode 100644 frontend/src/lib/types/api.ts create mode 100644 frontend/src/lib/types/index.ts create mode 100644 frontend/src/lib/types/shared.ts create mode 100644 frontend/src/routes/+layout.svelte create mode 100644 frontend/src/routes/+page.svelte create mode 100644 frontend/static/pwa-192x192.png create mode 100644 frontend/static/pwa-512x512.png create mode 100644 frontend/svelte.config.js create mode 100644 frontend/tailwind.config.js create mode 100644 frontend/tests/unit/example.test.ts create mode 100644 frontend/tests/unit/page.test.ts create mode 100644 frontend/tsconfig.json create mode 100644 frontend/vite.config.ts create mode 100755 scripts/check-bc-isolation.sh create mode 100755 scripts/check-naming.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..6e669a2 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,186 @@ +name: CI + +on: + push: + branches: [main, develop] + pull_request: + branches: [main, develop] + +jobs: + # ============================================================================= + # Backend Tests - PHP 8.5, PHPStan, PHPUnit + # ============================================================================= + test-backend: + name: Backend Tests + runs-on: ubuntu-latest + defaults: + run: + working-directory: backend + + services: + postgres: + image: postgres:18.1-alpine + env: + POSTGRES_DB: classeo_test + POSTGRES_USER: classeo + POSTGRES_PASSWORD: classeo + ports: + - 5432:5432 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + + redis: + image: redis:7.4-alpine + ports: + - 6379:6379 + options: >- + --health-cmd "redis-cli ping" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + + steps: + - uses: actions/checkout@v4 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.5' + extensions: intl, pdo_pgsql, amqp, redis, zip + coverage: xdebug + + - name: Get Composer cache directory + id: composer-cache + run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT + + - name: Cache Composer dependencies + uses: actions/cache@v4 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer- + + - name: Install dependencies + run: composer install --prefer-dist --no-progress + + - name: Run PHP CS Fixer (check) + run: composer cs-check + + - name: Run PHPStan + run: composer phpstan + + - name: Run PHPUnit + run: composer test + env: + DATABASE_URL: postgresql://classeo:classeo@localhost:5432/classeo_test?serverVersion=18 + REDIS_URL: redis://localhost:6379 + + - name: Run BC Isolation Check + working-directory: . + run: ./scripts/check-bc-isolation.sh + + # ============================================================================= + # Frontend Tests - Vitest, Playwright + # ============================================================================= + test-frontend: + name: Frontend Tests + runs-on: ubuntu-latest + defaults: + run: + working-directory: frontend + + steps: + - uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '22' + + - name: Setup pnpm + uses: pnpm/action-setup@v3 + with: + version: 9 + + - name: Get pnpm store directory + id: pnpm-cache + run: echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT + + - name: Cache pnpm dependencies + uses: actions/cache@v4 + with: + path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: ${{ runner.os }}-pnpm-store- + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Run linter + run: pnpm run lint + + - name: Run TypeScript check + run: pnpm run check + + - name: Run unit tests + run: pnpm run test + + - name: Install Playwright browsers + run: pnpm exec playwright install --with-deps + + - name: Run E2E tests + run: pnpm run test:e2e + + - name: Upload Playwright report + uses: actions/upload-artifact@v4 + if: failure() + with: + name: playwright-report + path: frontend/playwright-report/ + retention-days: 7 + + # ============================================================================= + # Naming Conventions Check + # ============================================================================= + check-naming: + name: Naming Conventions + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Run Naming Check + run: ./scripts/check-naming.sh + + # ============================================================================= + # Build Check + # ============================================================================= + build: + name: Build Check + runs-on: ubuntu-latest + needs: [test-backend, test-frontend] + + steps: + - uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build backend image + uses: docker/build-push-action@v6 + with: + context: ./backend + push: false + cache-from: type=gha + cache-to: type=gha,mode=max + + - name: Build frontend image + uses: docker/build-push-action@v6 + with: + context: ./frontend + push: false + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7148b70 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +# ============================================================================= +# Environment files +# ============================================================================= +.env.local +.env.*.local +*.env.local + +# ============================================================================= +# Logs +# ============================================================================= +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..7faf9e1 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,145 @@ +# Guide de Contribution - Classeo + +## Pre-requis + +- Docker Desktop 24+ +- Git + +## Setup Developpeur + +### 1. Cloner et lancer + +```bash +git clone https://github.com/ClasseoEdu/classeo.git +cd classeo +docker compose up -d +``` + +### 2. Verifier le setup + +```bash +# Tous les services doivent etre "healthy" +docker compose ps + +# Backend repond (port 18000 pour eviter conflit avec services locaux) +curl http://localhost:18000/api + +# Frontend repond (port 5174 pour eviter conflit avec services locaux) +curl http://localhost:5174 +``` + +## Regles de Code + +> **Important** : Lire le fichier `CLAUDE.md` a la racine du projet pour les conventions +> specifiques (style d'imports PHP, format des messages de commit, etc.). + +### PHP Backend + +1. **`declare(strict_types=1);`** sur la premiere ligne de chaque fichier +2. **PHPStan level 9** - Zero erreur toleree +3. **Domain = PHP pur** - Aucune dependance Symfony/Doctrine dans `src/*/Domain/` +4. **Value Objects immutables** - `final readonly class` +5. **No null returns** - Utiliser exceptions ou Null Object + +### TypeScript Frontend + +1. **Strict mode** active +2. **Svelte 5 Runes uniquement** - `$state`, `$derived`, `$effect` +3. **Jamais** `writable()`, `on:click`, `export let` (Svelte 4) +4. **Composants PascalCase** - `MyComponent.svelte` + +### Conventions Nommage + +| Element | Convention | Exemple | +|---------|-----------|---------| +| Classes PHP | PascalCase | `NoteRepository` | +| Methodes | camelCase | `findByStudent()` | +| Events | FR nom + EN verbe passe | `NoteRecorded` | +| Value Objects | `final readonly class` | `NoteId` | +| Composants Svelte | PascalCase.svelte | `GradeCard.svelte` | + +## Workflow Git + +### Branches + +- `main` - Production +- `develop` - Integration +- `feature/XXX` - Nouvelles fonctionnalites +- `fix/XXX` - Corrections de bugs + +### Commits + +Format : `type(scope): description` + +Types : +- `feat` - Nouvelle fonctionnalite +- `fix` - Correction de bug +- `refactor` - Refactoring +- `docs` - Documentation +- `test` - Ajout de tests +- `chore` - Maintenance + +Exemples : +``` +feat(auth): add JWT authentication +fix(notes): correct average calculation +refactor(admin): extract user service +``` + +## Tests + +### Avant de commit + +```bash +# Backend +docker compose exec php composer phpstan +docker compose exec php composer test + +# Frontend +docker compose exec frontend pnpm run lint +docker compose exec frontend pnpm run check +docker compose exec frontend pnpm run test +``` + +### CI/CD + +GitHub Actions execute automatiquement : +- PHPStan level 9 +- PHPUnit tests +- ESLint +- TypeScript check +- Vitest +- Playwright E2E +- BC isolation check +- Naming conventions check + +## Architecture + +### Bounded Contexts + +Ne pas creer de dependances directes entre BC. Utiliser : +- **Contracts** pour les interfaces partagees +- **Domain Events** pour la communication async + +### Domain Layer + +```php +// ✅ CORRECT - Pure PHP +namespace App\Scolarite\Domain\Model; + +final readonly class NoteId extends EntityId {} + +// ❌ INCORRECT - Framework dependency +use Doctrine\ORM\Mapping as ORM; + +#[ORM\Entity] +class Note {} +``` + +### Infrastructure Layer + +Les mappings Doctrine vont dans `Infrastructure/Persistence/Mapping/`. + +## Questions ? + +Ouvrir une issue sur GitHub ou contacter l'equipe sur le canal #classeo-dev. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..371410f --- /dev/null +++ b/Makefile @@ -0,0 +1,99 @@ +.PHONY: help up down build logs ps test lint phpstan cs-fix frontend-lint frontend-test e2e clean + +# Default target +help: + @echo "Classeo - Commandes disponibles" + @echo "" + @echo "Docker:" + @echo " make up - Lancer tous les services" + @echo " make down - Arreter tous les services" + @echo " make build - Reconstruire les images" + @echo " make logs - Voir les logs (Ctrl+C pour quitter)" + @echo " make ps - Statut des services" + @echo " make clean - Supprimer volumes et images" + @echo "" + @echo "Backend:" + @echo " make phpstan - Analyse statique PHPStan" + @echo " make cs-fix - Correction code style PHP" + @echo " make test-php - Tests PHPUnit" + @echo "" + @echo "Frontend:" + @echo " make lint - ESLint frontend" + @echo " make test-js - Tests Vitest" + @echo " make e2e - Tests Playwright" + @echo "" + @echo "All:" + @echo " make test - Tous les tests" + @echo " make check - Tous les linters" + +# ============================================================================= +# Docker +# ============================================================================= + +up: + docker compose up -d + +down: + docker compose down + +build: + docker compose build --no-cache + +logs: + docker compose logs -f + +ps: + docker compose ps + +clean: + docker compose down -v --rmi local + +# ============================================================================= +# Backend +# ============================================================================= + +phpstan: + docker compose exec php composer phpstan + +cs-fix: + docker compose exec php composer cs-fix + +cs-check: + docker compose exec php composer cs-check + +test-php: + docker compose exec php composer test + +# ============================================================================= +# Frontend +# ============================================================================= + +lint: + docker compose exec frontend pnpm run lint + +check-types: + docker compose exec frontend pnpm run check + +test-js: + docker compose exec frontend pnpm run test + +e2e: + docker compose exec frontend pnpm run test:e2e + +# ============================================================================= +# All +# ============================================================================= + +test: test-php test-js + +check: phpstan cs-check lint check-types + +# ============================================================================= +# Scripts +# ============================================================================= + +check-bc: + ./scripts/check-bc-isolation.sh + +check-naming: + ./scripts/check-naming.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..de836d9 --- /dev/null +++ b/README.md @@ -0,0 +1,140 @@ +# Classeo + +Application de gestion scolaire moderne - Backend Symfony 8 + Frontend SvelteKit 2. + +## Quick Start + +### Prerequis + +- Docker Desktop 24+ avec Docker Compose 2.20+ +- Git + +### Lancement + +```bash +# Cloner le repo +git clone https://github.com/ClasseoEdu/classeo.git +cd classeo + +# Lancer tous les services +docker compose up -d + +# Verifier le statut +docker compose ps +``` + +### URLs + +| Service | URL | Description | +|---------|-----|-------------| +| Frontend | http://localhost:5174 | Application SvelteKit | +| Backend API | http://localhost:18000/api | API REST (API Platform) | +| API Docs | http://localhost:18000/api/docs | Documentation OpenAPI | +| RabbitMQ | http://localhost:15672 | Admin (guest/guest) | +| Meilisearch | http://localhost:7700 | Dashboard recherche | +| Mailpit | http://localhost:8025 | Emails de test | +| Mercure | http://localhost:3000/.well-known/mercure | SSE Hub | + +## Stack Technique + +### Backend + +- **PHP 8.5** avec property hooks et asymmetric visibility +- **Symfony 8.0** - Framework DDD-friendly +- **API Platform 4.x** - API REST auto-generee +- **Doctrine ORM 3.x** - Persistence avec mappings separes +- **PHPStan level 9** - Analyse statique stricte + +### Frontend + +- **SvelteKit 2.x** - SSR, routing, PWA +- **Svelte 5** - Runes (`$state`, `$derived`, `$effect`) +- **TypeScript strict** - Typage fort +- **TanStack Query 5** - Server state management +- **Tailwind CSS 3** - Utility-first CSS + +### Infrastructure + +- **PostgreSQL 18.1** - Base de donnees +- **Redis 7.4** - Cache + Sessions +- **RabbitMQ 4.2** - Message queue +- **Mercure** - Real-time SSE +- **Meilisearch 1.12** - Full-text search +- **Mailpit** - Email testing + +## Architecture + +### Bounded Contexts + +``` +backend/src/ +├── Administration/ # Gestion etablissement, utilisateurs +├── Scolarite/ # Notes, classes, emploi du temps +├── VieScolaire/ # Absences, retards, sanctions +├── Communication/ # Messages, notifications +└── Shared/ # Kernel partage (EntityId, DomainEvent, etc.) +``` + +### Structure DDD + +Chaque Bounded Context suit la meme structure : + +``` +{BC}/ +├── Domain/ # Pure PHP - ZERO dependance framework +│ ├── Model/ # Aggregates, Entities, Value Objects +│ ├── Event/ # Domain Events +│ ├── Repository/ # Interfaces repository +│ └── Service/ # Domain Services +├── Application/ # Use cases +│ ├── Command/ # Write operations +│ ├── Query/ # Read operations +│ └── EventHandler/ # Domain event handlers +└── Infrastructure/ # Implementations framework + ├── Persistence/ # Doctrine repositories + ├── Api/ # API Platform resources + └── Messaging/ # RabbitMQ handlers +``` + +## Developpement + +### Commandes utiles + +```bash +# Backend +docker compose exec php composer phpstan # Analyse statique +docker compose exec php composer test # Tests PHPUnit +docker compose exec php composer cs-fix # Correction code style + +# Frontend +docker compose exec frontend pnpm run lint # ESLint +docker compose exec frontend pnpm run check # TypeScript check +docker compose exec frontend pnpm run test # Vitest +docker compose exec frontend pnpm run test:e2e # Playwright +``` + +### Makefile (raccourcis) + +```bash +make up # docker compose up -d +make down # docker compose down +make logs # docker compose logs -f +make test # Run all tests +make lint # Run all linters +``` + +## Tests + +- **PHPUnit** - Tests unitaires et integration backend +- **Vitest** - Tests unitaires frontend +- **Playwright** - Tests E2E + +## Documentation + +- [Architecture Decision Records](./docs/adr/) +- [Contributing Guide](./CONTRIBUTING.md) +- [API Documentation](http://localhost:8000/api/docs) + +## Licence + +Proprietary - ClasseoEdu diff --git a/backend/.env b/backend/.env new file mode 100644 index 0000000..ba0ed41 --- /dev/null +++ b/backend/.env @@ -0,0 +1,54 @@ +# In all environments, the following files are loaded if they exist, +# the latter taking precedence over the former: +# +# * .env contains default values for the environment variables needed by the app +# * .env.local uncommitted file with local overrides +# * .env.$APP_ENV committed environment-specific defaults +# * .env.$APP_ENV.local uncommitted environment-specific overrides +# +# Real environment variables win over .env files. +# +# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. +# https://symfony.com/doc/current/configuration/secrets.html +# +# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). + +###> symfony/framework-bundle ### +APP_ENV=dev +APP_SECRET=change_me_in_production_12345678 +TRUSTED_PROXIES=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 +TRUSTED_HOSTS='^(localhost|php|127\.0\.0\.1)$' +###< symfony/framework-bundle ### + +###> doctrine/doctrine-bundle ### +DATABASE_URL="postgresql://classeo:classeo@db:5432/classeo_master?serverVersion=18&charset=utf8" +###< doctrine/doctrine-bundle ### + +###> symfony/messenger ### +MESSENGER_TRANSPORT_DSN=amqp://guest:guest@rabbitmq:5672/%2f/messages +###< symfony/messenger ### + +###> lexik/jwt-authentication-bundle ### +JWT_SECRET_KEY=%kernel.project_dir%/config/jwt/private.pem +JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem +JWT_PASSPHRASE=classeo_jwt_passphrase_change_me +###< lexik/jwt-authentication-bundle ### + +###> redis ### +REDIS_URL=redis://redis:6379 +###< redis ### + +###> mercure ### +MERCURE_URL=http://mercure/.well-known/mercure +MERCURE_PUBLIC_URL=http://localhost:3000/.well-known/mercure +MERCURE_JWT_SECRET=mercure_publisher_secret_change_me_in_production +###< mercure ### + +###> meilisearch ### +MEILISEARCH_URL=http://meilisearch:7700 +MEILISEARCH_API_KEY=masterKey +###< meilisearch ### + +###> symfony/mailer ### +MAILER_DSN=smtp://mailpit:1025 +###< symfony/mailer ### diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..5259a9c --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,72 @@ +# ============================================================================= +# Symfony +# ============================================================================= +/var/ +/vendor/ +/.env.local +/.env.local.php +/.env.*.local +/config/secrets/prod/prod.decrypt.private.php +/public/bundles/ + +# Fichiers auto-générés par Symfony +/config/bundles.php +/config/preload.php +/config/reference.php + +# ============================================================================= +# Doctrine Fixtures (auto-généré) +# ============================================================================= +/src/DataFixtures/ + +# ============================================================================= +# PHPUnit +# ============================================================================= +/phpunit.xml +.phpunit.cache/ +.phpunit.result.cache + +# ============================================================================= +# PHPStan +# ============================================================================= +phpstan.neon.dist + +# ============================================================================= +# PHP CS Fixer +# ============================================================================= +.php-cs-fixer.cache + +# ============================================================================= +# JWT Keys +# ============================================================================= +/config/jwt/*.pem + +# ============================================================================= +# Composer +# ============================================================================= +composer.phar +composer.lock + +###> symfony/framework-bundle ### +/.env.local +/.env.local.php +/.env.*.local +/config/secrets/prod/prod.decrypt.private.php +/public/bundles/ +/var/ +/vendor/ +###< symfony/framework-bundle ### + +###> friendsofphp/php-cs-fixer ### +/.php-cs-fixer.php +/.php-cs-fixer.cache +###< friendsofphp/php-cs-fixer ### + +###> lexik/jwt-authentication-bundle ### +/config/jwt/*.pem +###< lexik/jwt-authentication-bundle ### + +###> phpunit/phpunit ### +/phpunit.xml +/.phpunit.cache/ +###< phpunit/phpunit ### diff --git a/backend/.php-cs-fixer.php b/backend/.php-cs-fixer.php new file mode 100644 index 0000000..7bed316 --- /dev/null +++ b/backend/.php-cs-fixer.php @@ -0,0 +1,60 @@ +in(__DIR__) + ->exclude('var') + ->exclude('vendor') + // Fichiers auto-générés par Symfony/Doctrine + ->notPath('config/bundles.php') + ->notPath('config/preload.php') + ->notPath('config/reference.php') + ->notPath('src/DataFixtures/AppFixtures.php') + // Exclusions spécifiques + ->notPath('src/Shared/Domain/AggregateRoot.php') + ->notPath('src/Shared/Domain/EntityId.php') +; + +return (new PhpCsFixer\Config()) + ->setRules([ + '@Symfony' => true, + '@Symfony:risky' => true, + 'declare_strict_types' => true, + 'strict_param' => true, + 'array_syntax' => ['syntax' => 'short'], + 'ordered_imports' => ['sort_algorithm' => 'alpha'], + 'no_unused_imports' => true, + 'not_operator_with_successor_space' => true, + 'trailing_comma_in_multiline' => true, + 'phpdoc_order' => true, + 'phpdoc_separation' => true, + 'phpdoc_no_empty_return' => true, + 'native_function_invocation' => [ + 'include' => ['@compiler_optimized'], + 'scope' => 'namespaced', + 'strict' => true, + ], + 'native_constant_invocation' => true, + 'global_namespace_import' => [ + 'import_classes' => true, + 'import_constants' => true, + 'import_functions' => true, + ], + 'final_class' => true, + 'class_definition' => [ + 'single_line' => true, + ], + 'concat_space' => [ + 'spacing' => 'one', + ], + 'single_line_throw' => false, + // NO Yoda conditions + 'yoda_style' => false, + 'blank_line_before_statement' => [ + 'statements' => ['return', 'throw', 'try'], + ], + ]) + ->setRiskyAllowed(true) + ->setFinder($finder) +; diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..2d7413e --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,107 @@ +# syntax=docker/dockerfile:1 + +# ============================================================================= +# PHP 8.5 + FrankenPHP - Backend Classeo +# ============================================================================= + +FROM dunglas/frankenphp:1-php8.5-alpine AS base + +# Install system dependencies +RUN apk add --no-cache \ + acl \ + fcgi \ + file \ + gettext \ + git \ + icu-dev \ + libzip-dev \ + postgresql-dev \ + rabbitmq-c-dev \ + linux-headers \ + $PHPIZE_DEPS + +# Install PHP extensions (opcache is pre-installed in FrankenPHP) +RUN docker-php-ext-install intl pdo_pgsql zip sockets + +# Install AMQP extension for RabbitMQ +RUN pecl install amqp && docker-php-ext-enable amqp + +# Install Redis extension +RUN pecl install redis && docker-php-ext-enable redis + +# Install Composer +COPY --from=composer:2 /usr/bin/composer /usr/bin/composer + +# Set working directory +WORKDIR /app + +# Configure PHP for production +RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" + +# Custom PHP configuration +RUN echo "opcache.enable=1" >> "$PHP_INI_DIR/conf.d/opcache.ini" \ + && echo "opcache.memory_consumption=256" >> "$PHP_INI_DIR/conf.d/opcache.ini" \ + && echo "opcache.interned_strings_buffer=16" >> "$PHP_INI_DIR/conf.d/opcache.ini" \ + && echo "opcache.max_accelerated_files=20000" >> "$PHP_INI_DIR/conf.d/opcache.ini" \ + && echo "opcache.validate_timestamps=0" >> "$PHP_INI_DIR/conf.d/opcache.ini" \ + && echo "realpath_cache_size=4096K" >> "$PHP_INI_DIR/conf.d/opcache.ini" \ + && echo "realpath_cache_ttl=600" >> "$PHP_INI_DIR/conf.d/opcache.ini" + +# ============================================================================= +# Development stage +# ============================================================================= +FROM base AS dev + +# Enable opcache revalidation for dev (zz- prefix loads last alphabetically) +RUN echo "opcache.validate_timestamps=1" >> "$PHP_INI_DIR/conf.d/zz-opcache-dev.ini" + +# Enable Xdebug for development +RUN pecl install xdebug && docker-php-ext-enable xdebug +RUN echo "xdebug.mode=develop,debug,coverage" >> "$PHP_INI_DIR/conf.d/xdebug.ini" \ + && echo "xdebug.client_host=host.docker.internal" >> "$PHP_INI_DIR/conf.d/xdebug.ini" \ + && echo "xdebug.start_with_request=trigger" >> "$PHP_INI_DIR/conf.d/xdebug.ini" + +# Caddy config for FrankenPHP +ENV SERVER_NAME=:8000 +ENV FRANKENPHP_CONFIG="worker ./public/index.php" + +# Create entrypoint script for dev (installs deps if needed) +RUN echo '#!/bin/sh' > /usr/local/bin/docker-entrypoint.sh && \ + echo 'set -e' >> /usr/local/bin/docker-entrypoint.sh && \ + echo 'if [ ! -f /app/vendor/autoload.php ]; then' >> /usr/local/bin/docker-entrypoint.sh && \ + echo ' echo "Installing Composer dependencies..."' >> /usr/local/bin/docker-entrypoint.sh && \ + echo ' composer install --prefer-dist --no-progress --no-interaction' >> /usr/local/bin/docker-entrypoint.sh && \ + echo 'fi' >> /usr/local/bin/docker-entrypoint.sh && \ + echo 'mkdir -p var/cache var/log && chmod -R 777 var' >> /usr/local/bin/docker-entrypoint.sh && \ + echo 'exec "$@"' >> /usr/local/bin/docker-entrypoint.sh && \ + chmod +x /usr/local/bin/docker-entrypoint.sh + +EXPOSE 8000 + +ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] +CMD ["frankenphp", "run", "--config", "/etc/caddy/Caddyfile"] + +# ============================================================================= +# Production stage +# ============================================================================= +FROM base AS prod + +ENV APP_ENV=prod +ENV SERVER_NAME=:8000 +ENV FRANKENPHP_CONFIG="worker ./public/index.php" + +# Copy application files +COPY . /app + +# Install dependencies (prod only, optimized) +RUN composer install --no-dev --prefer-dist --no-progress --no-interaction --optimize-autoloader + +# Warmup cache +RUN php bin/console cache:warmup + +# Ensure var directory exists with proper permissions +RUN mkdir -p var/cache var/log && chmod -R 755 var + +EXPOSE 8000 + +CMD ["frankenphp", "run", "--config", "/etc/caddy/Caddyfile"] diff --git a/backend/bin/console b/backend/bin/console new file mode 100755 index 0000000..adeeef6 --- /dev/null +++ b/backend/bin/console @@ -0,0 +1,19 @@ +#!/usr/bin/env php +=8.5", + "ext-ctype": "*", + "ext-iconv": "*", + "ext-intl": "*", + "api-platform/core": "^4.0", + "doctrine/dbal": "^4.0", + "doctrine/doctrine-bundle": "^2.13 || ^3.0@dev", + "doctrine/doctrine-migrations-bundle": "^3.4", + "doctrine/orm": "^3.3", + "lexik/jwt-authentication-bundle": "^3.2", + "ramsey/uuid": "^4.7", + "symfony/amqp-messenger": "^8.0", + "symfony/asset": "^8.0", + "symfony/console": "^8.0", + "symfony/doctrine-messenger": "^8.0", + "symfony/dotenv": "^8.0", + "symfony/flex": "^2", + "symfony/framework-bundle": "^8.0", + "symfony/messenger": "^8.0", + "symfony/monolog-bundle": "^4.0", + "symfony/property-access": "^8.0", + "symfony/property-info": "^8.0", + "symfony/runtime": "^8.0", + "symfony/security-bundle": "^8.0", + "symfony/serializer": "^8.0", + "symfony/twig-bundle": "^8.0", + "symfony/uid": "^8.0", + "symfony/validator": "^8.0", + "symfony/yaml": "^8.0" + }, + "require-dev": { + "doctrine/doctrine-fixtures-bundle": "^4.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-doctrine": "^2.0", + "phpstan/phpstan-symfony": "^2.0", + "phpunit/phpunit": "^11.0", + "symfony/browser-kit": "^8.0", + "symfony/css-selector": "^8.0", + "symfony/debug-bundle": "^8.0", + "symfony/maker-bundle": "^1.62", + "symfony/phpunit-bridge": "^8.0", + "symfony/stopwatch": "^8.0", + "symfony/web-profiler-bundle": "^8.0", + "friendsofphp/php-cs-fixer": "^3.65" + }, + "config": { + "allow-plugins": { + "php-http/discovery": true, + "symfony/flex": true, + "symfony/runtime": true + }, + "sort-packages": true + }, + "autoload": { + "psr-4": { + "App\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "App\\Tests\\": "tests/" + } + }, + "replace": { + "symfony/polyfill-ctype": "*", + "symfony/polyfill-iconv": "*", + "symfony/polyfill-php72": "*", + "symfony/polyfill-php73": "*", + "symfony/polyfill-php74": "*", + "symfony/polyfill-php80": "*", + "symfony/polyfill-php81": "*", + "symfony/polyfill-php82": "*", + "symfony/polyfill-php83": "*", + "symfony/polyfill-php84": "*" + }, + "scripts": { + "auto-scripts": { + "cache:clear": "symfony-cmd", + "assets:install %PUBLIC_DIR%": "symfony-cmd" + }, + "post-install-cmd": [ + "@auto-scripts" + ], + "post-update-cmd": [ + "@auto-scripts" + ], + "test": "phpunit", + "phpstan": "phpstan analyse --memory-limit=512M", + "cs-fix": "php-cs-fixer fix", + "cs-check": "php-cs-fixer fix --dry-run --diff" + }, + "conflict": { + "symfony/symfony": "*" + }, + "extra": { + "symfony": { + "allow-contrib": false, + "require": "8.0.*" + } + } +} diff --git a/backend/config/packages/api_platform.yaml b/backend/config/packages/api_platform.yaml new file mode 100644 index 0000000..f070780 --- /dev/null +++ b/backend/config/packages/api_platform.yaml @@ -0,0 +1,31 @@ +api_platform: + title: 'Classeo API' + description: 'API for Classeo - School Management System' + version: '1.0.0' + + # Enable OpenAPI documentation + formats: + jsonld: ['application/ld+json'] + json: ['application/json'] + html: ['text/html'] + + docs_formats: + jsonld: ['application/ld+json'] + jsonopenapi: ['application/vnd.openapi+json'] + html: ['text/html'] + + # Defaults + defaults: + stateless: true + cache_headers: + vary: ['Content-Type', 'Authorization', 'Origin'] + extra_properties: + standard_put: true + rfc_7807_compliant_errors: true + pagination_items_per_page: 30 + + # Pagination + collection: + pagination: + enabled: true + items_per_page_parameter_name: 'itemsPerPage' diff --git a/backend/config/packages/cache.yaml b/backend/config/packages/cache.yaml new file mode 100644 index 0000000..46b81b1 --- /dev/null +++ b/backend/config/packages/cache.yaml @@ -0,0 +1,13 @@ +framework: + cache: + # Unique name of your app: used to compute stable namespaces for cache keys. + prefix_seed: classeo/backend + +when@prod: + framework: + cache: + pools: + doctrine.system_cache_pool: + adapter: cache.adapter.system + doctrine.result_cache_pool: + adapter: cache.adapter.system diff --git a/backend/config/packages/doctrine.yaml b/backend/config/packages/doctrine.yaml new file mode 100644 index 0000000..66aee1b --- /dev/null +++ b/backend/config/packages/doctrine.yaml @@ -0,0 +1,52 @@ +doctrine: + dbal: + url: '%env(resolve:DATABASE_URL)%' + profiling_collect_backtrace: '%kernel.debug%' + + orm: + validate_xml_mapping: true + naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware + auto_mapping: true + mappings: + # Infrastructure mappings - keep entities separate from Domain + Administration: + type: attribute + is_bundle: false + dir: '%kernel.project_dir%/src/Administration/Infrastructure/Persistence/Mapping' + prefix: 'App\Administration\Infrastructure\Persistence\Mapping' + alias: Administration + Scolarite: + type: attribute + is_bundle: false + dir: '%kernel.project_dir%/src/Scolarite/Infrastructure/Persistence/Mapping' + prefix: 'App\Scolarite\Infrastructure\Persistence\Mapping' + alias: Scolarite + VieScolaire: + type: attribute + is_bundle: false + dir: '%kernel.project_dir%/src/VieScolaire/Infrastructure/Persistence/Mapping' + prefix: 'App\VieScolaire\Infrastructure\Persistence\Mapping' + alias: VieScolaire + Communication: + type: attribute + is_bundle: false + dir: '%kernel.project_dir%/src/Communication/Infrastructure/Persistence/Mapping' + prefix: 'App\Communication\Infrastructure\Persistence\Mapping' + alias: Communication + controller_resolver: + auto_mapping: false + +when@test: + doctrine: + dbal: + dbname_suffix: '_test%env(default::TEST_TOKEN)%' + +when@prod: + doctrine: + orm: + query_cache_driver: + type: pool + pool: doctrine.system_cache_pool + result_cache_driver: + type: pool + pool: doctrine.result_cache_pool diff --git a/backend/config/packages/doctrine_migrations.yaml b/backend/config/packages/doctrine_migrations.yaml new file mode 100644 index 0000000..f595128 --- /dev/null +++ b/backend/config/packages/doctrine_migrations.yaml @@ -0,0 +1,8 @@ +doctrine_migrations: + migrations_paths: + 'DoctrineMigrations': '%kernel.project_dir%/migrations' + enable_profiler: false + organize_migrations: none + all_or_nothing: true + transactional: true + check_database_platform: true diff --git a/backend/config/packages/framework.yaml b/backend/config/packages/framework.yaml new file mode 100644 index 0000000..d031491 --- /dev/null +++ b/backend/config/packages/framework.yaml @@ -0,0 +1,25 @@ +# see https://symfony.com/doc/current/reference/configuration/framework.html +framework: + secret: '%env(APP_SECRET)%' + csrf_protection: true + handle_all_throwables: true + http_method_override: false + trusted_proxies: '%env(TRUSTED_PROXIES)%' + trusted_hosts: '%env(TRUSTED_HOSTS)%' + + # Enables session support + session: + handler_id: null + cookie_secure: auto + cookie_samesite: lax + storage_factory_id: session.storage.factory.native + + # Enable php_attributes routing + php_errors: + log: true + +when@test: + framework: + test: true + session: + storage_factory_id: session.storage.factory.mock_file diff --git a/backend/config/packages/lexik_jwt_authentication.yaml b/backend/config/packages/lexik_jwt_authentication.yaml new file mode 100644 index 0000000..144af46 --- /dev/null +++ b/backend/config/packages/lexik_jwt_authentication.yaml @@ -0,0 +1,17 @@ +lexik_jwt_authentication: + secret_key: '%env(resolve:JWT_SECRET_KEY)%' + public_key: '%env(resolve:JWT_PUBLIC_KEY)%' + pass_phrase: '%env(JWT_PASSPHRASE)%' + token_ttl: 3600 + user_id_claim: username + clock_skew: 0 + + # Automatically extracts the token from cookies + token_extractors: + authorization_header: + enabled: true + prefix: Bearer + name: Authorization + cookie: + enabled: true + name: BEARER diff --git a/backend/config/packages/messenger.yaml b/backend/config/packages/messenger.yaml new file mode 100644 index 0000000..64b3192 --- /dev/null +++ b/backend/config/packages/messenger.yaml @@ -0,0 +1,44 @@ +framework: + messenger: + # Uncomment this (and the failed transport below) to send failed messages to this transport for later handling. + failure_transport: failed + + # Three buses: Command, Query, Event (CQRS + Event-driven) + default_bus: command.bus + + buses: + command.bus: + default_middleware: true + middleware: + - doctrine_transaction + + query.bus: + default_middleware: true + + event.bus: + default_middleware: + allow_no_handlers: true + + transports: + # https://symfony.com/doc/current/messenger.html#transport-configuration + async: + dsn: '%env(MESSENGER_TRANSPORT_DSN)%' + options: + exchange: + name: classeo_messages + type: topic + queues: + messages: + binding_keys: ['#'] + retry_strategy: + max_retries: 3 + delay: 1000 + multiplier: 2 + max_delay: 60000 + + failed: + dsn: 'doctrine://default?queue_name=failed' + + routing: + # Route your messages to the transports + # 'App\Message\YourMessage': async diff --git a/backend/config/packages/monolog.yaml b/backend/config/packages/monolog.yaml new file mode 100644 index 0000000..a3c5092 --- /dev/null +++ b/backend/config/packages/monolog.yaml @@ -0,0 +1,57 @@ +monolog: + channels: + - deprecation + - security + - audit + +when@dev: + monolog: + handlers: + main: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: debug + channels: ["!event"] + formatter: monolog.formatter.json + console: + type: console + process_psr_3_messages: false + channels: ["!event", "!doctrine", "!console"] + +when@test: + monolog: + handlers: + main: + type: fingers_crossed + action_level: error + handler: nested + excluded_http_codes: [404, 405] + channels: ["!event"] + nested: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: debug + +when@prod: + monolog: + handlers: + main: + type: fingers_crossed + action_level: error + handler: nested + excluded_http_codes: [404, 405] + buffer_size: 50 + nested: + type: stream + path: php://stderr + level: debug + formatter: monolog.formatter.json + console: + type: console + process_psr_3_messages: false + channels: ["!event", "!doctrine"] + deprecation: + type: stream + channels: [deprecation] + path: php://stderr + formatter: monolog.formatter.json diff --git a/backend/config/packages/security.yaml b/backend/config/packages/security.yaml new file mode 100644 index 0000000..bd7a4a7 --- /dev/null +++ b/backend/config/packages/security.yaml @@ -0,0 +1,41 @@ +security: + # https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords + password_hashers: + Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto' + + # https://symfony.com/doc/current/security.html#loading-the-user-the-user-provider + providers: + # used to reload user from session & other features (e.g. switch_user) + # Configure user provider when User entity is created + users_in_memory: + memory: + users: + admin: { password: 'admin', roles: ['ROLE_ADMIN'] } + + firewalls: + dev: + pattern: ^/(_(profiler|wdt)|css|images|js)/ + security: false + api: + pattern: ^/api + stateless: true + jwt: ~ + main: + lazy: true + provider: users_in_memory + + # Easy way to control access for large sections of your site + # Note: Only the *first* access control that matches will be used + access_control: + - { path: ^/api/docs, roles: PUBLIC_ACCESS } + - { path: ^/api/login, roles: PUBLIC_ACCESS } + - { path: ^/api, roles: IS_AUTHENTICATED_FULLY } + +when@test: + security: + password_hashers: + Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: + algorithm: auto + cost: 4 # Lowest possible value for bcrypt + time_cost: 3 # Lowest possible value for argon + memory_cost: 10 # Lowest possible value for argon diff --git a/backend/config/packages/twig.yaml b/backend/config/packages/twig.yaml new file mode 100644 index 0000000..3f795d9 --- /dev/null +++ b/backend/config/packages/twig.yaml @@ -0,0 +1,6 @@ +twig: + file_name_pattern: '*.twig' + +when@test: + twig: + strict_variables: true diff --git a/backend/config/packages/validator.yaml b/backend/config/packages/validator.yaml new file mode 100644 index 0000000..d5f7dca --- /dev/null +++ b/backend/config/packages/validator.yaml @@ -0,0 +1,8 @@ +framework: + validation: + email_validation_mode: html5 + +when@test: + framework: + validation: + not_compromised_password: false diff --git a/backend/config/routes.yaml b/backend/config/routes.yaml new file mode 100644 index 0000000..ecbf2d0 --- /dev/null +++ b/backend/config/routes.yaml @@ -0,0 +1,5 @@ +controllers: + resource: + path: ../src/ + namespace: App\ + type: attribute diff --git a/backend/config/routes/api_platform.yaml b/backend/config/routes/api_platform.yaml new file mode 100644 index 0000000..38f11cb --- /dev/null +++ b/backend/config/routes/api_platform.yaml @@ -0,0 +1,4 @@ +api_platform: + resource: . + type: api_platform + prefix: /api diff --git a/backend/config/services.yaml b/backend/config/services.yaml new file mode 100644 index 0000000..733a8da --- /dev/null +++ b/backend/config/services.yaml @@ -0,0 +1,27 @@ +# This file is the entry point to configure your own services. +# Files in the packages/ subdirectory configure your dependencies. + +# Put parameters here that don't need to change on each machine where the app is deployed +# https://symfony.com/doc/current/best_practices.html#use-parameters-for-application-configuration +parameters: + +services: + # default configuration for services in this file + _defaults: + autowire: true # Automatically injects dependencies in your services. + autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. + + # makes classes in src/ available to be used as services + # this creates a service per class whose id is the fully-qualified class name + App\: + resource: '../src/' + exclude: + - '../src/DependencyInjection/' + - '../src/Entity/' + - '../src/Kernel.php' + # Exclude Domain layers - they should be pure PHP with no framework deps + - '../src/*/Domain/' + + # Domain services need to be registered explicitly to avoid framework coupling + # Example: App\Administration\Application\Command\: + # resource: '../src/Administration/Application/Command/' diff --git a/backend/phpstan.neon b/backend/phpstan.neon new file mode 100644 index 0000000..3c6469d --- /dev/null +++ b/backend/phpstan.neon @@ -0,0 +1,12 @@ +parameters: + level: 9 + paths: + - src + excludePaths: + - src/Kernel.php + treatPhpDocTypesAsCertain: false + reportUnmatchedIgnoredErrors: false + +includes: + - vendor/phpstan/phpstan-doctrine/extension.neon + - vendor/phpstan/phpstan-symfony/extension.neon diff --git a/backend/public/index.php b/backend/public/index.php new file mode 100644 index 0000000..8e1a40d --- /dev/null +++ b/backend/public/index.php @@ -0,0 +1,11 @@ +domainEvents[] = $event; + } + + /** @return DomainEvent[] */ + public function pullDomainEvents(): array + { + $events = $this->domainEvents; + $this->domainEvents = []; + + return $events; + } +} diff --git a/backend/src/Shared/Domain/Clock.php b/backend/src/Shared/Domain/Clock.php new file mode 100644 index 0000000..76bf917 --- /dev/null +++ b/backend/src/Shared/Domain/Clock.php @@ -0,0 +1,12 @@ +toString()); + } + + public static function fromString(string $value): self + { + return new self($value); + } + + public function value(): string + { + return $this->value; + } + + public function __toString(): string + { + return $this->value; + } +} diff --git a/backend/src/Shared/Domain/DomainEvent.php b/backend/src/Shared/Domain/DomainEvent.php new file mode 100644 index 0000000..2f355e7 --- /dev/null +++ b/backend/src/Shared/Domain/DomainEvent.php @@ -0,0 +1,15 @@ +value->equals($other->value); + } + + public function __toString(): string + { + return $this->value->toString(); + } +} diff --git a/backend/src/Shared/Infrastructure/Clock/SystemClock.php b/backend/src/Shared/Infrastructure/Clock/SystemClock.php new file mode 100644 index 0000000..9bdfb82 --- /dev/null +++ b/backend/src/Shared/Infrastructure/Clock/SystemClock.php @@ -0,0 +1,16 @@ +doSomething($event1); + $aggregate->doSomething($event2); + + $events = $aggregate->pullDomainEvents(); + + $this->assertCount(2, $events); + $this->assertSame($event1, $events[0]); + $this->assertSame($event2, $events[1]); + } + + public function testPullDomainEventsClearsEventsAfterPulling(): void + { + $aggregate = new TestAggregate(); + $event = new TestDomainEvent('test'); + + $aggregate->doSomething($event); + $aggregate->pullDomainEvents(); + + $secondPull = $aggregate->pullDomainEvents(); + + $this->assertCount(0, $secondPull); + } + + public function testRecordEventAddsEventToInternalList(): void + { + $aggregate = new TestAggregate(); + $event = new TestDomainEvent('test'); + + $aggregate->doSomething($event); + $events = $aggregate->pullDomainEvents(); + + $this->assertCount(1, $events); + $this->assertInstanceOf(TestDomainEvent::class, $events[0]); + } +} + +// Test implementations +final class TestAggregate extends AggregateRoot +{ + public function doSomething(DomainEvent $event): void + { + $this->recordEvent($event); + } +} + +final readonly class TestDomainEvent implements DomainEvent +{ + private DateTimeImmutable $occurredOn; + + public function __construct( + public string $data, + private ?UuidInterface $testAggregateId = null, + ) { + $this->occurredOn = new DateTimeImmutable(); + } + + public function occurredOn(): DateTimeImmutable + { + return $this->occurredOn; + } + + public function aggregateId(): UuidInterface + { + return $this->testAggregateId ?? Uuid::uuid4(); + } +} diff --git a/backend/tests/Unit/Shared/Domain/CorrelationIdTest.php b/backend/tests/Unit/Shared/Domain/CorrelationIdTest.php new file mode 100644 index 0000000..eadc1c3 --- /dev/null +++ b/backend/tests/Unit/Shared/Domain/CorrelationIdTest.php @@ -0,0 +1,51 @@ +assertTrue(Uuid::isValid($correlationId->value())); + } + + public function testFromStringCreatesCorrelationIdFromValidUuid(): void + { + $uuid = '550e8400-e29b-41d4-a716-446655440000'; + $correlationId = CorrelationId::fromString($uuid); + + $this->assertSame($uuid, $correlationId->value()); + } + + public function testValueReturnsUuidString(): void + { + $uuid = '550e8400-e29b-41d4-a716-446655440000'; + $correlationId = CorrelationId::fromString($uuid); + + $this->assertSame($uuid, $correlationId->value()); + } + + public function testToStringReturnsUuidString(): void + { + $uuid = '550e8400-e29b-41d4-a716-446655440000'; + $correlationId = CorrelationId::fromString($uuid); + + $this->assertSame($uuid, (string) $correlationId); + } + + public function testGenerateCreatesDifferentIdsEachTime(): void + { + $id1 = CorrelationId::generate(); + $id2 = CorrelationId::generate(); + + $this->assertNotSame($id1->value(), $id2->value()); + } +} diff --git a/backend/tests/Unit/Shared/Domain/EntityIdTest.php b/backend/tests/Unit/Shared/Domain/EntityIdTest.php new file mode 100644 index 0000000..3f62a27 --- /dev/null +++ b/backend/tests/Unit/Shared/Domain/EntityIdTest.php @@ -0,0 +1,58 @@ +assertInstanceOf(TestEntityId::class, $id); + $this->assertTrue(Uuid::isValid((string) $id)); + } + + public function testFromStringCreatesEntityIdFromValidUuid(): void + { + $uuid = '550e8400-e29b-41d4-a716-446655440000'; + $id = TestEntityId::fromString($uuid); + + $this->assertSame($uuid, (string) $id); + } + + public function testEqualsReturnsTrueForSameValue(): void + { + $uuid = '550e8400-e29b-41d4-a716-446655440000'; + $id1 = TestEntityId::fromString($uuid); + $id2 = TestEntityId::fromString($uuid); + + $this->assertTrue($id1->equals($id2)); + } + + public function testEqualsReturnsFalseForDifferentValue(): void + { + $id1 = TestEntityId::generate(); + $id2 = TestEntityId::generate(); + + $this->assertFalse($id1->equals($id2)); + } + + public function testToStringReturnsUuidString(): void + { + $uuid = '550e8400-e29b-41d4-a716-446655440000'; + $id = TestEntityId::fromString($uuid); + + $this->assertSame($uuid, (string) $id); + } +} + +// Test concrete implementation +final readonly class TestEntityId extends EntityId +{ +} diff --git a/backend/tests/bootstrap.php b/backend/tests/bootstrap.php new file mode 100644 index 0000000..d4aecb0 --- /dev/null +++ b/backend/tests/bootstrap.php @@ -0,0 +1,13 @@ +bootEnv(dirname(__DIR__) . '/.env'); +} diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..023a96a --- /dev/null +++ b/compose.yaml @@ -0,0 +1,199 @@ +services: + # ============================================================================= + # BACKEND API - PHP 8.5 + FrankenPHP + # ============================================================================= + php: + build: + context: ./backend + dockerfile: Dockerfile + target: dev + container_name: classeo_php + environment: + APP_ENV: dev + APP_DEBUG: 1 + DATABASE_URL: postgresql://classeo:classeo@db:5432/classeo_master?serverVersion=18&charset=utf8 + REDIS_URL: redis://redis:6379 + MESSENGER_TRANSPORT_DSN: amqp://guest:guest@rabbitmq:5672/%2f/messages + MERCURE_URL: http://mercure/.well-known/mercure + MERCURE_PUBLIC_URL: http://localhost:3000/.well-known/mercure + MERCURE_JWT_SECRET: mercure_publisher_secret_change_me_in_production + MEILISEARCH_URL: http://meilisearch:7700 + MEILISEARCH_API_KEY: masterKey + MAILER_DSN: smtp://mailpit:1025 + ports: + - "18000:8000" # Port externe 18000 pour eviter conflit + volumes: + - ./backend:/app:cached + depends_on: + db: + condition: service_healthy + redis: + condition: service_healthy + rabbitmq: + condition: service_healthy + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8000/api"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 30s + restart: unless-stopped + + # ============================================================================= + # FRONTEND - SvelteKit + Node.js + # ============================================================================= + frontend: + build: + context: ./frontend + dockerfile: Dockerfile + target: dev + container_name: classeo_frontend + environment: + PUBLIC_API_URL: http://localhost:18000/api + PUBLIC_MERCURE_URL: http://localhost:3000/.well-known/mercure + ports: + - "5174:5173" # Port externe 5174 pour eviter conflit + volumes: + - ./frontend:/app:cached + - frontend_node_modules:/app/node_modules + healthcheck: + test: ["CMD", "wget", "-q", "--spider", "http://localhost:5173/"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 30s + restart: unless-stopped + + # ============================================================================= + # DATABASE - PostgreSQL 18.1 + # ============================================================================= + db: + image: postgres:18.1-alpine + container_name: classeo_db + environment: + POSTGRES_DB: classeo_master + POSTGRES_USER: classeo + POSTGRES_PASSWORD: classeo + ports: + - "5433:5432" # Port externe 5433 pour eviter conflit avec PostgreSQL local + volumes: + - postgres_data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U classeo -d classeo_master"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 10s + restart: unless-stopped + + # ============================================================================= + # CACHE & SESSIONS - Redis 7.4 + # ============================================================================= + redis: + image: redis:7.4-alpine + container_name: classeo_redis + command: redis-server --appendonly yes + ports: + - "6380:6379" # Port externe 6380 pour eviter conflit avec Redis local + volumes: + - redis_data:/data + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 5s + restart: unless-stopped + + # ============================================================================= + # MESSAGE QUEUE - RabbitMQ 4.2 + # ============================================================================= + rabbitmq: + image: rabbitmq:4.2-management-alpine + container_name: classeo_rabbitmq + environment: + RABBITMQ_DEFAULT_USER: guest + RABBITMQ_DEFAULT_PASS: guest + ports: + - "5672:5672" + - "15672:15672" + volumes: + - rabbitmq_data:/var/lib/rabbitmq + healthcheck: + test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 30s + restart: unless-stopped + + # ============================================================================= + # REAL-TIME SSE - Mercure + # ============================================================================= + mercure: + image: dunglas/mercure:latest + container_name: classeo_mercure + environment: + MERCURE_PUBLISHER_JWT_KEY: "mercure_publisher_secret_change_me_in_production" + MERCURE_SUBSCRIBER_JWT_KEY: "mercure_subscriber_secret_change_me_in_production" + SERVER_NAME: ":80" + MERCURE_EXTRA_DIRECTIVES: | + cors_origins http://localhost:5174 + anonymous + ports: + - "3000:80" + healthcheck: + test: ["CMD", "wget", "-q", "--spider", "http://localhost/.well-known/mercure"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 10s + restart: unless-stopped + + # ============================================================================= + # FULL-TEXT SEARCH - Meilisearch 1.12 + # ============================================================================= + meilisearch: + image: getmeili/meilisearch:v1.12 + container_name: classeo_meilisearch + environment: + MEILI_MASTER_KEY: "masterKey" + MEILI_ENV: "development" + ports: + - "7700:7700" + volumes: + - meilisearch_data:/meili_data + healthcheck: + test: ["CMD", "wget", "-q", "--spider", "http://localhost:7700/health"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 10s + restart: unless-stopped + + # ============================================================================= + # EMAIL TESTING - Mailpit + # ============================================================================= + mailpit: + image: axllent/mailpit:latest + container_name: classeo_mailpit + ports: + - "1025:1025" + - "8025:8025" + healthcheck: + test: ["CMD", "wget", "-q", "--spider", "http://localhost:8025"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 5s + restart: unless-stopped + +# ============================================================================= +# VOLUMES PERSISTANTS +# ============================================================================= +volumes: + postgres_data: + redis_data: + rabbitmq_data: + meilisearch_data: + frontend_node_modules: diff --git a/docs/adr/index.md b/docs/adr/index.md new file mode 100644 index 0000000..31265a2 --- /dev/null +++ b/docs/adr/index.md @@ -0,0 +1,40 @@ +# Architecture Decision Records (ADR) + +Ce dossier contient les decisions architecturales du projet Classeo. + +## Format + +Chaque ADR suit le template : + +```markdown +# ADR-XXX: Titre + +## Status +Proposed | Accepted | Deprecated | Superseded by [ADR-YYY] + +## Context +Description du probleme ou de la situation. + +## Decision +La decision prise et pourquoi. + +## Consequences +Impact positif et negatif de cette decision. +``` + +## Index + +| # | Titre | Status | Date | +|---|-------|--------|------| +| 001 | [Architecture DDD avec Bounded Contexts](./001-ddd-bounded-contexts.md) | Accepted | 2026-01 | +| 002 | [Svelte 5 Runes Only](./002-svelte5-runes-only.md) | Accepted | 2026-01 | +| 003 | [PHP 8.5 Property Hooks](./003-php85-property-hooks.md) | Accepted | 2026-01 | + +## Comment proposer une nouvelle ADR + +1. Copier le template `template.md` +2. Nommer `XXX-titre-court.md` +3. Remplir les sections +4. Soumettre en Pull Request +5. Discuter en equipe +6. Merger = Accepted diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..83323da --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,37 @@ +# ============================================================================= +# Dependencies +# ============================================================================= +node_modules/ +.pnpm-store/ + +# ============================================================================= +# Build output +# ============================================================================= +/.svelte-kit/ +/build/ +dist/ + +# ============================================================================= +# Environment files +# ============================================================================= +.env +.env.* +!.env.example + +# ============================================================================= +# Testing +# ============================================================================= +/coverage/ +/playwright-report/ +/test-results/ + +# ============================================================================= +# PWA +# ============================================================================= +dev-dist/ + +# ============================================================================= +# Misc +# ============================================================================= +*.local +*.tsbuildinfo diff --git a/frontend/.prettierrc b/frontend/.prettierrc new file mode 100644 index 0000000..7ebb855 --- /dev/null +++ b/frontend/.prettierrc @@ -0,0 +1,15 @@ +{ + "useTabs": true, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], + "overrides": [ + { + "files": "*.svelte", + "options": { + "parser": "svelte" + } + } + ] +} diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..f48d5d7 --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,61 @@ +# syntax=docker/dockerfile:1 + +# ============================================================================= +# Node.js 22 - Frontend Classeo (SvelteKit) +# ============================================================================= + +FROM node:22-alpine AS base + +# Install pnpm +RUN corepack enable && corepack prepare pnpm@10.28.2 --activate + +# Set working directory +WORKDIR /app + +# ============================================================================= +# Development stage +# ============================================================================= +FROM base AS dev + +# Create entrypoint script for dev (installs deps if needed) +RUN echo '#!/bin/sh' > /usr/local/bin/docker-entrypoint.sh && \ + echo 'set -e' >> /usr/local/bin/docker-entrypoint.sh && \ + echo 'if [ ! -d /app/node_modules ] || [ ! -f /app/node_modules/.pnpm/lock.yaml ]; then' >> /usr/local/bin/docker-entrypoint.sh && \ + echo ' echo "Installing pnpm dependencies..."' >> /usr/local/bin/docker-entrypoint.sh && \ + echo ' pnpm install' >> /usr/local/bin/docker-entrypoint.sh && \ + echo 'fi' >> /usr/local/bin/docker-entrypoint.sh && \ + echo 'exec "$@"' >> /usr/local/bin/docker-entrypoint.sh && \ + chmod +x /usr/local/bin/docker-entrypoint.sh + +EXPOSE 5173 + +ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] +CMD ["pnpm", "run", "dev", "--host", "0.0.0.0"] + +# ============================================================================= +# Build stage +# ============================================================================= +FROM base AS builder + +COPY package.json pnpm-lock.yaml* ./ +RUN if [ -f pnpm-lock.yaml ]; then pnpm install --frozen-lockfile; else pnpm install; fi + +COPY . . +RUN pnpm run build + +# ============================================================================= +# Production stage +# ============================================================================= +FROM base AS prod + +ENV NODE_ENV=production + +COPY package.json pnpm-lock.yaml* ./ +RUN if [ -f pnpm-lock.yaml ]; then pnpm install --frozen-lockfile --prod; else pnpm install --prod; fi + +COPY --from=builder /app/build build/ +COPY --from=builder /app/package.json . + +EXPOSE 3000 + +CMD ["node", "build"] diff --git a/frontend/e2e/home.test.ts b/frontend/e2e/home.test.ts new file mode 100644 index 0000000..aa5f24b --- /dev/null +++ b/frontend/e2e/home.test.ts @@ -0,0 +1,21 @@ +import { expect, test } from '@playwright/test'; + +test('home page has correct title and content', async ({ page }) => { + await page.goto('/'); + + await expect(page).toHaveTitle('Classeo'); + await expect(page.getByRole('heading', { name: 'Bienvenue sur Classeo' })).toBeVisible(); + await expect(page.getByText('Application de gestion scolaire')).toBeVisible(); +}); + +test('counter increments when button is clicked', async ({ page }) => { + await page.goto('/'); + + await expect(page.getByText('Compteur: 0')).toBeVisible(); + + await page.getByRole('button', { name: 'Incrementer' }).click(); + await expect(page.getByText('Compteur: 1')).toBeVisible(); + + await page.getByRole('button', { name: 'Incrementer' }).click(); + await expect(page.getByText('Compteur: 2')).toBeVisible(); +}); diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js new file mode 100644 index 0000000..9fca5eb --- /dev/null +++ b/frontend/eslint.config.js @@ -0,0 +1,96 @@ +import js from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import sveltePlugin from 'eslint-plugin-svelte'; +import svelteParser from 'svelte-eslint-parser'; +import prettier from 'eslint-config-prettier'; + +export default tseslint.config( + // Base JavaScript recommended rules + js.configs.recommended, + + // TypeScript recommended rules + ...tseslint.configs.recommended, + + // Global ignores + { + ignores: [ + '.svelte-kit/**', + 'build/**', + 'dist/**', + 'node_modules/**', + '*.config.js', + '*.config.ts' + ] + }, + + // TypeScript files + { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + sourceType: 'module', + ecmaVersion: 2020 + }, + globals: { + window: 'readonly', + document: 'readonly', + console: 'readonly', + process: 'readonly', + __dirname: 'readonly', + __filename: 'readonly', + Promise: 'readonly', + Set: 'readonly', + Map: 'readonly' + } + }, + rules: { + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_' + } + ], + 'no-console': ['warn', { allow: ['warn', 'error'] }] + } + }, + + // Svelte files + { + files: ['**/*.svelte'], + languageOptions: { + parser: svelteParser, + parserOptions: { + parser: tseslint.parser, + sourceType: 'module', + ecmaVersion: 2020, + extraFileExtensions: ['.svelte'] + }, + globals: { + window: 'readonly', + document: 'readonly', + console: 'readonly', + process: 'readonly', + Promise: 'readonly', + Set: 'readonly', + Map: 'readonly' + } + }, + plugins: { + svelte: sveltePlugin + }, + rules: { + ...sveltePlugin.configs.recommended.rules, + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_' + } + ] + } + }, + + // Prettier (disable conflicting rules) + prettier +); diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..166b2f5 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,55 @@ +{ + "name": "classeo-frontend", + "version": "0.0.1", + "private": true, + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "test": "vitest run", + "test:watch": "vitest", + "test:coverage": "vitest run --coverage", + "test:e2e": "playwright test", + "lint": "eslint .", + "format": "prettier --write ." + }, + "devDependencies": { + "@playwright/test": "^1.50.0", + "@sveltejs/adapter-auto": "^4.0.0", + "@sveltejs/adapter-node": "^5.0.0", + "@sveltejs/kit": "^2.50.0", + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "@tailwindcss/forms": "^0.5.7", + "@tailwindcss/typography": "^0.5.10", + "@testing-library/svelte": "^5.2.0", + "@types/node": "^22.0.0", + "@typescript-eslint/eslint-plugin": "^8.0.0", + "@typescript-eslint/parser": "^8.0.0", + "@vitest/coverage-v8": "^2.1.0", + "autoprefixer": "^10.4.20", + "eslint": "^9.0.0", + "eslint-config-prettier": "^10.0.0", + "eslint-plugin-svelte": "^3.0.0", + "jsdom": "^27.4.0", + "postcss": "^8.4.47", + "prettier": "^3.4.0", + "prettier-plugin-svelte": "^3.3.0", + "prettier-plugin-tailwindcss": "^0.6.0", + "svelte": "^5.15.0", + "svelte-check": "^4.1.0", + "tailwindcss": "^3.4.16", + "typescript": "^5.7.0", + "typescript-eslint": "^8.54.0", + "vite": "^6.0.0", + "vitest": "^2.1.0" + }, + "dependencies": { + "@tanstack/svelte-query": "^5.66.0", + "@vite-pwa/sveltekit": "^0.6.8", + "workbox-window": "^7.3.0" + }, + "packageManager": "pnpm@10.28.2" +} diff --git a/frontend/playwright.config.ts b/frontend/playwright.config.ts new file mode 100644 index 0000000..d46373b --- /dev/null +++ b/frontend/playwright.config.ts @@ -0,0 +1,41 @@ +import type { PlaywrightTestConfig } from '@playwright/test'; + +const config: PlaywrightTestConfig = { + webServer: { + command: 'pnpm run build && pnpm run preview', + port: 4173, + reuseExistingServer: !process.env.CI + }, + testDir: 'e2e', + testMatch: /(.+\.)?(test|spec)\.[jt]s/, + use: { + baseURL: 'http://localhost:4173', + trace: 'on-first-retry', + screenshot: 'only-on-failure', + video: 'retain-on-failure' + }, + retries: process.env.CI ? 2 : 0, + reporter: process.env.CI ? 'github' : 'html', + projects: [ + { + name: 'chromium', + use: { + browserName: 'chromium' + } + }, + { + name: 'firefox', + use: { + browserName: 'firefox' + } + }, + { + name: 'webkit', + use: { + browserName: 'webkit' + } + } + ] +}; + +export default config; diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml new file mode 100644 index 0000000..18bc5a3 --- /dev/null +++ b/frontend/pnpm-lock.yaml @@ -0,0 +1,7144 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@tanstack/svelte-query': + specifier: ^5.66.0 + version: 5.90.2(svelte@5.49.1) + '@vite-pwa/sveltekit': + specifier: ^0.6.8 + version: 0.6.8(@sveltejs/kit@2.50.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.49.1)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)))(svelte@5.49.1)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)))(vite-plugin-pwa@0.21.2(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0))(workbox-build@7.4.0)(workbox-window@7.4.0)) + workbox-window: + specifier: ^7.3.0 + version: 7.4.0 + devDependencies: + '@playwright/test': + specifier: ^1.50.0 + version: 1.58.0 + '@sveltejs/adapter-auto': + specifier: ^4.0.0 + version: 4.0.0(@sveltejs/kit@2.50.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.49.1)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)))(svelte@5.49.1)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0))) + '@sveltejs/adapter-node': + specifier: ^5.0.0 + version: 5.5.2(@sveltejs/kit@2.50.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.49.1)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)))(svelte@5.49.1)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0))) + '@sveltejs/kit': + specifier: ^2.50.0 + version: 2.50.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.49.1)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)))(svelte@5.49.1)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)) + '@sveltejs/vite-plugin-svelte': + specifier: ^5.0.0 + version: 5.1.1(svelte@5.49.1)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)) + '@tailwindcss/forms': + specifier: ^0.5.7 + version: 0.5.11(tailwindcss@3.4.19) + '@tailwindcss/typography': + specifier: ^0.5.10 + version: 0.5.19(tailwindcss@3.4.19) + '@testing-library/svelte': + specifier: ^5.2.0 + version: 5.3.1(svelte@5.49.1)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0))(vitest@2.1.9(@types/node@22.19.7)(jsdom@27.4.0)(terser@5.46.0)) + '@types/node': + specifier: ^22.0.0 + version: 22.19.7 + '@typescript-eslint/eslint-plugin': + specifier: ^8.0.0 + version: 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/parser': + specifier: ^8.0.0 + version: 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@vitest/coverage-v8': + specifier: ^2.1.0 + version: 2.1.9(vitest@2.1.9(@types/node@22.19.7)(jsdom@27.4.0)(terser@5.46.0)) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.23(postcss@8.5.6) + eslint: + specifier: ^9.0.0 + version: 9.39.2(jiti@1.21.7) + eslint-config-prettier: + specifier: ^10.0.0 + version: 10.1.8(eslint@9.39.2(jiti@1.21.7)) + eslint-plugin-svelte: + specifier: ^3.0.0 + version: 3.14.0(eslint@9.39.2(jiti@1.21.7))(svelte@5.49.1) + jsdom: + specifier: ^27.4.0 + version: 27.4.0 + postcss: + specifier: ^8.4.47 + version: 8.5.6 + prettier: + specifier: ^3.4.0 + version: 3.8.1 + prettier-plugin-svelte: + specifier: ^3.3.0 + version: 3.4.1(prettier@3.8.1)(svelte@5.49.1) + prettier-plugin-tailwindcss: + specifier: ^0.6.0 + version: 0.6.14(prettier-plugin-svelte@3.4.1(prettier@3.8.1)(svelte@5.49.1))(prettier@3.8.1) + svelte: + specifier: ^5.15.0 + version: 5.49.1 + svelte-check: + specifier: ^4.1.0 + version: 4.3.5(picomatch@4.0.3)(svelte@5.49.1)(typescript@5.9.3) + tailwindcss: + specifier: ^3.4.16 + version: 3.4.19 + typescript: + specifier: ^5.7.0 + version: 5.9.3 + typescript-eslint: + specifier: ^8.54.0 + version: 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + vite: + specifier: ^6.0.0 + version: 6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0) + vitest: + specifier: ^2.1.0 + version: 2.1.9(@types/node@22.19.7)(jsdom@27.4.0)(terser@5.46.0) + +packages: + + '@acemir/cssom@0.9.31': + resolution: {integrity: sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==} + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@apideck/better-ajv-errors@0.3.6': + resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} + engines: {node: '>=10'} + peerDependencies: + ajv: '>=8' + + '@asamuzakjp/css-color@4.1.1': + resolution: {integrity: sha512-B0Hv6G3gWGMn0xKJ0txEi/jM5iFpT3MfDxmhZFb4W047GvytCf1DHQ1D69W3zHI4yWe2aTZAA0JnbMZ7Xc8DuQ==} + + '@asamuzakjp/dom-selector@6.7.6': + resolution: {integrity: sha512-hBaJER6A9MpdG3WgdlOolHmbOYvSk46y7IQN/1+iqiCuUu6iWdQrs9DGKF8ocqsEqWujWf/V7b7vaDgiUmIvUg==} + + '@asamuzakjp/nwsapi@2.3.9': + resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} + + '@babel/code-frame@7.28.6': + resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.6': + resolution: {integrity: sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.6': + resolution: {integrity: sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.6': + resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.28.6': + resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.28.5': + resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.6': + resolution: {integrity: sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.28.5': + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.28.6': + resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.28.6': + resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.6': + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.6': + resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': + resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6': + resolution: {integrity: sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.28.6': + resolution: {integrity: sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.28.6': + resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.28.6': + resolution: {integrity: sha512-9knsChgsMzBV5Yh3kkhrZNxH3oCYAfMBkNNaVN4cP2RVlFPe8wYdwwcnOsAbkdDoV9UjFtOXWrWB52M8W4jNeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.28.6': + resolution: {integrity: sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.28.6': + resolution: {integrity: sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.28.6': + resolution: {integrity: sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.28.6': + resolution: {integrity: sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.28.6': + resolution: {integrity: sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.28.6': + resolution: {integrity: sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.28.5': + resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.28.6': + resolution: {integrity: sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.28.6': + resolution: {integrity: sha512-5suVoXjC14lUN6ZL9OLKIHCNVWCrqGqlmEp/ixdXjvgnEl/kauLvvMO/Xw9NyMc95Joj1AeLVPVMvibBgSoFlA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-explicit-resource-management@7.28.6': + resolution: {integrity: sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.28.6': + resolution: {integrity: sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.28.6': + resolution: {integrity: sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.28.6': + resolution: {integrity: sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.28.6': + resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.28.5': + resolution: {integrity: sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6': + resolution: {integrity: sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.28.6': + resolution: {integrity: sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.28.6': + resolution: {integrity: sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.28.6': + resolution: {integrity: sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.28.6': + resolution: {integrity: sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.27.7': + resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.28.6': + resolution: {integrity: sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.28.6': + resolution: {integrity: sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.28.6': + resolution: {integrity: sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regexp-modifiers@7.28.6': + resolution: {integrity: sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.28.6': + resolution: {integrity: sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.28.6': + resolution: {integrity: sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.28.6': + resolution: {integrity: sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.28.6': + resolution: {integrity: sha512-GaTI4nXDrs7l0qaJ6Rg06dtOXTBCG6TMDB44zbqofCIC4PqC7SEvmFFtpxzCDw9W5aJ7RKVshgXTLvLdBFV/qw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.6': + resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.6': + resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-syntax-patches-for-csstree@1.0.26': + resolution: {integrity: sha512-6boXK0KkzT5u5xOgF6TKB+CLq9SOpEGmkZw0g5n9/7yg85wab3UzSxB8TxhLJ31L4SGJ6BCFRw/iftTha1CJXA==} + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.2': + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@exodus/bytes@1.10.0': + resolution: {integrity: sha512-tf8YdcbirXdPnJ+Nd4UN1EXnz+IP2DI45YVEr3vvzcVTOyrApkmIB4zvOQVd3XPr7RXnfBtAx+PXImXOIU0Ajg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@noble/hashes': ^1.8.0 || ^2.0.0 + peerDependenciesMeta: + '@noble/hashes': + optional: true + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@playwright/test@1.58.0': + resolution: {integrity: sha512-fWza+Lpbj6SkQKCrU6si4iu+fD2dD3gxNHFhUPxsfXBPhnv3rRSQVd0NtBUT9Z/RhF/boCBcuUaMUSTRTopjZg==} + engines: {node: '>=18'} + hasBin: true + + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@rollup/plugin-babel@5.3.1': + resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} + engines: {node: '>= 10.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + + '@rollup/plugin-commonjs@28.0.9': + resolution: {integrity: sha512-PIR4/OHZ79romx0BVVll/PkwWpJ7e5lsqFa3gFfcrFPWwLXLV39JVUzQV9RKjWerE7B845Hqjj9VYlQeieZ2dA==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-json@6.1.0': + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@15.3.1': + resolution: {integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@16.0.3': + resolution: {integrity: sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-replace@2.4.2': + resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + + '@rollup/plugin-terser@0.4.4': + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@3.1.0': + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.57.0': + resolution: {integrity: sha512-tPgXB6cDTndIe1ah7u6amCI1T0SsnlOuKgg10Xh3uizJk4e5M1JGaUMk7J4ciuAUcFpbOiNhm2XIjP9ON0dUqA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.57.0': + resolution: {integrity: sha512-sa4LyseLLXr1onr97StkU1Nb7fWcg6niokTwEVNOO7awaKaoRObQ54+V/hrF/BP1noMEaaAW6Fg2d/CfLiq3Mg==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.57.0': + resolution: {integrity: sha512-/NNIj9A7yLjKdmkx5dC2XQ9DmjIECpGpwHoGmA5E1AhU0fuICSqSWScPhN1yLCkEdkCwJIDu2xIeLPs60MNIVg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.57.0': + resolution: {integrity: sha512-xoh8abqgPrPYPr7pTYipqnUi1V3em56JzE/HgDgitTqZBZ3yKCWI+7KUkceM6tNweyUKYru1UMi7FC060RyKwA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.57.0': + resolution: {integrity: sha512-PCkMh7fNahWSbA0OTUQ2OpYHpjZZr0hPr8lId8twD7a7SeWrvT3xJVyza+dQwXSSq4yEQTMoXgNOfMCsn8584g==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.57.0': + resolution: {integrity: sha512-1j3stGx+qbhXql4OCDZhnK7b01s6rBKNybfsX+TNrEe9JNq4DLi1yGiR1xW+nL+FNVvI4D02PUnl6gJ/2y6WJA==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.57.0': + resolution: {integrity: sha512-eyrr5W08Ms9uM0mLcKfM/Uzx7hjhz2bcjv8P2uynfj0yU8GGPdz8iYrBPhiLOZqahoAMB8ZiolRZPbbU2MAi6Q==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.57.0': + resolution: {integrity: sha512-Xds90ITXJCNyX9pDhqf85MKWUI4lqjiPAipJ8OLp8xqI2Ehk+TCVhF9rvOoN8xTbcafow3QOThkNnrM33uCFQA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.57.0': + resolution: {integrity: sha512-Xws2KA4CLvZmXjy46SQaXSejuKPhwVdaNinldoYfqruZBaJHqVo6hnRa8SDo9z7PBW5x84SH64+izmldCgbezw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.57.0': + resolution: {integrity: sha512-hrKXKbX5FdaRJj7lTMusmvKbhMJSGWJ+w++4KmjiDhpTgNlhYobMvKfDoIWecy4O60K6yA4SnztGuNTQF+Lplw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.57.0': + resolution: {integrity: sha512-6A+nccfSDGKsPm00d3xKcrsBcbqzCTAukjwWK6rbuAnB2bHaL3r9720HBVZ/no7+FhZLz/U3GwwZZEh6tOSI8Q==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.57.0': + resolution: {integrity: sha512-4P1VyYUe6XAJtQH1Hh99THxr0GKMMwIXsRNOceLrJnaHTDgk1FTcTimDgneRJPvB3LqDQxUmroBclQ1S0cIJwQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.57.0': + resolution: {integrity: sha512-8Vv6pLuIZCMcgXre6c3nOPhE0gjz1+nZP6T+hwWjr7sVH8k0jRkH+XnfjjOTglyMBdSKBPPz54/y1gToSKwrSQ==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.57.0': + resolution: {integrity: sha512-r1te1M0Sm2TBVD/RxBPC6RZVwNqUTwJTA7w+C/IW5v9Ssu6xmxWEi+iJQlpBhtUiT1raJ5b48pI8tBvEjEFnFA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.57.0': + resolution: {integrity: sha512-say0uMU/RaPm3CDQLxUUTF2oNWL8ysvHkAjcCzV2znxBr23kFfaxocS9qJm+NdkRhF8wtdEEAJuYcLPhSPbjuQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.57.0': + resolution: {integrity: sha512-/MU7/HizQGsnBREtRpcSbSV1zfkoxSTR7wLsRmBPQ8FwUj5sykrP1MyJTvsxP5KBq9SyE6kH8UQQQwa0ASeoQQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.57.0': + resolution: {integrity: sha512-Q9eh+gUGILIHEaJf66aF6a414jQbDnn29zeu0eX3dHMuysnhTvsUvZTCAyZ6tJhUjnvzBKE4FtuaYxutxRZpOg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.57.0': + resolution: {integrity: sha512-OR5p5yG5OKSxHReWmwvM0P+VTPMwoBS45PXTMYaskKQqybkS3Kmugq1W+YbNWArF8/s7jQScgzXUhArzEQ7x0A==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.57.0': + resolution: {integrity: sha512-XeatKzo4lHDsVEbm1XDHZlhYZZSQYym6dg2X/Ko0kSFgio+KXLsxwJQprnR48GvdIKDOpqWqssC3iBCjoMcMpw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.57.0': + resolution: {integrity: sha512-Lu71y78F5qOfYmubYLHPcJm74GZLU6UJ4THkf/a1K7Tz2ycwC2VUbsqbJAXaR6Bx70SRdlVrt2+n5l7F0agTUw==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.57.0': + resolution: {integrity: sha512-v5xwKDWcu7qhAEcsUubiav7r+48Uk/ENWdr82MBZZRIm7zThSxCIVDfb3ZeRRq9yqk+oIzMdDo6fCcA5DHfMyA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.57.0': + resolution: {integrity: sha512-XnaaaSMGSI6Wk8F4KK3QP7GfuuhjGchElsVerCplUuxRIzdvZ7hRBpLR0omCmw+kI2RFJB80nenhOoGXlJ5TfQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.57.0': + resolution: {integrity: sha512-3K1lP+3BXY4t4VihLw5MEg6IZD3ojSYzqzBG571W3kNQe4G4CcFpSUQVgurYgib5d+YaCjeFow8QivWp8vuSvA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.57.0': + resolution: {integrity: sha512-MDk610P/vJGc5L5ImE4k5s+GZT3en0KoK1MKPXCRgzmksAMk79j4h3k1IerxTNqwDLxsGxStEZVBqG0gIqZqoA==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.57.0': + resolution: {integrity: sha512-Zv7v6q6aV+VslnpwzqKAmrk5JdVkLUzok2208ZXGipjb+msxBr/fJPZyeEXiFgH7k62Ak0SLIfxQRZQvTuf7rQ==} + cpu: [x64] + os: [win32] + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@surma/rollup-plugin-off-main-thread@2.2.3': + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + + '@sveltejs/acorn-typescript@1.0.8': + resolution: {integrity: sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/adapter-auto@4.0.0': + resolution: {integrity: sha512-kmuYSQdD2AwThymQF0haQhM8rE5rhutQXG4LNbnbShwhMO4qQGnKaaTy+88DuNSuoQDi58+thpq8XpHc1+oEKQ==} + peerDependencies: + '@sveltejs/kit': ^2.0.0 + + '@sveltejs/adapter-node@5.5.2': + resolution: {integrity: sha512-L15Djwpr7HrSAPj/Z8PYfc0pa9A1tllrr18phKI0WJHJeoWw45yinPf0IGgVTmakqx1B3JQ+C/OFl9ZwmxHU1Q==} + peerDependencies: + '@sveltejs/kit': ^2.4.0 + + '@sveltejs/kit@2.50.1': + resolution: {integrity: sha512-XRHD2i3zC4ukhz2iCQzO4mbsts081PAZnnMAQ7LNpWeYgeBmwMsalf0FGSwhFXBbtr2XViPKnFJBDCckWqrsLw==} + engines: {node: '>=18.13'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.0.0 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: ^5.3.3 + vite: ^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + typescript: + optional: true + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1': + resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^5.0.0 + svelte: ^5.0.0 + vite: ^6.0.0 + + '@sveltejs/vite-plugin-svelte@5.1.1': + resolution: {integrity: sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + svelte: ^5.0.0 + vite: ^6.0.0 + + '@tailwindcss/forms@0.5.11': + resolution: {integrity: sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA==} + peerDependencies: + tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1' + + '@tailwindcss/typography@0.5.19': + resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + + '@tanstack/query-core@5.90.2': + resolution: {integrity: sha512-k/TcR3YalnzibscALLwxeiLUub6jN5EDLwKDiO7q5f4ICEoptJ+n9+7vcEFy5/x/i6Q+Lb/tXrsKCggf5uQJXQ==} + + '@tanstack/svelte-query@5.90.2': + resolution: {integrity: sha512-owjnp0w8sOXlMhLZhucHrsYvCjgjHrVyII/wlqMGefxKFyroZS3xCwTee+IUx7UHbL+QmKr/HQTeTqhgxmxPQw==} + peerDependencies: + svelte: ^3.54.0 || ^4.0.0 || ^5.0.0 + + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} + + '@testing-library/svelte-core@1.0.0': + resolution: {integrity: sha512-VkUePoLV6oOYwSUvX6ShA8KLnJqZiYMIbP2JW2t0GLWLkJxKGvuH5qrrZBV/X7cXFnLGuFQEC7RheYiZOW68KQ==} + engines: {node: '>=16'} + peerDependencies: + svelte: ^3 || ^4 || ^5 || ^5.0.0-next.0 + + '@testing-library/svelte@5.3.1': + resolution: {integrity: sha512-8Ez7ZOqW5geRf9PF5rkuopODe5RGy3I9XR+kc7zHh26gBiktLaxTfKmhlGaSHYUOTQE7wFsLMN9xCJVCszw47w==} + engines: {node: '>= 10'} + peerDependencies: + svelte: ^3 || ^4 || ^5 || ^5.0.0-next.0 + vite: '*' + vitest: '*' + peerDependenciesMeta: + vite: + optional: true + vitest: + optional: true + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + + '@types/estree@0.0.39': + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@22.19.7': + resolution: {integrity: sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@typescript-eslint/eslint-plugin@8.54.0': + resolution: {integrity: sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.54.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@8.54.0': + resolution: {integrity: sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.54.0': + resolution: {integrity: sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@8.54.0': + resolution: {integrity: sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.54.0': + resolution: {integrity: sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.54.0': + resolution: {integrity: sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@8.54.0': + resolution: {integrity: sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.54.0': + resolution: {integrity: sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.54.0': + resolution: {integrity: sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@8.54.0': + resolution: {integrity: sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vite-pwa/sveltekit@0.6.8': + resolution: {integrity: sha512-KCrADea4HajwOIJPMB/tKW/x6Xa7X2NiNoWJ5MoggNGguSFQfmtclNc9ejNuXkI7uPNLUvH2zaFmsZRrPl+Tdg==} + engines: {node: '>=16.14 || >=18.13'} + peerDependencies: + '@sveltejs/kit': ^1.3.1 || ^2.0.1 + '@vite-pwa/assets-generator': ^0.2.6 + vite-plugin-pwa: '>=0.21.2 <1' + peerDependenciesMeta: + '@vite-pwa/assets-generator': + optional: true + + '@vitest/coverage-v8@2.1.9': + resolution: {integrity: sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ==} + peerDependencies: + '@vitest/browser': 2.1.9 + vitest: 2.1.9 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@2.1.9': + resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} + + '@vitest/mocker@2.1.9': + resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@2.1.9': + resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} + + '@vitest/runner@2.1.9': + resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} + + '@vitest/snapshot@2.1.9': + resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} + + '@vitest/spy@2.1.9': + resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} + + '@vitest/utils@2.1.9': + resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + autoprefixer@10.4.23: + resolution: {integrity: sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + babel-plugin-polyfill-corejs2@0.4.15: + resolution: {integrity: sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.13.0: + resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.6: + resolution: {integrity: sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + baseline-browser-mapping@2.9.19: + resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} + hasBin: true + + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + caniuse-lite@1.0.30001766: + resolution: {integrity: sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==} + + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} + engines: {node: '>= 16'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + core-js-compat@3.48.0: + resolution: {integrity: sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssstyle@5.3.7: + resolution: {integrity: sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==} + engines: {node: '>=20'} + + data-urls@6.0.1: + resolution: {integrity: sha512-euIQENZg6x8mj3fO6o9+fOW8MimUI4PpD/fZBhJfeioZVy9TUpM4UY7KjQNVZFlqwJ0UdzRDzkycB997HEq1BQ==} + engines: {node: '>=20'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + devalue@5.6.2: + resolution: {integrity: sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.5.282: + resolution: {integrity: sha512-FCPkJtpst28UmFzd903iU7PdeVTfY0KAeJy+Lk0GLZRwgwYHn/irRcaCbQQOmr5Vytc/7rcavsYLvTM8RiHYhQ==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + es-abstract@1.24.1: + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-svelte@3.14.0: + resolution: {integrity: sha512-Isw0GvaMm0yHxAj71edAdGFh28ufYs+6rk2KlbbZphnqZAzrH3Se3t12IFh2H9+1F/jlDhBBL4oiOJmLqmYX0g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.1 || ^9.0.0 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrap@2.2.2: + resolution: {integrity: sha512-zA6497ha+qKvoWIK+WM9NAh5ni17sKZKhbS5B3PoYbBvaYHZWoS33zmFybmyqpn07RLUxSmn+RCls2/XF+d0oQ==} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + hasBin: true + + glob@11.1.0: + resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} + engines: {node: 20 || >=22} + hasBin: true + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.5.0: + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + html-encoding-sniffer@6.0.0: + resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} + + jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} + hasBin: true + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsdom@27.4.0: + resolution: {integrity: sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + known-css-properties@0.37.0: + resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.2.5: + resolution: {integrity: sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mini-svg-data-uri@1.4.4: + resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} + hasBin: true + + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse5@8.0.0: + resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.1: + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} + engines: {node: 20 || >=22} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + playwright-core@1.58.0: + resolution: {integrity: sha512-aaoB1RWrdNi3//rOeKuMiS65UCcgOVljU46At6eFcOFPFHWtd2weHRRow6z/n+Lec0Lvu0k9ZPKJSjPugikirw==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.58.0: + resolution: {integrity: sha512-2SVA0sbPktiIY/MCOPX8e86ehA/e+tDNq+e5Y8qjKYti2Z/JG7xnronT/TXTIkKbYGWlCbuucZ6dziEgkoEjQQ==} + engines: {node: '>=18'} + hasBin: true + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.1.0: + resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@3.1.4: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + + postcss-scss@4.0.9: + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.4.29 + + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-plugin-svelte@3.4.1: + resolution: {integrity: sha512-xL49LCloMoZRvSwa6IEdN2GV6cq2IqpYGstYtMT+5wmml1/dClEoI0MZR78MiVPpu6BdQFfN0/y73yO6+br5Pg==} + peerDependencies: + prettier: ^3.0.0 + svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + + prettier-plugin-tailwindcss@0.6.14: + resolution: {integrity: sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-hermes': '*' + '@prettier/plugin-oxc': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-hermes': + optional: true + '@prettier/plugin-oxc': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} + hasBin: true + + pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + + pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} + + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regenerate-unicode-properties@10.2.2: + resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + regexpu-core@6.4.0: + resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} + engines: {node: '>=4'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.13.0: + resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} + hasBin: true + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@2.79.2: + resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} + engines: {node: '>=10.0.0'} + hasBin: true + + rollup@4.57.0: + resolution: {integrity: sha512-e5lPJi/aui4TO1LpAXIRLySmwXSE8k3b9zoGfd42p67wzxog4WHjiZF3M2uheQih4DGyc25QEV4yRBbpueNiUA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + + smob@1.5.0: + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions + + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-comments@2.0.1: + resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} + engines: {node: '>=10'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svelte-check@4.3.5: + resolution: {integrity: sha512-e4VWZETyXaKGhpkxOXP+B/d0Fp/zKViZoJmneZWe/05Y2aqSKj3YN2nLfYPJBQ87WEiY4BQCQ9hWGu9mPT1a1Q==} + engines: {node: '>= 18.0.0'} + hasBin: true + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: '>=5.0.0' + + svelte-eslint-parser@1.4.1: + resolution: {integrity: sha512-1eqkfQ93goAhjAXxZiu1SaKI9+0/sxp4JIWQwUpsz7ybehRE5L8dNuz7Iry7K22R47p5/+s9EM+38nHV2OlgXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0, pnpm: 10.24.0} + peerDependencies: + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + + svelte@5.49.1: + resolution: {integrity: sha512-jj95WnbKbXsXXngYj28a4zx8jeZx50CN/J4r0CEeax2pbfdsETv/J1K8V9Hbu3DCXnpHz5qAikICuxEooi7eNQ==} + engines: {node: '>=18'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + tailwindcss@3.4.19: + resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + + tempy@0.6.0: + resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} + engines: {node: '>=10'} + + terser@5.46.0: + resolution: {integrity: sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + + tldts-core@7.0.19: + resolution: {integrity: sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==} + + tldts@7.0.19: + resolution: {integrity: sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==} + hasBin: true + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + tough-cookie@6.0.0: + resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + engines: {node: '>=16'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tr46@6.0.0: + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} + + ts-api-utils@2.4.0: + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript-eslint@8.54.0: + resolution: {integrity: sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.1: + resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.2.0: + resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} + engines: {node: '>=4'} + + unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vite-node@2.1.9: + resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite-plugin-pwa@0.21.2: + resolution: {integrity: sha512-vFhH6Waw8itNu37hWUJxL50q+CBbNcMVzsKaYHQVrfxTt3ihk3PeLO22SbiP1UNWzcEPaTQv+YVxe4G0KOjAkg==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@vite-pwa/assets-generator': ^0.2.6 + vite: ^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + workbox-build: ^7.3.0 + workbox-window: ^7.3.0 + peerDependenciesMeta: + '@vite-pwa/assets-generator': + optional: true + + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + 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 + + vite@6.4.1: + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + + vitest@2.1.9: + resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.9 + '@vitest/ui': 2.1.9 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + webidl-conversions@8.0.1: + resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} + engines: {node: '>=20'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-mimetype@5.0.0: + resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} + engines: {node: '>=20'} + + whatwg-url@15.1.0: + resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} + engines: {node: '>=20'} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + workbox-background-sync@7.4.0: + resolution: {integrity: sha512-8CB9OxKAgKZKyNMwfGZ1XESx89GryWTfI+V5yEj8sHjFH8MFelUwYXEyldEK6M6oKMmn807GoJFUEA1sC4XS9w==} + + workbox-broadcast-update@7.4.0: + resolution: {integrity: sha512-+eZQwoktlvo62cI0b+QBr40v5XjighxPq3Fzo9AWMiAosmpG5gxRHgTbGGhaJv/q/MFVxwFNGh/UwHZ/8K88lA==} + + workbox-build@7.4.0: + resolution: {integrity: sha512-Ntk1pWb0caOFIvwz/hfgrov/OJ45wPEhI5PbTywQcYjyZiVhT3UrwwUPl6TRYbTm4moaFYithYnl1lvZ8UjxcA==} + engines: {node: '>=20.0.0'} + + workbox-cacheable-response@7.4.0: + resolution: {integrity: sha512-0Fb8795zg/x23ISFkAc7lbWes6vbw34DGFIMw31cwuHPgDEC/5EYm6m/ZkylLX0EnEbbOyOCLjKgFS/Z5g0HeQ==} + + workbox-core@7.4.0: + resolution: {integrity: sha512-6BMfd8tYEnN4baG4emG9U0hdXM4gGuDU3ectXuVHnj71vwxTFI7WOpQJC4siTOlVtGqCUtj0ZQNsrvi6kZZTAQ==} + + workbox-expiration@7.4.0: + resolution: {integrity: sha512-V50p4BxYhtA80eOvulu8xVfPBgZbkxJ1Jr8UUn0rvqjGhLDqKNtfrDfjJKnLz2U8fO2xGQJTx/SKXNTzHOjnHw==} + + workbox-google-analytics@7.4.0: + resolution: {integrity: sha512-MVPXQslRF6YHkzGoFw1A4GIB8GrKym/A5+jYDUSL+AeJw4ytQGrozYdiZqUW1TPQHW8isBCBtyFJergUXyNoWQ==} + + workbox-navigation-preload@7.4.0: + resolution: {integrity: sha512-etzftSgdQfjMcfPgbfaZCfM2QuR1P+4o8uCA2s4rf3chtKTq/Om7g/qvEOcZkG6v7JZOSOxVYQiOu6PbAZgU6w==} + + workbox-precaching@7.4.0: + resolution: {integrity: sha512-VQs37T6jDqf1rTxUJZXRl3yjZMf5JX/vDPhmx2CPgDDKXATzEoqyRqhYnRoxl6Kr0rqaQlp32i9rtG5zTzIlNg==} + + workbox-range-requests@7.4.0: + resolution: {integrity: sha512-3Vq854ZNuP6Y0KZOQWLaLC9FfM7ZaE+iuQl4VhADXybwzr4z/sMmnLgTeUZLq5PaDlcJBxYXQ3U91V7dwAIfvw==} + + workbox-recipes@7.4.0: + resolution: {integrity: sha512-kOkWvsAn4H8GvAkwfJTbwINdv4voFoiE9hbezgB1sb/0NLyTG4rE7l6LvS8lLk5QIRIto+DjXLuAuG3Vmt3cxQ==} + + workbox-routing@7.4.0: + resolution: {integrity: sha512-C/ooj5uBWYAhAqwmU8HYQJdOjjDKBp9MzTQ+otpMmd+q0eF59K+NuXUek34wbL0RFrIXe/KKT+tUWcZcBqxbHQ==} + + workbox-strategies@7.4.0: + resolution: {integrity: sha512-T4hVqIi5A4mHi92+5EppMX3cLaVywDp8nsyUgJhOZxcfSV/eQofcOA6/EMo5rnTNmNTpw0rUgjAI6LaVullPpg==} + + workbox-streams@7.4.0: + resolution: {integrity: sha512-QHPBQrey7hQbnTs5GrEVoWz7RhHJXnPT+12qqWM378orDMo5VMJLCkCM1cnCk+8Eq92lccx/VgRZ7WAzZWbSLg==} + + workbox-sw@7.4.0: + resolution: {integrity: sha512-ltU+Kr3qWR6BtbdlMnCjobZKzeV1hN+S6UvDywBrwM19TTyqA03X66dzw1tEIdJvQ4lYKkBFox6IAEhoSEZ8Xw==} + + workbox-window@7.4.0: + resolution: {integrity: sha512-/bIYdBLAVsNR3v7gYGaV4pQW3M3kEPx5E8vDxGvxo6khTrGtSSCS7QiFKv9ogzBgZiy0OXLP9zO28U/1nF1mfw==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + 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 + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zimmerframe@1.1.4: + resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} + +snapshots: + + '@acemir/cssom@0.9.31': {} + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@apideck/better-ajv-errors@0.3.6(ajv@8.17.1)': + dependencies: + ajv: 8.17.1 + json-schema: 0.4.0 + jsonpointer: 5.0.1 + leven: 3.1.0 + + '@asamuzakjp/css-color@4.1.1': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 11.2.5 + + '@asamuzakjp/dom-selector@6.7.6': + dependencies: + '@asamuzakjp/nwsapi': 2.3.9 + bidi-js: 1.0.3 + css-tree: 3.1.0 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.2.5 + + '@asamuzakjp/nwsapi@2.3.9': {} + + '@babel/code-frame@7.28.6': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.6': {} + + '@babel/core@7.28.6': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/template': 7.28.6 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.6': + dependencies: + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.6 + + '@babel/helper-compilation-targets@7.28.6': + dependencies: + '@babel/compat-data': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.6) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.6 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.4.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + debug: 4.4.3 + lodash.debounce: 4.0.8 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.28.5': + dependencies: + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.6 + + '@babel/helper-plugin-utils@7.28.6': {} + + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.28.6 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helper-wrap-function@7.28.6': + dependencies: + '@babel/template': 7.28.6 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.28.6': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.28.6 + + '@babel/parser@7.28.6': + dependencies: + '@babel/types': 7.28.6 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + + '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-async-generator-functions@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.6) + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-globals': 7.28.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.6) + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/template': 7.28.6 + + '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-explicit-resource-management@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.6) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.6) + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-regenerator@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-spread@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-unicode-property-regex@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/preset-env@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/compat-data': 7.28.6 + '@babel/core': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.28.6) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.6) + '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.6) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-async-generator-functions': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.6) + '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-explicit-resource-management': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-modules-systemjs': 7.28.5(@babel/core@7.28.6) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.6) + '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-regenerator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.28.6) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.6) + babel-plugin-polyfill-corejs2: 0.4.15(@babel/core@7.28.6) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.6) + babel-plugin-polyfill-regenerator: 0.6.6(@babel/core@7.28.6) + core-js-compat: 3.48.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/types': 7.28.6 + esutils: 2.0.3 + + '@babel/runtime@7.28.6': {} + + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 + + '@babel/traverse@7.28.6': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.6 + '@babel/template': 7.28.6 + '@babel/types': 7.28.6 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.6': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@bcoe/v8-coverage@0.2.3': {} + + '@csstools/color-helpers@5.1.0': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-syntax-patches-for-csstree@1.0.26': {} + + '@csstools/css-tokenizer@3.0.4': {} + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@1.21.7))': + dependencies: + eslint: 9.39.2(jiti@1.21.7) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.21.1': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.3': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.39.2': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + + '@exodus/bytes@1.10.0': {} + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@playwright/test@1.58.0': + dependencies: + playwright: 1.58.0 + + '@polka/url@1.0.0-next.29': {} + + '@rollup/plugin-babel@5.3.1(@babel/core@7.28.6)(rollup@2.79.2)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-imports': 7.28.6 + '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + rollup: 2.79.2 + transitivePeerDependencies: + - supports-color + + '@rollup/plugin-commonjs@28.0.9(rollup@4.57.0)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.57.0) + commondir: 1.0.1 + estree-walker: 2.0.2 + fdir: 6.5.0(picomatch@4.0.3) + is-reference: 1.2.1 + magic-string: 0.30.21 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.57.0 + + '@rollup/plugin-json@6.1.0(rollup@4.57.0)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.57.0) + optionalDependencies: + rollup: 4.57.0 + + '@rollup/plugin-node-resolve@15.3.1(rollup@2.79.2)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@2.79.2) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.11 + optionalDependencies: + rollup: 2.79.2 + + '@rollup/plugin-node-resolve@16.0.3(rollup@4.57.0)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.57.0) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.11 + optionalDependencies: + rollup: 4.57.0 + + '@rollup/plugin-replace@2.4.2(rollup@2.79.2)': + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + magic-string: 0.25.9 + rollup: 2.79.2 + + '@rollup/plugin-terser@0.4.4(rollup@2.79.2)': + dependencies: + serialize-javascript: 6.0.2 + smob: 1.5.0 + terser: 5.46.0 + optionalDependencies: + rollup: 2.79.2 + + '@rollup/pluginutils@3.1.0(rollup@2.79.2)': + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.79.2 + + '@rollup/pluginutils@5.3.0(rollup@2.79.2)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 2.79.2 + + '@rollup/pluginutils@5.3.0(rollup@4.57.0)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.57.0 + + '@rollup/rollup-android-arm-eabi@4.57.0': + optional: true + + '@rollup/rollup-android-arm64@4.57.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.57.0': + optional: true + + '@rollup/rollup-darwin-x64@4.57.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.57.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.57.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.57.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.57.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.57.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.57.0': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.57.0': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.57.0': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.57.0': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.57.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.57.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.57.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.57.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.57.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.57.0': + optional: true + + '@rollup/rollup-openbsd-x64@4.57.0': + optional: true + + '@rollup/rollup-openharmony-arm64@4.57.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.57.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.57.0': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.57.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.57.0': + optional: true + + '@standard-schema/spec@1.1.0': {} + + '@surma/rollup-plugin-off-main-thread@2.2.3': + dependencies: + ejs: 3.1.10 + json5: 2.2.3 + magic-string: 0.25.9 + string.prototype.matchall: 4.0.12 + + '@sveltejs/acorn-typescript@1.0.8(acorn@8.15.0)': + dependencies: + acorn: 8.15.0 + + '@sveltejs/adapter-auto@4.0.0(@sveltejs/kit@2.50.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.49.1)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)))(svelte@5.49.1)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)))': + dependencies: + '@sveltejs/kit': 2.50.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.49.1)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)))(svelte@5.49.1)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)) + import-meta-resolve: 4.2.0 + + '@sveltejs/adapter-node@5.5.2(@sveltejs/kit@2.50.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.49.1)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)))(svelte@5.49.1)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)))': + dependencies: + '@rollup/plugin-commonjs': 28.0.9(rollup@4.57.0) + '@rollup/plugin-json': 6.1.0(rollup@4.57.0) + '@rollup/plugin-node-resolve': 16.0.3(rollup@4.57.0) + '@sveltejs/kit': 2.50.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.49.1)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)))(svelte@5.49.1)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)) + rollup: 4.57.0 + + '@sveltejs/kit@2.50.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.49.1)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)))(svelte@5.49.1)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0))': + dependencies: + '@standard-schema/spec': 1.1.0 + '@sveltejs/acorn-typescript': 1.0.8(acorn@8.15.0) + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.49.1)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)) + '@types/cookie': 0.6.0 + acorn: 8.15.0 + cookie: 0.6.0 + devalue: 5.6.2 + esm-env: 1.2.2 + kleur: 4.1.5 + magic-string: 0.30.21 + mrmime: 2.0.1 + sade: 1.8.1 + set-cookie-parser: 2.7.2 + sirv: 3.0.2 + svelte: 5.49.1 + vite: 6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0) + optionalDependencies: + typescript: 5.9.3 + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.49.1)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)))(svelte@5.49.1)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0))': + dependencies: + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.49.1)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)) + debug: 4.4.3 + svelte: 5.49.1 + vite: 6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.49.1)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.49.1)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)))(svelte@5.49.1)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)) + debug: 4.4.3 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.21 + svelte: 5.49.1 + vite: 6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0) + vitefu: 1.1.1(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)) + transitivePeerDependencies: + - supports-color + + '@tailwindcss/forms@0.5.11(tailwindcss@3.4.19)': + dependencies: + mini-svg-data-uri: 1.4.4 + tailwindcss: 3.4.19 + + '@tailwindcss/typography@0.5.19(tailwindcss@3.4.19)': + dependencies: + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.19 + + '@tanstack/query-core@5.90.2': {} + + '@tanstack/svelte-query@5.90.2(svelte@5.49.1)': + dependencies: + '@tanstack/query-core': 5.90.2 + svelte: 5.49.1 + + '@testing-library/dom@10.4.1': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/runtime': 7.28.6 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + picocolors: 1.1.1 + pretty-format: 27.5.1 + + '@testing-library/svelte-core@1.0.0(svelte@5.49.1)': + dependencies: + svelte: 5.49.1 + + '@testing-library/svelte@5.3.1(svelte@5.49.1)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0))(vitest@2.1.9(@types/node@22.19.7)(jsdom@27.4.0)(terser@5.46.0))': + dependencies: + '@testing-library/dom': 10.4.1 + '@testing-library/svelte-core': 1.0.0(svelte@5.49.1) + svelte: 5.49.1 + optionalDependencies: + vite: 6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0) + vitest: 2.1.9(@types/node@22.19.7)(jsdom@27.4.0)(terser@5.46.0) + + '@types/aria-query@5.0.4': {} + + '@types/cookie@0.6.0': {} + + '@types/estree@0.0.39': {} + + '@types/estree@1.0.8': {} + + '@types/json-schema@7.0.15': {} + + '@types/node@22.19.7': + dependencies: + undici-types: 6.21.0 + + '@types/resolve@1.20.2': {} + + '@types/trusted-types@2.0.7': {} + + '@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/type-utils': 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.54.0 + eslint: 9.39.2(jiti@1.21.7) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.54.0 + debug: 4.4.3 + eslint: 9.39.2(jiti@1.21.7) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.54.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) + '@typescript-eslint/types': 8.54.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.54.0': + dependencies: + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/visitor-keys': 8.54.0 + + '@typescript-eslint/tsconfig-utils@8.54.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.39.2(jiti@1.21.7) + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.54.0': {} + + '@typescript-eslint/typescript-estree@8.54.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.54.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/visitor-keys': 8.54.0 + debug: 4.4.3 + minimatch: 9.0.5 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@1.21.7)) + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + eslint: 9.39.2(jiti@1.21.7) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.54.0': + dependencies: + '@typescript-eslint/types': 8.54.0 + eslint-visitor-keys: 4.2.1 + + '@vite-pwa/sveltekit@0.6.8(@sveltejs/kit@2.50.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.49.1)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)))(svelte@5.49.1)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)))(vite-plugin-pwa@0.21.2(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0))(workbox-build@7.4.0)(workbox-window@7.4.0))': + dependencies: + '@sveltejs/kit': 2.50.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.49.1)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)))(svelte@5.49.1)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)) + kolorist: 1.8.0 + tinyglobby: 0.2.15 + vite-plugin-pwa: 0.21.2(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0))(workbox-build@7.4.0)(workbox-window@7.4.0) + + '@vitest/coverage-v8@2.1.9(vitest@2.1.9(@types/node@22.19.7)(jsdom@27.4.0)(terser@5.46.0))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.4.3 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.2.0 + magic-string: 0.30.21 + magicast: 0.3.5 + std-env: 3.10.0 + test-exclude: 7.0.1 + tinyrainbow: 1.2.0 + vitest: 2.1.9(@types/node@22.19.7)(jsdom@27.4.0)(terser@5.46.0) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@2.1.9': + dependencies: + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.3.3 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@22.19.7)(terser@5.46.0))': + dependencies: + '@vitest/spy': 2.1.9 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 5.4.21(@types/node@22.19.7)(terser@5.46.0) + + '@vitest/pretty-format@2.1.9': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@2.1.9': + dependencies: + '@vitest/utils': 2.1.9 + pathe: 1.1.2 + + '@vitest/snapshot@2.1.9': + dependencies: + '@vitest/pretty-format': 2.1.9 + magic-string: 0.30.21 + pathe: 1.1.2 + + '@vitest/spy@2.1.9': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@2.1.9': + dependencies: + '@vitest/pretty-format': 2.1.9 + loupe: 3.2.1 + tinyrainbow: 1.2.0 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + agent-base@7.1.4: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.3: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + argparse@2.0.1: {} + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + aria-query@5.3.2: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + assertion-error@2.0.1: {} + + async-function@1.0.0: {} + + async@3.2.6: {} + + at-least-node@1.0.0: {} + + autoprefixer@10.4.23(postcss@8.5.6): + dependencies: + browserslist: 4.28.1 + caniuse-lite: 1.0.30001766 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axobject-query@4.1.0: {} + + babel-plugin-polyfill-corejs2@0.4.15(@babel/core@7.28.6): + dependencies: + '@babel/compat-data': 7.28.6 + '@babel/core': 7.28.6 + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.28.6) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.6): + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.28.6) + core-js-compat: 3.48.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.6(@babel/core@7.28.6): + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + balanced-match@1.0.2: {} + + baseline-browser-mapping@2.9.19: {} + + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + + binary-extensions@2.3.0: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.9.19 + caniuse-lite: 1.0.30001766 + electron-to-chromium: 1.5.282 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + + buffer-from@1.1.2: {} + + cac@6.7.14: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + caniuse-lite@1.0.30001766: {} + + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.3 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + check-error@2.1.3: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + clsx@2.1.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@2.20.3: {} + + commander@4.1.1: {} + + common-tags@1.8.2: {} + + commondir@1.0.1: {} + + concat-map@0.0.1: {} + + convert-source-map@2.0.0: {} + + cookie@0.6.0: {} + + core-js-compat@3.48.0: + dependencies: + browserslist: 4.28.1 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-random-string@2.0.0: {} + + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + + cssesc@3.0.0: {} + + cssstyle@5.3.7: + dependencies: + '@asamuzakjp/css-color': 4.1.1 + '@csstools/css-syntax-patches-for-csstree': 1.0.26 + css-tree: 3.1.0 + lru-cache: 11.2.5 + + data-urls@6.0.1: + dependencies: + whatwg-mimetype: 5.0.0 + whatwg-url: 15.1.0 + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decimal.js@10.6.0: {} + + deep-eql@5.0.2: {} + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + dequal@2.0.3: {} + + devalue@5.6.2: {} + + didyoumean@1.2.2: {} + + dlv@1.1.3: {} + + dom-accessibility-api@0.5.16: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ejs@3.1.10: + dependencies: + jake: 10.9.4 + + electron-to-chromium@1.5.282: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + entities@6.0.1: {} + + es-abstract@1.24.1: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.20 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild@0.21.5: + 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 + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@1.21.7)): + dependencies: + eslint: 9.39.2(jiti@1.21.7) + + eslint-plugin-svelte@3.14.0(eslint@9.39.2(jiti@1.21.7))(svelte@5.49.1): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@1.21.7)) + '@jridgewell/sourcemap-codec': 1.5.5 + eslint: 9.39.2(jiti@1.21.7) + esutils: 2.0.3 + globals: 16.5.0 + known-css-properties: 0.37.0 + postcss: 8.5.6 + postcss-load-config: 3.1.4(postcss@8.5.6) + postcss-safe-parser: 7.0.1(postcss@8.5.6) + semver: 7.7.3 + svelte-eslint-parser: 1.4.1(svelte@5.49.1) + optionalDependencies: + svelte: 5.49.1 + transitivePeerDependencies: + - ts-node + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@9.39.2(jiti@1.21.7): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@1.21.7)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.2 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 1.21.7 + transitivePeerDependencies: + - supports-color + + esm-env@1.2.2: {} + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrap@2.2.2: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@1.0.1: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + expect-type@1.3.0: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.1.0: {} + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + fraction.js@5.3.4: {} + + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fsevents@2.3.2: + optional: true + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + + gensync@1.0.0-beta.2: {} + + get-intrinsic@1.3.0: + 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 + + get-own-enumerable-property-symbols@3.0.2: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@11.1.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.1 + minimatch: 10.1.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.1 + + globals@14.0.0: {} + + globals@16.5.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + html-encoding-sniffer@6.0.0: + dependencies: + '@exodus/bytes': 1.10.0 + transitivePeerDependencies: + - '@noble/hashes' + + html-escaper@2.0.2: {} + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + idb@7.1.1: {} + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-meta-resolve@4.2.0: {} + + imurmurhash@0.1.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.3: {} + + is-module@1.0.0: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-obj@1.0.1: {} + + is-potential-custom-element-name@1.0.1: {} + + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.8 + + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-regexp@1.0.0: {} + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-stream@2.0.1: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.20 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + debug: 4.4.3 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jackspeak@4.1.1: + dependencies: + '@isaacs/cliui': 8.0.2 + + jake@10.9.4: + dependencies: + async: 3.2.6 + filelist: 1.0.4 + picocolors: 1.1.1 + + jiti@1.21.7: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsdom@27.4.0: + dependencies: + '@acemir/cssom': 0.9.31 + '@asamuzakjp/dom-selector': 6.7.6 + '@exodus/bytes': 1.10.0 + cssstyle: 5.3.7 + data-urls: 6.0.1 + decimal.js: 10.6.0 + html-encoding-sniffer: 6.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + parse5: 8.0.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 6.0.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 8.0.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 15.1.0 + ws: 8.19.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - '@noble/hashes' + - bufferutil + - supports-color + - utf-8-validate + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-schema@0.4.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonpointer@5.0.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kleur@4.1.5: {} + + known-css-properties@0.37.0: {} + + kolorist@1.8.0: {} + + leven@3.1.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@2.1.0: {} + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + locate-character@3.0.0: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.debounce@4.0.8: {} + + lodash.merge@4.6.2: {} + + lodash.sortby@4.7.0: {} + + lodash@4.17.23: {} + + loupe@3.2.1: {} + + lru-cache@10.4.3: {} + + lru-cache@11.2.5: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lz-string@1.5.0: {} + + magic-string@0.25.9: + dependencies: + sourcemap-codec: 1.4.8 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 + source-map-js: 1.2.1 + + make-dir@4.0.0: + dependencies: + semver: 7.7.3 + + math-intrinsics@1.1.0: {} + + mdn-data@2.12.2: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mini-svg-data-uri@1.4.4: {} + + minimatch@10.1.1: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.2 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minipass@7.1.2: {} + + mri@1.2.0: {} + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.11: {} + + natural-compare@1.4.0: {} + + node-releases@2.0.27: {} + + normalize-path@3.0.0: {} + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + package-json-from-dist@1.0.1: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse5@8.0.0: + dependencies: + entities: 6.0.1 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-scurry@2.0.1: + dependencies: + lru-cache: 11.2.5 + minipass: 7.1.2 + + pathe@1.1.2: {} + + pathval@2.0.1: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pify@2.3.0: {} + + pirates@4.0.7: {} + + playwright-core@1.58.0: {} + + playwright@1.58.0: + dependencies: + playwright-core: 1.58.0 + optionalDependencies: + fsevents: 2.3.2 + + possible-typed-array-names@1.1.0: {} + + postcss-import@15.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.11 + + postcss-js@4.1.0(postcss@8.5.6): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.6 + + postcss-load-config@3.1.4(postcss@8.5.6): + dependencies: + lilconfig: 2.1.0 + yaml: 1.10.2 + optionalDependencies: + postcss: 8.5.6 + + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 1.21.7 + postcss: 8.5.6 + + postcss-nested@6.2.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-safe-parser@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-scss@4.0.9(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@7.1.1: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier-plugin-svelte@3.4.1(prettier@3.8.1)(svelte@5.49.1): + dependencies: + prettier: 3.8.1 + svelte: 5.49.1 + + prettier-plugin-tailwindcss@0.6.14(prettier-plugin-svelte@3.4.1(prettier@3.8.1)(svelte@5.49.1))(prettier@3.8.1): + dependencies: + prettier: 3.8.1 + optionalDependencies: + prettier-plugin-svelte: 3.4.1(prettier@3.8.1)(svelte@5.49.1) + + prettier@3.8.1: {} + + pretty-bytes@5.6.0: {} + + pretty-bytes@6.1.1: {} + + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + react-is@17.0.2: {} + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readdirp@4.1.2: {} + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regenerate-unicode-properties@10.2.2: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + regexpu-core@6.4.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.2 + regjsgen: 0.8.0 + regjsparser: 0.13.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.1 + + regjsgen@0.8.0: {} + + regjsparser@0.13.0: + dependencies: + jsesc: 3.1.0 + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + rollup@2.79.2: + optionalDependencies: + fsevents: 2.3.3 + + rollup@4.57.0: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.57.0 + '@rollup/rollup-android-arm64': 4.57.0 + '@rollup/rollup-darwin-arm64': 4.57.0 + '@rollup/rollup-darwin-x64': 4.57.0 + '@rollup/rollup-freebsd-arm64': 4.57.0 + '@rollup/rollup-freebsd-x64': 4.57.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.0 + '@rollup/rollup-linux-arm-musleabihf': 4.57.0 + '@rollup/rollup-linux-arm64-gnu': 4.57.0 + '@rollup/rollup-linux-arm64-musl': 4.57.0 + '@rollup/rollup-linux-loong64-gnu': 4.57.0 + '@rollup/rollup-linux-loong64-musl': 4.57.0 + '@rollup/rollup-linux-ppc64-gnu': 4.57.0 + '@rollup/rollup-linux-ppc64-musl': 4.57.0 + '@rollup/rollup-linux-riscv64-gnu': 4.57.0 + '@rollup/rollup-linux-riscv64-musl': 4.57.0 + '@rollup/rollup-linux-s390x-gnu': 4.57.0 + '@rollup/rollup-linux-x64-gnu': 4.57.0 + '@rollup/rollup-linux-x64-musl': 4.57.0 + '@rollup/rollup-openbsd-x64': 4.57.0 + '@rollup/rollup-openharmony-arm64': 4.57.0 + '@rollup/rollup-win32-arm64-msvc': 4.57.0 + '@rollup/rollup-win32-ia32-msvc': 4.57.0 + '@rollup/rollup-win32-x64-gnu': 4.57.0 + '@rollup/rollup-win32-x64-msvc': 4.57.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + + semver@6.3.1: {} + + semver@7.7.3: {} + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + set-cookie-parser@2.7.2: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + + smob@1.5.0: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + + sourcemap-codec@1.4.8: {} + + stackback@0.0.2: {} + + std-env@3.10.0: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + stringify-object@3.3.0: + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strip-comments@2.0.1: {} + + strip-json-comments@3.1.1: {} + + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.15 + ts-interface-checker: 0.1.13 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svelte-check@4.3.5(picomatch@4.0.3)(svelte@5.49.1)(typescript@5.9.3): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + chokidar: 4.0.3 + fdir: 6.5.0(picomatch@4.0.3) + picocolors: 1.1.1 + sade: 1.8.1 + svelte: 5.49.1 + typescript: 5.9.3 + transitivePeerDependencies: + - picomatch + + svelte-eslint-parser@1.4.1(svelte@5.49.1): + dependencies: + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + postcss: 8.5.6 + postcss-scss: 4.0.9(postcss@8.5.6) + postcss-selector-parser: 7.1.1 + optionalDependencies: + svelte: 5.49.1 + + svelte@5.49.1: + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.5 + '@sveltejs/acorn-typescript': 1.0.8(acorn@8.15.0) + '@types/estree': 1.0.8 + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + clsx: 2.1.1 + devalue: 5.6.2 + esm-env: 1.2.2 + esrap: 2.2.2 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.21 + zimmerframe: 1.1.4 + + symbol-tree@3.2.4: {} + + tailwindcss@3.4.19: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-import: 15.1.0(postcss@8.5.6) + postcss-js: 4.1.0(postcss@8.5.6) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6) + postcss-nested: 6.2.0(postcss@8.5.6) + postcss-selector-parser: 6.1.2 + resolve: 1.22.11 + sucrase: 3.35.1 + transitivePeerDependencies: + - tsx + - yaml + + temp-dir@2.0.0: {} + + tempy@0.6.0: + dependencies: + is-stream: 2.0.1 + temp-dir: 2.0.0 + type-fest: 0.16.0 + unique-string: 2.0.0 + + terser@5.46.0: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.15.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.5.0 + minimatch: 9.0.5 + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinypool@1.1.1: {} + + tinyrainbow@1.2.0: {} + + tinyspy@3.0.2: {} + + tldts-core@7.0.19: {} + + tldts@7.0.19: + dependencies: + tldts-core: 7.0.19 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + totalist@3.0.1: {} + + tough-cookie@6.0.0: + dependencies: + tldts: 7.0.19 + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tr46@6.0.0: + dependencies: + punycode: 2.3.1 + + ts-api-utils@2.4.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + ts-interface-checker@0.1.13: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.16.0: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typescript-eslint@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + eslint: 9.39.2(jiti@1.21.7) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + typescript@5.9.3: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@6.21.0: {} + + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.2.0 + + unicode-match-property-value-ecmascript@2.2.1: {} + + unicode-property-aliases-ecmascript@2.2.0: {} + + unique-string@2.0.0: + dependencies: + crypto-random-string: 2.0.0 + + universalify@2.0.1: {} + + upath@1.2.0: {} + + update-browserslist-db@1.2.3(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + vite-node@2.1.9(@types/node@22.19.7)(terser@5.46.0): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 1.1.2 + vite: 5.4.21(@types/node@22.19.7)(terser@5.46.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite-plugin-pwa@0.21.2(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0))(workbox-build@7.4.0)(workbox-window@7.4.0): + dependencies: + debug: 4.4.3 + pretty-bytes: 6.1.1 + tinyglobby: 0.2.15 + vite: 6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0) + workbox-build: 7.4.0 + workbox-window: 7.4.0 + transitivePeerDependencies: + - supports-color + + vite@5.4.21(@types/node@22.19.7)(terser@5.46.0): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.57.0 + optionalDependencies: + '@types/node': 22.19.7 + fsevents: 2.3.3 + terser: 5.46.0 + + vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0): + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.0 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 22.19.7 + fsevents: 2.3.3 + jiti: 1.21.7 + terser: 5.46.0 + + vitefu@1.1.1(vite@6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0)): + optionalDependencies: + vite: 6.4.1(@types/node@22.19.7)(jiti@1.21.7)(terser@5.46.0) + + vitest@2.1.9(@types/node@22.19.7)(jsdom@27.4.0)(terser@5.46.0): + dependencies: + '@vitest/expect': 2.1.9 + '@vitest/mocker': 2.1.9(vite@5.4.21(@types/node@22.19.7)(terser@5.46.0)) + '@vitest/pretty-format': 2.1.9 + '@vitest/runner': 2.1.9 + '@vitest/snapshot': 2.1.9 + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.3.3 + debug: 4.4.3 + expect-type: 1.3.0 + magic-string: 0.30.21 + pathe: 1.1.2 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.1.1 + tinyrainbow: 1.2.0 + vite: 5.4.21(@types/node@22.19.7)(terser@5.46.0) + vite-node: 2.1.9(@types/node@22.19.7)(terser@5.46.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.19.7 + jsdom: 27.4.0 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + + webidl-conversions@4.0.2: {} + + webidl-conversions@8.0.1: {} + + whatwg-mimetype@4.0.0: {} + + whatwg-mimetype@5.0.0: {} + + whatwg-url@15.1.0: + dependencies: + tr46: 6.0.0 + webidl-conversions: 8.0.1 + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.20 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.20: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + word-wrap@1.2.5: {} + + workbox-background-sync@7.4.0: + dependencies: + idb: 7.1.1 + workbox-core: 7.4.0 + + workbox-broadcast-update@7.4.0: + dependencies: + workbox-core: 7.4.0 + + workbox-build@7.4.0: + dependencies: + '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1) + '@babel/core': 7.28.6 + '@babel/preset-env': 7.28.6(@babel/core@7.28.6) + '@babel/runtime': 7.28.6 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.28.6)(rollup@2.79.2) + '@rollup/plugin-node-resolve': 15.3.1(rollup@2.79.2) + '@rollup/plugin-replace': 2.4.2(rollup@2.79.2) + '@rollup/plugin-terser': 0.4.4(rollup@2.79.2) + '@surma/rollup-plugin-off-main-thread': 2.2.3 + ajv: 8.17.1 + common-tags: 1.8.2 + fast-json-stable-stringify: 2.1.0 + fs-extra: 9.1.0 + glob: 11.1.0 + lodash: 4.17.23 + pretty-bytes: 5.6.0 + rollup: 2.79.2 + source-map: 0.8.0-beta.0 + stringify-object: 3.3.0 + strip-comments: 2.0.1 + tempy: 0.6.0 + upath: 1.2.0 + workbox-background-sync: 7.4.0 + workbox-broadcast-update: 7.4.0 + workbox-cacheable-response: 7.4.0 + workbox-core: 7.4.0 + workbox-expiration: 7.4.0 + workbox-google-analytics: 7.4.0 + workbox-navigation-preload: 7.4.0 + workbox-precaching: 7.4.0 + workbox-range-requests: 7.4.0 + workbox-recipes: 7.4.0 + workbox-routing: 7.4.0 + workbox-strategies: 7.4.0 + workbox-streams: 7.4.0 + workbox-sw: 7.4.0 + workbox-window: 7.4.0 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + + workbox-cacheable-response@7.4.0: + dependencies: + workbox-core: 7.4.0 + + workbox-core@7.4.0: {} + + workbox-expiration@7.4.0: + dependencies: + idb: 7.1.1 + workbox-core: 7.4.0 + + workbox-google-analytics@7.4.0: + dependencies: + workbox-background-sync: 7.4.0 + workbox-core: 7.4.0 + workbox-routing: 7.4.0 + workbox-strategies: 7.4.0 + + workbox-navigation-preload@7.4.0: + dependencies: + workbox-core: 7.4.0 + + workbox-precaching@7.4.0: + dependencies: + workbox-core: 7.4.0 + workbox-routing: 7.4.0 + workbox-strategies: 7.4.0 + + workbox-range-requests@7.4.0: + dependencies: + workbox-core: 7.4.0 + + workbox-recipes@7.4.0: + dependencies: + workbox-cacheable-response: 7.4.0 + workbox-core: 7.4.0 + workbox-expiration: 7.4.0 + workbox-precaching: 7.4.0 + workbox-routing: 7.4.0 + workbox-strategies: 7.4.0 + + workbox-routing@7.4.0: + dependencies: + workbox-core: 7.4.0 + + workbox-strategies@7.4.0: + dependencies: + workbox-core: 7.4.0 + + workbox-streams@7.4.0: + dependencies: + workbox-core: 7.4.0 + workbox-routing: 7.4.0 + + workbox-sw@7.4.0: {} + + workbox-window@7.4.0: + dependencies: + '@types/trusted-types': 2.0.7 + workbox-core: 7.4.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + ws@8.19.0: {} + + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + + yallist@3.1.1: {} + + yaml@1.10.2: {} + + yocto-queue@0.1.0: {} + + zimmerframe@1.1.4: {} diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js new file mode 100644 index 0000000..0f77216 --- /dev/null +++ b/frontend/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +}; diff --git a/frontend/src/app.css b/frontend/src/app.css new file mode 100644 index 0000000..599cbdd --- /dev/null +++ b/frontend/src/app.css @@ -0,0 +1,62 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --primary: 221.2 83.2% 53.3%; + --primary-foreground: 210 40% 98%; + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + --ring: 221.2 83.2% 53.3%; + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --primary: 217.2 91.2% 59.8%; + --primary-foreground: 222.2 47.4% 11.2%; + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + --ring: 224.3 76.3% 48%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + font-feature-settings: + 'rlig' 1, + 'calt' 1; + } +} diff --git a/frontend/src/app.html b/frontend/src/app.html new file mode 100644 index 0000000..e2da7a2 --- /dev/null +++ b/frontend/src/app.html @@ -0,0 +1,16 @@ + + + + + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/frontend/src/lib/index.ts b/frontend/src/lib/index.ts new file mode 100644 index 0000000..ecb094a --- /dev/null +++ b/frontend/src/lib/index.ts @@ -0,0 +1,2 @@ +// place files you want to import through the `$lib` alias in this folder. +export * from './types'; diff --git a/frontend/src/lib/types/api.ts b/frontend/src/lib/types/api.ts new file mode 100644 index 0000000..7a3a92b --- /dev/null +++ b/frontend/src/lib/types/api.ts @@ -0,0 +1,35 @@ +// API response types +export interface ApiError { + code: string; + message: string; + violations?: Array<{ + propertyPath: string; + message: string; + }>; +} + +export interface PaginatedResponse { + data: T[]; + meta: { + total: number; + page: number; + itemsPerPage: number; + lastPage: number; + }; +} + +export interface HydraCollection { + '@context': string; + '@id': string; + '@type': string; + 'hydra:totalItems': number; + 'hydra:member': T[]; + 'hydra:view'?: { + '@id': string; + '@type': string; + 'hydra:first'?: string; + 'hydra:last'?: string; + 'hydra:next'?: string; + 'hydra:previous'?: string; + }; +} diff --git a/frontend/src/lib/types/index.ts b/frontend/src/lib/types/index.ts new file mode 100644 index 0000000..52a4150 --- /dev/null +++ b/frontend/src/lib/types/index.ts @@ -0,0 +1,2 @@ +export * from './shared'; +export * from './api'; diff --git a/frontend/src/lib/types/shared.ts b/frontend/src/lib/types/shared.ts new file mode 100644 index 0000000..b3a8b65 --- /dev/null +++ b/frontend/src/lib/types/shared.ts @@ -0,0 +1,27 @@ +// Branded types for type safety +export type TenantId = string & { readonly brand: unique symbol }; +export type UserId = string & { readonly brand: unique symbol }; +export type NoteId = string & { readonly brand: unique symbol }; +export type ClasseId = string & { readonly brand: unique symbol }; +export type EleveId = string & { readonly brand: unique symbol }; + +// Helper functions for branded types +export function createTenantId(id: string): TenantId { + return id as TenantId; +} + +export function createUserId(id: string): UserId { + return id as UserId; +} + +export function createNoteId(id: string): NoteId { + return id as NoteId; +} + +export function createClasseId(id: string): ClasseId { + return id as ClasseId; +} + +export function createEleveId(id: string): EleveId { + return id as EleveId; +} diff --git a/frontend/src/routes/+layout.svelte b/frontend/src/routes/+layout.svelte new file mode 100644 index 0000000..e56d869 --- /dev/null +++ b/frontend/src/routes/+layout.svelte @@ -0,0 +1,23 @@ + + + + {@render children()} + diff --git a/frontend/src/routes/+page.svelte b/frontend/src/routes/+page.svelte new file mode 100644 index 0000000..e08bce6 --- /dev/null +++ b/frontend/src/routes/+page.svelte @@ -0,0 +1,28 @@ + + + + Classeo + + +
+
+

Bienvenue sur Classeo

+

Application de gestion scolaire

+ +
+

Compteur: {count}

+ +
+
+
diff --git a/frontend/static/pwa-192x192.png b/frontend/static/pwa-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..06b0dfbefb84425f1dc779ce63941773f6bf1bcc GIT binary patch literal 28612 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 literal 0 HcmV?d00001 diff --git a/frontend/static/pwa-512x512.png b/frontend/static/pwa-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..2ced50df83244d76268df4483a8bfa26dd80f08c GIT binary patch literal 120176 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 literal 0 HcmV?d00001 diff --git a/frontend/svelte.config.js b/frontend/svelte.config.js new file mode 100644 index 0000000..a8716e7 --- /dev/null +++ b/frontend/svelte.config.js @@ -0,0 +1,21 @@ +import adapter from '@sveltejs/adapter-node'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + preprocess: vitePreprocess(), + + kit: { + adapter: adapter(), + alias: { + $components: 'src/lib/components', + $features: 'src/lib/features', + $stores: 'src/lib/stores', + $api: 'src/lib/api', + $utils: 'src/lib/utils', + $types: 'src/lib/types' + } + } +}; + +export default config; diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js new file mode 100644 index 0000000..c64286d --- /dev/null +++ b/frontend/tailwind.config.js @@ -0,0 +1,53 @@ +/** @type {import('tailwindcss').Config} */ +export default { + darkMode: 'class', + content: ['./src/**/*.{html,js,svelte,ts}'], + theme: { + extend: { + colors: { + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))' + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))' + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))' + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))' + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))' + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))' + }, + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))' + } + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)' + }, + fontFamily: { + sans: ['Inter', 'system-ui', 'sans-serif'] + } + } + }, + plugins: [require('@tailwindcss/forms'), require('@tailwindcss/typography')] +}; diff --git a/frontend/tests/unit/example.test.ts b/frontend/tests/unit/example.test.ts new file mode 100644 index 0000000..85373f5 --- /dev/null +++ b/frontend/tests/unit/example.test.ts @@ -0,0 +1,21 @@ +import { describe, it, expect } from 'vitest'; + +describe('Math operations', () => { + it('should add two numbers correctly', () => { + expect(1 + 1).toBe(2); + }); + + it('should multiply two numbers correctly', () => { + expect(2 * 3).toBe(6); + }); +}); + +describe('String operations', () => { + it('should concatenate strings', () => { + expect('Hello' + ' ' + 'World').toBe('Hello World'); + }); + + it('should convert to uppercase', () => { + expect('classeo'.toUpperCase()).toBe('CLASSEO'); + }); +}); diff --git a/frontend/tests/unit/page.test.ts b/frontend/tests/unit/page.test.ts new file mode 100644 index 0000000..7c3e5fb --- /dev/null +++ b/frontend/tests/unit/page.test.ts @@ -0,0 +1,23 @@ +import { render, screen } from '@testing-library/svelte'; +import { describe, expect, it } from 'vitest'; +import Page from '../../src/routes/+page.svelte'; + +describe('Home Page', () => { + it('renders the welcome message', () => { + render(Page); + + expect(screen.getByRole('heading', { name: 'Bienvenue sur Classeo' })).toBeTruthy(); + }); + + it('renders the description', () => { + render(Page); + + expect(screen.getByText('Application de gestion scolaire')).toBeTruthy(); + }); + + it('starts counter at 0', () => { + render(Page); + + expect(screen.getByText('Compteur: 0')).toBeTruthy(); + }); +}); diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 0000000..e946222 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "exactOptionalPropertyTypes": true, + "moduleResolution": "bundler" + } +} diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts new file mode 100644 index 0000000..1e9f39a --- /dev/null +++ b/frontend/vite.config.ts @@ -0,0 +1,74 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import { SvelteKitPWA } from '@vite-pwa/sveltekit'; +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + plugins: [ + sveltekit(), + SvelteKitPWA({ + srcDir: 'src', + mode: 'development', + strategies: 'generateSW', + scope: '/', + base: '/', + manifest: { + name: 'Classeo', + short_name: 'Classeo', + description: 'Application de gestion scolaire', + theme_color: '#3b82f6', + background_color: '#ffffff', + display: 'standalone', + start_url: '/', + icons: [ + { + src: 'pwa-192x192.png', + sizes: '192x192', + type: 'image/png' + }, + { + src: 'pwa-512x512.png', + sizes: '512x512', + type: 'image/png' + }, + { + src: 'pwa-512x512.png', + sizes: '512x512', + type: 'image/png', + purpose: 'any maskable' + } + ] + }, + workbox: { + globPatterns: ['**/*.{js,css,html,ico,png,svg,webp,woff,woff2}'] + }, + devOptions: { + enabled: false, + type: 'module', + navigateFallback: '/' + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + }) as any + ], + test: { + include: ['src/**/*.{test,spec}.{js,ts}', 'tests/**/*.{test,spec}.{js,ts}'], + globals: true, + environment: 'jsdom', + server: { + deps: { + inline: [/svelte/] + } + }, + alias: { + $lib: '/src/lib', + $app: '/node_modules/@sveltejs/kit/src/runtime/app' + } + }, + resolve: { + conditions: ['browser'] + }, + server: { + host: '0.0.0.0', + port: 5173, + strictPort: true + } +}); diff --git a/scripts/check-bc-isolation.sh b/scripts/check-bc-isolation.sh new file mode 100755 index 0000000..5353a3c --- /dev/null +++ b/scripts/check-bc-isolation.sh @@ -0,0 +1,67 @@ +#!/bin/bash +# ============================================================================= +# Bounded Context Isolation Check +# Ensures Domain layer has no framework dependencies +# ============================================================================= + +set -e + +RED='\033[0;31m' +GREEN='\033[0;32m' +NC='\033[0m' # No Color + +ERRORS=0 + +echo "Checking Bounded Context isolation..." +echo "" + +# Define forbidden imports in Domain layer +FORBIDDEN_PATTERNS=( + "use Symfony\\\\" + "use Doctrine\\\\" + "use ApiPlatform\\\\" + "use Lexik\\\\" + "#\[ORM\\\\" + "#\[ApiResource" + "#\[Assert\\\\" +) + +# Check each BC Domain folder +for BC in Administration Scolarite VieScolaire Communication; do + DOMAIN_PATH="backend/src/${BC}/Domain" + + if [ -d "$DOMAIN_PATH" ]; then + echo "Checking ${BC}/Domain..." + + for pattern in "${FORBIDDEN_PATTERNS[@]}"; do + # Use grep with -r for recursive, -n for line numbers + if grep -rn "$pattern" "$DOMAIN_PATH" 2>/dev/null; then + echo -e "${RED}ERROR: Found forbidden import pattern '$pattern' in ${BC}/Domain${NC}" + ERRORS=$((ERRORS + 1)) + fi + done + fi +done + +# Check Shared/Domain as well +SHARED_DOMAIN="backend/src/Shared/Domain" +if [ -d "$SHARED_DOMAIN" ]; then + echo "Checking Shared/Domain..." + + for pattern in "${FORBIDDEN_PATTERNS[@]}"; do + if grep -rn "$pattern" "$SHARED_DOMAIN" 2>/dev/null; then + echo -e "${RED}ERROR: Found forbidden import pattern '$pattern' in Shared/Domain${NC}" + ERRORS=$((ERRORS + 1)) + fi + done +fi + +echo "" +if [ $ERRORS -gt 0 ]; then + echo -e "${RED}BC Isolation check FAILED with $ERRORS error(s)${NC}" + echo "Domain layer must be pure PHP without framework dependencies." + exit 1 +else + echo -e "${GREEN}BC Isolation check PASSED${NC}" + exit 0 +fi diff --git a/scripts/check-naming.sh b/scripts/check-naming.sh new file mode 100755 index 0000000..049a0b7 --- /dev/null +++ b/scripts/check-naming.sh @@ -0,0 +1,114 @@ +#!/bin/bash +# ============================================================================= +# Naming Conventions Check +# Ensures code follows Classeo naming conventions +# ============================================================================= + +set -e + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +WARNINGS=0 +ERRORS=0 + +echo "Checking naming conventions..." +echo "" + +# ============================================================================= +# PHP Backend Checks +# ============================================================================= + +echo "=== PHP Backend Checks ===" + +# Check all PHP files have declare(strict_types=1) on line 1 or 3 (after opening tag) +echo "Checking strict_types declarations..." +for file in $(find backend/src -name "*.php" 2>/dev/null); do + if ! grep -q "declare(strict_types=1)" "$file"; then + echo -e "${RED}ERROR: Missing declare(strict_types=1) in $file${NC}" + ERRORS=$((ERRORS + 1)) + fi +done + +# Check that Value Objects are readonly +echo "Checking Value Objects are readonly..." +for file in $(find backend/src -path "*/Domain/Model/*Id.php" 2>/dev/null); do + if ! grep -q "readonly class" "$file"; then + echo -e "${YELLOW}WARNING: Value Object should be readonly: $file${NC}" + WARNINGS=$((WARNINGS + 1)) + fi +done + +# Check Domain Events naming (should end with past tense verbs) +echo "Checking Domain Event naming..." +for file in $(find backend/src -path "*/Domain/Event/*.php" 2>/dev/null); do + filename=$(basename "$file" .php) + # Events should end with past tense (ed, en, etc.) + if [[ ! "$filename" =~ (ed|en|t|Created|Updated|Deleted|Recorded|Registered|Assigned|Completed)$ ]]; then + echo -e "${YELLOW}WARNING: Domain Event should use past tense: $filename${NC}" + WARNINGS=$((WARNINGS + 1)) + fi +done + +# ============================================================================= +# Frontend Checks +# ============================================================================= + +echo "" +echo "=== Frontend Checks ===" + +# Check Svelte components are PascalCase +echo "Checking Svelte component naming..." +for file in $(find frontend/src -name "*.svelte" 2>/dev/null); do + filename=$(basename "$file" .svelte) + # Skip +page.svelte, +layout.svelte, +error.svelte + if [[ "$filename" != +* ]]; then + # Check first character is uppercase + if [[ ! "$filename" =~ ^[A-Z] ]]; then + echo -e "${YELLOW}WARNING: Svelte component should be PascalCase: $file${NC}" + WARNINGS=$((WARNINGS + 1)) + fi + fi +done + +# Check for Svelte 4 patterns (forbidden) +echo "Checking for Svelte 4 patterns (should use Svelte 5 runes)..." +for file in $(find frontend/src -name "*.svelte" -o -name "*.ts" 2>/dev/null); do + # Check for writable/readable stores (Svelte 4) + if grep -q "from 'svelte/store'" "$file" 2>/dev/null; then + echo -e "${RED}ERROR: Using svelte/store (Svelte 4) instead of runes: $file${NC}" + ERRORS=$((ERRORS + 1)) + fi + + # Check for on:click (Svelte 4) instead of onclick (Svelte 5) + if grep -q "on:click" "$file" 2>/dev/null; then + echo -e "${RED}ERROR: Using on:click (Svelte 4) instead of onclick (Svelte 5): $file${NC}" + ERRORS=$((ERRORS + 1)) + fi + + # Check for export let (Svelte 4) instead of $props (Svelte 5) + if grep -q "export let" "$file" 2>/dev/null; then + echo -e "${RED}ERROR: Using 'export let' (Svelte 4) instead of \$props (Svelte 5): $file${NC}" + ERRORS=$((ERRORS + 1)) + fi +done + +# ============================================================================= +# Summary +# ============================================================================= + +echo "" +echo "=== Summary ===" + +if [ $ERRORS -gt 0 ]; then + echo -e "${RED}Naming check FAILED with $ERRORS error(s) and $WARNINGS warning(s)${NC}" + exit 1 +elif [ $WARNINGS -gt 0 ]; then + echo -e "${YELLOW}Naming check PASSED with $WARNINGS warning(s)${NC}" + exit 0 +else + echo -e "${GREEN}Naming check PASSED${NC}" + exit 0 +fi