From 51bc906792f7476d0fb93ca633edcfb8ea42599f Mon Sep 17 00:00:00 2001 From: Stephanos A Date: Thu, 21 May 2026 08:48:28 +0300 Subject: [PATCH] Refactored the whole app based on the requirements shared --- README.md | 584 +- apps/edr-passenger-api/.env.example | 52 +- apps/edr-passenger-api/.npmrc | 6 + apps/edr-passenger-api/SEGMENT_BASED_SEATS.md | 364 - apps/edr-passenger-api/package.json | 4 +- .../migration.sql | 31 - .../migration.sql | 63 - .../migration.sql | 463 +- .../migration.sql | 2 + .../migration.sql | 74 + .../edr-passenger-api/prisma/reset-admin.d.ts | 2 - .../prisma/reset-admin.d.ts.map | 1 - apps/edr-passenger-api/prisma/reset-admin.js | 49 - .../prisma/reset-admin.js.map | 1 - apps/edr-passenger-api/prisma/reset-admin.ts | 16 - apps/edr-passenger-api/prisma/schema.prisma | 288 +- apps/edr-passenger-api/prisma/seed.d.ts | 2 - apps/edr-passenger-api/prisma/seed.d.ts.map | 1 - apps/edr-passenger-api/prisma/seed.js | 73 - apps/edr-passenger-api/prisma/seed.js.map | 1 - apps/edr-passenger-api/prisma/seed.ts | 231 +- apps/edr-passenger-api/src/app.module.ts | 27 +- .../src/common/i18n/i18n.module.ts | 9 + .../src/common/i18n/i18n.service.spec.ts | 49 + .../src/common/i18n/i18n.service.ts | 63 + .../src/common/i18n/locale.decorator.ts | 9 + .../src/common/i18n/locale.middleware.ts | 16 + .../src/common/i18n/translations/am.json | 23 + .../src/common/i18n/translations/en.json | 23 + .../src/common/i18n/translations/fr.json | 23 + .../src/common/i18n/translations/om.json | 23 + .../src/common/iam-adapter.spec.ts | 264 + .../src/common/iam-adapter.ts | 144 + .../src/common/iam.module.ts | 11 + .../session-activity.interceptor.ts | 49 + .../src/common/prisma.module.ts | 3 +- .../src/common/roles.decorator.ts | 5 + .../src/common/roles.guard.ts | 19 + .../src/config/card.config.ts | 9 + .../src/config/cbe.config.ts | 9 + .../src/config/ebirr.config.ts | 9 + apps/edr-passenger-api/src/main.ts | 210 +- .../src/modules/agents/agents.controller.ts | 57 + .../src/modules/agents/agents.dto.ts | 33 + .../src/modules/agents/agents.module.ts | 12 + .../src/modules/agents/agents.service.ts | 131 + .../src/modules/auth/auth.controller.ts | 73 +- .../src/modules/auth/auth.dto.ts | 154 +- .../src/modules/auth/auth.service.ts | 106 +- .../modules/bookings/bookings.controller.ts | 31 +- .../src/modules/bookings/bookings.dto.ts | 20 +- .../src/modules/bookings/bookings.service.ts | 91 +- .../src/modules/fraud/fraud.controller.ts | 74 + .../src/modules/fraud/fraud.module.ts | 12 + .../src/modules/fraud/fraud.service.ts | 252 + .../notifications/notification.adapters.ts | 216 + .../notifications/notifications.controller.ts | 29 +- .../notifications/notifications.dto.ts | 20 +- .../notifications/notifications.module.ts | 9 +- .../notifications/notifications.service.ts | 260 +- .../src/modules/payments/payments.e2e-spec.ts | 270 + .../src/modules/payments/payments.module.ts | 18 +- .../modules/payments/payments.service.spec.ts | 328 + .../src/modules/payments/payments.service.ts | 49 +- .../payments/providers/card.provider.ts | 218 + .../payments/providers/cbe-birr.provider.ts | 215 + .../payments/providers/ebirr.provider.ts | 228 + .../payments/webhooks/card-webhook.service.ts | 147 + .../webhooks/cbe-birr-webhook.service.ts | 133 + .../webhooks/ebirr-webhook.service.ts | 133 + .../payments/webhooks/webhooks.controller.ts | 63 +- .../src/modules/reports/reports.controller.ts | 35 + .../src/modules/reports/reports.dto.ts | 29 + .../src/modules/reports/reports.module.ts | 12 + .../src/modules/reports/reports.service.ts | 185 + .../src/modules/search/search.dto.ts | 6 +- .../src/modules/search/search.service.ts | 28 +- .../src/modules/seats/seats.controller.ts | 16 + .../src/modules/seats/seats.service.spec.ts | 82 + .../src/modules/seats/seats.service.ts | 122 + .../src/modules/tickets/tickets.controller.ts | 38 +- .../modules/tickets/tickets.service.spec.ts | 126 + .../src/modules/tickets/tickets.service.ts | 115 +- pnpm-lock.yaml | 12058 +--------------- 84 files changed, 6880 insertions(+), 12659 deletions(-) create mode 100644 apps/edr-passenger-api/.npmrc delete mode 100644 apps/edr-passenger-api/SEGMENT_BASED_SEATS.md delete mode 100644 apps/edr-passenger-api/prisma/migrations/20260515133041_segment_updates/migration.sql delete mode 100644 apps/edr-passenger-api/prisma/migrations/20260516170103_add_telebirr_async_fields/migration.sql rename apps/edr-passenger-api/prisma/migrations/{20260513080558_initial_migration => 20260519124728_initial_migration}/migration.sql (59%) create mode 100644 apps/edr-passenger-api/prisma/migrations/20260520000002_language_field_note/migration.sql create mode 100644 apps/edr-passenger-api/prisma/migrations/20260521000001_add_fraud_detection/migration.sql delete mode 100644 apps/edr-passenger-api/prisma/reset-admin.d.ts delete mode 100644 apps/edr-passenger-api/prisma/reset-admin.d.ts.map delete mode 100644 apps/edr-passenger-api/prisma/reset-admin.js delete mode 100644 apps/edr-passenger-api/prisma/reset-admin.js.map delete mode 100644 apps/edr-passenger-api/prisma/reset-admin.ts delete mode 100644 apps/edr-passenger-api/prisma/seed.d.ts delete mode 100644 apps/edr-passenger-api/prisma/seed.d.ts.map delete mode 100644 apps/edr-passenger-api/prisma/seed.js delete mode 100644 apps/edr-passenger-api/prisma/seed.js.map create mode 100644 apps/edr-passenger-api/src/common/i18n/i18n.module.ts create mode 100644 apps/edr-passenger-api/src/common/i18n/i18n.service.spec.ts create mode 100644 apps/edr-passenger-api/src/common/i18n/i18n.service.ts create mode 100644 apps/edr-passenger-api/src/common/i18n/locale.decorator.ts create mode 100644 apps/edr-passenger-api/src/common/i18n/locale.middleware.ts create mode 100644 apps/edr-passenger-api/src/common/i18n/translations/am.json create mode 100644 apps/edr-passenger-api/src/common/i18n/translations/en.json create mode 100644 apps/edr-passenger-api/src/common/i18n/translations/fr.json create mode 100644 apps/edr-passenger-api/src/common/i18n/translations/om.json create mode 100644 apps/edr-passenger-api/src/common/iam-adapter.spec.ts create mode 100644 apps/edr-passenger-api/src/common/iam-adapter.ts create mode 100644 apps/edr-passenger-api/src/common/iam.module.ts create mode 100644 apps/edr-passenger-api/src/common/interceptors/session-activity.interceptor.ts create mode 100644 apps/edr-passenger-api/src/common/roles.decorator.ts create mode 100644 apps/edr-passenger-api/src/common/roles.guard.ts create mode 100644 apps/edr-passenger-api/src/config/card.config.ts create mode 100644 apps/edr-passenger-api/src/config/cbe.config.ts create mode 100644 apps/edr-passenger-api/src/config/ebirr.config.ts create mode 100644 apps/edr-passenger-api/src/modules/agents/agents.controller.ts create mode 100644 apps/edr-passenger-api/src/modules/agents/agents.dto.ts create mode 100644 apps/edr-passenger-api/src/modules/agents/agents.module.ts create mode 100644 apps/edr-passenger-api/src/modules/agents/agents.service.ts create mode 100644 apps/edr-passenger-api/src/modules/fraud/fraud.controller.ts create mode 100644 apps/edr-passenger-api/src/modules/fraud/fraud.module.ts create mode 100644 apps/edr-passenger-api/src/modules/fraud/fraud.service.ts create mode 100644 apps/edr-passenger-api/src/modules/notifications/notification.adapters.ts create mode 100644 apps/edr-passenger-api/src/modules/payments/payments.e2e-spec.ts create mode 100644 apps/edr-passenger-api/src/modules/payments/payments.service.spec.ts create mode 100644 apps/edr-passenger-api/src/modules/payments/providers/card.provider.ts create mode 100644 apps/edr-passenger-api/src/modules/payments/providers/cbe-birr.provider.ts create mode 100644 apps/edr-passenger-api/src/modules/payments/providers/ebirr.provider.ts create mode 100644 apps/edr-passenger-api/src/modules/payments/webhooks/card-webhook.service.ts create mode 100644 apps/edr-passenger-api/src/modules/payments/webhooks/cbe-birr-webhook.service.ts create mode 100644 apps/edr-passenger-api/src/modules/payments/webhooks/ebirr-webhook.service.ts create mode 100644 apps/edr-passenger-api/src/modules/reports/reports.controller.ts create mode 100644 apps/edr-passenger-api/src/modules/reports/reports.dto.ts create mode 100644 apps/edr-passenger-api/src/modules/reports/reports.module.ts create mode 100644 apps/edr-passenger-api/src/modules/reports/reports.service.ts create mode 100644 apps/edr-passenger-api/src/modules/seats/seats.service.spec.ts create mode 100644 apps/edr-passenger-api/src/modules/tickets/tickets.service.spec.ts diff --git a/README.md b/README.md index 33f22dc0a..eb7cccae0 100644 --- a/README.md +++ b/README.md @@ -1,141 +1,513 @@ -# EDR Passenger API +# EDR Platform - Ethio-Djibouti Railway Passenger API -NestJS REST API for the Ethio-Djibouti Railway passenger platform. Handles booking lifecycle, seat inventory, payments (Telebirr, CBE Birr, eBirr, Card, Wallet), loyalty, live tracking, notifications, and support. +Enterprise-grade NestJS REST API for the Ethio-Djibouti Railway passenger booking and management platform. Built with TypeScript, PostgreSQL, and Prisma ORM. -## Tech Stack +## πŸš€ Features -- **Runtime**: Node.js 20, TypeScript -- **Framework**: NestJS 11 -- **Database**: PostgreSQL via Prisma ORM -- **Auth**: JWT (Passport) -- **Docs**: Swagger / OpenAPI (`/api-docs`) -- **Package manager**: pnpm 9 +### Core Modules +- **Authentication & Authorization** - Dual authentication system: + - **Passenger Auth**: JWT-based auth with OTP verification, password reset, account lockout + - **Corporate IAM**: Integration with @tria-plc corporate identity system for back-office operations (agents, supervisors, admins) + - Role-based access control (RBAC) with granular permissions +- **Booking Management** - Complete booking lifecycle with modification, cancellation, refunds, and fare breakdown +- **Payment Integration** - Multi-provider support (Telebirr, CBE Birr, eBirr, Card, Wallet) with webhook handling +- **Seat Management** - Real-time seat inventory, holds, releases, and blocking with coach/class management +- **Ticketing** - QR code and barcode generation, PDF tickets, gate validation with audit logs +- **Agent Operations** - Counter booking, shift management, commission tracking, and reconciliation +- **Passenger Services** - Profile management, traveler profiles, saved routes, and preferences +- **Loyalty Program** - Points accumulation, tier management (Bronze/Silver/Gold/Platinum), and rewards +- **Wallet System** - Balance management, top-up, transaction ledger +- **Live Tracking** - Real-time trip status, location updates, delay notifications, crowd signals +- **Notifications** - Multi-channel (Email, SMS, Push) with templating engine +- **Support System** - FAQ management, live chat conversations +- **Reports & Analytics** - Revenue reports, occupancy analytics, agent sales tracking +- **Route Management** - Route configuration, stops, fare rules, baggage allowance -## Prerequisites +### Technical Features +- **Security** - Password hashing (bcrypt), JWT tokens, rate limiting, audit logging +- **Validation** - Request validation with class-validator, DTO transformation +- **Documentation** - Auto-generated Swagger/OpenAPI docs at `/api-docs` +- **Error Handling** - Global exception filters with standardized error responses +- **Database** - PostgreSQL with Prisma ORM, migrations, and comprehensive seeding +- **Scheduling** - Cron jobs for automated tasks (seat release, report generation) +- **Event System** - Event-driven architecture with @nestjs/event-emitter -- Node.js >= 20 -- pnpm >= 9 (`npm i -g pnpm`) -- PostgreSQL 15+ +## πŸ“‹ Prerequisites -## Quick Start +- **Node.js** >= 20.x +- **pnpm** >= 9.x (`npm install -g pnpm`) +- **PostgreSQL** >= 15.x +- **Git** +## πŸ› οΈ Installation & Setup + +### 1. Clone Repository ```bash -# 1. Install dependencies (from monorepo root) -pnpm install +git clone +cd edr-platform +``` -# 2. Copy and fill environment variables +### 2. Install Dependencies +```bash +pnpm install +``` + +### 3. Environment Configuration +```bash +# Copy environment template cp apps/edr-passenger-api/.env.example apps/edr-passenger-api/.env -# 3. Generate Prisma client +# Edit .env file with your configuration +``` + +#### Required Environment Variables + +| Variable | Description | Example | +|----------|-------------|---------| +| `NODE_ENV` | Environment mode | `development` | +| `PORT` | HTTP server port | `4000` | +| `DATABASE_URL` | PostgreSQL connection string | `postgresql://user:pass@localhost:5432/edr_passenger` | +| `JWT_SECRET` | JWT signing secret (change in production) | `your-secret-key` | +| `JWT_EXPIRES_IN` | JWT token expiry | `7d` | +| `FRONTEND_URL` | Web app CORS origin | `http://localhost:3000` | +| `PORTAL_URL` | Admin portal CORS origin | `http://localhost:3001` | +| `SENDGRID_API_KEY` | SendGrid API key (optional) | `SG.xxx` | +| `SENDGRID_FROM_EMAIL` | Email sender address | `noreply@edr-platform.com` | + +#### Corporate IAM Configuration (Back-office Authentication) + +| Variable | Description | Example | +|----------|-------------|---------| +| `IAM_ENABLED` | Enable corporate IAM integration | `true` or `false` | +| `IAM_API_URL` | Corporate IAM API endpoint | `https://iam.tria-plc.com/api` | +| `IAM_API_KEY` | API key for IAM service | `your-iam-api-key` | + +**Note:** When `IAM_ENABLED=false`, IAM-protected routes allow access without validation (development mode only). + +#### Optional: Payment Provider Configuration +```bash +# Telebirr Configuration +TELEBIRR_BASE_URL=https://api.telebirr.com +TELEBIRR_MERCHANT_CODE=your-merchant-code +TELEBIRR_APP_SECRET=your-app-secret +# ... see .env.example for complete list +``` + +### 4. Database Setup + +#### Start PostgreSQL +```bash +# Using Docker (recommended) +docker run --name edr-postgres \ + -e POSTGRES_USER=edr \ + -e POSTGRES_PASSWORD=edr_secret \ + -e POSTGRES_DB=edr_passenger \ + -p 5432:5432 \ + -d postgres:15 + +# Or use your local PostgreSQL installation +``` + +#### Generate Prisma Client +```bash pnpm --filter @edr/passenger-api run prisma:generate +``` -# 4. Run database migrations +#### Run Migrations +```bash pnpm --filter @edr/passenger-api run prisma:migrate +``` -# 5. Seed the database +#### Seed Database +```bash pnpm --filter @edr/passenger-api run prisma:seed +``` -# 6. Start in development mode +**Seed Data Includes:** +- 5 Stations (Addis Ababa, Adama, Awash, Dire Dawa, Djibouti) +- 1 Route with 5 stops and fare rules +- 2 Train services with 2 trips +- 360 seats across 6 coaches (Economy, Bed, VIP classes) +- 3 User accounts (Admin, Passenger, Agent) +- Baggage allowance rules +- Notification templates +- Promotions and FAQ content +- Menu items and station crowd signals + +### 5. Start Development Server +```bash pnpm --filter @edr/passenger-api run dev ``` -API runs at **http://localhost:4000** -Swagger UI at **http://localhost:4000/api-docs** +**API Server:** http://localhost:4000 +**Swagger Docs:** http://localhost:4000/api-docs -## Environment Variables +## πŸ”‘ Default Credentials -| Variable | Description | Default | -| --------------------- | ------------------------------------ | -------------------------------- | -| `PORT` | HTTP port | `4000` | -| `DATABASE_URL` | PostgreSQL connection string | β€” | -| `JWT_SECRET` | JWT signing secret | β€” | -| `JWT_EXPIRES_IN` | JWT expiry | `7d` | -| `FRONTEND_URL` | Allowed CORS origin (web app) | `http://localhost:3000` | -| `PORTAL_URL` | Allowed CORS origin (portal) | `http://localhost:3001` | -| `SENDGRID_API_KEY` | SendGrid key for email notifications | _(optional β€” logs if absent)_ | -| `SENDGRID_FROM_EMAIL` | Sender email address | `noreply@edr-platform.com` | +After seeding, use these credentials to test the API: -## API Modules +| Role | Email | Password | Description | +|------|-------|----------|-------------| +| **Admin** | `admin@edr-platform.com` | `admin123` | Full system access, reports, agent management | +| **Passenger** | `kelemu@email.com` | `password123` | Regular user with loyalty (Silver) and wallet | +| **Agent** | `agent@edr-platform.com` | `agent123` | Counter booking agent with commission tracking | -| Tag | Base path | Description | -| -------------- | ----------------- | ---------------------------------------- | -| Auth | `/auth` | Register, login, JWT | -| Stations | `/stations` | Station directory | -| Fleet | `/fleet` | Train services, coaches, seat batches | -| Schedule | `/schedule` | Trips, fare rules, status updates | -| Search | `/search` | Trip search, fare quotes | -| Seats | `/seats` | Seat maps, holds, releases | -| Booking | `/bookings` | Create, retrieve, cancel bookings | -| Payment | `/payments` | Initiate payment, refunds, methods | -| Tickets | `/tickets` | QR ticket generation and validation | -| Passenger | `/passengers` | Profiles, traveler profiles, saved routes| -| Notifications | `/notifications` | In-app notifications | -| Loyalty | `/loyalty` | Points, tiers, rewards | -| Wallet | `/wallet` | Balance, top-up, ledger | -| Promotions | `/promos` | Active promos, promo code validation | -| Live Tracking | `/live` | Real-time trip status, crowd signals | -| Support | `/support` | FAQ, chat conversations | -| Dashboard | `/dashboard` | Home screen aggregate | +## πŸ“š API Documentation -## Seed Credentials +### Swagger UI +Interactive API documentation available at: **http://localhost:4000/api-docs** -After running `prisma:seed`: +### Authentication Methods -| Role | Email | Password | -| --------- | ------------------------ | ------------- | -| Passenger | `kelemu@email.com` | `password123` | -| Admin | `admin@edr-platform.com` | `admin123` | +The API uses two authentication schemes: -## Docker +#### 1. JWT Authentication (Passenger-facing) +- **Used for**: Passenger bookings, profile management, wallet, loyalty +- **Header**: `Authorization: Bearer ` +- **Obtain token**: `POST /auth/login` with passenger credentials +- **Swagger Security**: `JWT-auth` + +#### 2. IAM Authentication (Back-office) +- **Used for**: Agent operations, fraud detection, reports, admin functions +- **Header**: `Authorization: Bearer ` +- **Obtain token**: From corporate IAM system (https://iam.tria-plc.com) +- **Swagger Security**: `IAM-auth` +- **Roles**: AGENT, SUPERVISOR, ADMIN, STAFF + +### API Endpoints Overview + +| Module | Base Path | Auth Type | Description | +|--------|-----------|-----------|-------------| +| **Auth** | `/auth` | Public/JWT | Register, login, OTP verification, password reset | +| **Agents** | `/agents` | IAM | Agent booking, shifts, commissions, reconciliation | +| **Fraud Detection** | `/fraud` | IAM | Fraud alerts, rules management, user blocking | +| **Reports** | `/reports` | IAM | Revenue, occupancy, agent sales analytics | +| **Stations** | `/stations` | JWT | Station directory and information | +| **Fleet** | `/fleet` | JWT/IAM | Train services, coaches, seat configurations | +| **Schedules** | `/schedules` | JWT/IAM | Trip schedules, fare rules, status updates | +| **Search** | `/search` | JWT | Trip search, availability, fare quotes | +| **Seats** | `/seats` | JWT/IAM | Seat maps, holds, releases, blocking | +| **Bookings** | `/bookings` | JWT | Create, modify, cancel bookings | +| **Payments** | `/payments` | JWT/Public | Payment initiation, webhooks, refunds | +| **Tickets** | `/tickets` | JWT/IAM | Ticket generation, QR/barcode, validation | +| **Passengers** | `/passengers` | JWT | Profile management, traveler profiles | +| **Notifications** | `/notifications` | JWT | In-app notifications, preferences | +| **Loyalty** | `/loyalty` | JWT | Points, tiers, rewards redemption | +| **Wallet** | `/wallet` | JWT | Balance, top-up, transaction history | +| **Promotions** | `/promos` | JWT | Active promotions, promo code validation | +| **Live Tracking** | `/live` | JWT | Real-time trip status, crowd signals | +| **Support** | `/support` | JWT | FAQ, chat conversations | +| **Dashboard** | `/dashboard` | JWT | Home screen aggregated data | + +### Example API Calls + +#### 1. Register Passenger +```bash +POST /auth/register +Content-Type: application/json + +{ + "email": "user@example.com", + "phone": "+251911234567", + "fullName": "John Doe", + "password": "SecurePass123" +} +``` + +#### 2. Login (Passenger) +```bash +POST /auth/login +Content-Type: application/json + +{ + "email": "user@example.com", + "password": "SecurePass123" +} + +# Response includes JWT token +{ + "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", + "user": { "id": "uuid", "role": "PASSENGER" } +} +``` + +#### 2b. Agent Booking (IAM Auth) +```bash +POST /agents/bookings +Authorization: Bearer +Content-Type: application/json + +{ + "tripId": "uuid", + "seats": [...], + "paymentMethod": "CASH", + "cashReceived": 50000 +} +``` + +#### 3. Search Trips +```bash +GET /search/trips?originStationId={id}&destinationStationId={id}&date=2026-06-15 +Authorization: Bearer {token} +``` + +#### 4. Create Booking +```bash +POST /bookings +Authorization: Bearer {token} +Content-Type: application/json + +{ + "tripId": "uuid", + "seats": [ + { + "seatId": "uuid", + "passengerName": "John Doe", + "idDocumentType": "PASSPORT", + "idDocumentNumber": "ET123456" + } + ] +} +``` + +## πŸ—οΈ Project Structure + +``` +apps/edr-passenger-api/ +β”œβ”€β”€ prisma/ +β”‚ β”œβ”€β”€ schema.prisma # Database schema (40+ models) +β”‚ β”œβ”€β”€ seed.ts # Comprehensive seed script +β”‚ └── migrations/ # Database migrations +β”œβ”€β”€ src/ +β”‚ β”œβ”€β”€ common/ # Shared utilities +β”‚ β”‚ β”œβ”€β”€ filters/ # Exception filters +β”‚ β”‚ β”œβ”€β”€ interceptors/ # Response interceptors +β”‚ β”‚ β”œβ”€β”€ pipes/ # Validation pipes +β”‚ β”‚ β”œβ”€β”€ i18n/ # Internationalization +β”‚ β”‚ β”œβ”€β”€ jwt.guard.ts # JWT authentication guard (passengers) +β”‚ β”‚ β”œβ”€β”€ jwt.strategy.ts # Passport JWT strategy +β”‚ β”‚ β”œβ”€β”€ iam-adapter.ts # Corporate IAM guard (back-office) +β”‚ β”‚ β”œβ”€β”€ iam.module.ts # IAM module +β”‚ β”‚ β”œβ”€β”€ roles.guard.ts # RBAC authorization guard +β”‚ β”‚ β”œβ”€β”€ roles.decorator.ts # Roles decorator +β”‚ β”‚ β”œβ”€β”€ prisma.service.ts # Prisma client service +β”‚ β”‚ └── prisma.module.ts # Prisma module +β”‚ β”œβ”€β”€ config/ # Configuration files +β”‚ β”‚ β”œβ”€β”€ app.config.ts # App configuration +β”‚ β”‚ β”œβ”€β”€ database.config.ts # Database configuration +β”‚ β”‚ └── telebirr.config.ts # Payment provider config +β”‚ β”œβ”€β”€ modules/ # Feature modules +β”‚ β”‚ β”œβ”€β”€ auth/ # Authentication & authorization (JWT) +β”‚ β”‚ β”œβ”€β”€ agents/ # Agent operations (IAM-protected) +β”‚ β”‚ β”œβ”€β”€ bookings/ # Booking management (JWT) +β”‚ β”‚ β”œβ”€β”€ dashboard/ # Dashboard aggregations (JWT) +β”‚ β”‚ β”œβ”€β”€ fleet/ # Train fleet management (JWT/IAM) +β”‚ β”‚ β”œβ”€β”€ fraud/ # Fraud detection (IAM-protected) +β”‚ β”‚ β”œβ”€β”€ live/ # Live tracking (JWT) +β”‚ β”‚ β”œβ”€β”€ loyalty/ # Loyalty program (JWT) +β”‚ β”‚ β”œβ”€β”€ notifications/ # Notification system (JWT) +β”‚ β”‚ β”œβ”€β”€ passengers/ # Passenger management (JWT) +β”‚ β”‚ β”œβ”€β”€ payments/ # Payment processing (JWT/Webhooks) +β”‚ β”‚ β”œβ”€β”€ promos/ # Promotions (JWT) +β”‚ β”‚ β”œβ”€β”€ reports/ # Reports & analytics (IAM-protected) +β”‚ β”‚ β”œβ”€β”€ schedules/ # Trip schedules (JWT/IAM) +β”‚ β”‚ β”œβ”€β”€ search/ # Trip search (JWT) +β”‚ β”‚ β”œβ”€β”€ seats/ # Seat management (JWT/IAM) +β”‚ β”‚ β”œβ”€β”€ segments/ # Journey segments (JWT) +β”‚ β”‚ β”œβ”€β”€ stations/ # Station management (JWT) +β”‚ β”‚ β”œβ”€β”€ support/ # Customer support (JWT) +β”‚ β”‚ β”œβ”€β”€ tickets/ # Ticketing (JWT/IAM) +β”‚ β”‚ └── wallet/ # Wallet system (JWT) +β”‚ β”œβ”€β”€ app.module.ts # Root application module +β”‚ └── main.ts # Application entry point +β”œβ”€β”€ test/ # E2E tests +β”œβ”€β”€ .env.example # Environment template +β”œβ”€β”€ Dockerfile # Docker configuration +β”œβ”€β”€ nest-cli.json # NestJS CLI configuration +β”œβ”€β”€ package.json # Dependencies & scripts +β”œβ”€β”€ tsconfig.json # TypeScript configuration +└── tsconfig.build.json # Build configuration +``` + +## πŸ—„οΈ Database Schema + +### Key Models (40+ total) + +**Core Entities:** +- `User`, `Session`, `Passenger`, `Agent` +- `Station`, `Route`, `RouteStop`, `RouteFareRule` +- `TrainService`, `Trip`, `TripStopTime`, `Coach`, `Seat` +- `Booking`, `BookingSeat`, `Ticket` +- `PaymentIntent`, `PaymentRefund`, `PaymentWebhookEvent` + +**Enhanced Features:** +- `OtpCode`, `PasswordResetToken` (Auth) +- `AgentBooking`, `AgentShift`, `AgentCommission` (Agents) +- `BookingModification`, `BookingCancellation` (Booking lifecycle) +- `GateValidationLog` (Ticket validation) +- `BaggageAllowance`, `BaggageBooking` (Baggage) +- `LoyaltyAccount`, `LoyaltyLedgerEntry`, `LoyaltyReward` +- `WalletAccount`, `WalletLedgerEntry` +- `Notification`, `NotificationTemplate` +- `AuditLog`, `OperationalReport` +- `SeatBlock`, `SeatHold` + +## πŸ”§ Available Scripts ```bash -# Build image (run from monorepo root) +# Development +pnpm --filter @edr/passenger-api run dev # Start with hot-reload + +# Build +pnpm --filter @edr/passenger-api run build # Compile TypeScript + +# Production +pnpm --filter @edr/passenger-api run start # Run compiled code + +# Testing +pnpm --filter @edr/passenger-api run test # Unit tests +pnpm --filter @edr/passenger-api run test:e2e # E2E tests + +# Code Quality +pnpm --filter @edr/passenger-api run lint # ESLint +pnpm --filter @edr/passenger-api run type-check # TypeScript check + +# Database +pnpm --filter @edr/passenger-api run prisma:generate # Generate Prisma client +pnpm --filter @edr/passenger-api run prisma:migrate # Run migrations +pnpm --filter @edr/passenger-api run prisma:seed # Seed database +``` + +## 🐳 Docker Deployment + +### Build Image +```bash +# From monorepo root docker build -f apps/edr-passenger-api/Dockerfile -t edr-passenger-api . - -# Run -docker run -p 4000:4000 --env-file apps/edr-passenger-api/.env edr-passenger-api ``` -## Scripts - -| Command | Description | -| ---------------------- | ------------------------------ | -| `pnpm dev` | Start with hot-reload | -| `pnpm build` | Compile to `dist/` | -| `pnpm start` | Run compiled output | -| `pnpm test` | Run unit tests | -| `pnpm lint` | ESLint | -| `pnpm type-check` | TypeScript type check | -| `pnpm prisma:generate` | Regenerate Prisma client | -| `pnpm prisma:migrate` | Run pending migrations | -| `pnpm prisma:seed` | Seed the database | - -## Project Structure - +### Run Container +```bash +docker run -d \ + --name edr-api \ + -p 4000:4000 \ + --env-file apps/edr-passenger-api/.env \ + edr-passenger-api ``` -src/ -β”œβ”€β”€ common/ # PrismaService, JwtGuard, JwtStrategy, filters, interceptors -β”œβ”€β”€ config/ # app.config.ts, database.config.ts -└── modules/ - β”œβ”€β”€ auth/ - β”œβ”€β”€ stations/ - β”œβ”€β”€ fleet/ - β”œβ”€β”€ schedules/ - β”œβ”€β”€ search/ - β”œβ”€β”€ seats/ - β”œβ”€β”€ bookings/ - β”œβ”€β”€ payments/ - β”œβ”€β”€ tickets/ - β”œβ”€β”€ passengers/ - β”œβ”€β”€ notifications/ - β”œβ”€β”€ loyalty/ - β”œβ”€β”€ wallet/ - β”œβ”€β”€ promos/ - β”œβ”€β”€ live/ - β”œβ”€β”€ support/ - └── dashboard/ -prisma/ -β”œβ”€β”€ schema.prisma -β”œβ”€β”€ seed.ts -└── migrations/ + +### Docker Compose (Recommended) +```yaml +version: '3.8' +services: + postgres: + image: postgres:15 + environment: + POSTGRES_USER: edr + POSTGRES_PASSWORD: edr_secret + POSTGRES_DB: edr_passenger + ports: + - "5432:5432" + volumes: + - postgres_data:/var/lib/postgresql/data + + api: + build: + context: . + dockerfile: apps/edr-passenger-api/Dockerfile + ports: + - "4000:4000" + environment: + DATABASE_URL: postgresql://edr:edr_secret@postgres:5432/edr_passenger + JWT_SECRET: your-secret-key + PORT: 4000 + depends_on: + - postgres + +volumes: + postgres_data: ``` + +## πŸ”’ Security Best Practices + +1. **Environment Variables** - Never commit `.env` files. Use secrets management in production. +2. **JWT Secret** - Use strong, randomly generated secrets (min 32 characters). +3. **Password Hashing** - Bcrypt with salt rounds (default: 10). +4. **Rate Limiting** - Implement rate limiting for auth endpoints. +5. **CORS** - Configure allowed origins in production. +6. **HTTPS** - Always use HTTPS in production. +7. **Database** - Use connection pooling and prepared statements (Prisma handles this). +8. **Audit Logging** - All sensitive operations are logged in `AuditLog` table. +9. **Dual Authentication** - Passenger routes use JWT, back-office routes use corporate IAM. +10. **IAM Integration** - Corporate IAM validates tokens against centralized identity service. +11. **Role-Based Access** - Granular permissions enforced via IAM roles (AGENT, SUPERVISOR, ADMIN). +12. **Token Validation** - IAM tokens validated in real-time with 5-second timeout. + +## πŸ“Š Monitoring & Logging + +- **Application Logs** - NestJS built-in logger +- **Database Queries** - Prisma query logging (enable in development) +- **Audit Trail** - All user actions logged in `AuditLog` table +- **Error Tracking** - Global exception filters with detailed error responses + +## πŸ§ͺ Testing + +```bash +# Unit tests +pnpm --filter @edr/passenger-api run test + +# E2E tests +pnpm --filter @edr/passenger-api run test:e2e + +# Test coverage +pnpm --filter @edr/passenger-api run test:cov +``` + +## πŸš€ Production Deployment + +### Pre-deployment Checklist +- [ ] Update environment variables (JWT_SECRET, DATABASE_URL, etc.) +- [ ] Configure IAM integration (IAM_ENABLED=true, IAM_API_URL, IAM_API_KEY) +- [ ] Set NODE_ENV=production +- [ ] Configure CORS origins (FRONTEND_URL, PORTAL_URL) +- [ ] Set up SSL/TLS certificates +- [ ] Configure database connection pooling +- [ ] Set up monitoring and logging +- [ ] Configure backup strategy +- [ ] Test payment provider integrations +- [ ] Verify IAM token validation endpoint +- [ ] Review security settings and audit logs +- [ ] Test both JWT and IAM authentication flows + +### Deployment Steps +```bash +# 1. Build application +pnpm --filter @edr/passenger-api run build + +# 2. Run migrations +pnpm --filter @edr/passenger-api run prisma:migrate + +# 3. Start production server +NODE_ENV=production pnpm --filter @edr/passenger-api run start:prod +``` + +## 🀝 Contributing + +1. Fork the repository +2. Create feature branch (`git checkout -b feature/amazing-feature`) +3. Commit changes (`git commit -m 'Add amazing feature'`) +4. Push to branch (`git push origin feature/amazing-feature`) +5. Open Pull Request + +## πŸ“ License + +This project is proprietary and confidential. + +## πŸ“§ Support + +For technical support or questions: +- Email: support@edr-platform.com +- Documentation: http://localhost:4000/api-docs + +--- + +**Built with ❀️ for Ethio-Djibouti Railway** diff --git a/apps/edr-passenger-api/.env.example b/apps/edr-passenger-api/.env.example index fa6f76e90..d3f17cdd1 100644 --- a/apps/edr-passenger-api/.env.example +++ b/apps/edr-passenger-api/.env.example @@ -17,6 +17,19 @@ JWT_EXPIRES_IN=7d SENDGRID_API_KEY= SENDGRID_FROM_EMAIL=noreply@edr-platform.com +# SMS Configuration +SMS_PROVIDER=twilio +SMS_API_KEY= + +# Twilio (if SMS_PROVIDER=twilio) +TWILIO_ACCOUNT_SID= +TWILIO_AUTH_TOKEN= +TWILIO_FROM_NUMBER= + +# Africa's Talking (if SMS_PROVIDER=africastalking) +AFRICASTALKING_USERNAME= +AFRICASTALKING_FROM= + # Telebirr TELEBIRR_BASE_URL= TELEBIRR_WEB_BASE_URL= @@ -29,4 +42,41 @@ TELEBIRR_RETURN_URL= TELEBIRR_TIMEOUT_EXPRESS=15m TELEBIRR_PRIVATE_KEY= TELEBIRR_PUBLIC_KEY= -TELEBIRR_INSECURE_TLS=false \ No newline at end of file +TELEBIRR_INSECURE_TLS=false + +# CBE Birr +CBE_BASE_URL= +CBE_MERCHANT_ID= +CBE_SECRET_KEY= +CBE_NOTIFY_URL= +CBE_RETURN_URL= + +# eBirr +EBIRR_BASE_URL= +EBIRR_MERCHANT_CODE= +EBIRR_SECRET_KEY= +EBIRR_NOTIFY_URL= +EBIRR_RETURN_URL= + +# Card Gateway (Stripe-like) +CARD_BASE_URL= +CARD_API_KEY= +CARD_WEBHOOK_SECRET= +CARD_WEBHOOK_URL= +CARD_RETURN_URL= + +# Payment Configuration +PAYMENT_PROVIDERS_ENABLED=TELEBIRR,CBE_BIRR,EBIRR,CARD,WALLET + +# Session Configuration +SESSION_INACTIVITY_MINUTES=30 + +# i18n Configuration +DEFAULT_LOCALE=en +SUPPORTED_LOCALES=en,am,fr,om + +# Corporate IAM Configuration (for back-office authentication) +IAM_ENABLED=false +IAM_API_URL=https://iam.tria-plc.com/api +IAM_API_KEY= +GITHUB_PACKAGE_TOKEN= \ No newline at end of file diff --git a/apps/edr-passenger-api/.npmrc b/apps/edr-passenger-api/.npmrc new file mode 100644 index 000000000..f1a000f80 --- /dev/null +++ b/apps/edr-passenger-api/.npmrc @@ -0,0 +1,6 @@ +# GitHub Packages configuration for @tria-plc scope +@tria-plc:registry=https://npm.pkg.github.com +//npm.pkg.github.com/:_authToken=${GITHUB_PACKAGE_TOKEN} + +# Default registry for other packages +registry=https://registry.npmjs.org/ diff --git a/apps/edr-passenger-api/SEGMENT_BASED_SEATS.md b/apps/edr-passenger-api/SEGMENT_BASED_SEATS.md deleted file mode 100644 index d1d1a6212..000000000 --- a/apps/edr-passenger-api/SEGMENT_BASED_SEATS.md +++ /dev/null @@ -1,364 +0,0 @@ -# Segment-Based Seat Reservation - -## Overview - -This implementation introduces segment-based seat reservation and release logic for the Ethio-Djibouti Railway passenger booking system. It allows passengers to book partial journeys while ensuring optimal seat utilization through automatic release when passengers reach their destinations. - -## Key Features - -- **Segment-based reservations**: Book seats for specific route segments (e.g., Addis Ababa β†’ Dire Dawa) -- **Automatic seat release**: Seats are released when passengers reach their destination -- **Concurrency control**: Database transactions ensure consistency -- **Real-time updates**: Event-driven notifications for seat availability changes -- **Hold expiration**: Automatic cleanup of expired seat holds - -## Route Example - -**Full Route**: Addis Ababa β†’ Adama β†’ Awash β†’ Dire Dawa β†’ Djibouti - -**Passenger Journey**: Addis Ababa β†’ Dire Dawa -- **Segments**: [Addisβ†’Adama, Adamaβ†’Awash, Awashβ†’Dire Dawa] -- **Seat Status**: HELD β†’ BOOKED β†’ AVAILABLE (when reaching Dire Dawa) - -## Database Schema Integration - -### Core Tables Used - -```sql --- Trip and route structure -Trip, TripStopTime, Station - --- Seat management -Seat, SeatHold, BookingSeat, Booking - --- Journey tracking -JourneySegment (stores segment-to-seat mapping) - --- Real-time progress -TripLiveStatus (triggers seat releases) -``` - -### Key Enums - -```typescript -enum SeatStatus { - AVAILABLE = 'AVAILABLE', - HELD = 'HELD', - BOOKED = 'BOOKED', - BLOCKED = 'BLOCKED' -} -``` - -## API Endpoints - -### 1. Check Seat Availability - -```http -GET /segments/seats/availability?tripId=trip_001&originStationId=st_ADD&destinationStationId=st_DRE -``` - -**Response:** -```json -{ - "segments": [ - { "fromName": "Addis Ababa", "toName": "Adama", "fromSequence": 0, "toSequence": 1 }, - { "fromName": "Adama", "toName": "Awash", "fromSequence": 1, "toSequence": 2 }, - { "fromName": "Awash", "toName": "Dire Dawa", "fromSequence": 2, "toSequence": 3 } - ], - "availableSeats": [ - { "id": "seat_1", "label": "1A", "coach": "A", "serviceClass": "ECONOMY" } - ], - "totalAvailable": 1 -} -``` - -### 2. Hold Seats - -```http -POST /segments/seats/hold -``` - -**Request:** -```json -{ - "tripId": "trip_001", - "seatIds": ["seat_1", "seat_2"], - "passengerId": "passenger_123", - "originStationId": "st_ADD", - "destinationStationId": "st_DRE", - "fareQuoteId": "quote_456" -} -``` - -**Response:** -```json -{ - "holdId": "hold_789", - "expiresAt": "2024-01-15T10:10:00Z", - "segments": [ - { "fromName": "Addis Ababa", "toName": "Adama" }, - { "fromName": "Adama", "toName": "Awash" }, - { "fromName": "Awash", "toName": "Dire Dawa" } - ], - "seats": ["seat_1", "seat_2"] -} -``` - -### 3. Confirm Booking - -```http -POST /segments/seats/confirm -``` - -**Request:** -```json -{ - "holdId": "hold_789", - "bookingId": "booking_123" -} -``` - -### 4. Release Seats (Automatic) - -```http -POST /segments/seats/release -``` - -**Request:** -```json -{ - "tripId": "trip_001", - "currentStationId": "st_DRE" -} -``` - -## Database Transaction Flow - -### 1. Seat Hold Transaction - -```typescript -async function holdSeatsTransaction(request: SeatHoldRequest) { - return prisma.$transaction(async (tx) => { - // 1. Validate seat availability - const seats = await tx.seat.findMany({ - where: { id: { in: request.seatIds } } - }); - - // 2. Check for overlapping reservations - for (const seatId of request.seatIds) { - const overlaps = await checkOverlaps(tx, tripId, seatId, segments); - if (overlaps.length > 0) throw new ConflictException(); - } - - // 3. Create hold record - const hold = await tx.seatHold.create({ - data: { - tripId: request.tripId, - seatIds: request.seatIds, - passengerId: request.passengerId, - expiresAt: new Date(Date.now() + 10 * 60 * 1000) - } - }); - - // 4. Update seat status - await tx.seat.updateMany({ - where: { id: { in: request.seatIds } }, - data: { status: 'HELD', heldUntil: hold.expiresAt } - }); - - return hold; - }); -} -``` - -### 2. Booking Confirmation Transaction - -```typescript -async function confirmBookingTransaction(holdId: string, bookingId: string) { - return prisma.$transaction(async (tx) => { - // 1. Validate hold - const hold = await tx.seatHold.findUnique({ where: { id: holdId } }); - if (!hold || hold.expiresAt < new Date()) { - throw new BadRequestException('Hold expired'); - } - - // 2. Create journey segments - for (const seatId of hold.seatIds) { - for (let i = 0; i < segments.length; i++) { - await tx.journeySegment.create({ - data: { - journeyId: bookingId, - tripId: hold.tripId, - segmentOrder: i + 1, - seatId, - departureStationId: segments[i].fromStationId, - arrivalStationId: segments[i].toStationId - } - }); - } - } - - // 3. Update seat status to BOOKED - await tx.seat.updateMany({ - where: { id: { in: hold.seatIds } }, - data: { status: 'BOOKED', heldUntil: null } - }); - - // 4. Delete hold - await tx.seatHold.delete({ where: { id: holdId } }); - - return { bookingId, confirmedSeats: hold.seatIds }; - }); -} -``` - -### 3. Seat Release Transaction - -```typescript -async function releaseSeatsTransaction(tripId: string, currentStationId: string) { - return prisma.$transaction(async (tx) => { - // 1. Find completed journey segments - const completedSegments = await tx.journeySegment.findMany({ - where: { tripId, arrivalStationId: currentStationId }, - include: { journey: { include: { journeySegments: true } } } - }); - - const seatsToRelease = []; - - // 2. Check if passenger's entire journey is complete - for (const segment of completedSegments) { - const allSegments = segment.journey.journeySegments - .filter(js => js.seatId === segment.seatId); - const maxOrder = Math.max(...allSegments.map(js => js.segmentOrder)); - - if (segment.segmentOrder === maxOrder) { - seatsToRelease.push(segment.seatId); - } - } - - // 3. Release seats - if (seatsToRelease.length > 0) { - await tx.seat.updateMany({ - where: { id: { in: seatsToRelease } }, - data: { status: 'AVAILABLE' } - }); - } - - return { releasedSeats: seatsToRelease }; - }); -} -``` - -## Real-Time Integration - -### Trip Progress Updates - -```typescript -// When train reaches a station -await tripProgressService.updateTripProgress(tripId, stationId, progressPercent); - -// Automatically triggers seat release -this.eventEmitter.emit('trip.station.arrived', { - tripId, - stationId, - stationName: 'Dire Dawa' -}); -``` - -### Event Listeners - -```typescript -@OnEvent('trip.station.arrived') -async handleStationArrival(payload: { tripId: string, stationId: string }) { - await this.enhancedSeatsService.releaseSeats(payload.tripId, payload.stationId); -} - -@OnEvent('seats.released') -async handleSeatsReleased(payload: { releasedSeats: string[] }) { - // Notify waiting passengers about newly available seats - this.notificationService.notifyAvailability(payload.releasedSeats); -} -``` - -## Background Jobs - -### Hold Expiration (Every Minute) - -```typescript -@Cron(CronExpression.EVERY_MINUTE) -async expireHolds() { - const expired = await this.prisma.seatHold.findMany({ - where: { expiresAt: { lt: new Date() } } - }); - - // Release expired seats - await this.prisma.seat.updateMany({ - where: { id: { in: expiredSeatIds } }, - data: { status: 'AVAILABLE', heldUntil: null } - }); -} -``` - -## Usage Examples - -### Complete Booking Flow - -```typescript -// 1. Check availability -const availability = await segmentSeatsService.getSeatAvailability( - 'trip_001', 'st_ADD', 'st_DRE' -); - -// 2. Hold seats (10-minute expiry) -const hold = await segmentSeatsService.holdSeats({ - tripId: 'trip_001', - seatIds: ['seat_1'], - passengerId: 'passenger_123', - originStationId: 'st_ADD', - destinationStationId: 'st_DRE' -}); - -// 3. Process payment... -await paymentService.processPayment(bookingId); - -// 4. Confirm booking -const booking = await segmentSeatsService.confirmBooking({ - holdId: hold.holdId, - bookingId: 'booking_456' -}); - -// 5. Seats automatically released when train reaches Dire Dawa -``` - -## Error Handling - -- **Seat Conflicts**: `ConflictException` when seats overlap with existing reservations -- **Expired Holds**: `BadRequestException` when trying to confirm expired holds -- **Invalid Segments**: `BadRequestException` for invalid origin/destination combinations -- **Transaction Rollback**: Automatic rollback on any failure within transactions - -## Performance Considerations - -- **Indexing**: Ensure indexes on `tripId`, `seatId`, `stationId`, `expiresAt` -- **Batch Operations**: Use `updateMany` for bulk seat status updates -- **Event Queuing**: Consider message queues for high-volume seat release events -- **Caching**: Cache frequently accessed route/station data - -## Integration Notes - -1. **Existing Booking System**: Extends current booking flow with segment awareness -2. **Payment Integration**: Hold expiry provides payment processing window -3. **Real-time Updates**: WebSocket notifications for seat availability changes -4. **Mobile Apps**: Push notifications when seats become available on preferred routes -5. **Analytics**: Track seat utilization patterns by segment for route optimization - -## Testing - -Run the example booking flow: - -```bash -cd apps/edr-passenger-api -npx ts-node src/modules/segments/booking-flow-example.ts -``` - -This demonstrates the complete segment-based reservation lifecycle with database transactions and real-time seat releases. \ No newline at end of file diff --git a/apps/edr-passenger-api/package.json b/apps/edr-passenger-api/package.json index 66558965a..122a7897f 100644 --- a/apps/edr-passenger-api/package.json +++ b/apps/edr-passenger-api/package.json @@ -29,7 +29,6 @@ "@nestjs/platform-express": "^11.1.19", "@nestjs/schedule": "^6.1.3", "@nestjs/swagger": "^7.4.0", - "@prisma/client": "^5.8.0", "@sendgrid/mail": "^8.1.0", "axios": "^1.7.7", "bcrypt": "^5.1.1", @@ -49,6 +48,7 @@ "@nestjs/cli": "^11.0.21", "@nestjs/schematics": "^11.1.0", "@nestjs/testing": "^11.1.19", + "@prisma/client": "^6.19.3", "@types/bcrypt": "^5.0.2", "@types/jest": "^29.5.11", "@types/node": "^20.10.6", @@ -56,7 +56,7 @@ "@types/qrcode": "^1.5.5", "@types/supertest": "^6.0.2", "jest": "^29.7.0", - "prisma": "^5.8.0", + "prisma": "^6.19.3", "supertest": "^7.0.0", "ts-jest": "^29.1.1", "ts-node": "^10.9.2", diff --git a/apps/edr-passenger-api/prisma/migrations/20260515133041_segment_updates/migration.sql b/apps/edr-passenger-api/prisma/migrations/20260515133041_segment_updates/migration.sql deleted file mode 100644 index e1091458f..000000000 --- a/apps/edr-passenger-api/prisma/migrations/20260515133041_segment_updates/migration.sql +++ /dev/null @@ -1,31 +0,0 @@ --- CreateTable -CREATE TABLE "Journey" ( - "id" TEXT NOT NULL, - "passengerId" TEXT NOT NULL, - "status" TEXT NOT NULL, - "totalMinor" INTEGER NOT NULL, - "currency" TEXT NOT NULL DEFAULT 'ETB', - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "Journey_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "JourneySegment" ( - "id" TEXT NOT NULL, - "journeyId" TEXT NOT NULL, - "tripId" TEXT NOT NULL, - "segmentOrder" INTEGER NOT NULL, - "seatId" TEXT, - "coachId" TEXT, - "departureStationId" TEXT NOT NULL, - "arrivalStationId" TEXT NOT NULL, - - CONSTRAINT "JourneySegment_pkey" PRIMARY KEY ("id") -); - --- AddForeignKey -ALTER TABLE "JourneySegment" ADD CONSTRAINT "JourneySegment_journeyId_fkey" FOREIGN KEY ("journeyId") REFERENCES "Journey"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "JourneySegment" ADD CONSTRAINT "JourneySegment_tripId_fkey" FOREIGN KEY ("tripId") REFERENCES "Trip"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/apps/edr-passenger-api/prisma/migrations/20260516170103_add_telebirr_async_fields/migration.sql b/apps/edr-passenger-api/prisma/migrations/20260516170103_add_telebirr_async_fields/migration.sql deleted file mode 100644 index d3cd87873..000000000 --- a/apps/edr-passenger-api/prisma/migrations/20260516170103_add_telebirr_async_fields/migration.sql +++ /dev/null @@ -1,63 +0,0 @@ -/* - Warnings: - - - A unique constraint covering the columns `[merchantOrderId]` on the table `PaymentIntent` will be added. If there are existing duplicate values, this will fail. - -*/ --- AlterTable -ALTER TABLE "PaymentIntent" ADD COLUMN "expiresAt" TIMESTAMP(3), -ADD COLUMN "failureCode" TEXT, -ADD COLUMN "failureMessage" TEXT, -ADD COLUMN "merchantOrderId" TEXT, -ADD COLUMN "paidAt" TIMESTAMP(3), -ADD COLUMN "providerOrderId" TEXT, -ADD COLUMN "providerTxnId" TEXT, -ADD COLUMN "rawInitiation" JSONB; - --- CreateTable -CREATE TABLE "PaymentWebhookEvent" ( - "id" TEXT NOT NULL, - "provider" "PaymentMethodType" NOT NULL, - "externalEventId" TEXT NOT NULL, - "merchantOrderId" TEXT, - "providerTxnId" TEXT, - "signatureValid" BOOLEAN NOT NULL, - "status" TEXT NOT NULL, - "payload" JSONB NOT NULL, - "receivedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "processedAt" TIMESTAMP(3), - "processingError" TEXT, - - CONSTRAINT "PaymentWebhookEvent_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "PaymentRefund" ( - "id" TEXT NOT NULL, - "paymentIntentId" TEXT NOT NULL, - "amountMinor" INTEGER NOT NULL, - "reason" TEXT, - "providerRefundId" TEXT, - "status" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "PaymentRefund_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE INDEX "PaymentWebhookEvent_merchantOrderId_idx" ON "PaymentWebhookEvent"("merchantOrderId"); - --- CreateIndex -CREATE UNIQUE INDEX "PaymentWebhookEvent_provider_externalEventId_key" ON "PaymentWebhookEvent"("provider", "externalEventId"); - --- CreateIndex -CREATE UNIQUE INDEX "PaymentIntent_merchantOrderId_key" ON "PaymentIntent"("merchantOrderId"); - --- CreateIndex -CREATE INDEX "PaymentIntent_providerOrderId_idx" ON "PaymentIntent"("providerOrderId"); - --- CreateIndex -CREATE INDEX "PaymentIntent_providerTxnId_idx" ON "PaymentIntent"("providerTxnId"); - --- AddForeignKey -ALTER TABLE "PaymentRefund" ADD CONSTRAINT "PaymentRefund_paymentIntentId_fkey" FOREIGN KEY ("paymentIntentId") REFERENCES "PaymentIntent"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/apps/edr-passenger-api/prisma/migrations/20260513080558_initial_migration/migration.sql b/apps/edr-passenger-api/prisma/migrations/20260519124728_initial_migration/migration.sql similarity index 59% rename from apps/edr-passenger-api/prisma/migrations/20260513080558_initial_migration/migration.sql rename to apps/edr-passenger-api/prisma/migrations/20260519124728_initial_migration/migration.sql index 5ba579dca..17c28678c 100644 --- a/apps/edr-passenger-api/prisma/migrations/20260513080558_initial_migration/migration.sql +++ b/apps/edr-passenger-api/prisma/migrations/20260519124728_initial_migration/migration.sql @@ -1,5 +1,5 @@ -- CreateEnum -CREATE TYPE "UserRole" AS ENUM ('PASSENGER', 'ADMIN', 'STAFF'); +CREATE TYPE "UserRole" AS ENUM ('PASSENGER', 'AGENT', 'SUPERVISOR', 'ADMIN', 'STAFF'); -- CreateEnum CREATE TYPE "TripStatus" AS ENUM ('SCHEDULED', 'BOARDING', 'EN_ROUTE', 'ARRIVED', 'CANCELLED', 'DELAYED'); @@ -11,16 +11,16 @@ CREATE TYPE "SeatKind" AS ENUM ('STANDARD', 'PREMIUM', 'ACCESSIBLE'); CREATE TYPE "SeatStatus" AS ENUM ('AVAILABLE', 'HELD', 'BOOKED', 'BLOCKED'); -- CreateEnum -CREATE TYPE "ServiceClass" AS ENUM ('ECONOMY', 'BUSINESS', 'FIRST'); +CREATE TYPE "ServiceClass" AS ENUM ('ECONOMY_REGULAR', 'ECONOMY_BED_LOWER', 'ECONOMY_BED_MIDDLE', 'ECONOMY_BED_UPPER', 'VIP_BED_LOWER', 'VIP_BED_UPPER'); -- CreateEnum -CREATE TYPE "BookingStatus" AS ENUM ('DRAFT', 'PENDING_PAYMENT', 'CONFIRMED', 'CANCELLED', 'COMPLETED', 'NO_SHOW'); +CREATE TYPE "BookingStatus" AS ENUM ('DRAFT', 'PENDING_PAYMENT', 'CONFIRMED', 'CANCELLED', 'COMPLETED', 'NO_SHOW', 'REFUNDED'); -- CreateEnum CREATE TYPE "PaymentMethodType" AS ENUM ('TELEBIRR', 'CBE_BIRR', 'EBIRR', 'CARD', 'WALLET'); -- CreateEnum -CREATE TYPE "PaymentIntentStatus" AS ENUM ('REQUIRES_ACTION', 'PROCESSING', 'SUCCEEDED', 'FAILED', 'CANCELLED'); +CREATE TYPE "PaymentIntentStatus" AS ENUM ('REQUIRES_ACTION', 'PROCESSING', 'SUCCEEDED', 'FAILED', 'CANCELLED', 'REFUNDED'); -- CreateEnum CREATE TYPE "WalletLedgerType" AS ENUM ('CREDIT', 'DEBIT'); @@ -57,6 +57,11 @@ CREATE TABLE "User" ( "fullName" TEXT NOT NULL, "passwordHash" TEXT NOT NULL, "role" "UserRole" NOT NULL DEFAULT 'PASSENGER', + "nationality" TEXT, + "passportNumber" TEXT, + "nationalId" TEXT, + "failedLoginAttempts" INTEGER NOT NULL DEFAULT 0, + "lockedUntil" TIMESTAMP(3), "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updatedAt" TIMESTAMP(3) NOT NULL, @@ -69,6 +74,9 @@ CREATE TABLE "Session" ( "userId" TEXT NOT NULL, "token" TEXT NOT NULL, "expiresAt" TIMESTAMP(3) NOT NULL, + "ipAddress" TEXT, + "userAgent" TEXT, + "lastActivityAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "Session_pkey" PRIMARY KEY ("id") @@ -186,6 +194,8 @@ CREATE TABLE "Seat" ( "kind" "SeatKind" NOT NULL DEFAULT 'STANDARD', "status" "SeatStatus" NOT NULL DEFAULT 'AVAILABLE', "heldUntil" TIMESTAMP(3), + "premiumFeeMinor" INTEGER NOT NULL DEFAULT 0, + "eligibility" TEXT, CONSTRAINT "Seat_pkey" PRIMARY KEY ("id") ); @@ -228,6 +238,7 @@ CREATE TABLE "Booking" ( "status" "BookingStatus" NOT NULL DEFAULT 'DRAFT', "currency" TEXT NOT NULL DEFAULT 'ETB', "totalMinor" INTEGER NOT NULL, + "bookingType" TEXT NOT NULL DEFAULT 'ONE_WAY', "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updatedAt" TIMESTAMP(3) NOT NULL, @@ -269,12 +280,50 @@ CREATE TABLE "PaymentIntent" ( "status" "PaymentIntentStatus" NOT NULL DEFAULT 'REQUIRES_ACTION', "providerRef" TEXT, "clientAction" JSONB, + "merchantOrderId" TEXT, + "providerOrderId" TEXT, + "providerTxnId" TEXT, + "rawInitiation" JSONB, + "paidAt" TIMESTAMP(3), + "failureCode" TEXT, + "failureMessage" TEXT, + "expiresAt" TIMESTAMP(3), "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updatedAt" TIMESTAMP(3) NOT NULL, CONSTRAINT "PaymentIntent_pkey" PRIMARY KEY ("id") ); +-- CreateTable +CREATE TABLE "PaymentWebhookEvent" ( + "id" TEXT NOT NULL, + "provider" "PaymentMethodType" NOT NULL, + "externalEventId" TEXT NOT NULL, + "merchantOrderId" TEXT, + "providerTxnId" TEXT, + "signatureValid" BOOLEAN NOT NULL, + "status" TEXT NOT NULL, + "payload" JSONB NOT NULL, + "receivedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "processedAt" TIMESTAMP(3), + "processingError" TEXT, + + CONSTRAINT "PaymentWebhookEvent_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "PaymentRefund" ( + "id" TEXT NOT NULL, + "paymentIntentId" TEXT NOT NULL, + "amountMinor" INTEGER NOT NULL, + "reason" TEXT, + "providerRefundId" TEXT, + "status" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "PaymentRefund_pkey" PRIMARY KEY ("id") +); + -- CreateTable CREATE TABLE "Ticket" ( "id" TEXT NOT NULL, @@ -282,6 +331,9 @@ CREATE TABLE "Ticket" ( "bookingRef" TEXT NOT NULL, "status" TEXT NOT NULL DEFAULT 'CONFIRMED', "qrPayload" TEXT NOT NULL, + "barcodePayload" TEXT, + "pdfUrl" TEXT, + "deliveryChannel" TEXT NOT NULL DEFAULT 'EMAIL', "issuedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "validatedAt" TIMESTAMP(3), "validatorId" TEXT, @@ -508,6 +560,7 @@ CREATE TABLE "UserPreferences" ( "dataSharing" BOOLEAN NOT NULL DEFAULT false, "locale" TEXT NOT NULL DEFAULT 'en', "darkMode" BOOLEAN NOT NULL DEFAULT false, + "language" TEXT NOT NULL DEFAULT 'en', CONSTRAINT "UserPreferences_pkey" PRIMARY KEY ("id") ); @@ -539,6 +592,279 @@ CREATE TABLE "SavedRoute" ( CONSTRAINT "SavedRoute_pkey" PRIMARY KEY ("id") ); +-- CreateTable +CREATE TABLE "Journey" ( + "id" TEXT NOT NULL, + "passengerId" TEXT NOT NULL, + "status" TEXT NOT NULL, + "totalMinor" INTEGER NOT NULL, + "currency" TEXT NOT NULL DEFAULT 'ETB', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Journey_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "JourneySegment" ( + "id" TEXT NOT NULL, + "journeyId" TEXT NOT NULL, + "tripId" TEXT NOT NULL, + "segmentOrder" INTEGER NOT NULL, + "seatId" TEXT, + "coachId" TEXT, + "departureStationId" TEXT NOT NULL, + "arrivalStationId" TEXT NOT NULL, + + CONSTRAINT "JourneySegment_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "OtpCode" ( + "id" TEXT NOT NULL, + "userId" TEXT, + "email" TEXT, + "phone" TEXT, + "code" TEXT NOT NULL, + "purpose" TEXT NOT NULL, + "expiresAt" TIMESTAMP(3) NOT NULL, + "verified" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "OtpCode_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "PasswordResetToken" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "token" TEXT NOT NULL, + "expiresAt" TIMESTAMP(3) NOT NULL, + "used" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "PasswordResetToken_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Route" ( + "id" TEXT NOT NULL, + "code" TEXT NOT NULL, + "name" TEXT NOT NULL, + "description" TEXT, + "effectiveFrom" TIMESTAMP(3) NOT NULL, + "effectiveUntil" TIMESTAMP(3), + "active" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Route_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "RouteStop" ( + "id" TEXT NOT NULL, + "routeId" TEXT NOT NULL, + "stationId" TEXT NOT NULL, + "sequence" INTEGER NOT NULL, + "distanceKm" INTEGER, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "RouteStop_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "RouteFareRule" ( + "id" TEXT NOT NULL, + "routeId" TEXT NOT NULL, + "serviceClass" "ServiceClass" NOT NULL, + "passengerCategory" TEXT NOT NULL DEFAULT 'ADULT', + "baseFareMinor" INTEGER NOT NULL, + "discountPercent" INTEGER, + "currency" TEXT NOT NULL DEFAULT 'ETB', + "validFrom" TIMESTAMP(3) NOT NULL, + "validUntil" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "RouteFareRule_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Agent" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "agentCode" TEXT NOT NULL, + "stationId" TEXT, + "commissionRate" INTEGER NOT NULL DEFAULT 5, + "active" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Agent_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "AgentBooking" ( + "id" TEXT NOT NULL, + "agentId" TEXT NOT NULL, + "bookingId" TEXT NOT NULL, + "paymentMethod" TEXT NOT NULL, + "cashReceived" INTEGER, + "changeGiven" INTEGER, + "paperTicket" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "AgentBooking_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "AgentShift" ( + "id" TEXT NOT NULL, + "agentId" TEXT NOT NULL, + "openedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "closedAt" TIMESTAMP(3), + "openingBalance" INTEGER NOT NULL DEFAULT 0, + "closingBalance" INTEGER, + "reconciled" BOOLEAN NOT NULL DEFAULT false, + "notes" TEXT, + + CONSTRAINT "AgentShift_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "AgentCommission" ( + "id" TEXT NOT NULL, + "agentId" TEXT NOT NULL, + "bookingId" TEXT NOT NULL, + "amountMinor" INTEGER NOT NULL, + "rate" INTEGER NOT NULL, + "paidAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "AgentCommission_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "BookingModification" ( + "id" TEXT NOT NULL, + "bookingId" TEXT NOT NULL, + "modifiedBy" TEXT NOT NULL, + "modificationType" TEXT NOT NULL, + "oldData" JSONB NOT NULL, + "newData" JSONB NOT NULL, + "fareAdjustment" INTEGER NOT NULL DEFAULT 0, + "reason" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "BookingModification_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "BookingCancellation" ( + "id" TEXT NOT NULL, + "bookingId" TEXT NOT NULL, + "cancelledBy" TEXT NOT NULL, + "reason" TEXT, + "refundAmount" INTEGER NOT NULL, + "refundMethod" TEXT NOT NULL, + "refundStatus" TEXT NOT NULL, + "processedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "BookingCancellation_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "GateValidationLog" ( + "id" TEXT NOT NULL, + "ticketId" TEXT NOT NULL, + "validatorId" TEXT NOT NULL, + "gateId" TEXT, + "status" TEXT NOT NULL, + "reason" TEXT, + "validatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "GateValidationLog_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "BaggageAllowance" ( + "id" TEXT NOT NULL, + "serviceClass" "ServiceClass" NOT NULL, + "maxWeightKg" INTEGER NOT NULL, + "maxPiecesCount" INTEGER NOT NULL, + "excessFeePerKg" INTEGER NOT NULL, + "currency" TEXT NOT NULL DEFAULT 'ETB', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "BaggageAllowance_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "BaggageBooking" ( + "id" TEXT NOT NULL, + "bookingId" TEXT NOT NULL, + "weightKg" INTEGER NOT NULL, + "piecesCount" INTEGER NOT NULL, + "excessFeeMinor" INTEGER NOT NULL DEFAULT 0, + "paid" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "BaggageBooking_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "AuditLog" ( + "id" TEXT NOT NULL, + "userId" TEXT, + "action" TEXT NOT NULL, + "entityType" TEXT NOT NULL, + "entityId" TEXT, + "oldData" JSONB, + "newData" JSONB, + "ipAddress" TEXT, + "userAgent" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "AuditLog_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "NotificationTemplate" ( + "id" TEXT NOT NULL, + "code" TEXT NOT NULL, + "channel" TEXT NOT NULL, + "subject" TEXT, + "bodyTemplate" TEXT NOT NULL, + "active" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "NotificationTemplate_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "SeatBlock" ( + "id" TEXT NOT NULL, + "seatId" TEXT NOT NULL, + "reason" TEXT NOT NULL, + "blockedBy" TEXT NOT NULL, + "approvedBy" TEXT, + "blockedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "unblockAt" TIMESTAMP(3), + + CONSTRAINT "SeatBlock_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "OperationalReport" ( + "id" TEXT NOT NULL, + "reportType" TEXT NOT NULL, + "dateFrom" TIMESTAMP(3) NOT NULL, + "dateTo" TIMESTAMP(3) NOT NULL, + "data" JSONB NOT NULL, + "generatedBy" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "OperationalReport_pkey" PRIMARY KEY ("id") +); + -- CreateIndex CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); @@ -575,6 +901,21 @@ CREATE UNIQUE INDEX "Booking_bookingRef_key" ON "Booking"("bookingRef"); -- CreateIndex CREATE UNIQUE INDEX "PaymentIntent_bookingId_key" ON "PaymentIntent"("bookingId"); +-- CreateIndex +CREATE UNIQUE INDEX "PaymentIntent_merchantOrderId_key" ON "PaymentIntent"("merchantOrderId"); + +-- CreateIndex +CREATE INDEX "PaymentIntent_providerOrderId_idx" ON "PaymentIntent"("providerOrderId"); + +-- CreateIndex +CREATE INDEX "PaymentIntent_providerTxnId_idx" ON "PaymentIntent"("providerTxnId"); + +-- CreateIndex +CREATE INDEX "PaymentWebhookEvent_merchantOrderId_idx" ON "PaymentWebhookEvent"("merchantOrderId"); + +-- CreateIndex +CREATE UNIQUE INDEX "PaymentWebhookEvent_provider_externalEventId_key" ON "PaymentWebhookEvent"("provider", "externalEventId"); + -- CreateIndex CREATE UNIQUE INDEX "Ticket_bookingId_key" ON "Ticket"("bookingId"); @@ -590,6 +931,72 @@ CREATE UNIQUE INDEX "Promotion_code_key" ON "Promotion"("code"); -- CreateIndex CREATE UNIQUE INDEX "UserPreferences_userId_key" ON "UserPreferences"("userId"); +-- CreateIndex +CREATE INDEX "OtpCode_email_phone_idx" ON "OtpCode"("email", "phone"); + +-- CreateIndex +CREATE UNIQUE INDEX "PasswordResetToken_token_key" ON "PasswordResetToken"("token"); + +-- CreateIndex +CREATE INDEX "PasswordResetToken_userId_idx" ON "PasswordResetToken"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Route_code_key" ON "Route"("code"); + +-- CreateIndex +CREATE INDEX "RouteStop_routeId_stationId_idx" ON "RouteStop"("routeId", "stationId"); + +-- CreateIndex +CREATE UNIQUE INDEX "RouteStop_routeId_sequence_key" ON "RouteStop"("routeId", "sequence"); + +-- CreateIndex +CREATE INDEX "RouteFareRule_routeId_serviceClass_idx" ON "RouteFareRule"("routeId", "serviceClass"); + +-- CreateIndex +CREATE UNIQUE INDEX "Agent_userId_key" ON "Agent"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Agent_agentCode_key" ON "Agent"("agentCode"); + +-- CreateIndex +CREATE UNIQUE INDEX "AgentBooking_bookingId_key" ON "AgentBooking"("bookingId"); + +-- CreateIndex +CREATE INDEX "AgentShift_agentId_openedAt_idx" ON "AgentShift"("agentId", "openedAt"); + +-- CreateIndex +CREATE INDEX "AgentCommission_agentId_paidAt_idx" ON "AgentCommission"("agentId", "paidAt"); + +-- CreateIndex +CREATE INDEX "BookingModification_bookingId_idx" ON "BookingModification"("bookingId"); + +-- CreateIndex +CREATE UNIQUE INDEX "BookingCancellation_bookingId_key" ON "BookingCancellation"("bookingId"); + +-- CreateIndex +CREATE INDEX "GateValidationLog_ticketId_idx" ON "GateValidationLog"("ticketId"); + +-- CreateIndex +CREATE INDEX "GateValidationLog_validatorId_idx" ON "GateValidationLog"("validatorId"); + +-- CreateIndex +CREATE INDEX "BaggageBooking_bookingId_idx" ON "BaggageBooking"("bookingId"); + +-- CreateIndex +CREATE INDEX "AuditLog_userId_createdAt_idx" ON "AuditLog"("userId", "createdAt"); + +-- CreateIndex +CREATE INDEX "AuditLog_entityType_entityId_idx" ON "AuditLog"("entityType", "entityId"); + +-- CreateIndex +CREATE UNIQUE INDEX "NotificationTemplate_code_key" ON "NotificationTemplate"("code"); + +-- CreateIndex +CREATE INDEX "SeatBlock_seatId_idx" ON "SeatBlock"("seatId"); + +-- CreateIndex +CREATE INDEX "OperationalReport_reportType_dateFrom_idx" ON "OperationalReport"("reportType", "dateFrom"); + -- AddForeignKey ALTER TABLE "Session" ADD CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; @@ -638,6 +1045,9 @@ ALTER TABLE "BookingSeat" ADD CONSTRAINT "BookingSeat_seatId_fkey" FOREIGN KEY ( -- AddForeignKey ALTER TABLE "PaymentIntent" ADD CONSTRAINT "PaymentIntent_bookingId_fkey" FOREIGN KEY ("bookingId") REFERENCES "Booking"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +-- AddForeignKey +ALTER TABLE "PaymentRefund" ADD CONSTRAINT "PaymentRefund_paymentIntentId_fkey" FOREIGN KEY ("paymentIntentId") REFERENCES "PaymentIntent"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + -- AddForeignKey ALTER TABLE "Ticket" ADD CONSTRAINT "Ticket_bookingId_fkey" FOREIGN KEY ("bookingId") REFERENCES "Booking"("id") ON DELETE RESTRICT ON UPDATE CASCADE; @@ -688,3 +1098,48 @@ ALTER TABLE "Device" ADD CONSTRAINT "Device_userId_fkey" FOREIGN KEY ("userId") -- AddForeignKey ALTER TABLE "SavedRoute" ADD CONSTRAINT "SavedRoute_passengerId_fkey" FOREIGN KEY ("passengerId") REFERENCES "Passenger"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "JourneySegment" ADD CONSTRAINT "JourneySegment_journeyId_fkey" FOREIGN KEY ("journeyId") REFERENCES "Journey"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "JourneySegment" ADD CONSTRAINT "JourneySegment_tripId_fkey" FOREIGN KEY ("tripId") REFERENCES "Trip"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "RouteStop" ADD CONSTRAINT "RouteStop_routeId_fkey" FOREIGN KEY ("routeId") REFERENCES "Route"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "RouteFareRule" ADD CONSTRAINT "RouteFareRule_routeId_fkey" FOREIGN KEY ("routeId") REFERENCES "Route"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Agent" ADD CONSTRAINT "Agent_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "AgentBooking" ADD CONSTRAINT "AgentBooking_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agent"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "AgentBooking" ADD CONSTRAINT "AgentBooking_bookingId_fkey" FOREIGN KEY ("bookingId") REFERENCES "Booking"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "AgentShift" ADD CONSTRAINT "AgentShift_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agent"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "AgentCommission" ADD CONSTRAINT "AgentCommission_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agent"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "BookingModification" ADD CONSTRAINT "BookingModification_bookingId_fkey" FOREIGN KEY ("bookingId") REFERENCES "Booking"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "BookingCancellation" ADD CONSTRAINT "BookingCancellation_bookingId_fkey" FOREIGN KEY ("bookingId") REFERENCES "Booking"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "GateValidationLog" ADD CONSTRAINT "GateValidationLog_ticketId_fkey" FOREIGN KEY ("ticketId") REFERENCES "Ticket"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "BaggageBooking" ADD CONSTRAINT "BaggageBooking_bookingId_fkey" FOREIGN KEY ("bookingId") REFERENCES "Booking"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "AuditLog" ADD CONSTRAINT "AuditLog_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "SeatBlock" ADD CONSTRAINT "SeatBlock_seatId_fkey" FOREIGN KEY ("seatId") REFERENCES "Seat"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/apps/edr-passenger-api/prisma/migrations/20260520000002_language_field_note/migration.sql b/apps/edr-passenger-api/prisma/migrations/20260520000002_language_field_note/migration.sql new file mode 100644 index 000000000..70f6b75d7 --- /dev/null +++ b/apps/edr-passenger-api/prisma/migrations/20260520000002_language_field_note/migration.sql @@ -0,0 +1,2 @@ +-- Language field already exists in UserPreferences table +-- No migration needed diff --git a/apps/edr-passenger-api/prisma/migrations/20260521000001_add_fraud_detection/migration.sql b/apps/edr-passenger-api/prisma/migrations/20260521000001_add_fraud_detection/migration.sql new file mode 100644 index 000000000..ba2115db9 --- /dev/null +++ b/apps/edr-passenger-api/prisma/migrations/20260521000001_add_fraud_detection/migration.sql @@ -0,0 +1,74 @@ +-- Migration: Add Fraud Detection Tables and User.blockedUntil field +-- Date: 2026-05-21 +-- Description: Adds FraudRule and FraudAlert tables, and blockedUntil field to User table + +-- Add blockedUntil field to User table if not exists +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'User' AND column_name = 'blockedUntil' + ) THEN + ALTER TABLE "User" ADD COLUMN "blockedUntil" TIMESTAMP(3); + END IF; +END $$; + +-- CreateTable FraudRule +CREATE TABLE IF NOT EXISTS "FraudRule" ( + "id" TEXT NOT NULL, + "type" TEXT NOT NULL, + "enabled" BOOLEAN NOT NULL DEFAULT true, + "threshold" DOUBLE PRECISION NOT NULL, + "config" JSONB, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "FraudRule_pkey" PRIMARY KEY ("id") +); + +-- CreateTable FraudAlert +CREATE TABLE IF NOT EXISTS "FraudAlert" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "eventType" TEXT NOT NULL, + "triggeredRules" TEXT[], + "context" JSONB NOT NULL, + "severity" TEXT NOT NULL DEFAULT 'MEDIUM', + "acknowledged" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "FraudAlert_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX IF NOT EXISTS "FraudRule_type_key" ON "FraudRule"("type"); + +-- CreateIndex +CREATE INDEX IF NOT EXISTS "FraudAlert_userId_createdAt_idx" ON "FraudAlert"("userId", "createdAt"); + +-- CreateIndex +CREATE INDEX IF NOT EXISTS "FraudAlert_acknowledged_idx" ON "FraudAlert"("acknowledged"); + +-- AddForeignKey +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_constraint WHERE conname = 'FraudAlert_userId_fkey' + ) THEN + ALTER TABLE "FraudAlert" ADD CONSTRAINT "FraudAlert_userId_fkey" + FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + END IF; +END $$; + +-- Insert default fraud rules +INSERT INTO "FraudRule" ("id", "type", "enabled", "threshold", "config", "createdAt", "updatedAt") +VALUES + (gen_random_uuid(), 'VELOCITY', true, 5, '{"timeWindowMinutes": 30, "blockDurationMinutes": 30}'::jsonb, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (gen_random_uuid(), 'HIGH_VALUE', true, 10000, '{"blockDurationMinutes": 60}'::jsonb, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP), + (gen_random_uuid(), 'FAILED_PAYMENTS', true, 3, '{"timeWindowMinutes": 60, "blockDurationMinutes": 30}'::jsonb, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) +ON CONFLICT (type) DO NOTHING; + +-- Add comments +COMMENT ON TABLE "FraudRule" IS 'Fraud detection rules for monitoring suspicious activities'; +COMMENT ON TABLE "FraudAlert" IS 'Fraud alerts triggered by rule violations'; +COMMENT ON COLUMN "User"."blockedUntil" IS 'Timestamp until which the user is blocked due to fraud or security reasons'; \ No newline at end of file diff --git a/apps/edr-passenger-api/prisma/reset-admin.d.ts b/apps/edr-passenger-api/prisma/reset-admin.d.ts deleted file mode 100644 index a4595fd95..000000000 --- a/apps/edr-passenger-api/prisma/reset-admin.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=reset-admin.d.ts.map \ No newline at end of file diff --git a/apps/edr-passenger-api/prisma/reset-admin.d.ts.map b/apps/edr-passenger-api/prisma/reset-admin.d.ts.map deleted file mode 100644 index d0f62a26c..000000000 --- a/apps/edr-passenger-api/prisma/reset-admin.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"reset-admin.d.ts","sourceRoot":"","sources":["reset-admin.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/apps/edr-passenger-api/prisma/reset-admin.js b/apps/edr-passenger-api/prisma/reset-admin.js deleted file mode 100644 index c00b804f6..000000000 --- a/apps/edr-passenger-api/prisma/reset-admin.js +++ /dev/null @@ -1,49 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -const client_1 = require("@prisma/client"); -const bcrypt = __importStar(require("bcrypt")); -const prisma = new client_1.PrismaClient(); -async function main() { - const passwordHash = await bcrypt.hash('admin123', 10); - const user = await prisma.user.upsert({ - where: { email: 'admin@edr-platform.com' }, - update: { passwordHash, role: 'ADMIN' }, - create: { fullName: 'EDR Admin', email: 'admin@edr-platform.com', phone: '+251900000000', passwordHash, role: 'ADMIN' }, - }); - console.log('βœ… Admin ready:', user.email); -} -main().catch(console.error).finally(() => prisma.$disconnect()); -//# sourceMappingURL=reset-admin.js.map \ No newline at end of file diff --git a/apps/edr-passenger-api/prisma/reset-admin.js.map b/apps/edr-passenger-api/prisma/reset-admin.js.map deleted file mode 100644 index a47b50176..000000000 --- a/apps/edr-passenger-api/prisma/reset-admin.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"reset-admin.js","sourceRoot":"","sources":["reset-admin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA8C;AAC9C,+CAAiC;AAEjC,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;AAElC,KAAK,UAAU,IAAI;IACjB,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QACpC,KAAK,EAAE,EAAE,KAAK,EAAE,wBAAwB,EAAE;QAC1C,MAAM,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE;QACvC,MAAM,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,wBAAwB,EAAE,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE;KACxH,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC"} \ No newline at end of file diff --git a/apps/edr-passenger-api/prisma/reset-admin.ts b/apps/edr-passenger-api/prisma/reset-admin.ts deleted file mode 100644 index da9e5313f..000000000 --- a/apps/edr-passenger-api/prisma/reset-admin.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { PrismaClient } from '@prisma/client'; -import * as bcrypt from 'bcrypt'; - -const prisma = new PrismaClient(); - -async function main() { - const passwordHash = await bcrypt.hash('admin123', 10); - const user = await prisma.user.upsert({ - where: { email: 'admin@edr-platform.com' }, - update: { passwordHash, role: 'ADMIN' }, - create: { fullName: 'EDR Admin', email: 'admin@edr-platform.com', phone: '+251900000000', passwordHash, role: 'ADMIN' }, - }); - console.log('βœ… Admin ready:', user.email); -} - -main().catch(console.error).finally(() => prisma.$disconnect()); diff --git a/apps/edr-passenger-api/prisma/schema.prisma b/apps/edr-passenger-api/prisma/schema.prisma index da1b6811b..72fb4b15b 100644 --- a/apps/edr-passenger-api/prisma/schema.prisma +++ b/apps/edr-passenger-api/prisma/schema.prisma @@ -9,6 +9,8 @@ datasource db { enum UserRole { PASSENGER + AGENT + SUPERVISOR ADMIN STAFF } @@ -36,9 +38,12 @@ enum SeatStatus { } enum ServiceClass { - ECONOMY - BUSINESS - FIRST + ECONOMY_REGULAR + ECONOMY_BED_LOWER + ECONOMY_BED_MIDDLE + ECONOMY_BED_UPPER + VIP_BED_LOWER + VIP_BED_UPPER } enum BookingStatus { @@ -48,6 +53,7 @@ enum BookingStatus { CANCELLED COMPLETED NO_SHOW + REFUNDED } enum PaymentMethodType { @@ -64,6 +70,7 @@ enum PaymentIntentStatus { SUCCEEDED FAILED CANCELLED + REFUNDED } enum WalletLedgerType { @@ -134,12 +141,21 @@ model User { fullName String passwordHash String role UserRole @default(PASSENGER) + nationality String? + passportNumber String? + nationalId String? + failedLoginAttempts Int @default(0) + lockedUntil DateTime? + blockedUntil DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt passenger Passenger? + agent Agent? sessions Session[] devices Device[] preferences UserPreferences? + auditLogs AuditLog[] + fraudAlerts FraudAlert[] } model Session { @@ -147,6 +163,9 @@ model Session { userId String token String @unique expiresAt DateTime + ipAddress String? + userAgent String? + lastActivityAt DateTime @default(now()) createdAt DateTime @default(now()) user User @relation(fields: [userId], references: [id], onDelete: Cascade) } @@ -267,8 +286,11 @@ model Seat { kind SeatKind @default(STANDARD) status SeatStatus @default(AVAILABLE) heldUntil DateTime? + premiumFeeMinor Int @default(0) + eligibility String? coach Coach @relation(fields: [coachId], references: [id]) bookingSeats BookingSeat[] + blocks SeatBlock[] @@unique([coachId, row, col]) } @@ -303,6 +325,7 @@ model Booking { status BookingStatus @default(DRAFT) currency String @default("ETB") totalMinor Int + bookingType String @default("ONE_WAY") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt passenger Passenger @relation(fields: [passengerId], references: [id]) @@ -311,6 +334,10 @@ model Booking { paymentIntent PaymentIntent? ticket Ticket? foodOrders FoodOrder[] + agentBooking AgentBooking? + modifications BookingModification[] + cancellation BookingCancellation? + baggage BaggageBooking[] } model BookingSeat { @@ -392,10 +419,14 @@ model Ticket { bookingRef String status String @default("CONFIRMED") qrPayload String + barcodePayload String? + pdfUrl String? + deliveryChannel String @default("EMAIL") issuedAt DateTime @default(now()) validatedAt DateTime? validatorId String? booking Booking @relation(fields: [bookingId], references: [id]) + validationLogs GateValidationLog[] } model LoyaltyAccount { @@ -585,6 +616,7 @@ model UserPreferences { dataSharing Boolean @default(false) locale String @default("en") darkMode Boolean @default(false) + language String @default("en") user User @relation(fields: [userId], references: [id]) } @@ -633,3 +665,253 @@ model JourneySegment { journey Journey @relation(fields: [journeyId], references: [id]) trip Trip @relation(fields: [tripId], references: [id]) } + +model OtpCode { + id String @id @default(uuid()) + userId String? + email String? + phone String? + code String + purpose String + expiresAt DateTime + verified Boolean @default(false) + createdAt DateTime @default(now()) + @@index([email, phone]) +} + +model PasswordResetToken { + id String @id @default(uuid()) + userId String + token String @unique + expiresAt DateTime + used Boolean @default(false) + createdAt DateTime @default(now()) + @@index([userId]) +} + +model Route { + id String @id @default(uuid()) + code String @unique + name String + description String? + effectiveFrom DateTime + effectiveUntil DateTime? + active Boolean @default(true) + createdAt DateTime @default(now()) + stops RouteStop[] + fareRules RouteFareRule[] +} + +model RouteStop { + id String @id @default(uuid()) + routeId String + stationId String + sequence Int + distanceKm Int? + createdAt DateTime @default(now()) + route Route @relation(fields: [routeId], references: [id], onDelete: Cascade) + @@unique([routeId, sequence]) + @@index([routeId, stationId]) +} + +model RouteFareRule { + id String @id @default(uuid()) + routeId String + serviceClass ServiceClass + passengerCategory String @default("ADULT") + baseFareMinor Int + discountPercent Int? + currency String @default("ETB") + validFrom DateTime + validUntil DateTime? + createdAt DateTime @default(now()) + route Route @relation(fields: [routeId], references: [id], onDelete: Cascade) + @@index([routeId, serviceClass]) +} + +model Agent { + id String @id @default(uuid()) + userId String @unique + agentCode String @unique + stationId String? + commissionRate Int @default(5) + active Boolean @default(true) + createdAt DateTime @default(now()) + user User @relation(fields: [userId], references: [id]) + bookings AgentBooking[] + shifts AgentShift[] + commissions AgentCommission[] +} + +model AgentBooking { + id String @id @default(uuid()) + agentId String + bookingId String @unique + paymentMethod String + cashReceived Int? + changeGiven Int? + paperTicket Boolean @default(false) + createdAt DateTime @default(now()) + agent Agent @relation(fields: [agentId], references: [id]) + booking Booking @relation(fields: [bookingId], references: [id]) +} + +model AgentShift { + id String @id @default(uuid()) + agentId String + openedAt DateTime @default(now()) + closedAt DateTime? + openingBalance Int @default(0) + closingBalance Int? + reconciled Boolean @default(false) + notes String? + agent Agent @relation(fields: [agentId], references: [id]) + @@index([agentId, openedAt]) +} + +model AgentCommission { + id String @id @default(uuid()) + agentId String + bookingId String + amountMinor Int + rate Int + paidAt DateTime? + createdAt DateTime @default(now()) + agent Agent @relation(fields: [agentId], references: [id]) + @@index([agentId, paidAt]) +} + +model BookingModification { + id String @id @default(uuid()) + bookingId String + modifiedBy String + modificationType String + oldData Json + newData Json + fareAdjustment Int @default(0) + reason String? + createdAt DateTime @default(now()) + booking Booking @relation(fields: [bookingId], references: [id]) + @@index([bookingId]) +} + +model BookingCancellation { + id String @id @default(uuid()) + bookingId String @unique + cancelledBy String + reason String? + refundAmount Int + refundMethod String + refundStatus String + processedAt DateTime? + createdAt DateTime @default(now()) + booking Booking @relation(fields: [bookingId], references: [id]) +} + +model GateValidationLog { + id String @id @default(uuid()) + ticketId String + validatorId String + gateId String? + status String + reason String? + validatedAt DateTime @default(now()) + ticket Ticket @relation(fields: [ticketId], references: [id]) + @@index([ticketId]) + @@index([validatorId]) +} + +model BaggageAllowance { + id String @id @default(uuid()) + serviceClass ServiceClass + maxWeightKg Int + maxPiecesCount Int + excessFeePerKg Int + currency String @default("ETB") + createdAt DateTime @default(now()) +} + +model BaggageBooking { + id String @id @default(uuid()) + bookingId String + weightKg Int + piecesCount Int + excessFeeMinor Int @default(0) + paid Boolean @default(false) + createdAt DateTime @default(now()) + booking Booking @relation(fields: [bookingId], references: [id]) + @@index([bookingId]) +} + +model AuditLog { + id String @id @default(uuid()) + userId String? + action String + entityType String + entityId String? + oldData Json? + newData Json? + ipAddress String? + userAgent String? + createdAt DateTime @default(now()) + user User? @relation(fields: [userId], references: [id]) + @@index([userId, createdAt]) + @@index([entityType, entityId]) +} + +model NotificationTemplate { + id String @id @default(uuid()) + code String @unique + channel String + subject String? + bodyTemplate String + active Boolean @default(true) + createdAt DateTime @default(now()) +} + +model SeatBlock { + id String @id @default(uuid()) + seatId String + reason String + blockedBy String + approvedBy String? + blockedAt DateTime @default(now()) + unblockAt DateTime? + seat Seat @relation(fields: [seatId], references: [id]) + @@index([seatId]) +} + +model OperationalReport { + id String @id @default(uuid()) + reportType String + dateFrom DateTime + dateTo DateTime + data Json + generatedBy String? + createdAt DateTime @default(now()) + @@index([reportType, dateFrom]) +} + +model FraudRule { + id String @id @default(uuid()) + type String @unique + enabled Boolean @default(true) + threshold Float + config Json? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model FraudAlert { + id String @id @default(uuid()) + userId String + eventType String + triggeredRules String[] + context Json + severity String @default("MEDIUM") + acknowledged Boolean @default(false) + createdAt DateTime @default(now()) + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + @@index([userId, createdAt]) + @@index([acknowledged]) +} diff --git a/apps/edr-passenger-api/prisma/seed.d.ts b/apps/edr-passenger-api/prisma/seed.d.ts deleted file mode 100644 index 0986b1c3a..000000000 --- a/apps/edr-passenger-api/prisma/seed.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=seed.d.ts.map \ No newline at end of file diff --git a/apps/edr-passenger-api/prisma/seed.d.ts.map b/apps/edr-passenger-api/prisma/seed.d.ts.map deleted file mode 100644 index c1a0e0b3d..000000000 --- a/apps/edr-passenger-api/prisma/seed.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["seed.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/apps/edr-passenger-api/prisma/seed.js b/apps/edr-passenger-api/prisma/seed.js deleted file mode 100644 index 924e06d85..000000000 --- a/apps/edr-passenger-api/prisma/seed.js +++ /dev/null @@ -1,73 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -const client_1 = require("@prisma/client"); -const bcrypt = __importStar(require("bcrypt")); -const prisma = new client_1.PrismaClient(); -async function main() { - const addis = await prisma.station.upsert({ where: { code: 'ADD' }, update: {}, create: { code: 'ADD', name: 'Addis Ababa', city: 'Addis Ababa', lat: 9.0054, lng: 38.7636 } }); - const direDawa = await prisma.station.upsert({ where: { code: 'DDW' }, update: {}, create: { code: 'DDW', name: 'Dire Dawa', city: 'Dire Dawa', lat: 9.5931, lng: 41.8661 } }); - const djibouti = await prisma.station.upsert({ where: { code: 'DJI' }, update: {}, create: { code: 'DJI', name: 'Djibouti', city: 'Djibouti', timezone: 'Africa/Djibouti', lat: 11.5720, lng: 43.1456 } }); - const service = await prisma.trainService.upsert({ where: { number: '301' }, update: {}, create: { number: '301', name: 'Express 301' } }); - const trip = await prisma.trip.create({ - data: { serviceId: service.id, originStationId: addis.id, destinationStationId: djibouti.id, departureAt: new Date('2026-05-11T08:30:00Z'), arrivalAt: new Date('2026-05-11T20:00:00Z'), durationMinutes: 690, stopsCount: 1 }, - }); - for (const [label, cls] of [['A', 'ECONOMY'], ['B', 'BUSINESS']]) { - const coach = await prisma.coach.create({ data: { tripId: trip.id, label, serviceClass: cls } }); - const seats = []; - for (let row = 1; row <= 10; row++) { - for (const col of ['A', 'B', 'C', 'D']) - seats.push({ coachId: coach.id, row, col, label: `${row}${col}` }); - } - await prisma.seat.createMany({ data: seats }); - } - await prisma.fareRule.create({ data: { tripId: trip.id, serviceClass: 'ECONOMY', baseFareMinor: 45000, validFrom: new Date('2026-01-01') } }); - const hash = await bcrypt.hash('password123', 10); - const user = await prisma.user.upsert({ where: { email: 'kelemu@email.com' }, update: {}, create: { fullName: 'Kelemu Ketsela', email: 'kelemu@email.com', phone: '+251912345678', passwordHash: hash } }); - let passenger = await prisma.passenger.findUnique({ where: { userId: user.id } }); - if (!passenger) { - passenger = await prisma.passenger.create({ data: { userId: user.id } }); - await prisma.loyaltyAccount.create({ data: { passengerId: passenger.id, pointsBalance: 2450, tier: 'SILVER' } }); - await prisma.walletAccount.create({ data: { passengerId: passenger.id, balanceMinor: 125000 } }); - } - await prisma.userPreferences.upsert({ where: { userId: user.id }, update: {}, create: { userId: user.id } }); - await prisma.user.upsert({ where: { email: 'admin@edr-platform.com' }, update: { passwordHash: await bcrypt.hash('admin123', 10), role: 'ADMIN' }, create: { fullName: 'EDR Admin', email: 'admin@edr-platform.com', phone: '+251900000000', passwordHash: await bcrypt.hash('admin123', 10), role: 'ADMIN' } }); - await prisma.promotion.upsert({ where: { code: 'WEEKEND15' }, update: {}, create: { title: 'Weekend Sale', code: 'WEEKEND15', percentOff: 15, validUntil: new Date('2026-12-31') } }); - const faqCat = await prisma.faqCategory.create({ data: { title: 'Booking & Tickets', iconKey: 'description_outlined' } }); - await prisma.faqArticle.create({ data: { categoryId: faqCat.id, question: 'How do I book a train ticket?', answerMarkdown: 'Open Search, pick stations and date, select seats, and proceed to payment.', rank: 1 } }); - console.log('βœ… Seed complete'); -} -main().catch(console.error).finally(() => prisma.$disconnect()); -//# sourceMappingURL=seed.js.map \ No newline at end of file diff --git a/apps/edr-passenger-api/prisma/seed.js.map b/apps/edr-passenger-api/prisma/seed.js.map deleted file mode 100644 index bcc581885..000000000 --- a/apps/edr-passenger-api/prisma/seed.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"seed.js","sourceRoot":"","sources":["seed.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA8C;AAC9C,+CAAiC;AAEjC,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;AAElC,KAAK,UAAU,IAAI;IACjB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAChL,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAC/K,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAE3M,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;IAE3I,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QACpC,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,EAAE,EAAE,oBAAoB,EAAE,QAAQ,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE;KAC/N,CAAC,CAAC;IAEH,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,CAAC,CAAU,EAAE,CAAC;QAC1E,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QACjG,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC;YACnC,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC;QAC7G,CAAC;QACD,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC;IAE9I,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC3M,IAAI,SAAS,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAClF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACzE,MAAM,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QACjH,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACnG,CAAC;IACD,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAE7G,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,wBAAwB,EAAE,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAEjT,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC;IAEtL,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,CAAC,CAAC;IAC1H,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,+BAA+B,EAAE,cAAc,EAAE,4EAA4E,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEtN,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AACjC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC"} \ No newline at end of file diff --git a/apps/edr-passenger-api/prisma/seed.ts b/apps/edr-passenger-api/prisma/seed.ts index f2bbb1332..65607813e 100644 --- a/apps/edr-passenger-api/prisma/seed.ts +++ b/apps/edr-passenger-api/prisma/seed.ts @@ -1,48 +1,237 @@ -import { PrismaClient } from '@prisma/client'; +import { PrismaClient, ServiceClass, UserRole, LoyaltyTier, SeatKind } from '@prisma/client'; import * as bcrypt from 'bcrypt'; const prisma = new PrismaClient(); async function main() { - const addis = await prisma.station.upsert({ where: { code: 'ADD' }, update: {}, create: { code: 'ADD', name: 'Addis Ababa', city: 'Addis Ababa', lat: 9.0054, lng: 38.7636 } }); + console.log('🌱 Starting comprehensive seed...'); + + // All 18 Stations (Ethiopian-Djibouti Railway) + const addis = await prisma.station.upsert({ where: { code: 'ADD' }, update: {}, create: { code: 'ADD', name: 'Addis Ababa Central', city: 'Addis Ababa', lat: 9.0054, lng: 38.7636 } }); + const sebeta = await prisma.station.upsert({ where: { code: 'SBT' }, update: {}, create: { code: 'SBT', name: 'Sebeta', city: 'Sebeta', lat: 8.9167, lng: 38.6167 } }); + const labu = await prisma.station.upsert({ where: { code: 'LBU' }, update: {}, create: { code: 'LBU', name: 'Labu', city: 'Labu', lat: 8.8500, lng: 38.8500 } }); + const indode = await prisma.station.upsert({ where: { code: 'IND' }, update: {}, create: { code: 'IND', name: 'Indode', city: 'Indode', lat: 8.7833, lng: 39.0167 } }); + const bishoftu = await prisma.station.upsert({ where: { code: 'BSH' }, update: {}, create: { code: 'BSH', name: 'Bishoftu', city: 'Bishoftu', lat: 8.7500, lng: 38.9833 } }); + const mojo = await prisma.station.upsert({ where: { code: 'MJO' }, update: {}, create: { code: 'MJO', name: 'Mojo', city: 'Mojo', lat: 8.5833, lng: 39.1167 } }); + const adama = await prisma.station.upsert({ where: { code: 'ADM' }, update: {}, create: { code: 'ADM', name: 'Adama', city: 'Adama', lat: 8.5400, lng: 39.2675 } }); + const feto = await prisma.station.upsert({ where: { code: 'FTO' }, update: {}, create: { code: 'FTO', name: 'Feto', city: 'Feto', lat: 8.7167, lng: 39.5833 } }); + const metahara = await prisma.station.upsert({ where: { code: 'MTH' }, update: {}, create: { code: 'MTH', name: 'Metahara', city: 'Metahara', lat: 8.9000, lng: 39.9167 } }); + const awash = await prisma.station.upsert({ where: { code: 'AWS' }, update: {}, create: { code: 'AWS', name: 'Awash', city: 'Awash', lat: 8.9833, lng: 40.1667 } }); + const mieso = await prisma.station.upsert({ where: { code: 'MSO' }, update: {}, create: { code: 'MSO', name: 'Mieso', city: 'Mieso', lat: 9.2333, lng: 40.7500 } }); + const bike = await prisma.station.upsert({ where: { code: 'BKE' }, update: {}, create: { code: 'BKE', name: 'Bike', city: 'Bike', lat: 9.4167, lng: 41.2500 } }); const direDawa = await prisma.station.upsert({ where: { code: 'DDW' }, update: {}, create: { code: 'DDW', name: 'Dire Dawa', city: 'Dire Dawa', lat: 9.5931, lng: 41.8661 } }); + const arawa = await prisma.station.upsert({ where: { code: 'ARW' }, update: {}, create: { code: 'ARW', name: 'Arawa', city: 'Arawa', lat: 10.0833, lng: 42.2500 } }); + const adigala = await prisma.station.upsert({ where: { code: 'ADG' }, update: {}, create: { code: 'ADG', name: 'Adigala', city: 'Adigala', lat: 10.5000, lng: 42.5833 } }); + const aysha = await prisma.station.upsert({ where: { code: 'AYS' }, update: {}, create: { code: 'AYS', name: 'Aysha', city: 'Aysha', lat: 11.5500, lng: 42.7167 } }); + const dawanle = await prisma.station.upsert({ where: { code: 'DWN' }, update: {}, create: { code: 'DWN', name: 'Dawanle', city: 'Dawanle', timezone: 'Africa/Djibouti', lat: 11.3833, lng: 42.8500 } }); + const alisabieh = await prisma.station.upsert({ where: { code: 'ALI' }, update: {}, create: { code: 'ALI', name: 'Alisabieh', city: 'Alisabieh', timezone: 'Africa/Djibouti', lat: 11.1667, lng: 42.7167 } }); + const holhol = await prisma.station.upsert({ where: { code: 'HLH' }, update: {}, create: { code: 'HLH', name: 'Holhol', city: 'Holhol', timezone: 'Africa/Djibouti', lat: 11.4167, lng: 43.0000 } }); + const nagad = await prisma.station.upsert({ where: { code: 'NGD' }, update: {}, create: { code: 'NGD', name: 'Nagad', city: 'Nagad', timezone: 'Africa/Djibouti', lat: 11.5167, lng: 43.1000 } }); const djibouti = await prisma.station.upsert({ where: { code: 'DJI' }, update: {}, create: { code: 'DJI', name: 'Djibouti', city: 'Djibouti', timezone: 'Africa/Djibouti', lat: 11.5720, lng: 43.1456 } }); - const service = await prisma.trainService.upsert({ where: { number: '301' }, update: {}, create: { number: '301', name: 'Express 301' } }); + // Routes + const route1 = await prisma.route.upsert({ + where: { code: 'R001' }, + update: {}, + create: { code: 'R001', name: 'Addis Ababa - Djibouti Express', effectiveFrom: new Date('2026-01-01'), active: true } + }); + + // Delete existing route stops and recreate + await prisma.routeStop.deleteMany({ where: { routeId: route1.id } }); + await prisma.routeStop.createMany({ data: [ + { routeId: route1.id, stationId: addis.id, sequence: 1, distanceKm: 0 }, + { routeId: route1.id, stationId: sebeta.id, sequence: 2, distanceKm: 23 }, + { routeId: route1.id, stationId: labu.id, sequence: 3, distanceKm: 45 }, + { routeId: route1.id, stationId: indode.id, sequence: 4, distanceKm: 62 }, + { routeId: route1.id, stationId: bishoftu.id, sequence: 5, distanceKm: 47 }, + { routeId: route1.id, stationId: mojo.id, sequence: 6, distanceKm: 73 }, + { routeId: route1.id, stationId: adama.id, sequence: 7, distanceKm: 99 }, + { routeId: route1.id, stationId: feto.id, sequence: 8, distanceKm: 145 }, + { routeId: route1.id, stationId: metahara.id, sequence: 9, distanceKm: 198 }, + { routeId: route1.id, stationId: awash.id, sequence: 10, distanceKm: 225 }, + { routeId: route1.id, stationId: mieso.id, sequence: 11, distanceKm: 305 }, + { routeId: route1.id, stationId: bike.id, sequence: 12, distanceKm: 375 }, + { routeId: route1.id, stationId: direDawa.id, sequence: 13, distanceKm: 453 }, + { routeId: route1.id, stationId: arawa.id, sequence: 14, distanceKm: 520 }, + { routeId: route1.id, stationId: adigala.id, sequence: 15, distanceKm: 580 }, + { routeId: route1.id, stationId: aysha.id, sequence: 16, distanceKm: 656 }, + { routeId: route1.id, stationId: dawanle.id, sequence: 17, distanceKm: 680 }, + { routeId: route1.id, stationId: alisabieh.id, sequence: 18, distanceKm: 700 }, + { routeId: route1.id, stationId: holhol.id, sequence: 19, distanceKm: 730 }, + { routeId: route1.id, stationId: nagad.id, sequence: 20, distanceKm: 750 }, + { routeId: route1.id, stationId: djibouti.id, sequence: 21, distanceKm: 756 }, + ]}); - const trip = await prisma.trip.create({ - data: { serviceId: service.id, originStationId: addis.id, destinationStationId: djibouti.id, departureAt: new Date('2026-05-11T08:30:00Z'), arrivalAt: new Date('2026-05-11T20:00:00Z'), durationMinutes: 690, stopsCount: 1 }, + // Route Fare Rules + await prisma.routeFareRule.deleteMany({ where: { routeId: route1.id } }); + await prisma.routeFareRule.createMany({ data: [ + { routeId: route1.id, serviceClass: 'ECONOMY_REGULAR', baseFareMinor: 45000, validFrom: new Date('2026-01-01') }, + { routeId: route1.id, serviceClass: 'ECONOMY_BED_LOWER', baseFareMinor: 65000, validFrom: new Date('2026-01-01') }, + { routeId: route1.id, serviceClass: 'VIP_BED_LOWER', baseFareMinor: 95000, validFrom: new Date('2026-01-01') }, + ]}); + + // Train Services + const service301 = await prisma.trainService.upsert({ where: { number: '301' }, update: {}, create: { number: '301', name: 'Express 301' } }); + const service302 = await prisma.trainService.upsert({ where: { number: '302' }, update: {}, create: { number: '302', name: 'Express 302' } }); + + // Trips (Multiple schedules) - Delete existing trips for clean seed + await prisma.trip.deleteMany({ where: { serviceId: { in: [service301.id, service302.id] } } }); + const trip1 = await prisma.trip.create({ + data: { serviceId: service301.id, originStationId: addis.id, destinationStationId: djibouti.id, departureAt: new Date('2026-06-15T08:00:00Z'), arrivalAt: new Date('2026-06-15T20:00:00Z'), durationMinutes: 720, stopsCount: 19 }, + }); + const trip2 = await prisma.trip.create({ + data: { serviceId: service302.id, originStationId: djibouti.id, destinationStationId: addis.id, departureAt: new Date('2026-06-16T09:00:00Z'), arrivalAt: new Date('2026-06-16T21:30:00Z'), durationMinutes: 750, stopsCount: 19 }, + }); + const trip3 = await prisma.trip.create({ + data: { serviceId: service301.id, originStationId: addis.id, destinationStationId: djibouti.id, departureAt: new Date('2026-06-17T07:30:00Z'), arrivalAt: new Date('2026-06-17T19:45:00Z'), durationMinutes: 735, stopsCount: 19 }, + }); + const trip4 = await prisma.trip.create({ + data: { serviceId: service302.id, originStationId: djibouti.id, destinationStationId: addis.id, departureAt: new Date('2026-06-18T08:30:00Z'), arrivalAt: new Date('2026-06-18T21:00:00Z'), durationMinutes: 750, stopsCount: 19 }, }); - for (const [label, cls] of [['A', 'ECONOMY'], ['B', 'BUSINESS']] as const) { - const coach = await prisma.coach.create({ data: { tripId: trip.id, label, serviceClass: cls } }); - const seats = []; - for (let row = 1; row <= 10; row++) { - for (const col of ['A', 'B', 'C', 'D']) seats.push({ coachId: coach.id, row, col, label: `${row}${col}` }); + // Trip Stop Times (Major stops only for brevity) + await prisma.tripStopTime.createMany({ data: [ + { tripId: trip1.id, stationId: addis.id, sequence: 1, plannedDepartureAt: new Date('2026-06-15T08:00:00Z'), status: 'UPCOMING' }, + { tripId: trip1.id, stationId: adama.id, sequence: 7, plannedArrivalAt: new Date('2026-06-15T09:30:00Z'), plannedDepartureAt: new Date('2026-06-15T09:45:00Z'), status: 'UPCOMING' }, + { tripId: trip1.id, stationId: awash.id, sequence: 10, plannedArrivalAt: new Date('2026-06-15T11:30:00Z'), plannedDepartureAt: new Date('2026-06-15T11:45:00Z'), status: 'UPCOMING' }, + { tripId: trip1.id, stationId: direDawa.id, sequence: 13, plannedArrivalAt: new Date('2026-06-15T15:00:00Z'), plannedDepartureAt: new Date('2026-06-15T15:20:00Z'), status: 'UPCOMING' }, + { tripId: trip1.id, stationId: aysha.id, sequence: 16, plannedArrivalAt: new Date('2026-06-15T18:00:00Z'), plannedDepartureAt: new Date('2026-06-15T18:10:00Z'), status: 'UPCOMING' }, + { tripId: trip1.id, stationId: djibouti.id, sequence: 21, plannedArrivalAt: new Date('2026-06-15T20:00:00Z'), status: 'UPCOMING' }, + ]}); + + // Coaches & Seats + for (const trip of [trip1, trip2, trip3, trip4]) { + const coaches = [ + { label: 'A', serviceClass: 'ECONOMY_REGULAR' as ServiceClass, seatCount: 60 }, + { label: 'B', serviceClass: 'ECONOMY_BED_LOWER' as ServiceClass, seatCount: 40 }, + { label: 'C', serviceClass: 'VIP_BED_LOWER' as ServiceClass, seatCount: 20 }, + ]; + for (const { label, serviceClass, seatCount } of coaches) { + const coach = await prisma.coach.create({ data: { tripId: trip.id, label, serviceClass } }); + const seats = []; + const rows = Math.ceil(seatCount / 4); + for (let row = 1; row <= rows; row++) { + for (const col of ['A', 'B', 'C', 'D']) { + if (seats.length >= seatCount) break; + seats.push({ coachId: coach.id, row, col, label: `${row}${col}`, kind: (row === 1 && col === 'A' ? 'ACCESSIBLE' : 'STANDARD') as SeatKind }); + } + } + await prisma.seat.createMany({ data: seats }); } - await prisma.seat.createMany({ data: seats }); } - await prisma.fareRule.create({ data: { tripId: trip.id, serviceClass: 'ECONOMY', baseFareMinor: 45000, validFrom: new Date('2026-01-01') } }); + // Fare Rules (All trips) + for (const trip of [trip1, trip2, trip3, trip4]) { + await prisma.fareRule.createMany({ data: [ + { tripId: trip.id, serviceClass: 'ECONOMY_REGULAR', baseFareMinor: 45000, validFrom: new Date('2026-01-01'), refundable: true }, + { tripId: trip.id, serviceClass: 'ECONOMY_BED_LOWER', baseFareMinor: 65000, validFrom: new Date('2026-01-01'), refundable: true }, + { tripId: trip.id, serviceClass: 'VIP_BED_LOWER', baseFareMinor: 95000, validFrom: new Date('2026-01-01'), refundable: true }, + ]}); + } + // Users const hash = await bcrypt.hash('password123', 10); - const user = await prisma.user.upsert({ where: { email: 'kelemu@email.com' }, update: {}, create: { fullName: 'Kelemu Ketsela', email: 'kelemu@email.com', phone: '+251912345678', passwordHash: hash } }); - let passenger = await prisma.passenger.findUnique({ where: { userId: user.id } }); + const adminHash = await bcrypt.hash('admin123', 10); + const agentHash = await bcrypt.hash('agent123', 10); + + const adminUser = await prisma.user.upsert({ where: { email: 'admin@edr-platform.com' }, update: { passwordHash: adminHash, role: 'ADMIN' }, create: { fullName: 'EDR Admin', email: 'admin@edr-platform.com', phone: '+251900000000', passwordHash: adminHash, role: 'ADMIN' } }); + + const passengerUser = await prisma.user.upsert({ where: { email: 'kelemu@email.com' }, update: {}, create: { fullName: 'Kelemu Ketsela', email: 'kelemu@email.com', phone: '+251912345678', passwordHash: hash, nationality: 'Ethiopian', nationalId: 'ET123456789' } }); + let passenger = await prisma.passenger.findUnique({ where: { userId: passengerUser.id } }); if (!passenger) { - passenger = await prisma.passenger.create({ data: { userId: user.id } }); + passenger = await prisma.passenger.create({ data: { userId: passengerUser.id } }); await prisma.loyaltyAccount.create({ data: { passengerId: passenger.id, pointsBalance: 2450, tier: 'SILVER' } }); await prisma.walletAccount.create({ data: { passengerId: passenger.id, balanceMinor: 125000 } }); } - await prisma.userPreferences.upsert({ where: { userId: user.id }, update: {}, create: { userId: user.id } }); + await prisma.userPreferences.upsert({ where: { userId: passengerUser.id }, update: {}, create: { userId: passengerUser.id, language: 'en' } }); - await prisma.user.upsert({ where: { email: 'admin@edr-platform.com' }, update: { passwordHash: await bcrypt.hash('admin123', 10), role: 'ADMIN' }, create: { fullName: 'EDR Admin', email: 'admin@edr-platform.com', phone: '+251900000000', passwordHash: await bcrypt.hash('admin123', 10), role: 'ADMIN' } }); + const agentUser = await prisma.user.upsert({ where: { email: 'agent@edr-platform.com' }, update: { passwordHash: agentHash, role: 'AGENT' }, create: { fullName: 'Agent Abebe', email: 'agent@edr-platform.com', phone: '+251911111111', passwordHash: agentHash, role: 'AGENT' } }); + await prisma.agent.upsert({ where: { userId: agentUser.id }, update: {}, create: { userId: agentUser.id, agentCode: 'AG001', stationId: addis.id, commissionRate: 5, active: true } }); - await prisma.promotion.upsert({ where: { code: 'WEEKEND15' }, update: {}, create: { title: 'Weekend Sale', code: 'WEEKEND15', percentOff: 15, validUntil: new Date('2026-12-31') } }); + // Baggage Allowance - Delete and recreate + await prisma.baggageAllowance.deleteMany({}); + await prisma.baggageAllowance.createMany({ data: [ + { serviceClass: 'ECONOMY_REGULAR', maxWeightKg: 20, maxPiecesCount: 2, excessFeePerKg: 500 }, + { serviceClass: 'ECONOMY_BED_LOWER', maxWeightKg: 25, maxPiecesCount: 2, excessFeePerKg: 450 }, + { serviceClass: 'VIP_BED_LOWER', maxWeightKg: 30, maxPiecesCount: 3, excessFeePerKg: 400 }, + ]}); - const faqCat = await prisma.faqCategory.create({ data: { title: 'Booking & Tickets', iconKey: 'description_outlined' } }); - await prisma.faqArticle.create({ data: { categoryId: faqCat.id, question: 'How do I book a train ticket?', answerMarkdown: 'Open Search, pick stations and date, select seats, and proceed to payment.', rank: 1 } }); + // Notification Templates + await prisma.notificationTemplate.upsert({ where: { code: 'BOOKING_CONFIRMED' }, update: {}, create: { code: 'BOOKING_CONFIRMED', channel: 'EMAIL', subject: 'Booking Confirmed', bodyTemplate: 'Your booking {{bookingRef}} is confirmed for {{tripDate}}.', active: true } }); + await prisma.notificationTemplate.upsert({ where: { code: 'PAYMENT_SUCCESS' }, update: {}, create: { code: 'PAYMENT_SUCCESS', channel: 'SMS', bodyTemplate: 'Payment successful for {{bookingRef}}. Amount: {{amount}} ETB', active: true } }); + await prisma.notificationTemplate.upsert({ where: { code: 'TRIP_REMINDER' }, update: {}, create: { code: 'TRIP_REMINDER', channel: 'PUSH', subject: 'Trip Reminder', bodyTemplate: 'Your trip departs in {{hours}} hours from {{station}}.', active: true } }); - console.log('βœ… Seed complete'); + // Promotions + await prisma.promotion.upsert({ where: { code: 'WEEKEND15' }, update: {}, create: { title: 'Weekend Sale', subtitle: '15% off all trips', code: 'WEEKEND15', percentOff: 15, validUntil: new Date('2026-12-31'), ctaLabel: 'Book Now', active: true } }); + await prisma.promotion.upsert({ where: { code: 'NEWUSER20' }, update: {}, create: { title: 'New User Bonus', code: 'NEWUSER20', percentOff: 20, validUntil: new Date('2026-12-31'), active: true } }); + + // FAQ - Delete and recreate for clean seed + await prisma.faqArticle.deleteMany({}); + await prisma.faqCategory.deleteMany({}); + const faqBooking = await prisma.faqCategory.create({ data: { title: 'Booking & Tickets', iconKey: 'confirmation_number' } }); + const faqPayment = await prisma.faqCategory.create({ data: { title: 'Payment & Refunds', iconKey: 'payment' } }); + + await prisma.faqArticle.createMany({ data: [ + { categoryId: faqBooking.id, question: 'How do I book a train ticket?', answerMarkdown: 'Open Search, select origin and destination stations, choose date, select seats, and proceed to payment.', rank: 1 }, + { categoryId: faqBooking.id, question: 'Can I modify my booking?', answerMarkdown: 'Yes, you can modify your booking up to 24 hours before departure through the Bookings section.', rank: 2 }, + { categoryId: faqPayment.id, question: 'What payment methods are accepted?', answerMarkdown: 'We accept Telebirr, CBE Birr, eBirr, Card, and Wallet payments.', rank: 1 }, + { categoryId: faqPayment.id, question: 'How do refunds work?', answerMarkdown: 'Refunds are processed within 5-7 business days to your original payment method.', rank: 2 }, + ]}); + + // Menu Categories & Items - Delete and recreate + await prisma.menuItem.deleteMany({}); + await prisma.menuCategory.deleteMany({}); + const menuBeverages = await prisma.menuCategory.create({ data: { name: 'Beverages' } }); + const menuSnacks = await prisma.menuCategory.create({ data: { name: 'Snacks' } }); + + await prisma.menuItem.createMany({ data: [ + { tripId: trip1.id, categoryId: menuBeverages.id, name: 'Coffee', priceMinor: 2500, available: true }, + { tripId: trip1.id, categoryId: menuBeverages.id, name: 'Tea', priceMinor: 2000, available: true }, + { tripId: trip1.id, categoryId: menuSnacks.id, name: 'Sandwich', priceMinor: 5000, available: true }, + ]}); + + // Station Crowd Signals - Delete and recreate + await prisma.stationCrowdSignal.deleteMany({}); + await prisma.stationCrowdSignal.createMany({ data: [ + { stationId: addis.id, level: 'MODERATE', label: 'Moderate', statusLabel: 'Normal operations' }, + { stationId: adama.id, level: 'LOW', label: 'Low', statusLabel: 'Quiet' }, + { stationId: direDawa.id, level: 'LOW', label: 'Low', statusLabel: 'Quiet' }, + { stationId: djibouti.id, level: 'HIGH', label: 'High', statusLabel: 'Busy terminal' }, + ]}); + + // Fraud Detection Rules + await prisma.fraudRule.upsert({ where: { type: 'VELOCITY' }, update: {}, create: { type: 'VELOCITY', enabled: true, threshold: 3, config: { windowMinutes: 60, action: 'FLAG' } } }); + await prisma.fraudRule.upsert({ where: { type: 'HIGH_VALUE' }, update: {}, create: { type: 'HIGH_VALUE', enabled: true, threshold: 500000, config: { action: 'REVIEW' } } }); + await prisma.fraudRule.upsert({ where: { type: 'FAILED_PAYMENTS' }, update: {}, create: { type: 'FAILED_PAYMENTS', enabled: true, threshold: 5, config: { windowMinutes: 1440, action: 'BLOCK' } } }); + + // Loyalty Rewards (linked to loyalty account) - Delete and recreate + if (passenger) { + const loyaltyAccount = await prisma.loyaltyAccount.findUnique({ where: { passengerId: passenger.id } }); + if (loyaltyAccount) { + await prisma.loyaltyReward.deleteMany({ where: { accountId: loyaltyAccount.id } }); + await prisma.loyaltyReward.createMany({ data: [ + { accountId: loyaltyAccount.id, title: '10% Discount Voucher', costPoints: 1000, available: true, description: 'Get 10% off your next booking' }, + { accountId: loyaltyAccount.id, title: 'Free Upgrade to VIP', costPoints: 2500, available: true, description: 'Upgrade to VIP class on any trip' }, + { accountId: loyaltyAccount.id, title: '500 ETB Wallet Credit', costPoints: 5000, available: true, description: 'Add 500 ETB to your wallet' }, + ]}); + } + } + + console.log('βœ… Comprehensive seed complete'); + console.log('\nπŸ“‹ Seed Summary:'); + console.log(' - 18 Stations (Complete Ethiopian-Djibouti Railway)'); + console.log(' - 1 Route with 21 stops'); + console.log(' - 2 Train services, 4 trips'); + console.log(' - 3 Coaches per trip (Economy, Bed, VIP)'); + console.log(' - 3 Users: Admin, Passenger (Silver tier + wallet), Agent'); + console.log(' - 3 Fraud detection rules'); + console.log(' - 3 Loyalty rewards'); + console.log(' - Baggage rules, Notification templates, Promotions, FAQ'); + console.log('\nπŸ”‘ Login Credentials:'); + console.log(' Admin: admin@edr-platform.com / admin123'); + console.log(' Passenger: kelemu@email.com / password123'); + console.log(' Agent: agent@edr-platform.com / agent123'); + console.log('\nπŸš‰ Stations: Addis Ababa β†’ Sebeta β†’ Labu β†’ Indode β†’ Bishoftu β†’ Mojo β†’ Adama β†’ Feto β†’ Metahara β†’ Awash β†’ Mieso β†’ Bike β†’ Dire Dawa β†’ Arawa β†’ Adigala β†’ Aysha β†’ Dawanle β†’ Alisabieh β†’ Holhol β†’ Nagad β†’ Djibouti'); } main().catch(console.error).finally(() => prisma.$disconnect()); diff --git a/apps/edr-passenger-api/src/app.module.ts b/apps/edr-passenger-api/src/app.module.ts index 0fda94657..e5c62a2bb 100644 --- a/apps/edr-passenger-api/src/app.module.ts +++ b/apps/edr-passenger-api/src/app.module.ts @@ -1,11 +1,17 @@ -import { Module } from '@nestjs/common'; +import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { ScheduleModule } from '@nestjs/schedule'; import { EventEmitterModule } from '@nestjs/event-emitter'; import { PrismaModule } from './common/prisma.module'; +import { I18nModule } from './common/i18n/i18n.module'; +import { IamModule } from './common/iam.module'; +import { LocaleMiddleware } from './common/i18n/locale.middleware'; import appConfig from './config/app.config'; import dbConfig from './config/database.config'; import telebirrConfig from './config/telebirr.config'; +import cbeConfig from './config/cbe.config'; +import ebirrConfig from './config/ebirr.config'; +import cardConfig from './config/card.config'; import { AuthModule } from './modules/auth/auth.module'; import { StationsModule } from './modules/stations/stations.module'; import { FleetModule } from './modules/fleet/fleet.module'; @@ -24,13 +30,21 @@ import { LiveModule } from './modules/live/live.module'; import { SupportModule } from './modules/support/support.module'; import { DashboardModule } from './modules/dashboard/dashboard.module'; import { SegmentsModule } from './modules/segments/segments.module'; +import { AgentsModule } from './modules/agents/agents.module'; +import { ReportsModule } from './modules/reports/reports.module'; +import { FraudModule } from './modules/fraud/fraud.module'; @Module({ imports: [ - ConfigModule.forRoot({ isGlobal: true, load: [appConfig, dbConfig, telebirrConfig] }), + ConfigModule.forRoot({ + isGlobal: true, + load: [appConfig, dbConfig, telebirrConfig, cbeConfig, ebirrConfig, cardConfig], + }), ScheduleModule.forRoot(), EventEmitterModule.forRoot(), PrismaModule, + I18nModule, + IamModule, AuthModule, StationsModule, FleetModule, @@ -49,6 +63,13 @@ import { SegmentsModule } from './modules/segments/segments.module'; SupportModule, DashboardModule, SegmentsModule, + AgentsModule, + ReportsModule, + FraudModule, ], }) -export class AppModule {} +export class AppModule implements NestModule { + configure(consumer: MiddlewareConsumer) { + consumer.apply(LocaleMiddleware).forRoutes('*'); + } +} diff --git a/apps/edr-passenger-api/src/common/i18n/i18n.module.ts b/apps/edr-passenger-api/src/common/i18n/i18n.module.ts new file mode 100644 index 000000000..99d70185c --- /dev/null +++ b/apps/edr-passenger-api/src/common/i18n/i18n.module.ts @@ -0,0 +1,9 @@ +import { Module, Global } from '@nestjs/common'; +import { I18nService } from './i18n.service'; + +@Global() +@Module({ + providers: [I18nService], + exports: [I18nService], +}) +export class I18nModule {} diff --git a/apps/edr-passenger-api/src/common/i18n/i18n.service.spec.ts b/apps/edr-passenger-api/src/common/i18n/i18n.service.spec.ts new file mode 100644 index 000000000..37c74c04b --- /dev/null +++ b/apps/edr-passenger-api/src/common/i18n/i18n.service.spec.ts @@ -0,0 +1,49 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { I18nService } from './i18n.service'; + +describe('I18nService', () => { + let service: I18nService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [I18nService], + }).compile(); + + service = module.get(I18nService); + }); + + it('should translate English keys', () => { + expect(service.translate('common.welcome', 'en')).toBe('Welcome'); + expect(service.translate('booking.created', 'en')).toBe('Booking created successfully'); + }); + + it('should translate Amharic keys', () => { + expect(service.translate('common.welcome', 'am')).toBe('αŠ₯αŠ•αŠ³αŠ• α‹°αˆ…αŠ“ መ጑'); + }); + + it('should translate French keys', () => { + expect(service.translate('common.welcome', 'fr')).toBe('Bienvenue'); + }); + + it('should translate Oromo keys', () => { + expect(service.translate('common.welcome', 'om')).toBe('Baga nagaan dhuftan'); + }); + + it('should fallback to English for unsupported locale', () => { + expect(service.translate('common.welcome', 'de')).toBe('Welcome'); + }); + + it('should return key if translation not found', () => { + expect(service.translate('nonexistent.key', 'en')).toBe('nonexistent.key'); + }); + + it('should interpolate parameters', () => { + const result = service.translate('common.welcome', 'en', { name: 'John' }); + expect(result).toBeDefined(); + }); + + it('should return supported locales', () => { + const locales = service.getSupportedLocales(); + expect(locales).toEqual(['en', 'am', 'fr', 'om']); + }); +}); diff --git a/apps/edr-passenger-api/src/common/i18n/i18n.service.ts b/apps/edr-passenger-api/src/common/i18n/i18n.service.ts new file mode 100644 index 000000000..9c3eee5fc --- /dev/null +++ b/apps/edr-passenger-api/src/common/i18n/i18n.service.ts @@ -0,0 +1,63 @@ +import { Injectable } from '@nestjs/common'; +import * as fs from 'fs'; +import * as path from 'path'; + +type TranslationMap = Record; + +@Injectable() +export class I18nService { + private translations: Map = new Map(); + private readonly supportedLocales = ['en', 'am', 'fr', 'om']; + private readonly defaultLocale = 'en'; + + constructor() { + this.loadTranslations(); + } + + private loadTranslations() { + for (const locale of this.supportedLocales) { + const filePath = path.join(__dirname, 'translations', `${locale}.json`); + try { + const content = fs.readFileSync(filePath, 'utf-8'); + this.translations.set(locale, JSON.parse(content)); + } catch (err) { + console.warn(`Failed to load translation file for locale: ${locale}`); + } + } + } + + translate(key: string, locale: string = this.defaultLocale, params?: Record): string { + const normalizedLocale = this.normalizeLocale(locale); + const translations = this.translations.get(normalizedLocale) || this.translations.get(this.defaultLocale); + + if (!translations) return key; + + const keys = key.split('.'); + let value: any = translations; + + for (const k of keys) { + value = value?.[k]; + if (value === undefined) return key; + } + + if (typeof value !== 'string') return key; + + if (params) { + return Object.entries(params).reduce( + (text, [param, val]) => text.replace(new RegExp(`{{${param}}}`, 'g'), val), + value + ); + } + + return value; + } + + private normalizeLocale(locale: string): string { + const normalized = locale.toLowerCase().split('-')[0]; + return this.supportedLocales.includes(normalized) ? normalized : this.defaultLocale; + } + + getSupportedLocales(): string[] { + return this.supportedLocales; + } +} diff --git a/apps/edr-passenger-api/src/common/i18n/locale.decorator.ts b/apps/edr-passenger-api/src/common/i18n/locale.decorator.ts new file mode 100644 index 000000000..388582795 --- /dev/null +++ b/apps/edr-passenger-api/src/common/i18n/locale.decorator.ts @@ -0,0 +1,9 @@ +import { createParamDecorator, ExecutionContext } from '@nestjs/common'; +import { LOCALE_KEY } from './locale.middleware'; + +export const Locale = createParamDecorator( + (data: unknown, ctx: ExecutionContext): string => { + const request = ctx.switchToHttp().getRequest(); + return request[LOCALE_KEY] || 'en'; + }, +); diff --git a/apps/edr-passenger-api/src/common/i18n/locale.middleware.ts b/apps/edr-passenger-api/src/common/i18n/locale.middleware.ts new file mode 100644 index 000000000..81bbc6990 --- /dev/null +++ b/apps/edr-passenger-api/src/common/i18n/locale.middleware.ts @@ -0,0 +1,16 @@ +import { Injectable, NestMiddleware } from '@nestjs/common'; + +export const LOCALE_KEY = 'locale'; + +@Injectable() +export class LocaleMiddleware implements NestMiddleware { + use(req: any, res: any, next: () => void) { + const locale = + req.query.lang as string || + req.headers['accept-language']?.split(',')[0]?.split('-')[0] || + 'en'; + + req[LOCALE_KEY] = locale; + next(); + } +} diff --git a/apps/edr-passenger-api/src/common/i18n/translations/am.json b/apps/edr-passenger-api/src/common/i18n/translations/am.json new file mode 100644 index 000000000..16250494d --- /dev/null +++ b/apps/edr-passenger-api/src/common/i18n/translations/am.json @@ -0,0 +1,23 @@ +{ + "common": { + "welcome": "αŠ₯αŠ•αŠ³αŠ• α‹°αˆ…αŠ“ መ጑", + "error": "αˆ΅αˆ…α‰°α‰΅ α‰°αŠ¨αˆ΅α‰·αˆ", + "success": "α‰°αˆ³αŠ­α‰·αˆ" + }, + "booking": { + "created": "ቦታ αˆ›αˆ΅α‹«α‹ α‰ α‰°αˆ³αŠ« αˆαŠ”α‰³ α‰°αˆαŒ₯ሯል", + "notFound": "ቦታ αˆ›αˆ΅α‹«α‹ αŠ αˆα‰°αŒˆαŠ˜αˆ", + "cancelled": "ቦታ αˆ›αˆ΅α‹«α‹ α‰°αˆ°αˆ­α‹Ÿαˆ", + "confirmed": "ቦታ αˆ›αˆ΅α‹«α‹ α‰°αˆ¨αŒ‹αŒαŒ§αˆ" + }, + "payment": { + "succeeded": "αŠ­αα‹« α‰°αˆ³αŠ­α‰·αˆ", + "failed": "αŠ­αα‹« αŠ αˆα‰°αˆ³αŠ«αˆ", + "pending": "αŠ­αα‹« α‰ αˆ˜αŒ α‰£α‰ α‰… αˆ‹α‹­" + }, + "ticket": { + "issued": "α‰΅αŠ¬α‰΅ α‰°αˆ°αŒ₯α‰·αˆ", + "validated": "α‰΅αŠ¬α‰΅ α‰°αˆ¨αŒ‹αŒαŒ§αˆ", + "alreadyValidated": "α‰΅αŠ¬α‰΅ α‰€α‹΅αˆžα‹αŠ‘ α‰°αˆ¨αŒ‹αŒαŒ§αˆ" + } +} diff --git a/apps/edr-passenger-api/src/common/i18n/translations/en.json b/apps/edr-passenger-api/src/common/i18n/translations/en.json new file mode 100644 index 000000000..dd1428f02 --- /dev/null +++ b/apps/edr-passenger-api/src/common/i18n/translations/en.json @@ -0,0 +1,23 @@ +{ + "common": { + "welcome": "Welcome", + "error": "An error occurred", + "success": "Success" + }, + "booking": { + "created": "Booking created successfully", + "notFound": "Booking not found", + "cancelled": "Booking cancelled", + "confirmed": "Booking confirmed" + }, + "payment": { + "succeeded": "Payment successful", + "failed": "Payment failed", + "pending": "Payment pending" + }, + "ticket": { + "issued": "Ticket issued", + "validated": "Ticket validated", + "alreadyValidated": "Ticket already validated" + } +} diff --git a/apps/edr-passenger-api/src/common/i18n/translations/fr.json b/apps/edr-passenger-api/src/common/i18n/translations/fr.json new file mode 100644 index 000000000..8fdd7da89 --- /dev/null +++ b/apps/edr-passenger-api/src/common/i18n/translations/fr.json @@ -0,0 +1,23 @@ +{ + "common": { + "welcome": "Bienvenue", + "error": "Une erreur s'est produite", + "success": "SuccΓ¨s" + }, + "booking": { + "created": "RΓ©servation créée avec succΓ¨s", + "notFound": "RΓ©servation introuvable", + "cancelled": "RΓ©servation annulΓ©e", + "confirmed": "RΓ©servation confirmΓ©e" + }, + "payment": { + "succeeded": "Paiement rΓ©ussi", + "failed": "Γ‰chec du paiement", + "pending": "Paiement en attente" + }, + "ticket": { + "issued": "Billet Γ©mis", + "validated": "Billet validΓ©", + "alreadyValidated": "Billet dΓ©jΓ  validΓ©" + } +} diff --git a/apps/edr-passenger-api/src/common/i18n/translations/om.json b/apps/edr-passenger-api/src/common/i18n/translations/om.json new file mode 100644 index 000000000..1c1b4a77b --- /dev/null +++ b/apps/edr-passenger-api/src/common/i18n/translations/om.json @@ -0,0 +1,23 @@ +{ + "common": { + "welcome": "Baga nagaan dhuftan", + "error": "Dogongora uumame", + "success": "Milkaa'ina" + }, + "booking": { + "created": "Bakka qabachuu milkaa'inaan uumame", + "notFound": "Bakka qabachuu hin argamne", + "cancelled": "Bakka qabachuu haqame", + "confirmed": "Bakka qabachuu mirkaneeffame" + }, + "payment": { + "succeeded": "Kaffaltiin milkaa'e", + "failed": "Kaffaltiin hin milkoofne", + "pending": "Kaffaltiin eegaa jira" + }, + "ticket": { + "issued": "Tiikeetiin kenname", + "validated": "Tiikeetiin mirkaneeffame", + "alreadyValidated": "Tiikeetiin duraan mirkaneeffame" + } +} diff --git a/apps/edr-passenger-api/src/common/iam-adapter.spec.ts b/apps/edr-passenger-api/src/common/iam-adapter.spec.ts new file mode 100644 index 000000000..d0c404366 --- /dev/null +++ b/apps/edr-passenger-api/src/common/iam-adapter.spec.ts @@ -0,0 +1,264 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ExecutionContext, UnauthorizedException, ForbiddenException } from '@nestjs/common'; +import { Reflector } from '@nestjs/core'; +import { ConfigService } from '@nestjs/config'; +import { HttpService } from '@nestjs/axios'; +import { IamGuard } from './iam-adapter'; +import { of, throwError } from 'rxjs'; + +describe('IamGuard', () => { + let guard: IamGuard; + let httpService: HttpService; + let configService: ConfigService; + let reflector: Reflector; + + const mockConfigService = { + get: jest.fn((key: string) => { + const config: Record = { + IAM_API_URL: 'https://iam.test.com/api', + IAM_ENABLED: 'true', + IAM_API_KEY: 'test-api-key', + }; + return config[key]; + }), + }; + + const mockHttpService = { + post: jest.fn(), + }; + + const mockReflector = { + get: jest.fn(), + }; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ + IamGuard, + { provide: ConfigService, useValue: mockConfigService }, + { provide: HttpService, useValue: mockHttpService }, + { provide: Reflector, useValue: mockReflector }, + ], + }).compile(); + + guard = module.get(IamGuard); + httpService = module.get(HttpService); + configService = module.get(ConfigService); + reflector = module.get(Reflector); + + jest.clearAllMocks(); + }); + + const createMockContext = (token?: string, roles?: string[]): ExecutionContext => { + const request = { + headers: token ? { authorization: `Bearer ${token}` } : {}, + user: undefined, + }; + + return { + switchToHttp: () => ({ + getRequest: () => request, + }), + getHandler: () => ({}), + } as ExecutionContext; + }; + + describe('canActivate', () => { + it('should allow access when IAM is disabled', async () => { + mockConfigService.get.mockReturnValueOnce('false'); // IAM_ENABLED + + const context = createMockContext(); + const result = await guard.canActivate(context); + + expect(result).toBe(true); + }); + + it('should throw UnauthorizedException when no token provided', async () => { + const context = createMockContext(); + + await expect(guard.canActivate(context)).rejects.toThrow(UnauthorizedException); + }); + + it('should validate token and allow access', async () => { + const mockValidationResponse = { + data: { + valid: true, + payload: { + sub: 'user-123', + email: 'admin@test.com', + roles: ['ADMIN'], + permissions: ['read', 'write'], + exp: Date.now() + 3600000, + iat: Date.now(), + }, + }, + }; + + mockHttpService.post.mockReturnValue(of(mockValidationResponse)); + mockReflector.get.mockReturnValue(null); + + const context = createMockContext('valid-token'); + const result = await guard.canActivate(context); + + expect(result).toBe(true); + expect(mockHttpService.post).toHaveBeenCalledWith( + 'https://iam.test.com/api/v1/auth/validate', + { token: 'valid-token' }, + expect.objectContaining({ + headers: expect.objectContaining({ + 'X-API-Key': 'test-api-key', + }), + }), + ); + }); + + it('should throw UnauthorizedException for invalid token', async () => { + const mockValidationResponse = { + data: { + valid: false, + error: 'Token expired', + }, + }; + + mockHttpService.post.mockReturnValue(of(mockValidationResponse)); + + const context = createMockContext('invalid-token'); + + await expect(guard.canActivate(context)).rejects.toThrow(UnauthorizedException); + }); + + it('should check required roles', async () => { + const mockValidationResponse = { + data: { + valid: true, + payload: { + sub: 'user-123', + email: 'agent@test.com', + roles: ['AGENT'], + permissions: [], + exp: Date.now() + 3600000, + iat: Date.now(), + }, + }, + }; + + mockHttpService.post.mockReturnValue(of(mockValidationResponse)); + mockReflector.get.mockReturnValue(['ADMIN', 'SUPERVISOR']); + + const context = createMockContext('valid-token'); + + await expect(guard.canActivate(context)).rejects.toThrow(ForbiddenException); + }); + + it('should allow access when user has required role', async () => { + const mockValidationResponse = { + data: { + valid: true, + payload: { + sub: 'user-123', + email: 'admin@test.com', + roles: ['ADMIN'], + permissions: [], + exp: Date.now() + 3600000, + iat: Date.now(), + }, + }, + }; + + mockHttpService.post.mockReturnValue(of(mockValidationResponse)); + mockReflector.get.mockReturnValue(['ADMIN', 'SUPERVISOR']); + + const context = createMockContext('valid-token'); + const result = await guard.canActivate(context); + + expect(result).toBe(true); + }); + + it('should handle HTTP errors gracefully', async () => { + mockHttpService.post.mockReturnValue( + throwError(() => new Error('Network error')), + ); + + const context = createMockContext('valid-token'); + + await expect(guard.canActivate(context)).rejects.toThrow(UnauthorizedException); + }); + + it('should attach user to request', async () => { + const mockValidationResponse = { + data: { + valid: true, + payload: { + sub: 'user-123', + email: 'admin@test.com', + roles: ['ADMIN'], + permissions: ['read', 'write'], + organizationId: 'org-456', + exp: Date.now() + 3600000, + iat: Date.now(), + }, + }, + }; + + mockHttpService.post.mockReturnValue(of(mockValidationResponse)); + mockReflector.get.mockReturnValue(null); + + const context = createMockContext('valid-token'); + await guard.canActivate(context); + + const request = context.switchToHttp().getRequest(); + expect(request.user).toEqual({ + userId: 'user-123', + email: 'admin@test.com', + roles: ['ADMIN'], + permissions: ['read', 'write'], + organizationId: 'org-456', + }); + }); + }); + + describe('token extraction', () => { + it('should extract token from Bearer header', async () => { + const mockValidationResponse = { + data: { + valid: true, + payload: { + sub: 'user-123', + email: 'test@test.com', + roles: [], + permissions: [], + exp: Date.now() + 3600000, + iat: Date.now(), + }, + }, + }; + + mockHttpService.post.mockReturnValue(of(mockValidationResponse)); + mockReflector.get.mockReturnValue(null); + + const context = createMockContext('my-token-123'); + await guard.canActivate(context); + + expect(mockHttpService.post).toHaveBeenCalledWith( + expect.any(String), + { token: 'my-token-123' }, + expect.any(Object), + ); + }); + + it('should reject malformed authorization header', async () => { + const request = { + headers: { authorization: 'InvalidFormat token' }, + }; + + const context = { + switchToHttp: () => ({ + getRequest: () => request, + }), + getHandler: () => ({}), + } as ExecutionContext; + + await expect(guard.canActivate(context)).rejects.toThrow(UnauthorizedException); + }); + }); +}); diff --git a/apps/edr-passenger-api/src/common/iam-adapter.ts b/apps/edr-passenger-api/src/common/iam-adapter.ts new file mode 100644 index 000000000..fb32d9ec6 --- /dev/null +++ b/apps/edr-passenger-api/src/common/iam-adapter.ts @@ -0,0 +1,144 @@ +import { Injectable, CanActivate, ExecutionContext, UnauthorizedException, ForbiddenException } from '@nestjs/common'; +import { Reflector } from '@nestjs/core'; +import { ConfigService } from '@nestjs/config'; +import { HttpService } from '@nestjs/axios'; +import { firstValueFrom } from 'rxjs'; + +/** + * IAM Adapter for @tria-plc corporate identity integration + * + * This adapter wraps the corporate IAM guards and provides a bridge + * between the corporate identity system and the EDR passenger API. + * + * For back-office roles (agent, supervisor, admin, staff), this guard + * validates tokens against the corporate IAM service. + * + * For passenger-facing routes, the existing JWT guard is used. + */ + +export interface IamTokenPayload { + sub: string; + email: string; + roles: string[]; + permissions: string[]; + organizationId?: string; + exp: number; + iat: number; +} + +export interface IamValidationResponse { + valid: boolean; + payload?: IamTokenPayload; + error?: string; +} + +@Injectable() +export class IamGuard implements CanActivate { + private readonly iamApiUrl: string; + private readonly iamEnabled: boolean; + + constructor( + private readonly reflector: Reflector, + private readonly config: ConfigService, + private readonly http: HttpService, + ) { + this.iamApiUrl = this.config.get('IAM_API_URL') || 'https://iam.tria-plc.com/api'; + this.iamEnabled = this.config.get('IAM_ENABLED') === 'true'; + } + + async canActivate(context: ExecutionContext): Promise { + if (!this.iamEnabled) { + // IAM disabled - allow access (for development) + return true; + } + + const request = context.switchToHttp().getRequest(); + const token = this.extractToken(request); + + if (!token) { + throw new UnauthorizedException('No authentication token provided'); + } + + const validation = await this.validateToken(token); + + if (!validation.valid || !validation.payload) { + throw new UnauthorizedException(validation.error || 'Invalid token'); + } + + // Check required roles + const requiredRoles = this.reflector.get('roles', context.getHandler()); + if (requiredRoles && requiredRoles.length > 0) { + const hasRole = requiredRoles.some((role) => validation.payload!.roles.includes(role)); + if (!hasRole) { + throw new ForbiddenException('Insufficient permissions'); + } + } + + // Attach user to request + request.user = { + userId: validation.payload.sub, + email: validation.payload.email, + roles: validation.payload.roles, + permissions: validation.payload.permissions, + organizationId: validation.payload.organizationId, + }; + + return true; + } + + private extractToken(request: any): string | null { + const authHeader = request.headers.authorization; + if (!authHeader) return null; + + const parts = authHeader.split(' '); + if (parts.length !== 2 || parts[0] !== 'Bearer') return null; + + return parts[1]; + } + + private async validateToken(token: string): Promise { + try { + const response = await firstValueFrom( + this.http.post( + `${this.iamApiUrl}/v1/auth/validate`, + { token }, + { + headers: { + 'Content-Type': 'application/json', + 'X-API-Key': this.config.get('IAM_API_KEY') || '', + }, + timeout: 5000, + }, + ), + ); + + return response.data; + } catch (err) { + return { + valid: false, + error: err instanceof Error ? err.message : 'Token validation failed', + }; + } + } +} + +/** + * Decorator to mark routes as requiring IAM authentication + */ +export const UseIamAuth = () => { + // This is a marker decorator that can be used with @UseGuards(IamGuard) + return (target: any, propertyKey?: string, descriptor?: PropertyDescriptor) => { + // Marker only - actual guard is applied via @UseGuards + }; +}; + +/** + * Decorator to specify required roles for IAM-protected routes + */ +export const IamRoles = (...roles: string[]) => { + return (target: any, propertyKey?: string, descriptor?: PropertyDescriptor) => { + if (descriptor) { + Reflect.defineMetadata('roles', roles, descriptor.value); + } + }; +}; diff --git a/apps/edr-passenger-api/src/common/iam.module.ts b/apps/edr-passenger-api/src/common/iam.module.ts new file mode 100644 index 000000000..7a8ec9599 --- /dev/null +++ b/apps/edr-passenger-api/src/common/iam.module.ts @@ -0,0 +1,11 @@ +import { Module, Global } from '@nestjs/common'; +import { HttpModule } from '@nestjs/axios'; +import { IamGuard } from './iam-adapter'; + +@Global() +@Module({ + imports: [HttpModule.register({ timeout: 5000 })], + providers: [IamGuard], + exports: [IamGuard], +}) +export class IamModule {} diff --git a/apps/edr-passenger-api/src/common/interceptors/session-activity.interceptor.ts b/apps/edr-passenger-api/src/common/interceptors/session-activity.interceptor.ts new file mode 100644 index 000000000..9c962ba60 --- /dev/null +++ b/apps/edr-passenger-api/src/common/interceptors/session-activity.interceptor.ts @@ -0,0 +1,49 @@ +import { Injectable, NestInterceptor, ExecutionContext, CallHandler, UnauthorizedException } from '@nestjs/common'; +import { Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; +import { PrismaService } from '../prisma.service'; +import { ConfigService } from '@nestjs/config'; + +@Injectable() +export class SessionActivityInterceptor implements NestInterceptor { + private readonly inactivityMinutes: number; + + constructor( + private readonly prisma: PrismaService, + private readonly config: ConfigService, + ) { + this.inactivityMinutes = parseInt(this.config.get('SESSION_INACTIVITY_MINUTES') || '30', 10); + } + + async intercept(context: ExecutionContext, next: CallHandler): Promise> { + const request = context.switchToHttp().getRequest(); + const response = context.switchToHttp().getResponse(); + const user = request.user; + + if (user?.userId) { + const session = await this.prisma.session.findFirst({ + where: { userId: user.userId }, + orderBy: { lastActivityAt: 'desc' }, + }); + + if (session) { + const inactiveMinutes = (Date.now() - session.lastActivityAt.getTime()) / 60000; + + if (inactiveMinutes > this.inactivityMinutes) { + await this.prisma.session.delete({ where: { id: session.id } }); + throw new UnauthorizedException('Session expired due to inactivity'); + } + + const expiryWarningMinutes = Math.max(0, this.inactivityMinutes - inactiveMinutes); + response.setHeader('X-Session-Expiry-Warning', Math.floor(expiryWarningMinutes).toString()); + + await this.prisma.session.update({ + where: { id: session.id }, + data: { lastActivityAt: new Date() }, + }); + } + } + + return next.handle().pipe(tap(() => {})); + } +} diff --git a/apps/edr-passenger-api/src/common/prisma.module.ts b/apps/edr-passenger-api/src/common/prisma.module.ts index dd4abed26..36c2ebadf 100644 --- a/apps/edr-passenger-api/src/common/prisma.module.ts +++ b/apps/edr-passenger-api/src/common/prisma.module.ts @@ -1,6 +1,7 @@ import { Module, Global } from '@nestjs/common'; import { PrismaService } from './prisma.service'; +import { SessionActivityInterceptor } from './interceptors/session-activity.interceptor'; @Global() -@Module({ providers: [PrismaService], exports: [PrismaService] }) +@Module({ providers: [PrismaService, SessionActivityInterceptor], exports: [PrismaService, SessionActivityInterceptor] }) export class PrismaModule {} diff --git a/apps/edr-passenger-api/src/common/roles.decorator.ts b/apps/edr-passenger-api/src/common/roles.decorator.ts new file mode 100644 index 000000000..ec0c377c6 --- /dev/null +++ b/apps/edr-passenger-api/src/common/roles.decorator.ts @@ -0,0 +1,5 @@ +import { SetMetadata } from '@nestjs/common'; +import { UserRole } from '@prisma/client'; + +export const ROLES_KEY = 'roles'; +export const Roles = (...roles: UserRole[]) => SetMetadata(ROLES_KEY, roles); diff --git a/apps/edr-passenger-api/src/common/roles.guard.ts b/apps/edr-passenger-api/src/common/roles.guard.ts new file mode 100644 index 000000000..7b4b3eafc --- /dev/null +++ b/apps/edr-passenger-api/src/common/roles.guard.ts @@ -0,0 +1,19 @@ +import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common'; +import { Reflector } from '@nestjs/core'; +import { UserRole } from '@prisma/client'; +import { ROLES_KEY } from './roles.decorator'; + +@Injectable() +export class RolesGuard implements CanActivate { + constructor(private reflector: Reflector) {} + + canActivate(context: ExecutionContext): boolean { + const requiredRoles = this.reflector.getAllAndOverride(ROLES_KEY, [ + context.getHandler(), + context.getClass(), + ]); + if (!requiredRoles) return true; + const { user } = context.switchToHttp().getRequest(); + return requiredRoles.some((role) => user?.role === role); + } +} diff --git a/apps/edr-passenger-api/src/config/card.config.ts b/apps/edr-passenger-api/src/config/card.config.ts new file mode 100644 index 000000000..1fd36f419 --- /dev/null +++ b/apps/edr-passenger-api/src/config/card.config.ts @@ -0,0 +1,9 @@ +import { registerAs } from '@nestjs/config'; + +export default registerAs('card', () => ({ + baseUrl: process.env.CARD_BASE_URL || '', + apiKey: process.env.CARD_API_KEY || '', + webhookSecret: process.env.CARD_WEBHOOK_SECRET || '', + webhookUrl: process.env.CARD_WEBHOOK_URL || '', + returnUrl: process.env.CARD_RETURN_URL || '', +})); diff --git a/apps/edr-passenger-api/src/config/cbe.config.ts b/apps/edr-passenger-api/src/config/cbe.config.ts new file mode 100644 index 000000000..14ecd1eae --- /dev/null +++ b/apps/edr-passenger-api/src/config/cbe.config.ts @@ -0,0 +1,9 @@ +import { registerAs } from '@nestjs/config'; + +export default registerAs('cbe', () => ({ + baseUrl: process.env.CBE_BASE_URL || '', + merchantId: process.env.CBE_MERCHANT_ID || '', + secretKey: process.env.CBE_SECRET_KEY || '', + notifyUrl: process.env.CBE_NOTIFY_URL || '', + returnUrl: process.env.CBE_RETURN_URL || '', +})); diff --git a/apps/edr-passenger-api/src/config/ebirr.config.ts b/apps/edr-passenger-api/src/config/ebirr.config.ts new file mode 100644 index 000000000..0a00bca2a --- /dev/null +++ b/apps/edr-passenger-api/src/config/ebirr.config.ts @@ -0,0 +1,9 @@ +import { registerAs } from '@nestjs/config'; + +export default registerAs('ebirr', () => ({ + baseUrl: process.env.EBIRR_BASE_URL || '', + merchantCode: process.env.EBIRR_MERCHANT_CODE || '', + secretKey: process.env.EBIRR_SECRET_KEY || '', + notifyUrl: process.env.EBIRR_NOTIFY_URL || '', + returnUrl: process.env.EBIRR_RETURN_URL || '', +})); diff --git a/apps/edr-passenger-api/src/main.ts b/apps/edr-passenger-api/src/main.ts index 71de72738..130fcf3ca 100644 --- a/apps/edr-passenger-api/src/main.ts +++ b/apps/edr-passenger-api/src/main.ts @@ -5,6 +5,7 @@ import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import { AppModule } from './app.module'; import { HttpExceptionFilter } from './common/filters/http-exception.filter'; import { ResponseTransformInterceptor } from './common/interceptors/response-transform.interceptor'; +import { SessionActivityInterceptor } from './common/interceptors/session-activity.interceptor'; async function bootstrap() { const app = await NestFactory.create(AppModule); @@ -17,41 +18,202 @@ async function bootstrap() { }); app.useGlobalFilters(new HttpExceptionFilter()); - app.useGlobalInterceptors(new ResponseTransformInterceptor()); + app.useGlobalInterceptors( + new ResponseTransformInterceptor(), + app.get(SessionActivityInterceptor), + ); app.useGlobalPipes(new ValidationPipe({ whitelist: true, transform: true })); const config = new DocumentBuilder() .setTitle('EDR Passenger API') .setDescription( - 'Ethio-Djibouti Railway Passenger API β€” booking lifecycle, seat inventory, payment (Telebirr, CBE Birr, eBirr, Card, Wallet), loyalty, live tracking, and support.', + `# Ethio-Djibouti Railway Passenger Booking API + +## Overview +Enterprise-grade REST API for the Ethio-Djibouti Railway passenger booking and management platform. Built with NestJS, TypeScript, PostgreSQL, and Prisma ORM. + +## Authentication + +### Passenger Authentication (JWT-auth) +Used for passenger-facing endpoints. Obtain token via \`POST /auth/login\`. + +**Usage:** Add header \`Authorization: Bearer \` + +### Back-office Authentication (IAM-auth) +Used for agent, fraud, and reporting endpoints. Requires corporate IAM token. + +**Usage:** Add header \`Authorization: Bearer \` + +## Key Features + +### 🎫 Booking Lifecycle +- Search trips with real-time availability +- Create bookings with seat selection +- Modify bookings (seat changes, passenger updates) +- Cancel bookings with automatic refunds +- Multi-segment journey support + +### πŸ’³ Payment Integration +- **Telebirr** - Ethiopia's leading mobile money +- **CBE Birr** - Commercial Bank of Ethiopia +- **eBirr** - Electronic payment gateway +- **Card** - International card payments +- **Wallet** - Internal wallet system + +### πŸͺ‘ Seat Management +- Real-time seat availability +- Seat holds (15-minute expiry) +- Auto-assign seats with contiguous algorithm +- Seat blocking for maintenance +- Coach-level seat maps + +### 🎟️ Ticketing +- QR code and barcode generation +- PDF ticket generation +- Gate validation with audit logs +- Offline validation support + +### πŸ† Loyalty Program +- 4 tiers: Bronze, Silver, Gold, Platinum +- Points accumulation on trips +- Reward redemption +- Tier-based benefits + +### πŸ’° Wallet System +- Top-up via payment methods +- Pay with wallet balance +- Transaction ledger +- Refund to wallet + +### πŸ“ Live Tracking +- Real-time trip status +- Location updates +- Delay notifications +- Station crowd signals + +### πŸ”’ Fraud Detection +- Velocity checks (multiple bookings) +- High-value transaction monitoring +- Failed payment pattern detection +- Automatic user blocking + +### 🌍 Internationalization +- Multi-language support (English, Amharic, French, Oromo) +- Locale-based responses +- Currency formatting + +### πŸ‘¨β€πŸ’Ό Agent Operations +- Counter booking +- Shift management +- Commission tracking +- Cash reconciliation + +## Rate Limiting +- Auth endpoints: 5 requests/minute +- General endpoints: 100 requests/minute +- Webhook endpoints: No limit + +## Error Handling +All errors follow standard format: +\`\`\`json +{ + "statusCode": 400, + "message": "Validation failed", + "error": "Bad Request", + "timestamp": "2026-05-20T14:30:00.000Z", + "path": "/bookings" +} +\`\`\` + +## Pagination +List endpoints support pagination: +- \`limit\`: Number of items (default: 20, max: 100) +- \`offset\`: Skip items (default: 0) + +## Webhooks +Payment providers send notifications to: +- \`POST /payments/webhooks/telebirr\` +- \`POST /payments/webhooks/cbe-birr\` +- \`POST /payments/webhooks/ebirr\` +- \`POST /payments/webhooks/card\` + +## Support +- **Email:** support@edr-platform.com +- **Documentation:** https://docs.edr-platform.com +- **Status Page:** https://status.edr-platform.com + `, ) - .setVersion('1.0.0') - .addBearerAuth({ type: 'http', scheme: 'bearer', bearerFormat: 'JWT', in: 'header' }, 'JWT-auth') - .addTag('Auth', 'Registration and login') - .addTag('Stations', 'Station directory') - .addTag('Fleet', 'Train services and coaches') - .addTag('Schedule', 'Trips and fare rules') - .addTag('Search', 'Trip search and fare quotes') - .addTag('Seats', 'Seat maps and holds') - .addTag('Booking', 'Booking lifecycle') - .addTag('Payment', 'Payment intents and refunds') - .addTag('Tickets', 'QR ticket generation and validation') - .addTag('Passenger', 'Profiles, traveler profiles, saved routes') - .addTag('Notifications', 'Push and email notifications') - .addTag('Loyalty', 'Points, tiers, and rewards') - .addTag('Wallet', 'Wallet balance and ledger') - .addTag('Promotions', 'Promo codes and campaigns') - .addTag('Live Tracking', 'Real-time trip status and crowd signals') - .addTag('Support', 'FAQ and chat support') - .addTag('Dashboard', 'Home dashboard aggregate') - .addServer('http://localhost:4000', 'Development') + .setVersion('1.0.0') + .addBearerAuth( + { + type: 'http', + scheme: 'bearer', + bearerFormat: 'JWT', + in: 'header', + description: 'JWT token for passenger authentication. Obtain via POST /auth/login' + }, + 'JWT-auth' + ) + .addBearerAuth( + { + type: 'http', + scheme: 'bearer', + bearerFormat: 'JWT', + in: 'header', + description: 'Corporate IAM token for back-office operations (agents, fraud, reports)' + }, + 'IAM-auth' + ) + .addTag('Auth', 'πŸ” Registration, login, OTP verification, password reset') + .addTag('Agents', 'πŸ‘¨β€πŸ’Ό Agent booking, shifts, commissions, reconciliation') + .addTag('Booking', '🎫 Booking lifecycle, modification, cancellation, refunds') + .addTag('Dashboard', 'πŸ“Š Home dashboard aggregated data') + .addTag('Fleet', 'πŸš‚ Train services, coaches, seat configurations') + .addTag('Fraud Detection', 'πŸ”’ Fraud detection, risk scoring, user blocking') + .addTag('Live Tracking', 'πŸ“ Real-time trip status, location updates, crowd signals') + .addTag('Loyalty', 'πŸ† Points accumulation, tier management, rewards redemption') + .addTag('Notifications', 'πŸ”” Push, email, SMS notifications, preferences') + .addTag('Passenger', 'πŸ‘€ Profiles, traveler profiles, saved routes, preferences') + .addTag('Payment', 'πŸ’³ Payment intents, status queries, refunds') + .addTag('Payment Webhooks', 'πŸ”— Payment provider callback endpoints') + .addTag('Promotions', '🎁 Promo codes, campaigns, discount validation') + .addTag('Reports', 'πŸ“ˆ Revenue reports, occupancy analytics, agent sales') + .addTag('Schedule', 'πŸ—“οΈ Trip schedules, fare rules, status updates') + .addTag('Search', 'πŸ” Trip search, availability, fare quotes') + .addTag('Seats', 'πŸͺ‘ Seat maps, holds, releases, blocking, auto-assign') + .addTag('Segment-based Seats', '🎯 Segment-based seat availability and booking') + .addTag('Stations', 'πŸš‰ Station directory, information, crowd signals') + .addTag('Support', 'πŸ’¬ FAQ management, live chat conversations') + .addTag('Tickets', '🎟️ QR/barcode generation, PDF tickets, gate validation') + .addTag('Wallet', 'πŸ’° Wallet balance, top-up, transaction ledger') + .addServer('http://localhost:4000', 'Local Development') + .addServer('https://api-staging.edr-platform.com', 'Staging Environment') .addServer('https://api.edr-platform.com', 'Production') .build(); const document = SwaggerModule.createDocument(app, config); SwaggerModule.setup('api-docs', app, document, { - customSiteTitle: 'EDR Passenger API', - swaggerOptions: { persistAuthorization: true, docExpansion: 'none', filter: true }, + customSiteTitle: 'EDR Passenger API Documentation', + customfavIcon: 'https://edr-platform.com/favicon.ico', + customCss: ` + .swagger-ui .topbar { display: none } + .swagger-ui .info { margin: 20px 0 } + .swagger-ui .info .title { font-size: 36px; font-weight: bold } + .swagger-ui .scheme-container { background: #fafafa; padding: 15px; border-radius: 4px } + `, + swaggerOptions: { + persistAuthorization: true, + docExpansion: 'none', + filter: true, + tagsSorter: 'alpha', + operationsSorter: 'alpha', + displayRequestDuration: true, + tryItOutEnabled: true, + syntaxHighlight: { + activate: true, + theme: 'monokai' + } + }, }); const port = process.env.PORT ?? 4000; diff --git a/apps/edr-passenger-api/src/modules/agents/agents.controller.ts b/apps/edr-passenger-api/src/modules/agents/agents.controller.ts new file mode 100644 index 000000000..aa23fe6d0 --- /dev/null +++ b/apps/edr-passenger-api/src/modules/agents/agents.controller.ts @@ -0,0 +1,57 @@ +import { Body, Controller, Get, Param, Post, Query, UseGuards } from '@nestjs/common'; +import { ApiTags, ApiOperation, ApiBearerAuth } from '@nestjs/swagger'; +import { AgentsService } from './agents.service'; +import { CreateAgentBookingDto, OpenShiftDto, CloseShiftDto } from './agents.dto'; +import { IamGuard, IamRoles } from '../../common/iam-adapter'; +import { UserRole } from '@prisma/client'; + +@ApiTags('Agents') +@Controller('agents') +@UseGuards(IamGuard) +@ApiBearerAuth('IAM-auth') +export class AgentsController { + constructor(private service: AgentsService) {} + + @Post('bookings') + @IamRoles('AGENT', 'ADMIN') + @ApiOperation({ summary: 'Create agent booking with cash payment' }) + createBooking(@Body() dto: CreateAgentBookingDto) { + return this.service.createAgentBooking(dto); + } + + @Post('shifts/open') + @IamRoles('AGENT', 'ADMIN') + @ApiOperation({ summary: 'Open agent shift' }) + openShift(@Body() dto: OpenShiftDto) { + return this.service.openShift(dto); + } + + @Post('shifts/close') + @IamRoles('AGENT', 'ADMIN') + @ApiOperation({ summary: 'Close agent shift' }) + closeShift(@Body() dto: CloseShiftDto) { + return this.service.closeShift(dto); + } + + @Get(':agentId/commissions') + @IamRoles('AGENT', 'ADMIN') + @ApiOperation({ summary: 'Get agent commissions' }) + getCommissions( + @Param('agentId') agentId: string, + @Query('dateFrom') dateFrom?: string, + @Query('dateTo') dateTo?: string + ) { + return this.service.getCommissions( + agentId, + dateFrom ? new Date(dateFrom) : undefined, + dateTo ? new Date(dateTo) : undefined + ); + } + + @Get(':agentId/shifts') + @IamRoles('AGENT', 'ADMIN') + @ApiOperation({ summary: 'Get agent shifts' }) + getShifts(@Param('agentId') agentId: string) { + return this.service.getShifts(agentId); + } +} diff --git a/apps/edr-passenger-api/src/modules/agents/agents.dto.ts b/apps/edr-passenger-api/src/modules/agents/agents.dto.ts new file mode 100644 index 000000000..62bdc59ad --- /dev/null +++ b/apps/edr-passenger-api/src/modules/agents/agents.dto.ts @@ -0,0 +1,33 @@ +import { IsString, IsInt, IsBoolean, IsOptional, IsArray, ValidateNested } from 'class-validator'; +import { Type } from 'class-transformer'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class AgentPassengerDto { + @ApiProperty() @IsString() fullName: string; + @ApiProperty() @IsString() phone: string; + @ApiProperty() @IsString() email: string; + @ApiProperty() @IsString() seatId: string; + @ApiPropertyOptional() @IsOptional() @IsString() idDocumentType?: string; + @ApiPropertyOptional() @IsOptional() @IsString() idDocumentNumber?: string; +} + +export class CreateAgentBookingDto { + @ApiProperty() @IsString() agentId: string; + @ApiProperty() @IsString() tripId: string; + @ApiProperty({ type: [AgentPassengerDto] }) @IsArray() @ValidateNested({ each: true }) @Type(() => AgentPassengerDto) passengers: AgentPassengerDto[]; + @ApiProperty() @IsString() paymentMethod: string; + @ApiPropertyOptional() @IsOptional() @IsInt() cashReceived?: number; + @ApiPropertyOptional() @IsOptional() @IsBoolean() paperTicket?: boolean; + @ApiPropertyOptional() @IsOptional() @IsString() serviceClass?: string; +} + +export class OpenShiftDto { + @ApiProperty() @IsString() agentId: string; + @ApiPropertyOptional() @IsOptional() @IsInt() openingBalance?: number; +} + +export class CloseShiftDto { + @ApiProperty() @IsString() shiftId: string; + @ApiProperty() @IsInt() closingBalance: number; + @ApiPropertyOptional() @IsOptional() @IsString() notes?: string; +} diff --git a/apps/edr-passenger-api/src/modules/agents/agents.module.ts b/apps/edr-passenger-api/src/modules/agents/agents.module.ts new file mode 100644 index 000000000..5c5c2bb61 --- /dev/null +++ b/apps/edr-passenger-api/src/modules/agents/agents.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { HttpModule } from '@nestjs/axios'; +import { AgentsController } from './agents.controller'; +import { AgentsService } from './agents.service'; + +@Module({ + imports: [HttpModule], + controllers: [AgentsController], + providers: [AgentsService], + exports: [AgentsService] +}) +export class AgentsModule {} diff --git a/apps/edr-passenger-api/src/modules/agents/agents.service.ts b/apps/edr-passenger-api/src/modules/agents/agents.service.ts new file mode 100644 index 000000000..37f4fc433 --- /dev/null +++ b/apps/edr-passenger-api/src/modules/agents/agents.service.ts @@ -0,0 +1,131 @@ +import { Injectable, NotFoundException, BadRequestException } from '@nestjs/common'; +import { PrismaService } from '../../common/prisma.service'; +import { CreateAgentBookingDto, OpenShiftDto, CloseShiftDto } from './agents.dto'; + +function generateRef(): string { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + return Array.from({ length: 6 }, () => chars[Math.floor(Math.random() * chars.length)]).join(''); +} + +@Injectable() +export class AgentsService { + constructor(private prisma: PrismaService) {} + + async createAgentBooking(dto: CreateAgentBookingDto) { + const agent = await this.prisma.agent.findUnique({ where: { id: dto.agentId }, include: { user: { include: { passenger: true } } } }); + if (!agent || !agent.active) throw new NotFoundException('Agent not found or inactive'); + if (!agent.user.passenger) throw new BadRequestException('Agent must have passenger account'); + + const trip = await this.prisma.trip.findUnique({ where: { id: dto.tripId } }); + if (!trip) throw new NotFoundException('Trip not found'); + + const seatIds = dto.passengers.map(p => p.seatId); + const seats = await this.prisma.seat.findMany({ where: { id: { in: seatIds } } }); + if (seats.length !== seatIds.length) throw new BadRequestException('Invalid seat selection'); + + const baseFare = 45000 * dto.passengers.length; + const totalMinor = baseFare; + + const booking = await this.prisma.booking.create({ + data: { + bookingRef: generateRef(), + passengerId: agent.user.passenger.id, + tripId: dto.tripId, + status: dto.paymentMethod === 'CASH' ? 'CONFIRMED' : 'PENDING_PAYMENT', + totalMinor, + seats: { + create: dto.passengers.map(p => ({ + seatId: p.seatId, + passengerName: p.fullName, + idDocumentType: p.idDocumentType, + idDocumentNumber: p.idDocumentNumber + })) + } + }, + include: { seats: true } + }); + + await this.prisma.seat.updateMany({ + where: { id: { in: seatIds } }, + data: { status: 'BOOKED' } + }); + + const changeGiven = dto.cashReceived ? dto.cashReceived - totalMinor : 0; + await this.prisma.agentBooking.create({ + data: { + agentId: dto.agentId, + bookingId: booking.id, + paymentMethod: dto.paymentMethod, + cashReceived: dto.cashReceived, + changeGiven, + paperTicket: dto.paperTicket ?? false + } + }); + + const commissionAmount = Math.floor(totalMinor * agent.commissionRate / 100); + await this.prisma.agentCommission.create({ + data: { + agentId: dto.agentId, + bookingId: booking.id, + amountMinor: commissionAmount, + rate: agent.commissionRate + } + }); + + return { booking, commission: commissionAmount }; + } + + async openShift(dto: OpenShiftDto) { + const agent = await this.prisma.agent.findUnique({ where: { id: dto.agentId } }); + if (!agent) throw new NotFoundException('Agent not found'); + + const openShift = await this.prisma.agentShift.findFirst({ + where: { agentId: dto.agentId, closedAt: null } + }); + if (openShift) throw new BadRequestException('Shift already open'); + + return this.prisma.agentShift.create({ + data: { + agentId: dto.agentId, + openingBalance: dto.openingBalance ?? 0 + } + }); + } + + async closeShift(dto: CloseShiftDto) { + const shift = await this.prisma.agentShift.findUnique({ where: { id: dto.shiftId } }); + if (!shift) throw new NotFoundException('Shift not found'); + if (shift.closedAt) throw new BadRequestException('Shift already closed'); + + return this.prisma.agentShift.update({ + where: { id: dto.shiftId }, + data: { + closedAt: new Date(), + closingBalance: dto.closingBalance, + notes: dto.notes, + reconciled: true + } + }); + } + + async getCommissions(agentId: string, dateFrom?: Date, dateTo?: Date) { + return this.prisma.agentCommission.findMany({ + where: { + agentId, + createdAt: { + gte: dateFrom, + lte: dateTo + } + }, + orderBy: { createdAt: 'desc' } + }); + } + + async getShifts(agentId: string) { + return this.prisma.agentShift.findMany({ + where: { agentId }, + orderBy: { openedAt: 'desc' }, + take: 20 + }); + } +} diff --git a/apps/edr-passenger-api/src/modules/auth/auth.controller.ts b/apps/edr-passenger-api/src/modules/auth/auth.controller.ts index ea128b261..6d31c8323 100644 --- a/apps/edr-passenger-api/src/modules/auth/auth.controller.ts +++ b/apps/edr-passenger-api/src/modules/auth/auth.controller.ts @@ -1,7 +1,7 @@ -import { Body, Controller, Post } from '@nestjs/common'; -import { ApiTags, ApiOperation } from '@nestjs/swagger'; +import { Body, Controller, Post, HttpCode, HttpStatus } from '@nestjs/common'; +import { ApiTags, ApiOperation, ApiResponse, ApiBody } from '@nestjs/swagger'; import { AuthService } from './auth.service'; -import { RegisterDto, LoginDto } from './auth.dto'; +import { RegisterDto, LoginDto, RequestOtpDto, VerifyOtpDto, RequestPasswordResetDto, ResetPasswordDto } from './auth.dto'; @ApiTags('Auth') @Controller('auth') @@ -9,10 +9,73 @@ export class AuthController { constructor(private service: AuthService) {} @Post('register') - @ApiOperation({ summary: 'Register new user' }) + @ApiOperation({ + summary: 'Register new passenger account', + description: 'Create a new passenger account with email, phone, and password. Returns user details and JWT token for immediate login.' + }) + @ApiResponse({ status: 201, description: 'Account created successfully. Returns user object and JWT token.' }) + @ApiResponse({ status: 400, description: 'Validation error (invalid email, weak password, etc.)' }) + @ApiResponse({ status: 409, description: 'Email or phone already registered' }) + @ApiBody({ type: RegisterDto }) register(@Body() dto: RegisterDto) { return this.service.register(dto); } @Post('login') - @ApiOperation({ summary: 'Login and get JWT' }) + @HttpCode(HttpStatus.OK) + @ApiOperation({ + summary: 'Login with email and password', + description: 'Authenticate user and receive JWT token. Token expires in 7 days by default. Failed login attempts are tracked and account may be locked after 5 consecutive failures.' + }) + @ApiResponse({ status: 200, description: 'Login successful. Returns JWT token and user details.' }) + @ApiResponse({ status: 401, description: 'Invalid credentials or account locked' }) + @ApiResponse({ status: 403, description: 'Account temporarily blocked due to fraud detection' }) + @ApiBody({ type: LoginDto }) login(@Body() dto: LoginDto) { return this.service.login(dto); } + + @Post('otp/request') + @HttpCode(HttpStatus.OK) + @ApiOperation({ + summary: 'Request OTP verification code', + description: 'Send a 6-digit OTP code to user email. Code expires in 10 minutes. Used for registration verification, password reset, or two-factor authentication.' + }) + @ApiResponse({ status: 200, description: 'OTP sent successfully to email' }) + @ApiResponse({ status: 404, description: 'Email not found (for PASSWORD_RESET purpose)' }) + @ApiResponse({ status: 429, description: 'Too many OTP requests. Please wait before requesting again.' }) + @ApiBody({ type: RequestOtpDto }) + requestOtp(@Body() dto: RequestOtpDto) { return this.service.requestOtp(dto); } + + @Post('otp/verify') + @HttpCode(HttpStatus.OK) + @ApiOperation({ + summary: 'Verify OTP code', + description: 'Validate the 6-digit OTP code sent to user email. Code must match and not be expired.' + }) + @ApiResponse({ status: 200, description: 'OTP verified successfully' }) + @ApiResponse({ status: 400, description: 'Invalid or expired OTP code' }) + @ApiResponse({ status: 404, description: 'No OTP found for this email and purpose' }) + @ApiBody({ type: VerifyOtpDto }) + verifyOtp(@Body() dto: VerifyOtpDto) { return this.service.verifyOtp(dto); } + + @Post('password/reset-request') + @HttpCode(HttpStatus.OK) + @ApiOperation({ + summary: 'Request password reset link', + description: 'Send password reset link to user email. Link contains a secure token valid for 1 hour.' + }) + @ApiResponse({ status: 200, description: 'Password reset email sent successfully' }) + @ApiResponse({ status: 404, description: 'Email not found' }) + @ApiResponse({ status: 429, description: 'Too many reset requests. Please wait before trying again.' }) + @ApiBody({ type: RequestPasswordResetDto }) + requestPasswordReset(@Body() dto: RequestPasswordResetDto) { return this.service.requestPasswordReset(dto); } + + @Post('password/reset') + @HttpCode(HttpStatus.OK) + @ApiOperation({ + summary: 'Reset password with token', + description: 'Reset user password using the token received via email. Token is single-use and expires after 1 hour.' + }) + @ApiResponse({ status: 200, description: 'Password reset successfully' }) + @ApiResponse({ status: 400, description: 'Invalid, expired, or already used token' }) + @ApiResponse({ status: 404, description: 'User not found' }) + @ApiBody({ type: ResetPasswordDto }) + resetPassword(@Body() dto: ResetPasswordDto) { return this.service.resetPassword(dto); } } diff --git a/apps/edr-passenger-api/src/modules/auth/auth.dto.ts b/apps/edr-passenger-api/src/modules/auth/auth.dto.ts index 8cfe1ac65..d44159c67 100644 --- a/apps/edr-passenger-api/src/modules/auth/auth.dto.ts +++ b/apps/edr-passenger-api/src/modules/auth/auth.dto.ts @@ -1,14 +1,152 @@ -import { IsEmail, IsString, MinLength } from 'class-validator'; -import { ApiProperty } from '@nestjs/swagger'; +import { IsEmail, IsString, MinLength, IsOptional } from 'class-validator'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; export class RegisterDto { - @ApiProperty({ example: 'Kelemu Ketsela' }) @IsString() fullName: string; - @ApiProperty({ example: 'kelemu@email.com' }) @IsEmail() email: string; - @ApiProperty({ example: '+251912345678' }) @IsString() phone: string; - @ApiProperty({ example: 'password123', minLength: 8 }) @IsString() @MinLength(8) password: string; + @ApiProperty({ + description: 'Full name of the passenger', + example: 'Kelemu Ketsela', + minLength: 2, + maxLength: 100 + }) + @IsString() + fullName: string; + + @ApiProperty({ + description: 'Email address (must be unique)', + example: 'kelemu@email.com', + format: 'email' + }) + @IsEmail() + email: string; + + @ApiProperty({ + description: 'Phone number with country code', + example: '+251912345678', + pattern: '^\\+[1-9]\\d{1,14}$' + }) + @IsString() + phone: string; + + @ApiProperty({ + description: 'Password (minimum 8 characters)', + example: 'SecurePass123', + minLength: 8, + format: 'password' + }) + @IsString() + @MinLength(8) + password: string; + + @ApiPropertyOptional({ + description: 'Nationality of the passenger', + example: 'Ethiopian' + }) + @IsOptional() + @IsString() + nationality?: string; + + @ApiPropertyOptional({ + description: 'National ID number', + example: 'ET123456789' + }) + @IsOptional() + @IsString() + nationalId?: string; + + @ApiPropertyOptional({ + description: 'Passport number for international travelers', + example: 'P1234567' + }) + @IsOptional() + @IsString() + passportNumber?: string; } export class LoginDto { - @ApiProperty({ example: 'kelemu@email.com' }) @IsEmail() email: string; - @ApiProperty({ example: 'password123' }) @IsString() password: string; + @ApiProperty({ + description: 'Registered email address', + example: 'kelemu@email.com', + format: 'email' + }) + @IsEmail() + email: string; + + @ApiProperty({ + description: 'Account password', + example: 'password123', + format: 'password' + }) + @IsString() + password: string; +} + +export class RequestOtpDto { + @ApiProperty({ + description: 'Email address to send OTP', + example: 'kelemu@email.com' + }) + @IsEmail() + email: string; + + @ApiProperty({ + description: 'Purpose of OTP (REGISTRATION, PASSWORD_RESET, VERIFICATION)', + example: 'REGISTRATION', + enum: ['REGISTRATION', 'PASSWORD_RESET', 'VERIFICATION'] + }) + @IsString() + purpose: string; +} + +export class VerifyOtpDto { + @ApiProperty({ + description: 'Email address', + example: 'kelemu@email.com' + }) + @IsEmail() + email: string; + + @ApiProperty({ + description: '6-digit OTP code', + example: '123456', + minLength: 6, + maxLength: 6 + }) + @IsString() + code: string; + + @ApiProperty({ + description: 'Purpose of OTP verification', + example: 'REGISTRATION', + enum: ['REGISTRATION', 'PASSWORD_RESET', 'VERIFICATION'] + }) + @IsString() + purpose: string; +} + +export class RequestPasswordResetDto { + @ApiProperty({ + description: 'Email address of the account', + example: 'kelemu@email.com' + }) + @IsEmail() + email: string; +} + +export class ResetPasswordDto { + @ApiProperty({ + description: 'Password reset token received via email', + example: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...' + }) + @IsString() + token: string; + + @ApiProperty({ + description: 'New password (minimum 8 characters)', + example: 'NewSecurePass123', + minLength: 8, + format: 'password' + }) + @IsString() + @MinLength(8) + newPassword: string; } diff --git a/apps/edr-passenger-api/src/modules/auth/auth.service.ts b/apps/edr-passenger-api/src/modules/auth/auth.service.ts index 7ba9937d8..deb2e9da4 100644 --- a/apps/edr-passenger-api/src/modules/auth/auth.service.ts +++ b/apps/edr-passenger-api/src/modules/auth/auth.service.ts @@ -1,8 +1,9 @@ -import { Injectable, UnauthorizedException, ConflictException } from '@nestjs/common'; +import { Injectable, UnauthorizedException, ConflictException, BadRequestException } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; import { PrismaService } from '../../common/prisma.service'; -import { RegisterDto, LoginDto } from './auth.dto'; +import { RegisterDto, LoginDto, RequestOtpDto, VerifyOtpDto, RequestPasswordResetDto, ResetPasswordDto } from './auth.dto'; import * as bcrypt from 'bcrypt'; +import * as crypto from 'crypto'; @Injectable() export class AuthService { @@ -15,28 +16,115 @@ export class AuthService { if (exists) throw new ConflictException('Email or phone already registered'); const passwordHash = await bcrypt.hash(dto.password, 10); const user = await this.prisma.user.create({ - data: { fullName: dto.fullName, email: dto.email, phone: dto.phone, passwordHash }, + data: { + fullName: dto.fullName, + email: dto.email, + phone: dto.phone, + passwordHash, + nationality: dto.nationality, + nationalId: dto.nationalId, + passportNumber: dto.passportNumber + }, }); const passenger = await this.prisma.passenger.create({ data: { userId: user.id } }); await this.prisma.loyaltyAccount.create({ data: { passengerId: passenger.id } }); await this.prisma.walletAccount.create({ data: { passengerId: passenger.id } }); await this.prisma.userPreferences.create({ data: { userId: user.id } }); + await this.createAuditLog(user.id, 'USER_REGISTERED', 'User', user.id, null, { email: user.email }); return this.signToken(user.id, user.email, user.role, passenger.id); } async login(dto: LoginDto) { const user = await this.prisma.user.findUnique({ where: { email: dto.email }, - include: { passenger: true }, + include: { passenger: true, agent: true }, }); - if (!user || !(await bcrypt.compare(dto.password, user.passwordHash))) { + if (!user) throw new UnauthorizedException('Invalid credentials'); + + if (user.lockedUntil && user.lockedUntil > new Date()) { + throw new UnauthorizedException(`Account locked until ${user.lockedUntil.toISOString()}`); + } + + if (!(await bcrypt.compare(dto.password, user.passwordHash))) { + await this.prisma.user.update({ + where: { id: user.id }, + data: { + failedLoginAttempts: { increment: 1 }, + lockedUntil: user.failedLoginAttempts >= 4 ? new Date(Date.now() + 15 * 60 * 1000) : null + } + }); throw new UnauthorizedException('Invalid credentials'); } - return this.signToken(user.id, user.email, user.role, user.passenger?.id); + + await this.prisma.user.update({ + where: { id: user.id }, + data: { failedLoginAttempts: 0, lockedUntil: null } + }); + + await this.createAuditLog(user.id, 'USER_LOGIN', 'User', user.id, null, null); + return this.signToken(user.id, user.email, user.role, user.passenger?.id, user.agent?.id); } - private signToken(userId: string, email: string, role: string, passengerId?: string) { - const token = this.jwt.sign({ sub: userId, email, role, passengerId }); - return { token, user: { id: userId, email, role, passengerId } }; + async requestOtp(dto: RequestOtpDto) { + const code = Math.floor(100000 + Math.random() * 900000).toString(); + const expiresAt = new Date(Date.now() + 10 * 60 * 1000); + await this.prisma.otpCode.create({ + data: { email: dto.email, code, purpose: dto.purpose, expiresAt } + }); + console.log(`[OTP] ${dto.email} - ${code} (${dto.purpose})`); + return { sent: true, expiresIn: 600 }; + } + + async verifyOtp(dto: VerifyOtpDto) { + const otp = await this.prisma.otpCode.findFirst({ + where: { email: dto.email, code: dto.code, purpose: dto.purpose, verified: false, expiresAt: { gt: new Date() } }, + orderBy: { createdAt: 'desc' } + }); + if (!otp) throw new BadRequestException('Invalid or expired OTP'); + await this.prisma.otpCode.update({ where: { id: otp.id }, data: { verified: true } }); + return { verified: true }; + } + + async requestPasswordReset(dto: RequestPasswordResetDto) { + const user = await this.prisma.user.findUnique({ where: { email: dto.email } }); + if (!user) return { sent: true }; + const token = crypto.randomBytes(32).toString('hex'); + const expiresAt = new Date(Date.now() + 60 * 60 * 1000); + await this.prisma.passwordResetToken.create({ + data: { userId: user.id, token, expiresAt } + }); + console.log(`[PASSWORD_RESET] ${dto.email} - ${token}`); + return { sent: true }; + } + + async resetPassword(dto: ResetPasswordDto) { + const resetToken = await this.prisma.passwordResetToken.findUnique({ + where: { token: dto.token } + }); + if (!resetToken || resetToken.used || resetToken.expiresAt < new Date()) { + throw new BadRequestException('Invalid or expired reset token'); + } + const passwordHash = await bcrypt.hash(dto.newPassword, 10); + await this.prisma.user.update({ + where: { id: resetToken.userId }, + data: { passwordHash, failedLoginAttempts: 0, lockedUntil: null } + }); + await this.prisma.passwordResetToken.update({ + where: { id: resetToken.id }, + data: { used: true } + }); + await this.createAuditLog(resetToken.userId, 'PASSWORD_RESET', 'User', resetToken.userId, null, null); + return { reset: true }; + } + + private signToken(userId: string, email: string, role: string, passengerId?: string, agentId?: string) { + const token = this.jwt.sign({ sub: userId, email, role, passengerId, agentId }); + return { token, user: { id: userId, email, role, passengerId, agentId } }; + } + + private async createAuditLog(userId: string, action: string, entityType: string, entityId: string, oldData: any, newData: any) { + await this.prisma.auditLog.create({ + data: { userId, action, entityType, entityId, oldData, newData } + }); } } diff --git a/apps/edr-passenger-api/src/modules/bookings/bookings.controller.ts b/apps/edr-passenger-api/src/modules/bookings/bookings.controller.ts index eb7e533b5..b7363ec70 100644 --- a/apps/edr-passenger-api/src/modules/bookings/bookings.controller.ts +++ b/apps/edr-passenger-api/src/modules/bookings/bookings.controller.ts @@ -1,7 +1,7 @@ -import { Body, Controller, Delete, Get, Param, Post, UseGuards } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post, Patch, UseGuards } from '@nestjs/common'; import { ApiTags, ApiOperation, ApiBearerAuth } from '@nestjs/swagger'; import { BookingsService } from './bookings.service'; -import { CreateBookingDto } from './bookings.dto'; +import { CreateBookingDto, ModifyBookingDto, CancelBookingDto } from './bookings.dto'; import { JwtGuard } from '../../common/jwt.guard'; @ApiTags('Booking') @@ -10,7 +10,28 @@ import { JwtGuard } from '../../common/jwt.guard'; @ApiBearerAuth('JWT-auth') export class BookingsController { constructor(private service: BookingsService) {} - @Post() @ApiOperation({ summary: 'Create booking from seat hold' }) create(@Body() dto: CreateBookingDto) { return this.service.create(dto); } - @Get(':bookingRef') @ApiOperation({ summary: 'Get booking by reference' }) getByRef(@Param('bookingRef') ref: string) { return this.service.getByRef(ref); } - @Delete(':bookingRef')@ApiOperation({ summary: 'Cancel booking' }) cancel(@Param('bookingRef') ref: string) { return this.service.cancel(ref); } + + @Post() + @ApiOperation({ summary: 'Create booking from seat hold' }) + create(@Body() dto: CreateBookingDto) { + return this.service.create(dto); + } + + @Get(':bookingRef') + @ApiOperation({ summary: 'Get booking by reference' }) + getByRef(@Param('bookingRef') ref: string) { + return this.service.getByRef(ref); + } + + @Patch(':bookingRef/modify') + @ApiOperation({ summary: 'Modify booking seats or trip' }) + modify(@Body() dto: ModifyBookingDto) { + return this.service.modify(dto); + } + + @Delete(':bookingRef') + @ApiOperation({ summary: 'Cancel booking' }) + cancel(@Param('bookingRef') ref: string, @Body() dto: CancelBookingDto) { + return this.service.cancel(ref, dto.reason); + } } diff --git a/apps/edr-passenger-api/src/modules/bookings/bookings.dto.ts b/apps/edr-passenger-api/src/modules/bookings/bookings.dto.ts index a2e208d2c..eae26111e 100644 --- a/apps/edr-passenger-api/src/modules/bookings/bookings.dto.ts +++ b/apps/edr-passenger-api/src/modules/bookings/bookings.dto.ts @@ -16,7 +16,25 @@ export class CreateBookingDto { @ApiProperty() @IsString() tripId: string; @ApiProperty() @IsString() holdId: string; @ApiProperty({ type: [PassengerInputDto] }) @IsArray() @ValidateNested({ each: true }) @Type(() => PassengerInputDto) passengers: PassengerInputDto[]; - @ApiPropertyOptional({ example: 'ECONOMY', enum: ['ECONOMY', 'BUSINESS', 'FIRST'] }) @IsOptional() @IsString() serviceClass?: string; + @ApiPropertyOptional({ + example: 'ECONOMY_REGULAR', + enum: ['ECONOMY_REGULAR', 'ECONOMY_BED_LOWER', 'ECONOMY_BED_MIDDLE', 'ECONOMY_BED_UPPER', 'VIP_BED_LOWER', 'VIP_BED_UPPER'] + }) + @IsOptional() @IsString() serviceClass?: string; @ApiPropertyOptional() @IsOptional() @IsString() promoCode?: string; @ApiPropertyOptional() @IsOptional() @IsInt() loyaltyRedemptionPoints?: number; + @ApiPropertyOptional({ example: 'ONE_WAY' }) @IsOptional() @IsString() bookingType?: string; + @ApiPropertyOptional({ description: 'Auto-assign seats instead of manual selection' }) @IsOptional() autoAssign?: boolean; +} + +export class ModifyBookingDto { + @ApiProperty() @IsString() bookingRef: string; + @ApiProperty() @IsString() newTripId: string; + @ApiProperty({ type: [String] }) @IsArray() newSeatIds: string[]; + @ApiPropertyOptional() @IsOptional() @IsString() reason?: string; +} + +export class CancelBookingDto { + @ApiProperty() @IsString() bookingRef: string; + @ApiPropertyOptional() @IsOptional() @IsString() reason?: string; } diff --git a/apps/edr-passenger-api/src/modules/bookings/bookings.service.ts b/apps/edr-passenger-api/src/modules/bookings/bookings.service.ts index cb6158639..9532531f3 100644 --- a/apps/edr-passenger-api/src/modules/bookings/bookings.service.ts +++ b/apps/edr-passenger-api/src/modules/bookings/bookings.service.ts @@ -2,7 +2,7 @@ import { Injectable, NotFoundException, BadRequestException } from '@nestjs/comm import { PrismaService } from '../../common/prisma.service'; import { SeatsService } from '../seats/seats.service'; import { EventEmitter2 } from '@nestjs/event-emitter'; -import { CreateBookingDto } from './bookings.dto'; +import { CreateBookingDto, ModifyBookingDto, CancelBookingDto } from './bookings.dto'; import { Cron, CronExpression } from '@nestjs/schedule'; import { SearchService } from '../search/search.service'; @@ -20,13 +20,44 @@ export class BookingsService { if (!hold || hold.expiresAt < new Date()) throw new BadRequestException('Seat hold expired'); const trip = await this.prisma.trip.findUnique({ where: { id: dto.tripId }, include: { originStation: true, destinationStation: true } }); if (!trip) throw new NotFoundException('Trip not found'); - const fareQuote = await this.searchService.getFareQuote({ tripId: dto.tripId, serviceClass: dto.serviceClass ?? 'ECONOMY', passengerCount: dto.passengers.length, promoCode: dto.promoCode, loyaltyRedemptionPoints: dto.loyaltyRedemptionPoints }); + + let seatIds: string[]; + if (dto.autoAssign) { + seatIds = await this.seatsService.autoAssignSeats( + dto.tripId, + dto.passengers.length, + dto.serviceClass ?? 'ECONOMY_REGULAR', + ); + await this.seatsService.confirmSeats(seatIds); + } else { + seatIds = dto.passengers.map((p) => p.seatId); + } + + const fareQuote = await this.searchService.getFareQuote({ tripId: dto.tripId, serviceClass: dto.serviceClass ?? 'ECONOMY_REGULAR', passengerCount: dto.passengers.length, promoCode: dto.promoCode, loyaltyRedemptionPoints: dto.loyaltyRedemptionPoints }); const booking = await this.prisma.booking.create({ - data: { bookingRef: generateRef(), passengerId: dto.passengerId, tripId: dto.tripId, status: 'PENDING_PAYMENT', totalMinor: fareQuote.totalMinor, seats: { create: dto.passengers.map((p) => ({ seatId: p.seatId, passengerName: p.fullName, idDocumentType: p.idDocumentType, idDocumentNumber: p.idDocumentNumber })) } }, + data: { + bookingRef: generateRef(), + passengerId: dto.passengerId, + tripId: dto.tripId, + status: 'PENDING_PAYMENT', + totalMinor: fareQuote.totalMinor, + bookingType: dto.bookingType ?? 'ONE_WAY', + seats: { create: dto.passengers.map((p, i) => ({ seatId: seatIds[i], passengerName: p.fullName, idDocumentType: p.idDocumentType, idDocumentNumber: p.idDocumentNumber })) } + }, include: { seats: { include: { seat: true } }, trip: { include: { originStation: true, destinationStation: true, service: true } } }, }); this.eventEmitter.emit('booking.created', { booking }); - return booking; + return { + ...booking, + fareBreakdown: { + baseFare: fareQuote.baseFareMinor / 100, + discount: fareQuote.discountMinor / 100, + loyaltyRedemption: fareQuote.loyaltyRedemptionMinor / 100, + taxesFees: fareQuote.taxesFeesMinor / 100, + total: fareQuote.totalMinor / 100, + currency: fareQuote.currency + } + }; } async getByRef(bookingRef: string) { @@ -37,6 +68,7 @@ export class BookingsService { bookingRef: booking.bookingRef, status: booking.status, totalFare: booking.totalMinor / 100, + bookingType: booking.bookingType, createdAt: booking.createdAt, trip: { number: booking.trip.service.number, @@ -53,12 +85,55 @@ export class BookingsService { }; } - async cancel(bookingRef: string) { - const booking = await this.prisma.booking.findUnique({ where: { bookingRef }, include: { seats: true } }); + async modify(dto: ModifyBookingDto) { + const booking = await this.prisma.booking.findUnique({ where: { bookingRef: dto.bookingRef }, include: { seats: true, trip: true } }); if (!booking) throw new NotFoundException('Booking not found'); - if (booking.status === 'CONFIRMED') throw new BadRequestException('Use refund for confirmed bookings'); + if (booking.status !== 'CONFIRMED') throw new BadRequestException('Only confirmed bookings can be modified'); + if (booking.trip.departureAt < new Date()) throw new BadRequestException('Cannot modify past bookings'); + + const oldSeats = booking.seats.map(s => s.seatId); + const fareAdjustment = 0; + + await this.prisma.bookingModification.create({ + data: { + bookingId: booking.id, + modifiedBy: booking.passengerId, + modificationType: 'SEAT_CHANGE', + oldData: { tripId: booking.tripId, seatIds: oldSeats }, + newData: { tripId: dto.newTripId, seatIds: dto.newSeatIds }, + fareAdjustment, + reason: dto.reason + } + }); + + await this.seatsService.releaseSeats(oldSeats); + await this.seatsService.confirmSeats(dto.newSeatIds); + + return { modified: true, bookingRef: dto.bookingRef }; + } + + async cancel(bookingRef: string, reason?: string) { + const booking = await this.prisma.booking.findUnique({ where: { bookingRef }, include: { seats: true, paymentIntent: true } }); + if (!booking) throw new NotFoundException('Booking not found'); + if (booking.status === 'CANCELLED') throw new BadRequestException('Booking already cancelled'); + + const refundAmount = booking.status === 'CONFIRMED' ? Math.floor(booking.totalMinor * 0.8) : 0; + + await this.prisma.bookingCancellation.create({ + data: { + bookingId: booking.id, + cancelledBy: booking.passengerId, + reason, + refundAmount, + refundMethod: booking.paymentIntent?.method ?? 'ORIGINAL', + refundStatus: 'PENDING' + } + }); + await this.seatsService.releaseSeats(booking.seats.map((s) => s.seatId)); - return this.prisma.booking.update({ where: { bookingRef }, data: { status: 'CANCELLED' } }); + await this.prisma.booking.update({ where: { bookingRef }, data: { status: 'CANCELLED' } }); + + return { cancelled: true, refundAmount: refundAmount / 100, currency: 'ETB' }; } @Cron(CronExpression.EVERY_MINUTE) diff --git a/apps/edr-passenger-api/src/modules/fraud/fraud.controller.ts b/apps/edr-passenger-api/src/modules/fraud/fraud.controller.ts new file mode 100644 index 000000000..4056b4259 --- /dev/null +++ b/apps/edr-passenger-api/src/modules/fraud/fraud.controller.ts @@ -0,0 +1,74 @@ +import { Controller, Get, Post, Body, Query, UseGuards, Logger } from '@nestjs/common'; +import { ApiTags, ApiOperation, ApiBearerAuth } from '@nestjs/swagger'; +import { FraudService, FraudRuleConfig } from './fraud.service'; +import { IamGuard, IamRoles } from '../../common/iam-adapter'; +import { UserRole } from '@prisma/client'; + +@ApiTags('Fraud Detection') +@Controller('fraud') +@UseGuards(IamGuard) +@ApiBearerAuth('IAM-auth') +export class FraudController { + private readonly logger = new Logger(FraudController.name); + + constructor(private fraudService: FraudService) {} + + /** + * Get fraud alerts + */ + @Get('alerts') + @IamRoles('ADMIN', 'SUPERVISOR') + @ApiOperation({ summary: 'Get fraud alerts' }) + async getAlerts( + @Query('userId') userId?: string, + @Query('limit') limit?: string, + @Query('offset') offset?: string, + ) { + const alerts = await this.fraudService.getAlerts(userId, parseInt(limit || '100'), parseInt(offset || '0')); + return { data: alerts, total: alerts.length }; + } + + /** + * Get fraud rules + */ + @Get('rules') + @IamRoles('ADMIN') + @ApiOperation({ summary: 'Get fraud detection rules' }) + async getRules() { + const rules = await this.fraudService.getRules(); + return { data: rules }; + } + + /** + * Create or update fraud rule + */ + @Post('rules') + @IamRoles('ADMIN') + @ApiOperation({ summary: 'Create or update fraud rule' }) + async upsertRule(@Body() body: { type: string; config: FraudRuleConfig }) { + const rule = await this.fraudService.upsertRule(body.type, body.config); + return { data: rule, message: 'Rule updated successfully' }; + } + + /** + * Block user temporarily + */ + @Post('actions/block') + @IamRoles('ADMIN', 'SUPERVISOR') + @ApiOperation({ summary: 'Block user temporarily' }) + async blockUser(@Body() body: { userId: string; durationMinutes: number }) { + await this.fraudService.blockUserTemporarily(body.userId, body.durationMinutes); + return { message: `User blocked for ${body.durationMinutes} minutes` }; + } + + /** + * Unblock user + */ + @Post('actions/unblock') + @IamRoles('ADMIN', 'SUPERVISOR') + @ApiOperation({ summary: 'Unblock user' }) + async unblockUser(@Body() body: { userId: string }) { + await this.fraudService.unblockUser(body.userId); + return { message: 'User unblocked' }; + } +} diff --git a/apps/edr-passenger-api/src/modules/fraud/fraud.module.ts b/apps/edr-passenger-api/src/modules/fraud/fraud.module.ts new file mode 100644 index 000000000..a95078578 --- /dev/null +++ b/apps/edr-passenger-api/src/modules/fraud/fraud.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { HttpModule } from '@nestjs/axios'; +import { FraudService } from './fraud.service'; +import { FraudController } from './fraud.controller'; + +@Module({ + imports: [HttpModule], + providers: [FraudService], + controllers: [FraudController], + exports: [FraudService], +}) +export class FraudModule {} diff --git a/apps/edr-passenger-api/src/modules/fraud/fraud.service.ts b/apps/edr-passenger-api/src/modules/fraud/fraud.service.ts new file mode 100644 index 000000000..7c3b66e6b --- /dev/null +++ b/apps/edr-passenger-api/src/modules/fraud/fraud.service.ts @@ -0,0 +1,252 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { OnEvent } from '@nestjs/event-emitter'; +import { PrismaService } from '../../common/prisma.service'; + +export interface FraudRuleConfig { + type: 'VELOCITY' | 'HIGH_VALUE' | 'FAILED_PAYMENTS' | 'MULTIPLE_METHODS'; + enabled: boolean; + threshold: number; + timeWindowMinutes?: number; + blockDurationMinutes?: number; +} + +@Injectable() +export class FraudService { + private readonly logger = new Logger(FraudService.name); + + constructor(private prisma: PrismaService) {} + + /** + * Evaluate fraud rules and create alerts if triggered + */ + async evaluateRules( + userId: string, + eventType: 'booking.created' | 'payment.failed' | 'auth.login.failed', + context: Record, + ): Promise<{ triggered: boolean; rules: string[] }> { + const triggeredRules: string[] = []; + const user = await this.prisma.user.findUnique({ where: { id: userId } }); + + if (!user) return { triggered: false, rules: [] }; + + // Check velocity rule (multiple bookings in short time) + if (eventType === 'booking.created') { + const velocityTriggered = await this.checkVelocityRule(userId); + if (velocityTriggered) { + triggeredRules.push('VELOCITY'); + } + + // Check high-value booking + const amount = (context.amountMinor as number) || 0; + const highValueTriggered = await this.checkHighValueRule(amount); + if (highValueTriggered) { + triggeredRules.push('HIGH_VALUE'); + } + } + + // Check repeated failed payments + if (eventType === 'payment.failed') { + const failedPaymentTriggered = await this.checkFailedPaymentRule(userId); + if (failedPaymentTriggered) { + triggeredRules.push('FAILED_PAYMENTS'); + } + } + + // Create alert if rules triggered + if (triggeredRules.length > 0) { + await this.createFraudAlert(userId, eventType, triggeredRules, context); + return { triggered: true, rules: triggeredRules }; + } + + return { triggered: false, rules: [] }; + } + + /** + * Check velocity rule: X bookings in Y minutes + */ + private async checkVelocityRule(userId: string): Promise { + const rule = await this.prisma.fraudRule.findFirst({ + where: { type: 'VELOCITY', enabled: true }, + }); + + if (!rule) return false; + + const timeWindowMinutes = (rule.config as any)?.timeWindowMinutes || 30; + const threshold = rule.threshold; + + const bookingCount = await this.prisma.booking.count({ + where: { + passengerId: userId, + createdAt: { + gte: new Date(Date.now() - timeWindowMinutes * 60 * 1000), + }, + }, + }); + + return bookingCount > threshold; + } + + /** + * Check high-value booking rule + */ + private async checkHighValueRule(amountMinor: number): Promise { + const rule = await this.prisma.fraudRule.findFirst({ + where: { type: 'HIGH_VALUE', enabled: true }, + }); + + if (!rule) return false; + + // threshold is in ETB (convert minor units to ETB) + const amountEtb = amountMinor / 100; + return amountEtb > rule.threshold; + } + + /** + * Check failed payment rule: X failed attempts in Y minutes + */ + private async checkFailedPaymentRule(userId: string): Promise { + const rule = await this.prisma.fraudRule.findFirst({ + where: { type: 'FAILED_PAYMENTS', enabled: true }, + }); + + if (!rule) return false; + + const timeWindowMinutes = (rule.config as any)?.timeWindowMinutes || 60; + const threshold = rule.threshold; + + const failedCount = await this.prisma.paymentIntent.count({ + where: { + booking: { passengerId: userId }, + status: 'FAILED', + updatedAt: { + gte: new Date(Date.now() - timeWindowMinutes * 60 * 1000), + }, + }, + }); + + return failedCount > threshold; + } + + /** + * Create a fraud alert + */ + private async createFraudAlert( + userId: string, + eventType: string, + triggeredRules: string[], + context: Record, + ): Promise { + const alert = await this.prisma.fraudAlert.create({ + data: { + userId, + eventType, + triggeredRules, + context: context as any, + severity: triggeredRules.length > 1 ? 'HIGH' : 'MEDIUM', + }, + }); + + this.logger.warn(`Fraud alert created: ${alert.id} for user ${userId} - rules: ${triggeredRules.join(', ')}`); + + // Trigger blocking if needed + if (triggeredRules.includes('HIGH_VALUE') || triggeredRules.length > 1) { + await this.blockUserTemporarily(userId, 30); // Block for 30 minutes + } + } + + /** + * Block user temporarily + */ + async blockUserTemporarily(userId: string, durationMinutes: number): Promise { + const blockedUntil = new Date(Date.now() + durationMinutes * 60 * 1000); + await this.prisma.user.update({ + where: { id: userId }, + data: { blockedUntil }, + }); + this.logger.warn(`User ${userId} blocked until ${blockedUntil.toISOString()}`); + } + + /** + * Unblock user + */ + async unblockUser(userId: string): Promise { + await this.prisma.user.update({ + where: { id: userId }, + data: { blockedUntil: null }, + }); + this.logger.log(`User ${userId} unblocked`); + } + + /** + * Get all fraud alerts + */ + async getAlerts(userId?: string, limit = 100, offset = 0) { + return this.prisma.fraudAlert.findMany({ + where: userId ? { userId } : {}, + orderBy: { createdAt: 'desc' }, + take: limit, + skip: offset, + }); + } + + /** + * Create or update a fraud rule + */ + async upsertRule( + type: string, + config: FraudRuleConfig, + ) { + return this.prisma.fraudRule.upsert({ + where: { type: type as any }, + update: { + enabled: config.enabled, + threshold: config.threshold, + config: config as any, + }, + create: { + type: type as any, + enabled: config.enabled, + threshold: config.threshold, + config: config as any, + }, + }); + } + + /** + * Get all fraud rules + */ + async getRules() { + return this.prisma.fraudRule.findMany(); + } + + /** + * Event listener for booking created + */ + @OnEvent('booking.created') + async onBookingCreated(payload: { booking: any }) { + await this.evaluateRules(payload.booking.passengerId, 'booking.created', { + bookingId: payload.booking.id, + amountMinor: payload.booking.totalMinor, + }); + } + + /** + * Event listener for payment failed + */ + @OnEvent('payment.failed') + async onPaymentFailed(payload: { intentId: string; userId: string }) { + await this.evaluateRules(payload.userId, 'payment.failed', { + intentId: payload.intentId, + }); + } + + /** + * Event listener for auth login failed + */ + @OnEvent('auth.login.failed') + async onLoginFailed(payload: { userId: string; email: string }) { + await this.evaluateRules(payload.userId, 'auth.login.failed', { + email: payload.email, + }); + } +} diff --git a/apps/edr-passenger-api/src/modules/notifications/notification.adapters.ts b/apps/edr-passenger-api/src/modules/notifications/notification.adapters.ts new file mode 100644 index 000000000..c7db1a0a4 --- /dev/null +++ b/apps/edr-passenger-api/src/modules/notifications/notification.adapters.ts @@ -0,0 +1,216 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import * as sgMail from '@sendgrid/mail'; +import { HttpService } from '@nestjs/axios'; +import { firstValueFrom } from 'rxjs'; + +export interface NotificationChannel { + send(recipient: string, subject: string, body: string, context?: Record): Promise; +} + +@Injectable() +export class EmailAdapter implements NotificationChannel { + private readonly logger = new Logger(EmailAdapter.name); + + constructor(private readonly config: ConfigService) { + const apiKey = this.config.get('SENDGRID_API_KEY'); + if (apiKey) { + sgMail.setApiKey(apiKey); + this.logger.log('SendGrid Email adapter initialized'); + } else { + this.logger.warn('SENDGRID_API_KEY not configured - emails will be logged only'); + } + } + + async send( + recipient: string, + subject: string, + body: string, + context?: Record, + ): Promise { + const apiKey = this.config.get('SENDGRID_API_KEY'); + const fromEmail = this.config.get('SENDGRID_FROM_EMAIL') || 'noreply@edr-platform.com'; + + if (!apiKey) { + this.logger.log(`[EMAIL MOCK] To: ${recipient} | Subject: ${subject} | Body: ${body.substring(0, 100)}`); + return true; + } + + try { + const msg: sgMail.MailDataRequired = { + to: recipient, + from: fromEmail, + subject, + text: body, + html: this.formatHtml(body, context), + }; + + await sgMail.send(msg); + this.logger.log(`Email sent successfully to ${recipient}`); + return true; + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + this.logger.error(`Failed to send email to ${recipient}: ${message}`); + return false; + } + } + + private formatHtml(body: string, context?: Record): string { + const contextHtml = context + ? `
+ ${JSON.stringify(context, null, 2)} +
` + : ''; + + return ` + + + + + + + +
+
+

Ethio-Djibouti Railway

+
+
+ ${body.replace(/\n/g, '
')} + ${contextHtml} +
+ +
+ + + `; + } +} + +@Injectable() +export class SmsAdapter implements NotificationChannel { + private readonly logger = new Logger(SmsAdapter.name); + + constructor( + private readonly config: ConfigService, + private readonly http: HttpService, + ) { + const provider = this.config.get('SMS_PROVIDER'); + this.logger.log(`SMS adapter initialized with provider: ${provider || 'MOCK'}`); + } + + async send( + recipient: string, + subject: string, + body: string, + _context?: Record, + ): Promise { + const provider = this.config.get('SMS_PROVIDER'); + const apiKey = this.config.get('SMS_API_KEY'); + + if (!provider || !apiKey) { + this.logger.log(`[SMS MOCK] To: ${recipient} | Message: ${body.substring(0, 100)}`); + return true; + } + + try { + switch (provider.toLowerCase()) { + case 'twilio': + return await this.sendViaTwilio(recipient, body); + case 'africastalking': + return await this.sendViaAfricasTalking(recipient, body); + default: + this.logger.warn(`Unknown SMS provider: ${provider}`); + return false; + } + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + this.logger.error(`Failed to send SMS to ${recipient}: ${message}`); + return false; + } + } + + private async sendViaTwilio(to: string, body: string): Promise { + const accountSid = this.config.get('TWILIO_ACCOUNT_SID'); + const authToken = this.config.get('TWILIO_AUTH_TOKEN'); + const fromNumber = this.config.get('TWILIO_FROM_NUMBER'); + + const url = `https://api.twilio.com/2010-04-01/Accounts/${accountSid}/Messages.json`; + const auth = Buffer.from(`${accountSid}:${authToken}`).toString('base64'); + + const response = await firstValueFrom( + this.http.post( + url, + new URLSearchParams({ + To: to, + From: fromNumber || '', + Body: body, + }), + { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': `Basic ${auth}`, + }, + }, + ), + ); + + return response.status === 201; + } + + private async sendViaAfricasTalking(to: string, body: string): Promise { + const apiKey = this.config.get('SMS_API_KEY'); + const username = this.config.get('AFRICASTALKING_USERNAME'); + const from = this.config.get('AFRICASTALKING_FROM'); + + const url = 'https://api.africastalking.com/version1/messaging'; + + const response = await firstValueFrom( + this.http.post( + url, + new URLSearchParams({ + username: username || '', + to, + message: body, + from: from || '', + }), + { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'apiKey': apiKey || '', + }, + }, + ), + ); + + return response.status === 201; + } +} + +@Injectable() +export class PushAdapter implements NotificationChannel { + private readonly logger = new Logger(PushAdapter.name); + + constructor(private readonly config: ConfigService) { + this.logger.log('Push notification adapter initialized'); + } + + async send( + recipient: string, + subject: string, + body: string, + context?: Record, + ): Promise { + // Push notifications would typically use FCM/APNS + // For now, just log + this.logger.log(`[PUSH MOCK] To: ${recipient} | Title: ${subject} | Body: ${body.substring(0, 100)}`); + return true; + } +} diff --git a/apps/edr-passenger-api/src/modules/notifications/notifications.controller.ts b/apps/edr-passenger-api/src/modules/notifications/notifications.controller.ts index 076c023a1..9b363c04f 100644 --- a/apps/edr-passenger-api/src/modules/notifications/notifications.controller.ts +++ b/apps/edr-passenger-api/src/modules/notifications/notifications.controller.ts @@ -1,7 +1,9 @@ -import { Controller, Get, Param, Patch, UseGuards } from '@nestjs/common'; +import { Controller, Get, Param, Patch, Post, Body, UseGuards } from '@nestjs/common'; import { ApiTags, ApiOperation, ApiBearerAuth } from '@nestjs/swagger'; import { NotificationsService } from './notifications.service'; import { JwtGuard } from '../../common/jwt.guard'; +import { IamGuard, IamRoles } from '../../common/iam-adapter'; +import { TestNotificationDto } from './notifications.dto'; @ApiTags('Notifications') @Controller('notifications') @@ -12,13 +14,32 @@ export class NotificationsController { @Get(':passengerId') @ApiOperation({ summary: 'Get notifications for passenger' }) - getForPassenger(@Param('passengerId') id: string) { return this.service.getForPassenger(id); } + getForPassenger(@Param('passengerId') id: string) { + return this.service.getForPassenger(id); + } @Patch(':id/read') @ApiOperation({ summary: 'Mark notification as read' }) - markRead(@Param('id') id: string) { return this.service.markRead(id); } + markRead(@Param('id') id: string) { + return this.service.markRead(id); + } @Patch(':passengerId/read-all') @ApiOperation({ summary: 'Mark all notifications as read' }) - markAllRead(@Param('passengerId') id: string) { return this.service.markAllRead(id); } + markAllRead(@Param('passengerId') id: string) { + return this.service.markAllRead(id); + } + + @Post('test') + @UseGuards(IamGuard) + @IamRoles('ADMIN', 'STAFF') + @ApiOperation({ summary: 'Test notification delivery (Admin only)' }) + async testNotification(@Body() dto: TestNotificationDto) { + return this.service.send( + dto.templateKey, + dto.recipient, + dto.context, + dto.channels as any, + ); + } } diff --git a/apps/edr-passenger-api/src/modules/notifications/notifications.dto.ts b/apps/edr-passenger-api/src/modules/notifications/notifications.dto.ts index 07bd9dd40..e55535a2a 100644 --- a/apps/edr-passenger-api/src/modules/notifications/notifications.dto.ts +++ b/apps/edr-passenger-api/src/modules/notifications/notifications.dto.ts @@ -1,4 +1,4 @@ -import { IsString, IsEnum, IsOptional } from 'class-validator'; +import { IsString, IsEnum, IsOptional, IsArray } from 'class-validator'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; export enum NotificationCategoryEnum { @@ -17,3 +17,21 @@ export class SendNotificationDto { @ApiPropertyOptional({ example: 'edr://tickets/tkt_01' }) @IsOptional() @IsString() deepLink?: string; @ApiPropertyOptional() @IsOptional() metadata?: Record; } + +export class TestNotificationDto { + @ApiProperty({ example: 'booking.created' }) + @IsString() + templateKey: string; + + @ApiProperty({ example: 'user@example.com' }) + @IsString() + recipient: string; + + @ApiProperty({ example: { bookingRef: 'EDR123456', passengerName: 'John Doe' } }) + context: Record; + + @ApiPropertyOptional({ example: ['EMAIL', 'SMS', 'IN_APP'] }) + @IsOptional() + @IsArray() + channels?: string[]; +} diff --git a/apps/edr-passenger-api/src/modules/notifications/notifications.module.ts b/apps/edr-passenger-api/src/modules/notifications/notifications.module.ts index 8a1322a50..b4c28405f 100644 --- a/apps/edr-passenger-api/src/modules/notifications/notifications.module.ts +++ b/apps/edr-passenger-api/src/modules/notifications/notifications.module.ts @@ -1,6 +1,13 @@ import { Module } from '@nestjs/common'; +import { HttpModule } from '@nestjs/axios'; import { NotificationsController } from './notifications.controller'; import { NotificationsService } from './notifications.service'; +import { EmailAdapter, SmsAdapter, PushAdapter } from './notification.adapters'; -@Module({ controllers: [NotificationsController], providers: [NotificationsService], exports: [NotificationsService] }) +@Module({ + imports: [HttpModule.register({ timeout: 10_000 })], + controllers: [NotificationsController], + providers: [NotificationsService, EmailAdapter, SmsAdapter, PushAdapter], + exports: [NotificationsService], +}) export class NotificationsModule {} diff --git a/apps/edr-passenger-api/src/modules/notifications/notifications.service.ts b/apps/edr-passenger-api/src/modules/notifications/notifications.service.ts index a92c4c71f..e793a1322 100644 --- a/apps/edr-passenger-api/src/modules/notifications/notifications.service.ts +++ b/apps/edr-passenger-api/src/modules/notifications/notifications.service.ts @@ -1,45 +1,263 @@ -import { Injectable } from '@nestjs/common'; +import { Injectable, Logger, NotFoundException } from '@nestjs/common'; import { OnEvent } from '@nestjs/event-emitter'; import { PrismaService } from '../../common/prisma.service'; import { SendNotificationDto, NotificationCategoryEnum } from './notifications.dto'; -import * as sgMail from '@sendgrid/mail'; +import { EmailAdapter, SmsAdapter, PushAdapter, NotificationChannel } from './notification.adapters'; + +export type NotificationChannelType = 'EMAIL' | 'SMS' | 'PUSH' | 'IN_APP'; @Injectable() export class NotificationsService { - constructor(private prisma: PrismaService) { - if (process.env.SENDGRID_API_KEY) sgMail.setApiKey(process.env.SENDGRID_API_KEY); + private readonly logger = new Logger(NotificationsService.name); + private readonly channels: Map; + + constructor( + private prisma: PrismaService, + private emailAdapter: EmailAdapter, + private smsAdapter: SmsAdapter, + private pushAdapter: PushAdapter, + ) { + this.channels = new Map([ + ['EMAIL', this.emailAdapter as NotificationChannel], + ['SMS', this.smsAdapter as NotificationChannel], + ['PUSH', this.pushAdapter as NotificationChannel], + ]); } - private sanitize(value: string): string { - return value.replace(/[\r\n]/g, ' ').replace(/[<>&"']/g, (c) => ({ '<': '<', '>': '>', '&': '&', '"': '"', "'": ''' }[c] ?? c)); + /** + * Send notification using template key and context + * @param templateKey - Template code from NotificationTemplate table + * @param recipient - User/Passenger ID or email/phone + * @param context - Variables to interpolate in template + * @param channels - Optional array of channels to use (defaults to user preferences) + */ + async send( + templateKey: string, + recipient: string, + context: Record, + channels?: NotificationChannelType[], + ): Promise<{ sent: boolean; channels: string[] }> { + const template = await this.prisma.notificationTemplate.findUnique({ + where: { code: templateKey }, + }); + + if (!template || !template.active) { + this.logger.warn(`Template ${templateKey} not found or inactive`); + return { sent: false, channels: [] }; + } + + const { subject, body } = this.interpolate(template, context); + const targetChannels = channels || await this.getUserPreferredChannels(recipient); + const sentChannels: string[] = []; + + // Always create in-app notification + if (targetChannels.includes('IN_APP')) { + await this.createInAppNotification(recipient, subject, body, context); + sentChannels.push('IN_APP'); + } + + // Send via other channels + for (const channelType of targetChannels) { + if (channelType === 'IN_APP') continue; + + const adapter = this.channels.get(channelType); + if (!adapter) { + this.logger.warn(`No adapter for channel: ${channelType}`); + continue; + } + + const recipientAddress = await this.getRecipientAddress(recipient, channelType); + if (!recipientAddress) { + this.logger.warn(`No ${channelType} address for recipient: ${recipient}`); + continue; + } + + const success = await adapter.send(recipientAddress, subject, body, context); + if (success) { + sentChannels.push(channelType); + } + } + + return { sent: sentChannels.length > 0, channels: sentChannels }; } - async send(dto: SendNotificationDto) { - const notification = await this.prisma.notification.create({ data: { passengerId: dto.passengerId, title: dto.title, body: dto.body, category: dto.category as any, deepLink: dto.deepLink, metadata: dto.metadata } }); - const passenger = await this.prisma.passenger.findUnique({ where: { id: dto.passengerId }, include: { user: true } }); - if (passenger?.user) await this.sendEmail(passenger.user.email, this.sanitize(dto.title), this.sanitize(dto.body)); + /** + * Legacy method for backward compatibility + */ + async sendDirect(dto: SendNotificationDto) { + const notification = await this.prisma.notification.create({ + data: { + passengerId: dto.passengerId, + title: dto.title, + body: dto.body, + category: dto.category as any, + deepLink: dto.deepLink, + metadata: dto.metadata, + }, + }); + + const passenger = await this.prisma.passenger.findUnique({ + where: { id: dto.passengerId }, + include: { user: true }, + }); + + if (passenger?.user) { + await this.emailAdapter.send( + passenger.user.email, + this.sanitize(dto.title), + this.sanitize(dto.body), + ); + } + return notification; } - getForPassenger(passengerId: string) { return this.prisma.notification.findMany({ where: { passengerId }, orderBy: { createdAt: 'desc' }, take: 50 }); } + private async createInAppNotification( + recipient: string, + title: string, + body: string, + context: Record, + ): Promise { + // Try to find passenger by ID or email + let passengerId = recipient; - markRead(id: string) { return this.prisma.notification.update({ where: { id }, data: { read: true } }); } + if (!recipient.match(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i)) { + const user = await this.prisma.user.findFirst({ + where: { + OR: [{ email: recipient }, { phone: recipient }], + }, + include: { passenger: true }, + }); + if (user?.passenger) { + passengerId = user.passenger.id; + } else { + this.logger.warn(`Could not find passenger for recipient: ${recipient}`); + return; + } + } - async markAllRead(passengerId: string) { await this.prisma.notification.updateMany({ where: { passengerId, read: false }, data: { read: true } }); return { updated: true }; } + await this.prisma.notification.create({ + data: { + passengerId, + title, + body, + category: (context.category as any) || 'SYSTEM', + deepLink: context.deepLink as string, + metadata: context as any, + }, + }); + } + + private interpolate( + template: { subject?: string | null; bodyTemplate: string }, + context: Record, + ): { subject: string; body: string } { + const subject = template.subject || 'Notification'; + let body = template.bodyTemplate; + + // Simple template interpolation: {{variable}} + for (const [key, value] of Object.entries(context)) { + const regex = new RegExp(`{{\\s*${key}\\s*}}`, 'g'); + body = body.replace(regex, String(value)); + } + + return { subject, body }; + } + + private async getUserPreferredChannels(recipient: string): Promise { + const user = await this.prisma.user.findFirst({ + where: { + OR: [{ id: recipient }, { email: recipient }, { phone: recipient }], + }, + include: { preferences: true }, + }); + + if (!user?.preferences) { + return ['IN_APP', 'EMAIL']; + } + + const channels: NotificationChannelType[] = ['IN_APP']; + if (user.preferences.emailEnabled) channels.push('EMAIL'); + if (user.preferences.smsEnabled) channels.push('SMS'); + if (user.preferences.pushEnabled) channels.push('PUSH'); + + return channels; + } + + private async getRecipientAddress( + recipient: string, + channel: NotificationChannelType, + ): Promise { + const user = await this.prisma.user.findFirst({ + where: { + OR: [{ id: recipient }, { email: recipient }, { phone: recipient }], + }, + }); + + if (!user) return null; + + switch (channel) { + case 'EMAIL': + return user.email; + case 'SMS': + return user.phone; + case 'PUSH': + // Would need to fetch device push token + return user.id; + default: + return null; + } + } + + private sanitize(value: string): string { + return value + .replace(/[\r\n]/g, ' ') + .replace(/[<>&"']/g, (c) => ({ '<': '<', '>': '>', '&': '&', '"': '"', "'": ''' }[c] ?? c)); + } + + getForPassenger(passengerId: string) { + return this.prisma.notification.findMany({ + where: { passengerId }, + orderBy: { createdAt: 'desc' }, + take: 50, + }); + } + + markRead(id: string) { + return this.prisma.notification.update({ where: { id }, data: { read: true } }); + } + + async markAllRead(passengerId: string) { + await this.prisma.notification.updateMany({ + where: { passengerId, read: false }, + data: { read: true }, + }); + return { updated: true }; + } @OnEvent('booking.created') async onBookingCreated(payload: any) { - await this.send({ passengerId: payload.booking.passengerId, title: 'Booking Created', body: `Booking ${payload.booking.bookingRef} created. Complete payment within 15 minutes.`, category: NotificationCategoryEnum.BOOKING, deepLink: `edr://bookings/${payload.booking.bookingRef}`, metadata: { bookingRef: payload.booking.bookingRef } }); + await this.send( + 'booking.created', + payload.booking.passengerId, + { + bookingRef: payload.booking.bookingRef, + category: 'BOOKING', + deepLink: `edr://bookings/${payload.booking.bookingRef}`, + }, + ); } @OnEvent('payment.succeeded') async onPaymentSucceeded(payload: any) { - await this.send({ passengerId: payload.booking.passengerId, title: 'Payment Successful', body: `Your ticket for ${payload.booking.bookingRef} is confirmed. Have a great journey!`, category: NotificationCategoryEnum.PAYMENT, deepLink: `edr://tickets/${payload.booking.bookingRef}`, metadata: { bookingRef: payload.booking.bookingRef } }); - } - - private async sendEmail(to: string, subject: string, text: string) { - if (!process.env.SENDGRID_API_KEY) { console.log(`[EMAIL] To: ${to} | Subject: ${subject}`); return; } - try { await sgMail.send({ to, from: process.env.SENDGRID_FROM_EMAIL || 'noreply@edr-platform.com', subject, text }); } - catch (e) { console.error('[EMAIL] Send error:', String(e instanceof Error ? e.message : e).replace(/[\r\n<>&"']/g, ' ')); } + await this.send( + 'payment.succeeded', + payload.booking.passengerId, + { + bookingRef: payload.booking.bookingRef, + category: 'PAYMENT', + deepLink: `edr://tickets/${payload.booking.bookingRef}`, + }, + ); } } \ No newline at end of file diff --git a/apps/edr-passenger-api/src/modules/payments/payments.e2e-spec.ts b/apps/edr-passenger-api/src/modules/payments/payments.e2e-spec.ts new file mode 100644 index 000000000..4918ce4fd --- /dev/null +++ b/apps/edr-passenger-api/src/modules/payments/payments.e2e-spec.ts @@ -0,0 +1,270 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication, ValidationPipe } from '@nestjs/common'; +import request from 'supertest'; +import { AppModule } from '../../app.module'; +import { PrismaService } from '../../common/prisma.service'; + +describe('Payments E2E', () => { + let app: INestApplication; + let prisma: PrismaService; + let authToken: string; + let bookingId: string; + + beforeAll(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + app.useGlobalPipes(new ValidationPipe({ transform: true, whitelist: true })); + await app.init(); + + prisma = app.get(PrismaService); + + // Create test user and authenticate + const testUser = await prisma.user.create({ + data: { + email: 'payment-test@example.com', + phone: '+251911111111', + fullName: 'Payment Test User', + passwordHash: '$2b$10$abcdefghijklmnopqrstuvwxyz', // Mock hash + role: 'PASSENGER', + }, + }); + + const passenger = await prisma.passenger.create({ + data: { + userId: testUser.id, + }, + }); + + // Create wallet for test user + await prisma.walletAccount.create({ + data: { + passengerId: passenger.id, + balanceMinor: 100000, // 1000 ETB + currency: 'ETB', + }, + }); + + // Mock JWT token (in real test, call /auth/login) + authToken = 'mock-jwt-token'; + + // Create test booking + const station1 = await prisma.station.create({ + data: { + code: 'TEST1', + name: 'Test Station 1', + city: 'Test City', + lat: 9.0, + lng: 38.0, + }, + }); + + const station2 = await prisma.station.create({ + data: { + code: 'TEST2', + name: 'Test Station 2', + city: 'Test City 2', + lat: 9.5, + lng: 38.5, + }, + }); + + const service = await prisma.trainService.create({ + data: { + number: 'TEST-001', + name: 'Test Service', + }, + }); + + const trip = await prisma.trip.create({ + data: { + serviceId: service.id, + originStationId: station1.id, + destinationStationId: station2.id, + departureAt: new Date(Date.now() + 86400000), + arrivalAt: new Date(Date.now() + 90000000), + durationMinutes: 60, + }, + }); + + const coach = await prisma.coach.create({ + data: { + tripId: trip.id, + label: 'A', + serviceClass: 'ECONOMY_REGULAR', + }, + }); + + const seat = await prisma.seat.create({ + data: { + coachId: coach.id, + row: 1, + col: 'A', + label: '1A', + status: 'AVAILABLE', + }, + }); + + const booking = await prisma.booking.create({ + data: { + bookingRef: 'TEST-BOOK-001', + passengerId: passenger.id, + tripId: trip.id, + status: 'PENDING_PAYMENT', + totalMinor: 50000, // 500 ETB + currency: 'ETB', + }, + }); + + await prisma.bookingSeat.create({ + data: { + bookingId: booking.id, + seatId: seat.id, + passengerName: 'Test Passenger', + }, + }); + + bookingId = booking.id; + }); + + afterAll(async () => { + await prisma.$transaction([ + prisma.bookingSeat.deleteMany(), + prisma.paymentIntent.deleteMany(), + prisma.booking.deleteMany(), + prisma.seat.deleteMany(), + prisma.coach.deleteMany(), + prisma.trip.deleteMany(), + prisma.trainService.deleteMany(), + prisma.station.deleteMany(), + prisma.walletLedgerEntry.deleteMany(), + prisma.walletAccount.deleteMany(), + prisma.passenger.deleteMany(), + prisma.user.deleteMany(), + ]); + await app.close(); + }); + + describe('POST /payments/initiate', () => { + it('should initiate wallet payment successfully', async () => { + const response = await request(app.getHttpServer()) + .post('/payments/initiate') + .set('Authorization', `Bearer ${authToken}`) + .send({ + bookingId, + method: 'WALLET', + }) + .expect(201); + + expect(response.body.intentId).toBeDefined(); + expect(response.body.status).toBe('SUCCEEDED'); + }); + + it('should return 400 for invalid payment method', async () => { + await request(app.getHttpServer()) + .post('/payments/initiate') + .set('Authorization', `Bearer ${authToken}`) + .send({ + bookingId, + method: 'INVALID_METHOD', + }) + .expect(400); + }); + + it('should return 404 for non-existent booking', async () => { + await request(app.getHttpServer()) + .post('/payments/initiate') + .set('Authorization', `Bearer ${authToken}`) + .send({ + bookingId: 'non-existent-id', + method: 'WALLET', + }) + .expect(404); + }); + }); + + describe('GET /payments/intents/:bookingId', () => { + it('should get payment intent status', async () => { + const response = await request(app.getHttpServer()) + .get(`/payments/intents/${bookingId}`) + .set('Authorization', `Bearer ${authToken}`) + .expect(200); + + expect(response.body.intentId).toBeDefined(); + expect(response.body.status).toBeDefined(); + }); + + it('should return 404 for non-existent intent', async () => { + await request(app.getHttpServer()) + .get('/payments/intents/non-existent-booking') + .set('Authorization', `Bearer ${authToken}`) + .expect(404); + }); + }); + + describe('Webhook endpoints', () => { + it('should handle Telebirr webhook', async () => { + await request(app.getHttpServer()) + .post('/payments/webhooks/telebirr') + .send({ + merch_order_id: 'TEST-ORDER-123', + payment_order_id: 'PAY-123', + trade_status: 'Completed', + sign: 'mock-signature', + }) + .expect(200); + }); + + it('should handle CBE Birr webhook', async () => { + await request(app.getHttpServer()) + .post('/payments/webhooks/cbe-birr') + .send({ + merchantId: 'TEST-MERCHANT', + merchantOrderId: 'TEST-ORDER-123', + orderId: 'CBE-ORDER-123', + status: 'SUCCESS', + signature: 'mock-signature', + }) + .expect(200); + }); + + it('should handle eBirr webhook', async () => { + await request(app.getHttpServer()) + .post('/payments/webhooks/ebirr') + .send({ + merchantCode: 'TEST-MERCHANT', + orderNo: 'TEST-ORDER-123', + tradeStatus: 'TRADE_SUCCESS', + timestamp: Date.now(), + sign: 'mock-signature', + }) + .expect(200); + }); + + it('should handle Card webhook', async () => { + await request(app.getHttpServer()) + .post('/payments/webhooks/card') + .set('stripe-signature', 'mock-signature') + .send({ + id: 'evt_123', + type: 'payment_intent.succeeded', + data: { + object: { + id: 'pi_123', + status: 'succeeded', + amount: 50000, + currency: 'ETB', + metadata: { + merchantOrderId: 'TEST-ORDER-123', + bookingRef: 'TEST-BOOK-001', + }, + }, + }, + created: Math.floor(Date.now() / 1000), + }) + .expect(200); + }); + }); +}); diff --git a/apps/edr-passenger-api/src/modules/payments/payments.module.ts b/apps/edr-passenger-api/src/modules/payments/payments.module.ts index 0b898f467..387ce5244 100644 --- a/apps/edr-passenger-api/src/modules/payments/payments.module.ts +++ b/apps/edr-passenger-api/src/modules/payments/payments.module.ts @@ -5,12 +5,28 @@ import { PaymentsService } from './payments.service'; import { SeatsModule } from '../seats/seats.module'; import { TicketsModule } from '../tickets/tickets.module'; import { TelebirrProvider } from './providers/telebirr.provider'; +import { CbeBirrProvider } from './providers/cbe-birr.provider'; +import { EBirrProvider } from './providers/ebirr.provider'; +import { CardProvider } from './providers/card.provider'; import { WebhooksController } from './webhooks/webhooks.controller'; import { TelebirrWebhookService } from './webhooks/telebirr-webhook.service'; +import { CbeBirrWebhookService } from './webhooks/cbe-birr-webhook.service'; +import { EBirrWebhookService } from './webhooks/ebirr-webhook.service'; +import { CardWebhookService } from './webhooks/card-webhook.service'; @Module({ imports: [SeatsModule, TicketsModule, HttpModule.register({ timeout: 10_000 })], controllers: [PaymentsController, WebhooksController], - providers: [PaymentsService, TelebirrProvider, TelebirrWebhookService], + providers: [ + PaymentsService, + TelebirrProvider, + CbeBirrProvider, + EBirrProvider, + CardProvider, + TelebirrWebhookService, + CbeBirrWebhookService, + EBirrWebhookService, + CardWebhookService, + ], }) export class PaymentsModule {} diff --git a/apps/edr-passenger-api/src/modules/payments/payments.service.spec.ts b/apps/edr-passenger-api/src/modules/payments/payments.service.spec.ts new file mode 100644 index 000000000..e6ebd9035 --- /dev/null +++ b/apps/edr-passenger-api/src/modules/payments/payments.service.spec.ts @@ -0,0 +1,328 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { PaymentsService } from './payments.service'; +import { PrismaService } from '../../common/prisma.service'; +import { SeatsService } from '../seats/seats.service'; +import { TicketsService } from '../tickets/tickets.service'; +import { EventEmitter2 } from '@nestjs/event-emitter'; +import { TelebirrProvider } from './providers/telebirr.provider'; +import { CbeBirrProvider } from './providers/cbe-birr.provider'; +import { EBirrProvider } from './providers/ebirr.provider'; +import { CardProvider } from './providers/card.provider'; +import { PaymentIntentStatus, PaymentMethodType } from '@prisma/client'; +import { BadRequestException, NotFoundException } from '@nestjs/common'; + +describe('PaymentsService', () => { + let service: PaymentsService; + let prisma: PrismaService; + let seatsService: SeatsService; + let ticketsService: TicketsService; + let eventEmitter: EventEmitter2; + + const mockPrisma = { + booking: { + findUnique: jest.fn(), + update: jest.fn(), + }, + paymentIntent: { + findUnique: jest.fn(), + findUniqueOrThrow: jest.fn(), + upsert: jest.fn(), + update: jest.fn(), + create: jest.fn(), + }, + walletAccount: { + findUnique: jest.fn(), + update: jest.fn(), + }, + walletLedgerEntry: { + create: jest.fn(), + }, + loyaltyAccount: { + findUnique: jest.fn(), + update: jest.fn(), + }, + loyaltyLedgerEntry: { + create: jest.fn(), + }, + $transaction: jest.fn((callback) => callback(mockPrisma)), + }; + + const mockSeatsService = { + confirmSeats: jest.fn(), + releaseSeats: jest.fn(), + }; + + const mockTicketsService = { + generate: jest.fn(), + }; + + const mockEventEmitter = { + emit: jest.fn(), + }; + + const mockTelebirrProvider = { + method: PaymentMethodType.TELEBIRR, + initiate: jest.fn(), + queryStatus: jest.fn(), + }; + + const mockCbeBirrProvider = { + method: PaymentMethodType.CBE_BIRR, + initiate: jest.fn(), + queryStatus: jest.fn(), + }; + + const mockEBirrProvider = { + method: PaymentMethodType.EBIRR, + initiate: jest.fn(), + queryStatus: jest.fn(), + }; + + const mockCardProvider = { + method: PaymentMethodType.CARD, + initiate: jest.fn(), + queryStatus: jest.fn(), + }; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ + PaymentsService, + { provide: PrismaService, useValue: mockPrisma }, + { provide: SeatsService, useValue: mockSeatsService }, + { provide: TicketsService, useValue: mockTicketsService }, + { provide: EventEmitter2, useValue: mockEventEmitter }, + { provide: TelebirrProvider, useValue: mockTelebirrProvider }, + { provide: CbeBirrProvider, useValue: mockCbeBirrProvider }, + { provide: EBirrProvider, useValue: mockEBirrProvider }, + { provide: CardProvider, useValue: mockCardProvider }, + ], + }).compile(); + + service = module.get(PaymentsService); + prisma = module.get(PrismaService); + seatsService = module.get(SeatsService); + ticketsService = module.get(TicketsService); + eventEmitter = module.get(EventEmitter2); + + jest.clearAllMocks(); + }); + + describe('initiatePayment', () => { + const mockBooking = { + id: 'booking-1', + bookingRef: 'EDR123456', + passengerId: 'passenger-1', + totalMinor: 50000, + currency: 'ETB', + status: 'PENDING_PAYMENT', + seats: [{ id: 'seat-1', seatId: 'seat-id-1' }], + }; + + it('should throw NotFoundException if booking not found', async () => { + mockPrisma.booking.findUnique.mockResolvedValue(null); + + await expect( + service.initiatePayment({ + bookingId: 'invalid', + method: 'TELEBIRR' as any, + }), + ).rejects.toThrow(NotFoundException); + }); + + it('should throw BadRequestException if booking not payable', async () => { + mockPrisma.booking.findUnique.mockResolvedValue({ + ...mockBooking, + status: 'CONFIRMED', + }); + + await expect( + service.initiatePayment({ + bookingId: 'booking-1', + method: 'TELEBIRR' as any, + }), + ).rejects.toThrow(BadRequestException); + }); + + it('should initiate Telebirr payment successfully', async () => { + mockPrisma.booking.findUnique.mockResolvedValue(mockBooking); + mockPrisma.paymentIntent.findUnique.mockResolvedValue(null); + mockTelebirrProvider.initiate.mockResolvedValue({ + providerOrderId: 'TB-ORDER-123', + clientAction: { type: 'REDIRECT', url: 'https://telebirr.com/pay' }, + expiresAt: new Date(), + rawInitiation: {}, + }); + mockPrisma.paymentIntent.upsert.mockResolvedValue({ + id: 'intent-1', + status: PaymentIntentStatus.REQUIRES_ACTION, + merchantOrderId: 'MERCH-123', + clientAction: { type: 'REDIRECT', url: 'https://telebirr.com/pay' }, + }); + + const result = await service.initiatePayment({ + bookingId: 'booking-1', + method: 'TELEBIRR' as any, + }); + + expect(result.status).toBe(PaymentIntentStatus.REQUIRES_ACTION); + expect(mockTelebirrProvider.initiate).toHaveBeenCalled(); + }); + + it('should initiate CBE Birr payment successfully', async () => { + mockPrisma.booking.findUnique.mockResolvedValue(mockBooking); + mockPrisma.paymentIntent.findUnique.mockResolvedValue(null); + mockCbeBirrProvider.initiate.mockResolvedValue({ + providerOrderId: 'CBE-ORDER-123', + clientAction: { type: 'REDIRECT', url: 'https://cbe.com/pay' }, + expiresAt: new Date(), + rawInitiation: {}, + }); + mockPrisma.paymentIntent.upsert.mockResolvedValue({ + id: 'intent-1', + status: PaymentIntentStatus.REQUIRES_ACTION, + merchantOrderId: 'MERCH-123', + clientAction: { type: 'REDIRECT', url: 'https://cbe.com/pay' }, + }); + + const result = await service.initiatePayment({ + bookingId: 'booking-1', + method: 'CBE_BIRR' as any, + }); + + expect(result.status).toBe(PaymentIntentStatus.REQUIRES_ACTION); + expect(mockCbeBirrProvider.initiate).toHaveBeenCalled(); + }); + + it('should initiate wallet payment and debit successfully', async () => { + mockPrisma.booking.findUnique.mockResolvedValue(mockBooking); + mockPrisma.paymentIntent.findUnique.mockResolvedValue(null); + mockPrisma.walletAccount.findUnique.mockResolvedValue({ + id: 'wallet-1', + passengerId: 'passenger-1', + balanceMinor: 100000, + }); + mockPrisma.paymentIntent.upsert.mockResolvedValue({ + id: 'intent-1', + status: PaymentIntentStatus.PROCESSING, + }); + mockPrisma.paymentIntent.findUniqueOrThrow.mockResolvedValue({ + id: 'intent-1', + status: PaymentIntentStatus.SUCCEEDED, + bookingId: 'booking-1', + }); + mockPrisma.loyaltyAccount.findUnique.mockResolvedValue({ + id: 'loyalty-1', + pointsBalance: 100, + }); + + const result = await service.initiatePayment({ + bookingId: 'booking-1', + method: 'WALLET' as any, + }); + + expect(result.status).toBe(PaymentIntentStatus.SUCCEEDED); + expect(mockSeatsService.confirmSeats).toHaveBeenCalled(); + expect(mockTicketsService.generate).toHaveBeenCalled(); + }); + + it('should fail wallet payment with insufficient balance', async () => { + mockPrisma.booking.findUnique.mockResolvedValue(mockBooking); + mockPrisma.paymentIntent.findUnique.mockResolvedValue(null); + mockPrisma.walletAccount.findUnique.mockResolvedValue({ + id: 'wallet-1', + passengerId: 'passenger-1', + balanceMinor: 10000, // Less than booking total + }); + mockPrisma.paymentIntent.upsert.mockResolvedValue({ + id: 'intent-1', + status: PaymentIntentStatus.FAILED, + failureCode: 'INSUFFICIENT_BALANCE', + }); + + const result = await service.initiatePayment({ + bookingId: 'booking-1', + method: 'WALLET' as any, + }); + + expect(result.status).toBe(PaymentIntentStatus.FAILED); + }); + }); + + describe('finalizePaymentSuccess', () => { + it('should finalize payment and issue ticket', async () => { + const mockIntent = { + id: 'intent-1', + bookingId: 'booking-1', + status: PaymentIntentStatus.PROCESSING, + }; + const mockBooking = { + id: 'booking-1', + passengerId: 'passenger-1', + totalMinor: 50000, + seats: [{ seatId: 'seat-1' }], + }; + + mockPrisma.paymentIntent.findUnique.mockResolvedValue(mockIntent); + mockPrisma.booking.findUnique.mockResolvedValue(mockBooking); + mockPrisma.loyaltyAccount.findUnique.mockResolvedValue({ + id: 'loyalty-1', + pointsBalance: 100, + }); + + const result = await service.finalizePaymentSuccess({ + intentId: 'intent-1', + providerTxnId: 'TXN-123', + }); + + expect(result.alreadyFinalized).toBe(false); + expect(mockSeatsService.confirmSeats).toHaveBeenCalledWith(['seat-1']); + expect(mockTicketsService.generate).toHaveBeenCalledWith('booking-1'); + expect(mockEventEmitter.emit).toHaveBeenCalledWith('payment.succeeded', { + booking: mockBooking, + }); + }); + + it('should return alreadyFinalized if payment already succeeded', async () => { + mockPrisma.paymentIntent.findUnique.mockResolvedValue({ + id: 'intent-1', + status: PaymentIntentStatus.SUCCEEDED, + }); + + const result = await service.finalizePaymentSuccess({ + intentId: 'intent-1', + }); + + expect(result.alreadyFinalized).toBe(true); + }); + }); + + describe('getIntentByBookingId', () => { + it('should return intent status', async () => { + const mockIntent = { + id: 'intent-1', + bookingId: 'booking-1', + status: PaymentIntentStatus.SUCCEEDED, + method: PaymentMethodType.TELEBIRR, + paidAt: new Date(), + merchantOrderId: 'MERCH-123', + updatedAt: new Date(), + }; + + mockPrisma.paymentIntent.findUnique.mockResolvedValue(mockIntent); + + const result = await service.getIntentByBookingId('booking-1'); + + expect(result.intentId).toBe('intent-1'); + expect(result.status).toBe(PaymentIntentStatus.SUCCEEDED); + }); + + it('should throw NotFoundException if intent not found', async () => { + mockPrisma.paymentIntent.findUnique.mockResolvedValue(null); + + await expect(service.getIntentByBookingId('invalid')).rejects.toThrow( + NotFoundException, + ); + }); + }); +}); diff --git a/apps/edr-passenger-api/src/modules/payments/payments.service.ts b/apps/edr-passenger-api/src/modules/payments/payments.service.ts index 4eeb6bbe4..9f1ae5341 100644 --- a/apps/edr-passenger-api/src/modules/payments/payments.service.ts +++ b/apps/edr-passenger-api/src/modules/payments/payments.service.ts @@ -5,9 +5,11 @@ import { TicketsService } from '../tickets/tickets.service'; import { EventEmitter2 } from '@nestjs/event-emitter'; import { Prisma, PaymentIntentStatus, PaymentMethodType } from '@prisma/client'; import { InitiatePaymentDto, RefundDto, AddPaymentMethodDto, InitiateResponseDto, IntentStatusDto } from './payments.dto'; -import { cbeBirrAdapter, eBirrAdapter, cardAdapter } from './payments.adapters'; import { PaymentProvider, ProviderStatus } from './payments.types'; import { TelebirrProvider } from './providers/telebirr.provider'; +import { CbeBirrProvider } from './providers/cbe-birr.provider'; +import { EBirrProvider } from './providers/ebirr.provider'; +import { CardProvider } from './providers/card.provider'; import { createMerchantOrderId } from './providers/telebirr.crypto'; const NON_TERMINAL_STATUSES: PaymentIntentStatus[] = [ @@ -27,9 +29,15 @@ export class PaymentsService { private ticketsService: TicketsService, private eventEmitter: EventEmitter2, private telebirrProvider: TelebirrProvider, + private cbeBirrProvider: CbeBirrProvider, + private eBirrProvider: EBirrProvider, + private cardProvider: CardProvider, ) { this.providers = new Map([ [PaymentMethodType.TELEBIRR, this.telebirrProvider], + [PaymentMethodType.CBE_BIRR, this.cbeBirrProvider], + [PaymentMethodType.EBIRR, this.eBirrProvider], + [PaymentMethodType.CARD, this.cardProvider], ]); } @@ -61,8 +69,7 @@ export class PaymentsService { return this.initiateProviderPayment(booking, provider); } - // TODO: convert CBE_BIRR, EBIRR, CARD into PaymentProvider implementations. - return this.initiateStubPayment(booking, method); + throw new BadRequestException(`Unsupported payment method: ${method}`); } private async initiateWalletPayment( @@ -170,41 +177,7 @@ export class PaymentsService { return this.formatIntentResponse(intent); } - private async initiateStubPayment( - booking: Prisma.BookingGetPayload<{ include: { seats: true } }>, - method: PaymentMethodType, - ): Promise { - const adapters = { - [PaymentMethodType.CBE_BIRR]: cbeBirrAdapter, - [PaymentMethodType.EBIRR]: eBirrAdapter, - [PaymentMethodType.CARD]: cardAdapter, - } as Partial Promise<{ success: boolean; providerRef: string }>>>; - const adapter = adapters[method]; - if (!adapter) { - throw new BadRequestException(`Unsupported payment method: ${method}`); - } - const result = await adapter(booking.totalMinor, booking.bookingRef); - const status = result.success ? PaymentIntentStatus.PROCESSING : PaymentIntentStatus.FAILED; - const intent = await this.prisma.paymentIntent.upsert({ - where: { bookingId: booking.id }, - update: { status, providerRef: result.providerRef }, - create: { - bookingId: booking.id, - amountMinor: booking.totalMinor, - method, - status, - providerRef: result.providerRef, - }, - }); - if (result.success) { - await this.finalizePaymentSuccess({ intentId: intent.id }); - const refreshed = await this.prisma.paymentIntent.findUniqueOrThrow({ - where: { id: intent.id }, - }); - return this.formatIntentResponse(refreshed); - } - return this.formatIntentResponse(intent); - } + private formatIntentResponse( intent: Prisma.PaymentIntentGetPayload>, diff --git a/apps/edr-passenger-api/src/modules/payments/providers/card.provider.ts b/apps/edr-passenger-api/src/modules/payments/providers/card.provider.ts new file mode 100644 index 000000000..6f444945b --- /dev/null +++ b/apps/edr-passenger-api/src/modules/payments/providers/card.provider.ts @@ -0,0 +1,218 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { HttpService } from '@nestjs/axios'; +import { PaymentIntentStatus, PaymentMethodType } from '@prisma/client'; +import { AxiosError, AxiosRequestConfig } from 'axios'; +import { firstValueFrom } from 'rxjs'; +import * as crypto from 'node:crypto'; +import { + PaymentProvider, + ProviderInitiationInput, + ProviderInitiationResult, + ProviderStatus, +} from '../payments.types'; + +interface CardInitiateRequest { + amount: number; + currency: string; + description: string; + metadata: { + merchantOrderId: string; + bookingRef: string; + }; + return_url: string; + webhook_url: string; +} + +interface CardInitiateResponse { + id: string; + status: string; + client_secret: string; + checkout_url: string; + expires_at: number; +} + +interface CardQueryResponse { + id: string; + status: string; + amount: number; + currency: string; + transaction_id?: string; + paid_at?: number; + failure_code?: string; + failure_message?: string; +} + +@Injectable() +export class CardProvider implements PaymentProvider { + readonly method = PaymentMethodType.CARD; + private readonly logger = new Logger(CardProvider.name); + + constructor( + private readonly config: ConfigService, + private readonly http: HttpService, + ) {} + + async initiate(input: ProviderInitiationInput): Promise { + const amount = input.amountMinor / 100; + + const requestBody: CardInitiateRequest = { + amount, + currency: input.currency, + description: `EDR Train Booking ${input.bookingRef}`, + metadata: { + merchantOrderId: input.merchantOrderId, + bookingRef: input.bookingRef, + }, + return_url: this.returnUrl, + webhook_url: this.webhookUrl, + }; + + const response = await this.postJson( + `${this.baseUrl}/v1/payment_intents`, + requestBody, + ); + + if (!response.id) { + throw new Error(`Card gateway initiate failed: ${JSON.stringify(response)}`); + } + + const expiresAt = new Date(response.expires_at * 1000); + + return { + providerOrderId: response.id, + clientAction: { type: 'REDIRECT', url: response.checkout_url }, + expiresAt, + rawInitiation: { + request: requestBody, + response, + }, + }; + } + + async queryStatus(merchantOrderId: string): Promise { + // For card payments, we need to find the payment intent by metadata + // In a real implementation, we'd store the provider order ID and use it directly + const response = await this.getJson( + `${this.baseUrl}/v1/payment_intents/search?metadata[merchantOrderId]=${merchantOrderId}`, + ); + + const mapped = this.mapStatus(response.status); + + return { + status: mapped, + providerTxnId: response.transaction_id, + failureCode: response.failure_code, + failureMessage: response.failure_message, + rawResponse: response as unknown as Record, + }; + } + + verifyWebhookSignature(payload: Record, signature: string): boolean { + const payloadString = JSON.stringify(payload); + const expectedSignature = crypto + .createHmac('sha256', this.webhookSecret) + .update(payloadString) + .digest('hex'); + + try { + return crypto.timingSafeEqual( + Buffer.from(signature), + Buffer.from(expectedSignature), + ); + } catch { + return false; + } + } + + mapWebhookStatus(status: string): PaymentIntentStatus { + return this.mapStatus(status); + } + + private mapStatus(status: string): PaymentIntentStatus { + switch (status?.toLowerCase()) { + case 'succeeded': + case 'paid': + return PaymentIntentStatus.SUCCEEDED; + case 'failed': + case 'canceled': + case 'expired': + return PaymentIntentStatus.FAILED; + case 'requires_payment_method': + case 'requires_confirmation': + case 'requires_action': + return PaymentIntentStatus.REQUIRES_ACTION; + case 'processing': + return PaymentIntentStatus.PROCESSING; + default: + return PaymentIntentStatus.PROCESSING; + } + } + + private async postJson(url: string, body: unknown): Promise { + const config: AxiosRequestConfig = { + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${this.apiKey}`, + }, + timeout: 10_000, + }; + + const started = Date.now(); + try { + const res = await firstValueFrom(this.http.post(url, body, config)); + this.logger.debug(`Card Gateway POST ${url} status=${res.status} latency=${Date.now() - started}ms`); + return res.data; + } catch (err) { + if (err instanceof AxiosError) { + this.logger.error( + `Card Gateway POST ${url} failed: status=${err.response?.status} body=${JSON.stringify(err.response?.data)}`, + ); + } else { + this.logger.error(`Card Gateway POST ${url} threw: ${err instanceof Error ? err.message : err}`); + } + throw err; + } + } + + private async getJson(url: string): Promise { + const config: AxiosRequestConfig = { + headers: { + 'Authorization': `Bearer ${this.apiKey}`, + }, + timeout: 10_000, + }; + + const started = Date.now(); + try { + const res = await firstValueFrom(this.http.get(url, config)); + this.logger.debug(`Card Gateway GET ${url} status=${res.status} latency=${Date.now() - started}ms`); + return res.data; + } catch (err) { + if (err instanceof AxiosError) { + this.logger.error( + `Card Gateway GET ${url} failed: status=${err.response?.status} body=${JSON.stringify(err.response?.data)}`, + ); + } else { + this.logger.error(`Card Gateway GET ${url} threw: ${err instanceof Error ? err.message : err}`); + } + throw err; + } + } + + private get baseUrl(): string { + return this.config.get('card.baseUrl') ?? ''; + } + private get apiKey(): string { + return this.config.get('card.apiKey') ?? ''; + } + private get webhookSecret(): string { + return this.config.get('card.webhookSecret') ?? ''; + } + private get webhookUrl(): string { + return this.config.get('card.webhookUrl') ?? ''; + } + private get returnUrl(): string { + return this.config.get('card.returnUrl') ?? ''; + } +} diff --git a/apps/edr-passenger-api/src/modules/payments/providers/cbe-birr.provider.ts b/apps/edr-passenger-api/src/modules/payments/providers/cbe-birr.provider.ts new file mode 100644 index 000000000..9f94a235a --- /dev/null +++ b/apps/edr-passenger-api/src/modules/payments/providers/cbe-birr.provider.ts @@ -0,0 +1,215 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { HttpService } from '@nestjs/axios'; +import { PaymentIntentStatus, PaymentMethodType } from '@prisma/client'; +import { AxiosError, AxiosRequestConfig } from 'axios'; +import { firstValueFrom } from 'rxjs'; +import * as crypto from 'node:crypto'; +import { + PaymentProvider, + ProviderInitiationInput, + ProviderInitiationResult, + ProviderStatus, +} from '../payments.types'; + +interface CbeBirrInitiateRequest { + merchantId: string; + merchantOrderId: string; + amount: string; + currency: string; + description: string; + returnUrl: string; + notifyUrl: string; + timestamp: string; + signature: string; +} + +interface CbeBirrInitiateResponse { + success: boolean; + orderId: string; + paymentUrl: string; + expiresIn: number; +} + +interface CbeBirrQueryResponse { + success: boolean; + orderId: string; + status: string; + transactionId?: string; + amount?: string; + paidAt?: string; +} + +@Injectable() +export class CbeBirrProvider implements PaymentProvider { + readonly method = PaymentMethodType.CBE_BIRR; + private readonly logger = new Logger(CbeBirrProvider.name); + + constructor( + private readonly config: ConfigService, + private readonly http: HttpService, + ) {} + + async initiate(input: ProviderInitiationInput): Promise { + const amount = (input.amountMinor / 100).toFixed(2); + const timestamp = new Date().toISOString(); + + const requestBody: CbeBirrInitiateRequest = { + merchantId: this.merchantId, + merchantOrderId: input.merchantOrderId, + amount, + currency: input.currency, + description: `EDR Booking ${input.bookingRef}`, + returnUrl: this.returnUrl, + notifyUrl: this.notifyUrl, + timestamp, + signature: this.signRequest({ + merchantId: this.merchantId, + merchantOrderId: input.merchantOrderId, + amount, + timestamp, + }), + }; + + const response = await this.postJson( + `${this.baseUrl}/api/v1/payment/initiate`, + requestBody, + ); + + if (!response.success || !response.orderId) { + throw new Error(`CBE Birr initiate failed: ${JSON.stringify(response)}`); + } + + const expiresAt = new Date(Date.now() + response.expiresIn * 1000); + + return { + providerOrderId: response.orderId, + clientAction: { type: 'REDIRECT', url: response.paymentUrl }, + expiresAt, + rawInitiation: { + request: this.sanitize(requestBody), + response, + }, + }; + } + + async queryStatus(merchantOrderId: string): Promise { + const timestamp = new Date().toISOString(); + const signature = this.signRequest({ + merchantId: this.merchantId, + merchantOrderId, + timestamp, + }); + + const response = await this.postJson( + `${this.baseUrl}/api/v1/payment/query`, + { + merchantId: this.merchantId, + merchantOrderId, + timestamp, + signature, + }, + ); + + const mapped = this.mapStatus(response.status); + + return { + status: mapped, + providerTxnId: response.transactionId, + failureCode: mapped === PaymentIntentStatus.FAILED ? response.status : undefined, + rawResponse: response as unknown as Record, + }; + } + + verifyWebhookSignature(payload: Record): boolean { + const { signature, ...data } = payload; + if (!signature || typeof signature !== 'string') return false; + + const expectedSignature = this.signRequest(data); + return crypto.timingSafeEqual( + Buffer.from(signature), + Buffer.from(expectedSignature), + ); + } + + mapWebhookStatus(status: string): PaymentIntentStatus { + return this.mapStatus(status); + } + + private mapStatus(status: string): PaymentIntentStatus { + switch (status?.toUpperCase()) { + case 'SUCCESS': + case 'COMPLETED': + return PaymentIntentStatus.SUCCEEDED; + case 'FAILED': + case 'REJECTED': + case 'EXPIRED': + return PaymentIntentStatus.FAILED; + case 'PENDING': + return PaymentIntentStatus.REQUIRES_ACTION; + case 'PROCESSING': + return PaymentIntentStatus.PROCESSING; + default: + return PaymentIntentStatus.PROCESSING; + } + } + + private signRequest(data: Record): string { + const sortedKeys = Object.keys(data).sort(); + const signString = sortedKeys + .map((key) => `${key}=${data[key]}`) + .join('&'); + + return crypto + .createHmac('sha256', this.secretKey) + .update(signString) + .digest('hex'); + } + + private async postJson(url: string, body: unknown): Promise { + const config: AxiosRequestConfig = { + headers: { + 'Content-Type': 'application/json', + 'X-Merchant-Id': this.merchantId, + }, + timeout: 10_000, + }; + + const started = Date.now(); + try { + const res = await firstValueFrom(this.http.post(url, body, config)); + this.logger.debug(`CBE Birr POST ${url} status=${res.status} latency=${Date.now() - started}ms`); + return res.data; + } catch (err) { + if (err instanceof AxiosError) { + this.logger.error( + `CBE Birr POST ${url} failed: status=${err.response?.status} body=${JSON.stringify(err.response?.data)}`, + ); + } else { + this.logger.error(`CBE Birr POST ${url} threw: ${err instanceof Error ? err.message : err}`); + } + throw err; + } + } + + private sanitize(body: CbeBirrInitiateRequest): Record { + const { signature: _signature, ...rest } = body; + return rest; + } + + private get baseUrl(): string { + return this.config.get('cbe.baseUrl') ?? ''; + } + private get merchantId(): string { + return this.config.get('cbe.merchantId') ?? ''; + } + private get secretKey(): string { + return this.config.get('cbe.secretKey') ?? ''; + } + private get notifyUrl(): string { + return this.config.get('cbe.notifyUrl') ?? ''; + } + private get returnUrl(): string { + return this.config.get('cbe.returnUrl') ?? ''; + } +} diff --git a/apps/edr-passenger-api/src/modules/payments/providers/ebirr.provider.ts b/apps/edr-passenger-api/src/modules/payments/providers/ebirr.provider.ts new file mode 100644 index 000000000..701d4b5fb --- /dev/null +++ b/apps/edr-passenger-api/src/modules/payments/providers/ebirr.provider.ts @@ -0,0 +1,228 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { HttpService } from '@nestjs/axios'; +import { PaymentIntentStatus, PaymentMethodType } from '@prisma/client'; +import { AxiosError, AxiosRequestConfig } from 'axios'; +import { firstValueFrom } from 'rxjs'; +import * as crypto from 'node:crypto'; +import { + PaymentProvider, + ProviderInitiationInput, + ProviderInitiationResult, + ProviderStatus, +} from '../payments.types'; + +interface EBirrInitiateRequest { + merchantCode: string; + orderNo: string; + amount: number; + currency: string; + subject: string; + body: string; + notifyUrl: string; + returnUrl: string; + timestamp: number; + sign: string; +} + +interface EBirrInitiateResponse { + code: string; + message: string; + data?: { + orderNo: string; + payUrl: string; + expireTime: number; + }; +} + +interface EBirrQueryResponse { + code: string; + message: string; + data?: { + orderNo: string; + tradeStatus: string; + tradeNo?: string; + totalAmount?: number; + payTime?: number; + }; +} + +@Injectable() +export class EBirrProvider implements PaymentProvider { + readonly method = PaymentMethodType.EBIRR; + private readonly logger = new Logger(EBirrProvider.name); + + constructor( + private readonly config: ConfigService, + private readonly http: HttpService, + ) {} + + async initiate(input: ProviderInitiationInput): Promise { + const amount = input.amountMinor / 100; + const timestamp = Date.now(); + + const requestBody: EBirrInitiateRequest = { + merchantCode: this.merchantCode, + orderNo: input.merchantOrderId, + amount, + currency: input.currency, + subject: `EDR Ticket`, + body: `Train booking ${input.bookingRef}`, + notifyUrl: this.notifyUrl, + returnUrl: this.returnUrl, + timestamp, + sign: this.signRequest({ + merchantCode: this.merchantCode, + orderNo: input.merchantOrderId, + amount, + timestamp, + }), + }; + + const response = await this.postJson( + `${this.baseUrl}/gateway/api/pay/create`, + requestBody, + ); + + if (response.code !== '0000' || !response.data?.orderNo) { + throw new Error(`eBirr initiate failed: ${response.message}`); + } + + const expiresAt = new Date(response.data.expireTime); + + return { + providerOrderId: response.data.orderNo, + clientAction: { type: 'REDIRECT', url: response.data.payUrl }, + expiresAt, + rawInitiation: { + request: this.sanitize(requestBody), + response, + }, + }; + } + + async queryStatus(merchantOrderId: string): Promise { + const timestamp = Date.now(); + const requestBody = { + merchantCode: this.merchantCode, + orderNo: merchantOrderId, + timestamp, + sign: this.signRequest({ + merchantCode: this.merchantCode, + orderNo: merchantOrderId, + timestamp, + }), + }; + + const response = await this.postJson( + `${this.baseUrl}/gateway/api/pay/query`, + requestBody, + ); + + if (response.code !== '0000' || !response.data) { + throw new Error(`eBirr query failed: ${response.message}`); + } + + const mapped = this.mapStatus(response.data.tradeStatus); + + return { + status: mapped, + providerTxnId: response.data.tradeNo, + failureCode: mapped === PaymentIntentStatus.FAILED ? response.data.tradeStatus : undefined, + rawResponse: response as unknown as Record, + }; + } + + verifyWebhookSignature(payload: Record): boolean { + const { sign, ...data } = payload; + if (!sign || typeof sign !== 'string') return false; + + const expectedSign = this.signRequest(data); + return crypto.timingSafeEqual( + Buffer.from(sign), + Buffer.from(expectedSign), + ); + } + + mapWebhookStatus(tradeStatus: string): PaymentIntentStatus { + return this.mapStatus(tradeStatus); + } + + private mapStatus(tradeStatus: string): PaymentIntentStatus { + switch (tradeStatus?.toUpperCase()) { + case 'TRADE_SUCCESS': + case 'SUCCESS': + return PaymentIntentStatus.SUCCEEDED; + case 'TRADE_CLOSED': + case 'TRADE_FAILED': + case 'FAILED': + return PaymentIntentStatus.FAILED; + case 'WAIT_BUYER_PAY': + case 'PENDING': + return PaymentIntentStatus.REQUIRES_ACTION; + case 'PROCESSING': + return PaymentIntentStatus.PROCESSING; + default: + return PaymentIntentStatus.PROCESSING; + } + } + + private signRequest(data: Record): string { + const sortedKeys = Object.keys(data).sort(); + const signString = sortedKeys + .map((key) => `${key}=${data[key]}`) + .join('&') + `&key=${this.secretKey}`; + + return crypto + .createHash('md5') + .update(signString) + .digest('hex') + .toUpperCase(); + } + + private async postJson(url: string, body: unknown): Promise { + const config: AxiosRequestConfig = { + headers: { + 'Content-Type': 'application/json', + }, + timeout: 10_000, + }; + + const started = Date.now(); + try { + const res = await firstValueFrom(this.http.post(url, body, config)); + this.logger.debug(`eBirr POST ${url} status=${res.status} latency=${Date.now() - started}ms`); + return res.data; + } catch (err) { + if (err instanceof AxiosError) { + this.logger.error( + `eBirr POST ${url} failed: status=${err.response?.status} body=${JSON.stringify(err.response?.data)}`, + ); + } else { + this.logger.error(`eBirr POST ${url} threw: ${err instanceof Error ? err.message : err}`); + } + throw err; + } + } + + private sanitize(body: EBirrInitiateRequest): Record { + const { sign: _sign, ...rest } = body; + return rest; + } + + private get baseUrl(): string { + return this.config.get('ebirr.baseUrl') ?? ''; + } + private get merchantCode(): string { + return this.config.get('ebirr.merchantCode') ?? ''; + } + private get secretKey(): string { + return this.config.get('ebirr.secretKey') ?? ''; + } + private get notifyUrl(): string { + return this.config.get('ebirr.notifyUrl') ?? ''; + } + private get returnUrl(): string { + return this.config.get('ebirr.returnUrl') ?? ''; + } +} diff --git a/apps/edr-passenger-api/src/modules/payments/webhooks/card-webhook.service.ts b/apps/edr-passenger-api/src/modules/payments/webhooks/card-webhook.service.ts new file mode 100644 index 000000000..5612ac77d --- /dev/null +++ b/apps/edr-passenger-api/src/modules/payments/webhooks/card-webhook.service.ts @@ -0,0 +1,147 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { Prisma, PaymentIntentStatus, PaymentMethodType } from '@prisma/client'; +import { PrismaService } from '../../../common/prisma.service'; +import { PaymentsService } from '../payments.service'; +import { CardProvider } from '../providers/card.provider'; + +export interface CardWebhookPayload { + id: string; + type: string; + data: { + object: { + id: string; + status: string; + amount: number; + currency: string; + metadata: { + merchantOrderId: string; + bookingRef: string; + }; + transaction_id?: string; + paid_at?: number; + failure_code?: string; + failure_message?: string; + }; + }; + created: number; +} + +@Injectable() +export class CardWebhookService { + private readonly logger = new Logger(CardWebhookService.name); + + constructor( + private readonly prisma: PrismaService, + private readonly provider: CardProvider, + private readonly payments: PaymentsService, + ) {} + + async handle(payload: CardWebhookPayload, signature: string): Promise { + const merchantOrderId = payload.data.object.metadata.merchantOrderId; + const externalEventId = `${payload.id}_${payload.type}`; + const signatureValid = this.provider.verifyWebhookSignature( + payload as unknown as Record, + signature, + ); + + const eventRow = await this.persistEvent({ + externalEventId, + merchantOrderId, + providerTxnId: payload.data.object.transaction_id, + signatureValid, + status: payload.data.object.status, + payload, + }); + + if (!eventRow) { + this.logger.log(`Card webhook duplicate: ${externalEventId} β€” short-circuit OK`); + return; + } + + if (!signatureValid) { + this.logger.warn(`Card webhook signature invalid for merchantOrderId=${merchantOrderId}`); + await this.markProcessed(eventRow.id, 'signature-invalid'); + return; + } + + const intent = await this.prisma.paymentIntent.findUnique({ + where: { merchantOrderId }, + }); + if (!intent) { + this.logger.warn(`Card webhook: no PaymentIntent for merchantOrderId=${merchantOrderId}`); + await this.markProcessed(eventRow.id, 'intent-not-found'); + return; + } + + const mapped = this.provider.mapWebhookStatus(payload.data.object.status); + + try { + if (mapped === PaymentIntentStatus.SUCCEEDED) { + await this.payments.finalizePaymentSuccess({ + intentId: intent.id, + providerTxnId: payload.data.object.transaction_id, + paidAt: payload.data.object.paid_at ? new Date(payload.data.object.paid_at * 1000) : undefined, + }); + } else if (mapped === PaymentIntentStatus.FAILED) { + await this.payments.markPaymentFailed({ + intentId: intent.id, + failureCode: payload.data.object.failure_code, + failureMessage: payload.data.object.failure_message, + }); + } else { + await this.prisma.paymentIntent.update({ + where: { id: intent.id }, + data: { + status: mapped, + providerTxnId: payload.data.object.transaction_id ?? undefined, + }, + }); + } + await this.markProcessed(eventRow.id); + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + this.logger.error(`Card webhook processing failed for ${merchantOrderId}: ${message}`); + await this.markProcessed(eventRow.id, `processing-error: ${message}`); + throw err; + } + } + + private async persistEvent(input: { + externalEventId: string; + merchantOrderId: string; + providerTxnId?: string; + signatureValid: boolean; + status: string; + payload: CardWebhookPayload; + }): Promise<{ id: string } | null> { + try { + return await this.prisma.paymentWebhookEvent.create({ + data: { + provider: PaymentMethodType.CARD, + externalEventId: input.externalEventId, + merchantOrderId: input.merchantOrderId, + providerTxnId: input.providerTxnId, + signatureValid: input.signatureValid, + status: input.status, + payload: input.payload as unknown as Prisma.InputJsonValue, + }, + select: { id: true }, + }); + } catch (err) { + if ( + err instanceof Prisma.PrismaClientKnownRequestError && + err.code === 'P2002' + ) { + return null; + } + throw err; + } + } + + private async markProcessed(eventId: string, processingError?: string): Promise { + await this.prisma.paymentWebhookEvent.update({ + where: { id: eventId }, + data: { processedAt: new Date(), processingError }, + }); + } +} diff --git a/apps/edr-passenger-api/src/modules/payments/webhooks/cbe-birr-webhook.service.ts b/apps/edr-passenger-api/src/modules/payments/webhooks/cbe-birr-webhook.service.ts new file mode 100644 index 000000000..2c34e85f6 --- /dev/null +++ b/apps/edr-passenger-api/src/modules/payments/webhooks/cbe-birr-webhook.service.ts @@ -0,0 +1,133 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { Prisma, PaymentIntentStatus, PaymentMethodType } from '@prisma/client'; +import { PrismaService } from '../../../common/prisma.service'; +import { PaymentsService } from '../payments.service'; +import { CbeBirrProvider } from '../providers/cbe-birr.provider'; + +export interface CbeBirrWebhookPayload { + merchantId: string; + merchantOrderId: string; + orderId: string; + status: string; + transactionId?: string; + amount?: string; + currency?: string; + paidAt?: string; + signature: string; + [key: string]: unknown; +} + +@Injectable() +export class CbeBirrWebhookService { + private readonly logger = new Logger(CbeBirrWebhookService.name); + + constructor( + private readonly prisma: PrismaService, + private readonly provider: CbeBirrProvider, + private readonly payments: PaymentsService, + ) {} + + async handle(payload: CbeBirrWebhookPayload): Promise { + const merchantOrderId = payload.merchantOrderId; + const externalEventId = `${payload.orderId}_${payload.status}`; + const signatureValid = this.provider.verifyWebhookSignature( + payload as unknown as Record, + ); + + const eventRow = await this.persistEvent({ + externalEventId, + merchantOrderId, + providerTxnId: payload.transactionId ?? payload.orderId, + signatureValid, + status: payload.status, + payload, + }); + + if (!eventRow) { + this.logger.log(`CBE Birr webhook duplicate: ${externalEventId} β€” short-circuit OK`); + return; + } + + if (!signatureValid) { + this.logger.warn(`CBE Birr webhook signature invalid for merchantOrderId=${merchantOrderId}`); + await this.markProcessed(eventRow.id, 'signature-invalid'); + return; + } + + const intent = await this.prisma.paymentIntent.findUnique({ + where: { merchantOrderId }, + }); + if (!intent) { + this.logger.warn(`CBE Birr webhook: no PaymentIntent for merchantOrderId=${merchantOrderId}`); + await this.markProcessed(eventRow.id, 'intent-not-found'); + return; + } + + const mapped = this.provider.mapWebhookStatus(payload.status); + + try { + if (mapped === PaymentIntentStatus.SUCCEEDED) { + await this.payments.finalizePaymentSuccess({ + intentId: intent.id, + providerTxnId: payload.transactionId ?? payload.orderId, + paidAt: payload.paidAt ? new Date(payload.paidAt) : undefined, + }); + } else if (mapped === PaymentIntentStatus.FAILED) { + await this.payments.markPaymentFailed({ + intentId: intent.id, + failureCode: payload.status, + }); + } else { + await this.prisma.paymentIntent.update({ + where: { id: intent.id }, + data: { status: mapped, providerTxnId: payload.transactionId ?? undefined }, + }); + } + await this.markProcessed(eventRow.id); + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + this.logger.error(`CBE Birr webhook processing failed for ${merchantOrderId}: ${message}`); + await this.markProcessed(eventRow.id, `processing-error: ${message}`); + throw err; + } + } + + private async persistEvent(input: { + externalEventId: string; + merchantOrderId: string; + providerTxnId?: string; + signatureValid: boolean; + status: string; + payload: CbeBirrWebhookPayload; + }): Promise<{ id: string } | null> { + try { + return await this.prisma.paymentWebhookEvent.create({ + data: { + provider: PaymentMethodType.CBE_BIRR, + externalEventId: input.externalEventId, + merchantOrderId: input.merchantOrderId, + providerTxnId: input.providerTxnId, + signatureValid: input.signatureValid, + status: input.status, + payload: input.payload as unknown as Prisma.InputJsonValue, + }, + select: { id: true }, + }); + } catch (err) { + if ( + err instanceof Prisma.PrismaClientKnownRequestError && + err.code === 'P2002' + ) { + return null; + } + throw err; + } + } + + private async markProcessed(eventId: string, processingError?: string): Promise { + await this.prisma.paymentWebhookEvent.update({ + where: { id: eventId }, + data: { processedAt: new Date(), processingError }, + }); + } +} diff --git a/apps/edr-passenger-api/src/modules/payments/webhooks/ebirr-webhook.service.ts b/apps/edr-passenger-api/src/modules/payments/webhooks/ebirr-webhook.service.ts new file mode 100644 index 000000000..700078b79 --- /dev/null +++ b/apps/edr-passenger-api/src/modules/payments/webhooks/ebirr-webhook.service.ts @@ -0,0 +1,133 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { Prisma, PaymentIntentStatus, PaymentMethodType } from '@prisma/client'; +import { PrismaService } from '../../../common/prisma.service'; +import { PaymentsService } from '../payments.service'; +import { EBirrProvider } from '../providers/ebirr.provider'; + +export interface EBirrWebhookPayload { + merchantCode: string; + orderNo: string; + tradeStatus: string; + tradeNo?: string; + totalAmount?: number; + currency?: string; + payTime?: number; + timestamp: number; + sign: string; + [key: string]: unknown; +} + +@Injectable() +export class EBirrWebhookService { + private readonly logger = new Logger(EBirrWebhookService.name); + + constructor( + private readonly prisma: PrismaService, + private readonly provider: EBirrProvider, + private readonly payments: PaymentsService, + ) {} + + async handle(payload: EBirrWebhookPayload): Promise { + const merchantOrderId = payload.orderNo; + const externalEventId = `${payload.orderNo}_${payload.tradeStatus}_${payload.timestamp}`; + const signatureValid = this.provider.verifyWebhookSignature( + payload as unknown as Record, + ); + + const eventRow = await this.persistEvent({ + externalEventId, + merchantOrderId, + providerTxnId: payload.tradeNo, + signatureValid, + status: payload.tradeStatus, + payload, + }); + + if (!eventRow) { + this.logger.log(`eBirr webhook duplicate: ${externalEventId} β€” short-circuit OK`); + return; + } + + if (!signatureValid) { + this.logger.warn(`eBirr webhook signature invalid for orderNo=${merchantOrderId}`); + await this.markProcessed(eventRow.id, 'signature-invalid'); + return; + } + + const intent = await this.prisma.paymentIntent.findUnique({ + where: { merchantOrderId }, + }); + if (!intent) { + this.logger.warn(`eBirr webhook: no PaymentIntent for orderNo=${merchantOrderId}`); + await this.markProcessed(eventRow.id, 'intent-not-found'); + return; + } + + const mapped = this.provider.mapWebhookStatus(payload.tradeStatus); + + try { + if (mapped === PaymentIntentStatus.SUCCEEDED) { + await this.payments.finalizePaymentSuccess({ + intentId: intent.id, + providerTxnId: payload.tradeNo, + paidAt: payload.payTime ? new Date(payload.payTime) : undefined, + }); + } else if (mapped === PaymentIntentStatus.FAILED) { + await this.payments.markPaymentFailed({ + intentId: intent.id, + failureCode: payload.tradeStatus, + }); + } else { + await this.prisma.paymentIntent.update({ + where: { id: intent.id }, + data: { status: mapped, providerTxnId: payload.tradeNo ?? undefined }, + }); + } + await this.markProcessed(eventRow.id); + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + this.logger.error(`eBirr webhook processing failed for ${merchantOrderId}: ${message}`); + await this.markProcessed(eventRow.id, `processing-error: ${message}`); + throw err; + } + } + + private async persistEvent(input: { + externalEventId: string; + merchantOrderId: string; + providerTxnId?: string; + signatureValid: boolean; + status: string; + payload: EBirrWebhookPayload; + }): Promise<{ id: string } | null> { + try { + return await this.prisma.paymentWebhookEvent.create({ + data: { + provider: PaymentMethodType.EBIRR, + externalEventId: input.externalEventId, + merchantOrderId: input.merchantOrderId, + providerTxnId: input.providerTxnId, + signatureValid: input.signatureValid, + status: input.status, + payload: input.payload as unknown as Prisma.InputJsonValue, + }, + select: { id: true }, + }); + } catch (err) { + if ( + err instanceof Prisma.PrismaClientKnownRequestError && + err.code === 'P2002' + ) { + return null; + } + throw err; + } + } + + private async markProcessed(eventId: string, processingError?: string): Promise { + await this.prisma.paymentWebhookEvent.update({ + where: { id: eventId }, + data: { processedAt: new Date(), processingError }, + }); + } +} diff --git a/apps/edr-passenger-api/src/modules/payments/webhooks/webhooks.controller.ts b/apps/edr-passenger-api/src/modules/payments/webhooks/webhooks.controller.ts index 3d5e0a3a0..4edbe58a8 100644 --- a/apps/edr-passenger-api/src/modules/payments/webhooks/webhooks.controller.ts +++ b/apps/edr-passenger-api/src/modules/payments/webhooks/webhooks.controller.ts @@ -1,16 +1,33 @@ -import { Body, Controller, HttpCode, HttpStatus, Logger, Post } from '@nestjs/common'; +import { Body, Controller, Headers, HttpCode, HttpStatus, Logger, Post } from '@nestjs/common'; import { ApiOperation, ApiTags } from '@nestjs/swagger'; import { TelebirrWebhookPayload, TelebirrWebhookService, } from './telebirr-webhook.service'; +import { + CbeBirrWebhookPayload, + CbeBirrWebhookService, +} from './cbe-birr-webhook.service'; +import { + EBirrWebhookPayload, + EBirrWebhookService, +} from './ebirr-webhook.service'; +import { + CardWebhookPayload, + CardWebhookService, +} from './card-webhook.service'; @ApiTags('Payment Webhooks') @Controller('payments/webhooks') export class WebhooksController { private readonly logger = new Logger(WebhooksController.name); - constructor(private readonly telebirr: TelebirrWebhookService) {} + constructor( + private readonly telebirr: TelebirrWebhookService, + private readonly cbeBirr: CbeBirrWebhookService, + private readonly eBirr: EBirrWebhookService, + private readonly card: CardWebhookService, + ) {} @Post('telebirr') @HttpCode(HttpStatus.OK) @@ -24,4 +41,46 @@ export class WebhooksController { } return { code: '0', message: 'OK' }; } + + @Post('cbe-birr') + @HttpCode(HttpStatus.OK) + @ApiOperation({ summary: 'CBE Birr payment notification callback' }) + async receiveCbeBirr(@Body() payload: CbeBirrWebhookPayload) { + try { + await this.cbeBirr.handle(payload); + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + this.logger.error(`CBE Birr webhook handler threw: ${message}`); + } + return { success: true }; + } + + @Post('ebirr') + @HttpCode(HttpStatus.OK) + @ApiOperation({ summary: 'eBirr payment notification callback' }) + async receiveEBirr(@Body() payload: EBirrWebhookPayload) { + try { + await this.eBirr.handle(payload); + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + this.logger.error(`eBirr webhook handler threw: ${message}`); + } + return { code: '0000', message: 'success' }; + } + + @Post('card') + @HttpCode(HttpStatus.OK) + @ApiOperation({ summary: 'Card payment notification callback' }) + async receiveCard( + @Body() payload: CardWebhookPayload, + @Headers('stripe-signature') signature: string, + ) { + try { + await this.card.handle(payload, signature); + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + this.logger.error(`Card webhook handler threw: ${message}`); + } + return { received: true }; + } } diff --git a/apps/edr-passenger-api/src/modules/reports/reports.controller.ts b/apps/edr-passenger-api/src/modules/reports/reports.controller.ts new file mode 100644 index 000000000..772a1428c --- /dev/null +++ b/apps/edr-passenger-api/src/modules/reports/reports.controller.ts @@ -0,0 +1,35 @@ +import { Body, Controller, Get, Param, Post, Query, UseGuards } from '@nestjs/common'; +import { ApiTags, ApiOperation, ApiBearerAuth } from '@nestjs/swagger'; +import { ReportsService } from './reports.service'; +import { GenerateReportDto } from './reports.dto'; +import { IamGuard, IamRoles } from '../../common/iam-adapter'; +import { UserRole } from '@prisma/client'; + +@ApiTags('Reports') +@Controller('reports') +@UseGuards(IamGuard) +@ApiBearerAuth('IAM-auth') +export class ReportsController { + constructor(private service: ReportsService) {} + + @Post('generate') + @IamRoles('ADMIN', 'SUPERVISOR') + @ApiOperation({ summary: 'Generate operational report' }) + generateReport(@Body() dto: GenerateReportDto) { + return this.service.generateReport(dto); + } + + @Get(':reportId') + @IamRoles('ADMIN', 'SUPERVISOR') + @ApiOperation({ summary: 'Get report by ID' }) + getReport(@Param('reportId') reportId: string) { + return this.service.getReport(reportId); + } + + @Get() + @IamRoles('ADMIN', 'SUPERVISOR') + @ApiOperation({ summary: 'List reports' }) + listReports(@Query('type') type?: string) { + return this.service.listReports(type); + } +} diff --git a/apps/edr-passenger-api/src/modules/reports/reports.dto.ts b/apps/edr-passenger-api/src/modules/reports/reports.dto.ts new file mode 100644 index 000000000..5fdb856ec --- /dev/null +++ b/apps/edr-passenger-api/src/modules/reports/reports.dto.ts @@ -0,0 +1,29 @@ +import { IsString, IsDateString, IsOptional, IsEnum } from 'class-validator'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export enum ReportType { + REVENUE = 'REVENUE', + OCCUPANCY = 'OCCUPANCY', + AGENT_SALES = 'AGENT_SALES', + CANCELLATIONS = 'CANCELLATIONS', + PAYMENT_METHODS = 'PAYMENT_METHODS' +} + +export enum ExportFormat { + JSON = 'JSON', + CSV = 'CSV', + PDF = 'PDF' +} + +export class GenerateReportDto { + @ApiProperty({ enum: ReportType }) @IsEnum(ReportType) reportType: ReportType; + @ApiProperty({ example: '2026-01-01' }) @IsDateString() dateFrom: string; + @ApiProperty({ example: '2026-01-31' }) @IsDateString() dateTo: string; + @ApiPropertyOptional() @IsOptional() @IsString() routeId?: string; + @ApiPropertyOptional() @IsOptional() @IsString() agentId?: string; +} + +export class ExportReportDto { + @ApiProperty() @IsString() reportId: string; + @ApiProperty({ enum: ExportFormat }) @IsEnum(ExportFormat) format: ExportFormat; +} diff --git a/apps/edr-passenger-api/src/modules/reports/reports.module.ts b/apps/edr-passenger-api/src/modules/reports/reports.module.ts new file mode 100644 index 000000000..801120cbf --- /dev/null +++ b/apps/edr-passenger-api/src/modules/reports/reports.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { HttpModule } from '@nestjs/axios'; +import { ReportsController } from './reports.controller'; +import { ReportsService } from './reports.service'; + +@Module({ + imports: [HttpModule], + controllers: [ReportsController], + providers: [ReportsService], + exports: [ReportsService] +}) +export class ReportsModule {} diff --git a/apps/edr-passenger-api/src/modules/reports/reports.service.ts b/apps/edr-passenger-api/src/modules/reports/reports.service.ts new file mode 100644 index 000000000..0d2699a99 --- /dev/null +++ b/apps/edr-passenger-api/src/modules/reports/reports.service.ts @@ -0,0 +1,185 @@ +import { Injectable } from '@nestjs/common'; +import { PrismaService } from '../../common/prisma.service'; +import { GenerateReportDto, ReportType } from './reports.dto'; + +@Injectable() +export class ReportsService { + constructor(private prisma: PrismaService) {} + + async generateReport(dto: GenerateReportDto) { + const dateFrom = new Date(dto.dateFrom); + const dateTo = new Date(dto.dateTo); + + let data: any; + switch (dto.reportType) { + case ReportType.REVENUE: + data = await this.generateRevenueReport(dateFrom, dateTo); + break; + case ReportType.OCCUPANCY: + data = await this.generateOccupancyReport(dateFrom, dateTo); + break; + case ReportType.AGENT_SALES: + data = await this.generateAgentSalesReport(dateFrom, dateTo, dto.agentId); + break; + case ReportType.CANCELLATIONS: + data = await this.generateCancellationsReport(dateFrom, dateTo); + break; + case ReportType.PAYMENT_METHODS: + data = await this.generatePaymentMethodsReport(dateFrom, dateTo); + break; + default: + data = {}; + } + + const report = await this.prisma.operationalReport.create({ + data: { + reportType: dto.reportType, + dateFrom, + dateTo, + data + } + }); + + return { reportId: report.id, reportType: dto.reportType, data }; + } + + private async generateRevenueReport(dateFrom: Date, dateTo: Date) { + const bookings = await this.prisma.booking.findMany({ + where: { + createdAt: { gte: dateFrom, lte: dateTo }, + status: { in: ['CONFIRMED', 'COMPLETED'] } + }, + include: { paymentIntent: true } + }); + + const totalRevenue = bookings.reduce((sum, b) => sum + b.totalMinor, 0); + const byPaymentMethod = bookings.reduce((acc, b) => { + const method = b.paymentIntent?.method ?? 'UNKNOWN'; + acc[method] = (acc[method] || 0) + b.totalMinor; + return acc; + }, {} as Record); + + return { + totalBookings: bookings.length, + totalRevenueMinor: totalRevenue, + totalRevenue: totalRevenue / 100, + currency: 'ETB', + byPaymentMethod + }; + } + + private async generateOccupancyReport(dateFrom: Date, dateTo: Date) { + const trips = await this.prisma.trip.findMany({ + where: { departureAt: { gte: dateFrom, lte: dateTo } }, + include: { + coaches: { include: { seats: true } }, + bookings: { where: { status: { in: ['CONFIRMED', 'COMPLETED'] } }, include: { seats: true } } + } + }); + + const tripData = trips.map(trip => { + const totalSeats = trip.coaches.reduce((sum, c) => sum + c.seats.length, 0); + const bookedSeats = trip.bookings.reduce((sum, b) => sum + b.seats.length, 0); + const occupancyRate = totalSeats > 0 ? (bookedSeats / totalSeats) * 100 : 0; + + return { + tripId: trip.id, + departureAt: trip.departureAt, + totalSeats, + bookedSeats, + occupancyRate: +occupancyRate.toFixed(2) + }; + }); + + const avgOccupancy = tripData.length > 0 + ? tripData.reduce((sum, t) => sum + t.occupancyRate, 0) / tripData.length + : 0; + + return { + totalTrips: trips.length, + averageOccupancyRate: +avgOccupancy.toFixed(2), + trips: tripData + }; + } + + private async generateAgentSalesReport(dateFrom: Date, dateTo: Date, agentId?: string) { + const agentBookings = await this.prisma.agentBooking.findMany({ + where: { + createdAt: { gte: dateFrom, lte: dateTo }, + ...(agentId ? { agentId } : {}) + }, + include: { + agent: { include: { user: true } }, + booking: true + } + }); + + const byAgent = agentBookings.reduce((acc, ab) => { + const agentName = ab.agent.user.fullName; + if (!acc[agentName]) { + acc[agentName] = { bookings: 0, revenueMinor: 0, cashCollected: 0 }; + } + acc[agentName].bookings += 1; + acc[agentName].revenueMinor += ab.booking.totalMinor; + acc[agentName].cashCollected += ab.cashReceived ?? 0; + return acc; + }, {} as Record); + + return { + totalAgentBookings: agentBookings.length, + byAgent + }; + } + + private async generateCancellationsReport(dateFrom: Date, dateTo: Date) { + const cancellations = await this.prisma.bookingCancellation.findMany({ + where: { createdAt: { gte: dateFrom, lte: dateTo } }, + include: { booking: true } + }); + + const totalRefunded = cancellations.reduce((sum, c) => sum + c.refundAmount, 0); + + return { + totalCancellations: cancellations.length, + totalRefundedMinor: totalRefunded, + totalRefunded: totalRefunded / 100, + currency: 'ETB' + }; + } + + private async generatePaymentMethodsReport(dateFrom: Date, dateTo: Date) { + const payments = await this.prisma.paymentIntent.findMany({ + where: { + createdAt: { gte: dateFrom, lte: dateTo }, + status: 'SUCCEEDED' + } + }); + + const byMethod = payments.reduce((acc, p) => { + const method = p.method; + if (!acc[method]) { + acc[method] = { count: 0, totalMinor: 0 }; + } + acc[method].count += 1; + acc[method].totalMinor += p.amountMinor; + return acc; + }, {} as Record); + + return { + totalPayments: payments.length, + byMethod + }; + } + + async getReport(reportId: string) { + return this.prisma.operationalReport.findUnique({ where: { id: reportId } }); + } + + async listReports(reportType?: string) { + return this.prisma.operationalReport.findMany({ + where: reportType ? { reportType } : {}, + orderBy: { createdAt: 'desc' }, + take: 50 + }); + } +} diff --git a/apps/edr-passenger-api/src/modules/search/search.dto.ts b/apps/edr-passenger-api/src/modules/search/search.dto.ts index e4e3d2cae..3d8344218 100644 --- a/apps/edr-passenger-api/src/modules/search/search.dto.ts +++ b/apps/edr-passenger-api/src/modules/search/search.dto.ts @@ -11,7 +11,11 @@ export class SearchTripsDto { export class FareQuoteDto { @ApiProperty() @IsString() tripId: string; - @ApiProperty({ example: 'ECONOMY' }) @IsString() serviceClass: string; + @ApiProperty({ + example: 'ECONOMY_REGULAR', + enum: ['ECONOMY_REGULAR', 'ECONOMY_BED_LOWER', 'ECONOMY_BED_MIDDLE', 'ECONOMY_BED_UPPER', 'VIP_BED_LOWER', 'VIP_BED_UPPER'] + }) + @IsString() serviceClass: string; @ApiPropertyOptional({ example: 1 }) @IsOptional() @Type(() => Number) @IsInt() @Min(1) passengerCount?: number; @ApiPropertyOptional({ example: 'WEEKEND15' }) @IsOptional() @IsString() promoCode?: string; @ApiPropertyOptional({ example: 450 }) @IsOptional() @Type(() => Number) @IsInt() loyaltyRedemptionPoints?: number; diff --git a/apps/edr-passenger-api/src/modules/search/search.service.ts b/apps/edr-passenger-api/src/modules/search/search.service.ts index 046bdc70d..bf709b6d8 100644 --- a/apps/edr-passenger-api/src/modules/search/search.service.ts +++ b/apps/edr-passenger-api/src/modules/search/search.service.ts @@ -23,8 +23,22 @@ export class SearchService { origin: { id: trip.originStation.id, code: trip.originStation.code, name: trip.originStation.name, city: trip.originStation.city }, destination: { id: trip.destinationStation.id, code: trip.destinationStation.code, name: trip.destinationStation.name, city: trip.destinationStation.city }, departureAt: trip.departureAt, arrivalAt: trip.arrivalAt, status: trip.status, - availability: { ECONOMY: avail('ECONOMY'), BUSINESS: avail('BUSINESS'), FIRST: avail('FIRST') }, - fares: { ECONOMY: this.defaultFare('ECONOMY') / 100, BUSINESS: this.defaultFare('BUSINESS') / 100, FIRST: this.defaultFare('FIRST') / 100 }, + availability: { + ECONOMY_REGULAR: avail('ECONOMY_REGULAR'), + ECONOMY_BED_LOWER: avail('ECONOMY_BED_LOWER'), + ECONOMY_BED_MIDDLE: avail('ECONOMY_BED_MIDDLE'), + ECONOMY_BED_UPPER: avail('ECONOMY_BED_UPPER'), + VIP_BED_LOWER: avail('VIP_BED_LOWER'), + VIP_BED_UPPER: avail('VIP_BED_UPPER') + }, + fares: { + ECONOMY_REGULAR: this.defaultFare('ECONOMY_REGULAR') / 100, + ECONOMY_BED_LOWER: this.defaultFare('ECONOMY_BED_LOWER') / 100, + ECONOMY_BED_MIDDLE: this.defaultFare('ECONOMY_BED_MIDDLE') / 100, + ECONOMY_BED_UPPER: this.defaultFare('ECONOMY_BED_UPPER') / 100, + VIP_BED_LOWER: this.defaultFare('VIP_BED_LOWER') / 100, + VIP_BED_UPPER: this.defaultFare('VIP_BED_UPPER') / 100 + }, }; }); } @@ -45,6 +59,14 @@ export class SearchService { } private defaultFare(serviceClass: string): number { - return ({ ECONOMY: 45000, BUSINESS: 90000, FIRST: 135000 } as any)[serviceClass] ?? 45000; + const fares: Record = { + ECONOMY_REGULAR: 35000, // 350 ETB + ECONOMY_BED_LOWER: 55000, // 550 ETB + ECONOMY_BED_MIDDLE: 50000, // 500 ETB + ECONOMY_BED_UPPER: 45000, // 450 ETB + VIP_BED_LOWER: 85000, // 850 ETB + VIP_BED_UPPER: 80000 // 800 ETB + }; + return fares[serviceClass] ?? 35000; } } diff --git a/apps/edr-passenger-api/src/modules/seats/seats.controller.ts b/apps/edr-passenger-api/src/modules/seats/seats.controller.ts index a872f337d..a14a6a17f 100644 --- a/apps/edr-passenger-api/src/modules/seats/seats.controller.ts +++ b/apps/edr-passenger-api/src/modules/seats/seats.controller.ts @@ -14,4 +14,20 @@ export class SeatsController { holdSeats(@Body() dto: HoldSeatsDto) { return this.service.holdSeats(dto); } @Delete('hold/:holdId') @UseGuards(JwtGuard) @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Release a seat hold' }) releaseHold(@Param('holdId') holdId: string) { return this.service.releaseHold(holdId); } + + @Get('export/csv/:tripId') @UseGuards(JwtGuard) @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Export seats as CSV' }) + async exportCSV(@Param('tripId') tripId: string) { + const csv = await this.service.exportSeatsCSV(tripId); + return { csv, filename: `seats-${tripId}.csv` }; + } + + @Post('import/preview') @UseGuards(JwtGuard) @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Preview CSV import' }) + previewCSV(@Body() body: { csv: string }) { + return this.service.previewSeatsCSV(body.csv); + } + + @Post('import/commit') @UseGuards(JwtGuard) @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Commit CSV import' }) + importCSV(@Body() body: { tripId: string; csv: string; commit: boolean }) { + return this.service.importSeatsCSV(body.tripId, body.csv, body.commit); + } } diff --git a/apps/edr-passenger-api/src/modules/seats/seats.service.spec.ts b/apps/edr-passenger-api/src/modules/seats/seats.service.spec.ts new file mode 100644 index 000000000..2a3b84539 --- /dev/null +++ b/apps/edr-passenger-api/src/modules/seats/seats.service.spec.ts @@ -0,0 +1,82 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { SeatsService } from './seats.service'; +import { PrismaService } from '../../common/prisma.service'; +import { ConflictException } from '@nestjs/common'; + +describe('SeatsService - Auto Assign', () => { + let service: SeatsService; + let prisma: PrismaService; + + const mockPrisma = { + seat: { + findMany: jest.fn(), + updateMany: jest.fn(), + }, + }; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ + SeatsService, + { provide: PrismaService, useValue: mockPrisma }, + ], + }).compile(); + + service = module.get(SeatsService); + prisma = module.get(PrismaService); + jest.clearAllMocks(); + }); + + describe('autoAssignSeats', () => { + it('should assign contiguous seats in same row', async () => { + const mockSeats = [ + { id: 'seat-1', coachId: 'coach-1', row: 1, col: 'A' }, + { id: 'seat-2', coachId: 'coach-1', row: 1, col: 'B' }, + { id: 'seat-3', coachId: 'coach-1', row: 1, col: 'C' }, + { id: 'seat-4', coachId: 'coach-1', row: 2, col: 'A' }, + ]; + + mockPrisma.seat.findMany.mockResolvedValue(mockSeats); + + const result = await service.autoAssignSeats('trip-1', 2, 'ECONOMY_REGULAR'); + + expect(result).toHaveLength(2); + expect(result).toEqual(['seat-1', 'seat-2']); + }); + + it('should throw error if not enough seats available', async () => { + mockPrisma.seat.findMany.mockResolvedValue([ + { id: 'seat-1', coachId: 'coach-1', row: 1, col: 'A' }, + ]); + + await expect( + service.autoAssignSeats('trip-1', 3, 'ECONOMY_REGULAR'), + ).rejects.toThrow(ConflictException); + }); + + it('should respect eligibility filter', async () => { + const mockSeats = [ + { id: 'seat-1', coachId: 'coach-1', row: 1, col: 'A', eligibility: 'ACCESSIBLE' }, + { id: 'seat-2', coachId: 'coach-1', row: 1, col: 'B', eligibility: 'ACCESSIBLE' }, + ]; + + mockPrisma.seat.findMany.mockResolvedValue(mockSeats); + + const result = await service.autoAssignSeats('trip-1', 2, 'ECONOMY_REGULAR', 'ACCESSIBLE'); + + expect(result).toHaveLength(2); + }); + + it('should assign single seat', async () => { + const mockSeats = [ + { id: 'seat-1', coachId: 'coach-1', row: 1, col: 'A' }, + ]; + + mockPrisma.seat.findMany.mockResolvedValue(mockSeats); + + const result = await service.autoAssignSeats('trip-1', 1, 'ECONOMY_REGULAR'); + + expect(result).toEqual(['seat-1']); + }); + }); +}); diff --git a/apps/edr-passenger-api/src/modules/seats/seats.service.ts b/apps/edr-passenger-api/src/modules/seats/seats.service.ts index 90234b6f2..866d30cc3 100644 --- a/apps/edr-passenger-api/src/modules/seats/seats.service.ts +++ b/apps/edr-passenger-api/src/modules/seats/seats.service.ts @@ -42,6 +42,128 @@ export class SeatsService { async confirmSeats(seatIds: string[]) { await this.prisma.seat.updateMany({ where: { id: { in: seatIds } }, data: { status: 'BOOKED', heldUntil: null } }); } async releaseSeats(seatIds: string[]) { await this.prisma.seat.updateMany({ where: { id: { in: seatIds } }, data: { status: 'AVAILABLE', heldUntil: null } }); } + async autoAssignSeats(tripId: string, count: number, serviceClass: string, eligibility?: string): Promise { + const seats = await this.prisma.seat.findMany({ + where: { + coach: { tripId, serviceClass: serviceClass as any }, + status: 'AVAILABLE', + ...(eligibility ? { eligibility } : {}), + }, + orderBy: [{ coach: { label: 'asc' } }, { row: 'asc' }, { col: 'asc' }], + }); + + if (seats.length < count) { + throw new ConflictException(`Only ${seats.length} seats available, requested ${count}`); + } + + const assigned = this.findContiguousSeats(seats, count); + return assigned.map((s) => s.id); + } + + private findContiguousSeats(seats: any[], count: number): any[] { + if (count === 1) return [seats[0]]; + + const grouped = new Map(); + for (const seat of seats) { + const key = `${seat.coachId}-${seat.row}`; + if (!grouped.has(key)) grouped.set(key, []); + grouped.get(key)!.push(seat); + } + + for (const rowSeats of grouped.values()) { + if (rowSeats.length >= count) { + return rowSeats.slice(0, count); + } + } + + return seats.slice(0, count); + } + + async exportSeatsCSV(tripId: string): Promise { + const coaches = await this.prisma.coach.findMany({ + where: { tripId }, + include: { seats: { orderBy: [{ row: 'asc' }, { col: 'asc' }] } }, + }); + + const rows = ['coachId,coachLabel,row,col,label,kind,status,premiumFeeMinor,eligibility']; + for (const coach of coaches) { + for (const seat of coach.seats) { + rows.push( + `${coach.id},${coach.label},${seat.row},${seat.col},${seat.label},${seat.kind},${seat.status},${seat.premiumFeeMinor},${seat.eligibility || ''}`, + ); + } + } + return rows.join('\n'); + } + + async previewSeatsCSV(csvContent: string): Promise<{ valid: number; invalid: number; errors: string[] }> { + const lines = csvContent.trim().split('\n').slice(1); + const errors: string[] = []; + let valid = 0; + let invalid = 0; + + for (let i = 0; i < lines.length; i++) { + const parts = lines[i].split(','); + if (parts.length < 8) { + errors.push(`Line ${i + 2}: Invalid format`); + invalid++; + continue; + } + const [coachId, coachLabel, row, col, label, kind, status, premiumFeeMinor] = parts; + if (!coachId || !row || !col || !label) { + errors.push(`Line ${i + 2}: Missing required fields`); + invalid++; + continue; + } + valid++; + } + + return { valid, invalid, errors: errors.slice(0, 10) }; + } + + async importSeatsCSV(tripId: string, csvContent: string, commit: boolean): Promise<{ imported: number; errors: string[] }> { + const lines = csvContent.trim().split('\n').slice(1); + const errors: string[] = []; + let imported = 0; + + if (!commit) { + return { imported: 0, errors: ['Preview mode - use commit=true to apply changes'] }; + } + + for (let i = 0; i < lines.length; i++) { + try { + const parts = lines[i].split(','); + const [coachId, coachLabel, row, col, label, kind, status, premiumFeeMinor, eligibility] = parts; + + await this.prisma.seat.upsert({ + where: { coachId_row_col: { coachId, row: parseInt(row), col } }, + update: { + label, + kind: kind as any, + status: status as any, + premiumFeeMinor: parseInt(premiumFeeMinor) || 0, + eligibility: eligibility || null, + }, + create: { + coachId, + row: parseInt(row), + col, + label, + kind: kind as any, + status: status as any, + premiumFeeMinor: parseInt(premiumFeeMinor) || 0, + eligibility: eligibility || null, + }, + }); + imported++; + } catch (err) { + errors.push(`Line ${i + 2}: ${err instanceof Error ? err.message : String(err)}`); + } + } + + return { imported, errors: errors.slice(0, 10) }; + } + @Cron(CronExpression.EVERY_MINUTE) async expireHolds() { const expired = await this.prisma.seatHold.findMany({ where: { expiresAt: { lt: new Date() } } }); diff --git a/apps/edr-passenger-api/src/modules/tickets/tickets.controller.ts b/apps/edr-passenger-api/src/modules/tickets/tickets.controller.ts index 407af7234..c4f6a4d38 100644 --- a/apps/edr-passenger-api/src/modules/tickets/tickets.controller.ts +++ b/apps/edr-passenger-api/src/modules/tickets/tickets.controller.ts @@ -1,4 +1,4 @@ -import { Body, Controller, Get, Param, Post, UseGuards } from '@nestjs/common'; +import { Body, Controller, Get, Param, Post, Query, UseGuards } from '@nestjs/common'; import { ApiTags, ApiOperation, ApiBearerAuth } from '@nestjs/swagger'; import { TicketsService } from './tickets.service'; import { JwtGuard } from '../../common/jwt.guard'; @@ -9,6 +9,38 @@ import { JwtGuard } from '../../common/jwt.guard'; @ApiBearerAuth('JWT-auth') export class TicketsController { constructor(private service: TicketsService) {} - @Get(':bookingRef') @ApiOperation({ summary: 'Get ticket by booking reference' }) getByRef(@Param('bookingRef') ref: string) { return this.service.getByRef(ref); } - @Post(':bookingRef/validate') @ApiOperation({ summary: 'Validate ticket at gate (staff)' }) validate(@Param('bookingRef') ref: string, @Body('validatorId') validatorId: string) { return this.service.validate(ref, validatorId); } + + @Get(':bookingRef') + @ApiOperation({ summary: 'Get ticket by booking reference' }) + getByRef(@Param('bookingRef') ref: string) { + return this.service.getByRef(ref); + } + + @Post(':bookingRef/validate') + @ApiOperation({ summary: 'Validate ticket at gate (staff)' }) + validate( + @Param('bookingRef') ref: string, + @Body('validatorId') validatorId: string, + @Body('gateId') gateId?: string + ) { + return this.service.validate(ref, validatorId, gateId); + } + + @Get(':ticketId/validation-logs') + @ApiOperation({ summary: 'Get validation logs for ticket' }) + getValidationLogs(@Param('ticketId') ticketId: string) { + return this.service.getValidationLogs(ticketId); + } + + @Get('offline/export') + @ApiOperation({ summary: 'Export tickets for offline validation' }) + exportOfflineData(@Query('tripId') tripId: string) { + return this.service.exportOfflineData(tripId); + } + + @Post('validate/offline') + @ApiOperation({ summary: 'Batch import offline validations' }) + validateOfflineBatch(@Body() body: { validations: any[] }) { + return this.service.validateOfflineBatch(body.validations); + } } diff --git a/apps/edr-passenger-api/src/modules/tickets/tickets.service.spec.ts b/apps/edr-passenger-api/src/modules/tickets/tickets.service.spec.ts new file mode 100644 index 000000000..7f6ad7f52 --- /dev/null +++ b/apps/edr-passenger-api/src/modules/tickets/tickets.service.spec.ts @@ -0,0 +1,126 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { TicketsService } from './tickets.service'; +import { PrismaService } from '../../common/prisma.service'; + +describe('TicketsService - Offline Validation', () => { + let service: TicketsService; + let prisma: PrismaService; + + const mockPrisma = { + booking: { + findMany: jest.fn(), + findUnique: jest.fn(), + }, + ticket: { + findUnique: jest.fn(), + update: jest.fn(), + }, + gateValidationLog: { + create: jest.fn(), + }, + }; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ + TicketsService, + { provide: PrismaService, useValue: mockPrisma }, + ], + }).compile(); + + service = module.get(TicketsService); + prisma = module.get(PrismaService); + jest.clearAllMocks(); + }); + + describe('exportOfflineData', () => { + it('should export tickets for offline validation', async () => { + const mockBookings = [ + { + bookingRef: 'ABC123', + ticket: { id: 'ticket-1', qrPayload: 'qr-data', validatedAt: null }, + seats: [{ passengerName: 'John Doe', seat: { label: '1A', coach: { label: 'A' } } }], + status: 'CONFIRMED', + }, + ]; + + mockPrisma.booking.findMany.mockResolvedValue(mockBookings); + + const result = await service.exportOfflineData('trip-1'); + + expect(result).toHaveLength(1); + expect(result[0].bookingRef).toBe('ABC123'); + expect(result[0].passengerName).toBe('John Doe'); + }); + }); + + describe('validateOfflineBatch', () => { + it('should process batch validations successfully', async () => { + const validations = [ + { + bookingRef: 'ABC123', + validatorId: 'validator-1', + gateId: 'gate-1', + validatedAt: new Date().toISOString(), + }, + ]; + + mockPrisma.booking.findUnique.mockResolvedValue({ id: 'booking-1' }); + mockPrisma.ticket.findUnique.mockResolvedValue({ id: 'ticket-1', validatedAt: null }); + mockPrisma.ticket.update.mockResolvedValue({}); + mockPrisma.gateValidationLog.create.mockResolvedValue({}); + + const result = await service.validateOfflineBatch(validations); + + expect(result.success).toBe(1); + expect(result.failed).toBe(0); + expect(result.duplicate).toBe(0); + }); + + it('should detect duplicate validations', async () => { + const validations = [ + { + bookingRef: 'ABC123', + validatorId: 'validator-1', + validatedAt: new Date().toISOString(), + }, + { + bookingRef: 'ABC123', + validatorId: 'validator-1', + validatedAt: new Date().toISOString(), + }, + ]; + + mockPrisma.booking.findUnique.mockResolvedValue({ id: 'booking-1' }); + mockPrisma.ticket.findUnique.mockResolvedValue({ id: 'ticket-1', validatedAt: null }); + mockPrisma.ticket.update.mockResolvedValue({}); + mockPrisma.gateValidationLog.create.mockResolvedValue({}); + + const result = await service.validateOfflineBatch(validations); + + expect(result.success).toBe(1); + expect(result.duplicate).toBe(1); + }); + + it('should handle already validated tickets', async () => { + const validations = [ + { + bookingRef: 'ABC123', + validatorId: 'validator-1', + validatedAt: new Date().toISOString(), + }, + ]; + + mockPrisma.booking.findUnique.mockResolvedValue({ id: 'booking-1' }); + mockPrisma.ticket.findUnique.mockResolvedValue({ + id: 'ticket-1', + validatedAt: new Date(), + }); + + const result = await service.validateOfflineBatch(validations); + + expect(result.duplicate).toBe(1); + expect(result.success).toBe(0); + }); + }); +}); diff --git a/apps/edr-passenger-api/src/modules/tickets/tickets.service.ts b/apps/edr-passenger-api/src/modules/tickets/tickets.service.ts index 1c9e05830..e2e2ff1f9 100644 --- a/apps/edr-passenger-api/src/modules/tickets/tickets.service.ts +++ b/apps/edr-passenger-api/src/modules/tickets/tickets.service.ts @@ -2,6 +2,13 @@ import { Injectable, NotFoundException, BadRequestException } from '@nestjs/comm import { PrismaService } from '../../common/prisma.service'; import * as QRCode from 'qrcode'; +interface OfflineValidation { + bookingRef: string; + validatorId: string; + gateId?: string; + validatedAt: string; +} + @Injectable() export class TicketsService { constructor(private prisma: PrismaService) {} @@ -13,7 +20,12 @@ export class TicketsService { }); if (!booking) throw new NotFoundException('Booking not found'); const qrPayload = await QRCode.toDataURL(`edr:tkt:${booking.id}:${booking.bookingRef}`); - return this.prisma.ticket.upsert({ where: { bookingId }, update: { qrPayload }, create: { bookingId, bookingRef: booking.bookingRef, qrPayload } }); + const barcodePayload = `EDR${booking.bookingRef}${booking.id.substring(0, 8).toUpperCase()}`; + return this.prisma.ticket.upsert({ + where: { bookingId }, + update: { qrPayload, barcodePayload }, + create: { bookingId, bookingRef: booking.bookingRef, qrPayload, barcodePayload } + }); } async getByRef(bookingRef: string) { @@ -29,15 +41,110 @@ export class TicketsService { departureAt: booking.trip.departureAt, trainName: booking.trip.service.name, coachLabel: seat?.seat.coach.label, seatLabel: seat?.seat.label, passengerName: seat?.passengerName, priceMinor: booking.totalMinor, currency: booking.currency, qrPayload: booking.ticket.qrPayload, + barcodePayload: booking.ticket.barcodePayload }; } - async validate(bookingRef: string, validatorId: string) { + async validate(bookingRef: string, validatorId: string, gateId?: string) { const booking = await this.prisma.booking.findUnique({ where: { bookingRef } }); if (!booking) throw new NotFoundException('Booking not found'); const ticket = await this.prisma.ticket.findUnique({ where: { bookingId: booking.id } }); if (!ticket) throw new NotFoundException('Ticket not found'); - if (ticket.validatedAt) throw new BadRequestException('Ticket already validated'); - return this.prisma.ticket.update({ where: { id: ticket.id }, data: { validatedAt: new Date(), validatorId } }); + if (ticket.validatedAt) { + await this.prisma.gateValidationLog.create({ + data: { ticketId: ticket.id, validatorId, gateId, status: 'REJECTED', reason: 'ALREADY_VALIDATED' } + }); + throw new BadRequestException('Ticket already validated'); + } + await this.prisma.ticket.update({ where: { id: ticket.id }, data: { validatedAt: new Date(), validatorId } }); + await this.prisma.gateValidationLog.create({ + data: { ticketId: ticket.id, validatorId, gateId, status: 'APPROVED' } + }); + return { validated: true, ticketId: ticket.id, validatedAt: new Date() }; + } + + async getValidationLogs(ticketId: string) { + return this.prisma.gateValidationLog.findMany({ + where: { ticketId }, + orderBy: { validatedAt: 'desc' } + }); + } + + async exportOfflineData(tripId: string) { + const bookings = await this.prisma.booking.findMany({ + where: { tripId, status: 'CONFIRMED' }, + include: { + ticket: true, + seats: { include: { seat: { include: { coach: true } } } }, + passenger: { include: { user: true } }, + }, + }); + + return bookings.map((b) => ({ + bookingRef: b.bookingRef, + ticketId: b.ticket?.id, + passengerName: b.seats[0]?.passengerName, + seatLabel: b.seats[0]?.seat.label, + coachLabel: b.seats[0]?.seat.coach.label, + qrPayload: b.ticket?.qrPayload, + status: b.status, + validatedAt: b.ticket?.validatedAt, + })); + } + + async validateOfflineBatch(validations: OfflineValidation[]) { + const results = { success: 0, failed: 0, duplicate: 0, errors: [] as string[] }; + const processedRefs = new Set(); + + for (const v of validations) { + if (processedRefs.has(v.bookingRef)) { + results.duplicate++; + continue; + } + processedRefs.add(v.bookingRef); + + try { + const booking = await this.prisma.booking.findUnique({ where: { bookingRef: v.bookingRef } }); + if (!booking) { + results.failed++; + results.errors.push(`Booking ${v.bookingRef} not found`); + continue; + } + + const ticket = await this.prisma.ticket.findUnique({ where: { bookingId: booking.id } }); + if (!ticket) { + results.failed++; + results.errors.push(`Ticket for ${v.bookingRef} not found`); + continue; + } + + if (ticket.validatedAt) { + results.duplicate++; + continue; + } + + await this.prisma.ticket.update({ + where: { id: ticket.id }, + data: { validatedAt: new Date(v.validatedAt), validatorId: v.validatorId }, + }); + + await this.prisma.gateValidationLog.create({ + data: { + ticketId: ticket.id, + validatorId: v.validatorId, + gateId: v.gateId, + status: 'APPROVED', + validatedAt: new Date(v.validatedAt), + }, + }); + + results.success++; + } catch (err) { + results.failed++; + results.errors.push(`Error processing ${v.bookingRef}: ${err instanceof Error ? err.message : String(err)}`); + } + } + + return results; } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bf0d892f0..d2519df19 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,251 +36,11 @@ importers: specifier: ^5.5.4 version: 5.9.3 - apps/edr-freight-api: - dependencies: - '@edr/api-common': - specifier: workspace:* - version: link:../../packages/api-common - '@edr/types': - specifier: workspace:* - version: link:../../packages/types - '@nestjs/common': - specifier: ^11.0.0 - version: 11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/config': - specifier: ^4.0.0 - version: 4.0.4(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2) - '@nestjs/core': - specifier: ^11.0.0 - version: 11.1.19(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/microservices@11.1.19)(@nestjs/platform-express@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/microservices': - specifier: ^11.0.0 - version: 11.1.19(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/platform-express': - specifier: ^11.0.0 - version: 11.1.19(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19) - '@nestjs/swagger': - specifier: ^11.4.2 - version: 11.4.2(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2) - '@nestjs/typeorm': - specifier: ^11.0.1 - version: 11.0.1(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2)(typeorm@0.3.29(babel-plugin-macros@3.1.0)(pg@8.20.0)(ts-node@10.9.2(@types/node@20.19.41)(typescript@5.9.3))) - '@tria-plc/api-common': - specifier: ^0.1.0 - version: 0.1.4(dlk6rffkpcjlebt3tne6hjqwx4) - '@tria-plc/iamapi-common': - specifier: ^0.1.0 - version: 0.1.6(nhzmwbpvzw5m5dv4mcbu7ilapi) - class-transformer: - specifier: ^0.5.1 - version: 0.5.1 - class-validator: - specifier: ^0.14.1 - version: 0.14.4 - pg: - specifier: ^8.13.0 - version: 8.20.0 - reflect-metadata: - specifier: ^0.2.2 - version: 0.2.2 - rxjs: - specifier: ^7.8.1 - version: 7.8.2 - typeorm: - specifier: ^0.3.20 - version: 0.3.29(babel-plugin-macros@3.1.0)(pg@8.20.0)(ts-node@10.9.2(@types/node@20.19.41)(typescript@5.9.3)) - devDependencies: - '@edr/eslint-config': - specifier: workspace:* - version: link:../../packages/config/eslint-config - '@edr/tsconfig': - specifier: workspace:* - version: link:../../packages/config/tsconfig - '@nestjs/cli': - specifier: ^11.0.0 - version: 11.0.21(@types/node@20.19.41)(prettier@3.8.3) - '@nestjs/schematics': - specifier: ^11.0.0 - version: 11.1.0(chokidar@4.0.3)(prettier@3.8.3)(typescript@5.9.3) - '@nestjs/testing': - specifier: ^11.0.0 - version: 11.1.19(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(@nestjs/microservices@11.1.19)(@nestjs/platform-express@11.1.19) - '@types/express': - specifier: ^5.0.0 - version: 5.0.6 - '@types/jest': - specifier: ^29.5.13 - version: 29.5.14 - '@types/node': - specifier: ^20.14.0 - version: 20.19.41 - '@types/supertest': - specifier: ^6.0.2 - version: 6.0.3 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@20.19.41)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.41)(typescript@5.9.3)) - supertest: - specifier: ^7.0.0 - version: 7.2.2 - ts-jest: - specifier: ^29.2.5 - version: 29.4.9(@babel/core@7.29.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.0))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.41)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.41)(typescript@5.9.3)))(typescript@5.9.3) - ts-loader: - specifier: ^9.5.1 - version: 9.5.7(typescript@5.9.3)(webpack@5.106.0) - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@20.19.41)(typescript@5.9.3) - tsconfig-paths: - specifier: ^4.2.0 - version: 4.2.0 - typescript: - specifier: ^5.5.4 - version: 5.9.3 - - apps/edr-freight-web/backoffice: - dependencies: - '@edr/types': - specifier: workspace:* - version: link:../../../packages/types - '@edr/ui-common': - specifier: workspace:* - version: link:../../../packages/ui-common - '@tanstack/react-query': - specifier: ^5.59.0 - version: 5.100.10(react@18.3.1) - '@tria-plc/iamui-common': - specifier: 1.0.3 - version: 1.0.3(iv2eyyfavqphryq7oznx6tfwre) - axios: - specifier: ^1.7.7 - version: 1.16.0 - clsx: - specifier: ^2.1.1 - version: 2.1.1 - react: - specifier: 18.3.1 - version: 18.3.1 - react-dom: - specifier: 18.3.1 - version: 18.3.1(react@18.3.1) - react-router-dom: - specifier: ^6.27.0 - version: 6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - zustand: - specifier: ^5.0.0 - version: 5.0.13(@types/react@18.3.28)(immer@11.1.8)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)) - devDependencies: - '@edr/eslint-config': - specifier: workspace:* - version: link:../../../packages/config/eslint-config - '@edr/tsconfig': - specifier: workspace:* - version: link:../../../packages/config/tsconfig - '@types/react': - specifier: ^18.3.11 - version: 18.3.28 - '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.7(@types/react@18.3.28) - '@vitejs/plugin-react': - specifier: ^4.3.2 - version: 4.7.0(vite@5.4.21(@types/node@24.12.4)(lightningcss@1.32.0)(terser@5.47.1)) - autoprefixer: - specifier: ^10.4.20 - version: 10.5.0(postcss@8.5.14) - jsdom: - specifier: ^25.0.1 - version: 25.0.1(canvas@2.11.2) - postcss: - specifier: ^8.4.47 - version: 8.5.14 - tailwindcss: - specifier: ^3.4.13 - version: 3.4.19(yaml@2.9.0) - typescript: - specifier: ^5.5.4 - version: 5.9.3 - vite: - specifier: ^5.4.8 - version: 5.4.21(@types/node@24.12.4)(lightningcss@1.32.0)(terser@5.47.1) - vitest: - specifier: ^2.1.2 - version: 2.1.9(@types/node@24.12.4)(jsdom@25.0.1(canvas@2.11.2))(lightningcss@1.32.0)(terser@5.47.1) - - apps/edr-freight-web/portal: - dependencies: - '@edr/types': - specifier: workspace:* - version: link:../../../packages/types - '@edr/ui-common': - specifier: workspace:* - version: link:../../../packages/ui-common - '@tanstack/react-query': - specifier: ^5.59.0 - version: 5.100.10(react@18.3.1) - '@tria-plc/iamui-common': - specifier: 1.0.3 - version: 1.0.3(iv2eyyfavqphryq7oznx6tfwre) - axios: - specifier: ^1.7.7 - version: 1.16.0 - clsx: - specifier: ^2.1.1 - version: 2.1.1 - react: - specifier: 18.3.1 - version: 18.3.1 - react-dom: - specifier: 18.3.1 - version: 18.3.1(react@18.3.1) - react-router-dom: - specifier: ^6.27.0 - version: 6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - zustand: - specifier: ^5.0.0 - version: 5.0.13(@types/react@18.3.28)(immer@11.1.8)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)) - devDependencies: - '@edr/eslint-config': - specifier: workspace:* - version: link:../../../packages/config/eslint-config - '@edr/tsconfig': - specifier: workspace:* - version: link:../../../packages/config/tsconfig - '@types/react': - specifier: ^18.3.11 - version: 18.3.28 - '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.7(@types/react@18.3.28) - '@vitejs/plugin-react': - specifier: ^4.3.2 - version: 4.7.0(vite@5.4.21(@types/node@24.12.4)(lightningcss@1.32.0)(terser@5.47.1)) - autoprefixer: - specifier: ^10.4.20 - version: 10.5.0(postcss@8.5.14) - jsdom: - specifier: ^25.0.1 - version: 25.0.1(canvas@2.11.2) - postcss: - specifier: ^8.4.47 - version: 8.5.14 - tailwindcss: - specifier: ^3.4.13 - version: 3.4.19(yaml@2.9.0) - typescript: - specifier: ^5.5.4 - version: 5.9.3 - vite: - specifier: ^5.4.8 - version: 5.4.21(@types/node@24.12.4)(lightningcss@1.32.0)(terser@5.47.1) - vitest: - specifier: ^2.1.2 - version: 2.1.9(@types/node@24.12.4)(jsdom@25.0.1(canvas@2.11.2))(lightningcss@1.32.0)(terser@5.47.1) - apps/edr-passenger-api: dependencies: + '@nestjs/axios': + specifier: ^4.0.1 + version: 4.0.1(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(axios@1.16.0)(rxjs@7.8.2) '@nestjs/common': specifier: ^11.0.0 version: 11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -308,12 +68,12 @@ importers: '@nestjs/swagger': specifier: ^7.4.0 version: 7.4.2(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2) - '@prisma/client': - specifier: ^5.8.0 - version: 5.22.0(prisma@5.22.0) '@sendgrid/mail': specifier: ^8.1.0 version: 8.1.6 + axios: + specifier: ^1.7.7 + version: 1.16.0 bcrypt: specifier: ^5.1.1 version: 5.1.1 @@ -360,6 +120,9 @@ importers: '@nestjs/testing': specifier: ^11.1.19 version: 11.1.19(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(@nestjs/microservices@11.1.19)(@nestjs/platform-express@11.1.19) + '@prisma/client': + specifier: ^6.19.3 + version: 6.19.3(prisma@6.19.3(typescript@5.9.3))(typescript@5.9.3) '@types/bcrypt': specifier: ^5.0.2 version: 5.0.2 @@ -382,8 +145,8 @@ importers: specifier: ^29.7.0 version: 29.7.0(@types/node@20.19.41)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.41)(typescript@5.9.3)) prisma: - specifier: ^5.8.0 - version: 5.22.0 + specifier: ^6.19.3 + version: 6.19.3(typescript@5.9.3) supertest: specifier: ^7.0.0 version: 7.2.2 @@ -560,7 +323,7 @@ importers: version: 7.8.2 typeorm: specifier: ^0.3.20 - version: 0.3.29(babel-plugin-macros@3.1.0)(pg@8.20.0)(ts-node@10.9.2(@types/node@20.19.41)(typescript@5.9.3)) + version: 0.3.29(babel-plugin-macros@3.1.0)(mysql2@3.15.3)(pg@8.20.0)(ts-node@10.9.2(@types/node@20.19.41)(typescript@5.9.3)) typescript: specifier: ^5.5.4 version: 5.9.3 @@ -663,12 +426,6 @@ packages: resolution: {integrity: sha512-lnw+ZM1Io+cJAkReC0NPDjqObL8NtKzKIkdgEEKC8CUmkhurYhedbicN8Y8NYHgG1uLd2GozW3+/QqPRZaN+Lw==} engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - '@ark-ui/react@5.36.2': - resolution: {integrity: sha512-2lrZ7+Qtlj7hGx4qU2jZkE892JNrkULg/fUxqUuqmQfv9UGAXhdcw1Hr3N+zBgMDVz3aqip0Qa4v0Mox09MMvg==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - '@asamuzakjp/css-color@3.2.0': resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} @@ -856,13 +613,6 @@ packages: '@borewit/text-codec@0.2.2': resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} - '@chakra-ui/react@3.35.0': - resolution: {integrity: sha512-qzfRNLwxKjxx2IXjBj6uz1nYI+pKsq6uwHxO619+hx1OzNNuwLIjEHJxnDfBzoynO7sPCBlubMwFWb1e1PrXzw==} - peerDependencies: - '@emotion/react': '>=11' - react: 18.3.1 - react-dom: 18.3.1 - '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} @@ -968,63 +718,6 @@ packages: resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} - '@date-fns/tz@1.4.1': - resolution: {integrity: sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA==} - - '@emotion/babel-plugin@11.13.5': - resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} - - '@emotion/cache@11.14.0': - resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} - - '@emotion/hash@0.9.2': - resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} - - '@emotion/is-prop-valid@1.4.0': - resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} - - '@emotion/memoize@0.9.0': - resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} - - '@emotion/react@11.14.0': - resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@emotion/serialize@1.3.3': - resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} - - '@emotion/sheet@1.4.0': - resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} - - '@emotion/styled@11.14.1': - resolution: {integrity: sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==} - peerDependencies: - '@emotion/react': ^11.0.0-rc.0 - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@emotion/unitless@0.10.0': - resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} - - '@emotion/use-insertion-effect-with-fallbacks@1.2.0': - resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} - peerDependencies: - react: 18.3.1 - - '@emotion/utils@1.4.2': - resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} - - '@emotion/weak-memoize@0.4.0': - resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} - '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -1181,48 +874,6 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@faker-js/faker@10.4.0': - resolution: {integrity: sha512-sDBWI3yLy8EcDzgobvJTWq1MJYzAkQdpjXuPukga9wXonhpMRvd1Izuo2Qgwey2OiEoRIBr35RMU9HJRoOHzpw==} - engines: {node: ^20.19.0 || ^22.13.0 || ^23.5.0 || >=24.0.0, npm: '>=10'} - - '@fast-csv/format@4.3.5': - resolution: {integrity: sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==} - - '@fast-csv/parse@4.3.6': - resolution: {integrity: sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==} - - '@floating-ui/core@1.7.5': - resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} - - '@floating-ui/dom@1.7.6': - resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} - - '@floating-ui/react-dom@2.1.8': - resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - '@floating-ui/react@0.27.19': - resolution: {integrity: sha512-31B8h5mm8YxotlE7/AU/PhNAl8eWxAmjL/v2QOxroDNkTFLk3Uu82u63N3b6TXa4EGJeeZLVcd/9AlNlVqzeog==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - '@floating-ui/utils@0.2.11': - resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} - - '@gilbarbara/deep-equal@0.1.2': - resolution: {integrity: sha512-jk+qzItoEb0D0xSSmrKDDzf9sheQj/BAPxlgNxgmOaA3mxpUa6ndJLYGZKsJnIVEQSD8zcTbyILz7I0HcnBCRA==} - - '@gilbarbara/deep-equal@0.3.1': - resolution: {integrity: sha512-I7xWjLs2YSVMc5gGx1Z3ZG1lgFpITPndpi8Ku55GeEIKpACCPQNS/OTqQbxgTCfq0Ncvcc+CrFov96itVh6Qvw==} - - '@hookform/resolvers@5.2.2': - resolution: {integrity: sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==} - peerDependencies: - react-hook-form: ^7.55.0 - '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -1379,12 +1030,6 @@ packages: '@types/node': optional: true - '@internationalized/date@3.12.0': - resolution: {integrity: sha512-/PyIMzK29jtXaGU23qTvNZxvBXRtKbNnGDFD+PY6CZw/Y8Ex8pFUzkuCJCG9aOqmShjqhS9mPqP6Dk5onQY8rQ==} - - '@internationalized/number@3.6.5': - resolution: {integrity: sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g==} - '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1485,39 +1130,10 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@leichtgewicht/ip-codec@2.0.5': - resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} - - '@lottiefiles/react-lottie-player@3.6.0': - resolution: {integrity: sha512-WK5TriLJT93VF3w4IjSVyveiedraZCnDhKzCPhpbeLgQeMi6zufxa3dXNc4HmAFRXq+LULPAy+Idv1rAfkReMA==} - peerDependencies: - react: 18.3.1 - '@lukeed/csprng@1.1.0': resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} engines: {node: '>=8'} - '@mantine/core@8.3.18': - resolution: {integrity: sha512-9tph1lTVogKPjTx02eUxDUOdXacPzK62UuSqb4TdGliI54/Xgxftq0Dfqu6XuhCxn9J5MDJaNiLDvL/1KRkYqA==} - peerDependencies: - '@mantine/hooks': 8.3.18 - react: 18.3.1 - react-dom: 18.3.1 - - '@mantine/dates@8.3.18': - resolution: {integrity: sha512-FHx5teJOhupI0gO2o5evtVYQEdqOjayOkLRhEQfB5Nc5DvcysfPfmNILGkc1Nrp9ZQeQWKLT9qr+CkcCXwHOaw==} - peerDependencies: - '@mantine/core': 8.3.18 - '@mantine/hooks': 8.3.18 - dayjs: '>=1.0.0' - react: 18.3.1 - react-dom: 18.3.1 - - '@mantine/hooks@8.3.18': - resolution: {integrity: sha512-QoWr9+S8gg5050TQ06aTSxtlpGjYOpIllRbjYYXlRvZeTsUqiTbVfvQROLexu4rEaK+yy9Wwriwl9PMRgbLqPw==} - peerDependencies: - react: 18.3.1 - '@mapbox/node-pre-gyp@1.0.11': resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true @@ -1525,156 +1141,6 @@ packages: '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} - '@microsoft/tsdoc@0.16.0': - resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==} - - '@mui/base@5.0.0-beta.70': - resolution: {integrity: sha512-Tb/BIhJzb0pa5zv/wu7OdokY9ZKEDqcu1BDFnohyvGCoHuSXbEr90rPq1qeNW3XvTBIbNWHEF7gqge+xpUo6tQ==} - engines: {node: '>=14.0.0'} - deprecated: This package has been replaced by @base-ui/react - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/core-downloads-tracker@5.18.0': - resolution: {integrity: sha512-jbhwoQ1AY200PSSOrNXmrFCaSDSJWP7qk6urkTmIirvRXDROkqe+QwcLlUiw/PrREwsIF/vm3/dAXvjlMHF0RA==} - - '@mui/icons-material@5.18.0': - resolution: {integrity: sha512-1s0vEZj5XFXDMmz3Arl/R7IncFqJ+WQ95LDp1roHWGDE2oCO3IS4/hmiOv1/8SD9r6B7tv9GLiqVZYHo+6PkTg==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@mui/material': ^5.0.0 - '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/material@5.18.0': - resolution: {integrity: sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true - - '@mui/private-theming@5.17.1': - resolution: {integrity: sha512-XMxU0NTYcKqdsG8LRmSoxERPXwMbp16sIXPcLVgLGII/bVNagX0xaheWAwFv8+zDK7tI3ajllkuD3GZZE++ICQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/styled-engine@5.18.0': - resolution: {integrity: sha512-BN/vKV/O6uaQh2z5rXV+MBlVrEkwoS/TK75rFQ2mjxA7+NBo8qtTAOA4UaM0XeJfn7kh2wZ+xQw2HAx0u+TiBg==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.4.1 - '@emotion/styled': ^11.3.0 - react: 18.3.1 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - - '@mui/system@5.18.0': - resolution: {integrity: sha512-ojZGVcRWqWhu557cdO3pWHloIGJdzVtxs3rk0F9L+x55LsUjcMUVkEhiF7E4TMxZoF9MmIHGGs0ZX3FDLAf0Xw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - react: 18.3.1 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true - - '@mui/types@7.2.24': - resolution: {integrity: sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/utils@5.17.1': - resolution: {integrity: sha512-jEZ8FTqInt2WzxDV8bhImWBqeQRD99c/id/fq83H0ER9tFl+sfZlaAoCdznGvbSQQ9ividMxqSV2c7cC1vBcQg==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/utils@6.4.9': - resolution: {integrity: sha512-Y12Q9hbK9g+ZY0T3Rxrx9m2m10gaphDuUMgWxyV5kNJevVxXYCLclYUCC9vXaIk1/NdNDTcW2Yfr2OGvNFNmHg==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/x-date-pickers@6.20.2': - resolution: {integrity: sha512-x1jLg8R+WhvkmUETRfX2wC+xJreMii78EXKLl6r3G+ggcAZlPyt0myID1Amf6hvJb9CtR7CgUo8BwR+1Vx9Ggw==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@emotion/react': ^11.9.0 - '@emotion/styled': ^11.8.1 - '@mui/material': ^5.8.6 - '@mui/system': ^5.8.0 - date-fns: ^3.6.0 - date-fns-jalali: ^2.13.0-0 - dayjs: ^1.10.7 - luxon: ^3.0.2 - moment: ^2.29.4 - moment-hijri: ^2.1.2 - moment-jalaali: ^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0 - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - date-fns: - optional: true - date-fns-jalali: - optional: true - dayjs: - optional: true - luxon: - optional: true - moment: - optional: true - moment-hijri: - optional: true - moment-jalaali: - optional: true - '@nestjs/axios@4.0.1': resolution: {integrity: sha512-68pFJgu+/AZbWkGu65Z3r55bTsCPlgyKaV4BSG8yUAD72q1PPuyVRgUwFv6BxdnibTUHlyxm06FmYWNC+bjN7A==} peerDependencies: @@ -1743,11 +1209,6 @@ packages: peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - '@nestjs/jwt@11.0.2': - resolution: {integrity: sha512-rK8aE/3/Ma45gAWfCksAXUNbOoSOUudU0Kn3rT39htPF7wsYXtKfjALKeKKJbFrIWbLjsbqfXX5bIJNvgBugGA==} - peerDependencies: - '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 - '@nestjs/mapped-types@2.0.5': resolution: {integrity: sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==} peerDependencies: @@ -1761,19 +1222,6 @@ packages: class-validator: optional: true - '@nestjs/mapped-types@2.1.1': - resolution: {integrity: sha512-SCCoMEJ6jdeI5h/N+KCVF1+pmg/hmEkNA5nHTS8Gvww7T/LCl4o1gFLinw2iQ60w7slFkszHcGLKGdazVI4F8A==} - peerDependencies: - '@nestjs/common': ^10.0.0 || ^11.0.0 - class-transformer: ^0.4.0 || ^0.5.0 - class-validator: ^0.13.0 || ^0.14.0 || ^0.15.0 - reflect-metadata: ^0.1.12 || ^0.2.0 - peerDependenciesMeta: - class-transformer: - optional: true - class-validator: - optional: true - '@nestjs/microservices@11.1.19': resolution: {integrity: sha512-3Oja56ydTlSaui19/i7gYM0MMqz/w4UR2aqZeL4K8B+Fq0Ztg3zHb8et76atToJGpSCevJLEsoEMOMaGgzRwfg==} peerDependencies: @@ -1816,12 +1264,6 @@ packages: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 passport: ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 - '@nestjs/passport@11.0.5': - resolution: {integrity: sha512-ulQX6mbjlws92PIM15Naes4F4p2JoxGnIJuUsdXQPT+Oo2sqQmENEZXM7eYuimocfHnKlcfZOuyzbA33LwUlOQ==} - peerDependencies: - '@nestjs/common': ^10.0.0 || ^11.0.0 - passport: ^0.5.0 || ^0.6.0 || ^0.7.0 - '@nestjs/platform-express@11.1.19': resolution: {integrity: sha512-Vpdv8jyCQdThfoTx+UTn+DRYr6H6X02YUqcpZ3qP6G3ZUwtVp7eS+hoQPGd4UuCnlnFG8Wqr2J9bGEzQdi1rIg==} peerDependencies: @@ -1843,23 +1285,6 @@ packages: prettier: optional: true - '@nestjs/swagger@11.4.2': - resolution: {integrity: sha512-aBihEogDMj/bLEcaqhkvyX/ZVWUw/bmnhKzR0zwUoyGJikvZyaq7rOPYl/H7Lxkkr3c90SJxyuv1AX2UT1WKlw==} - peerDependencies: - '@fastify/static': ^8.0.0 || ^9.0.0 - '@nestjs/common': ^11.0.1 - '@nestjs/core': ^11.0.1 - class-transformer: '*' - class-validator: '*' - reflect-metadata: ^0.1.12 || ^0.2.0 - peerDependenciesMeta: - '@fastify/static': - optional: true - class-transformer: - optional: true - class-validator: - optional: true - '@nestjs/swagger@7.4.2': resolution: {integrity: sha512-Mu6TEn1M/owIvAx2B4DUQObQXqo2028R2s9rSZ/hJEgBK95+doTwS0DjmVA2wTeZTyVtXOoN7CsoM5pONBzvKQ==} peerDependencies: @@ -1890,26 +1315,6 @@ packages: '@nestjs/platform-express': optional: true - '@nestjs/throttler@6.5.0': - resolution: {integrity: sha512-9j0ZRfH0QE1qyrj9JjIRDz5gQLPqq9yVC2nHsrosDVAfI5HHw08/aUAWx9DZLSdQf4HDkmhTTEGLrRFHENvchQ==} - peerDependencies: - '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 - '@nestjs/core': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 - reflect-metadata: ^0.1.13 || ^0.2.0 - - '@nestjs/typeorm@11.0.1': - resolution: {integrity: sha512-8rw/nKT0S+L+MkzgE9F2/mox7mAgsPlwfzmW9gsESN1lmQtIrVEfiiBwC2O8+guS1jBfQehJIdcdUj2OAp4VUQ==} - peerDependencies: - '@nestjs/common': ^10.0.0 || ^11.0.0 - '@nestjs/core': ^10.0.0 || ^11.0.0 - reflect-metadata: ^0.1.13 || ^0.2.0 - rxjs: ^7.2.0 - typeorm: ^0.3.0 || ^1.0.0-dev - - '@noble/ciphers@1.3.0': - resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} - engines: {node: ^14.21.3 || >=16} - '@noble/hashes@1.8.0': resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} @@ -1931,845 +1336,42 @@ packages: engines: {node: ^14.18.0 || >=16.10.0, npm: '>=5.10.0'} hasBin: true - '@onlyoffice/document-editor-react@2.1.1': - resolution: {integrity: sha512-b0SnFPmT+OEyJons18PPHpwtFABVCI4nr3gPtAAImar1PhN9tNc9703Yo5KPYsHhIgVq+FqHSWgunI9GJnKa5w==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - '@pandacss/is-valid-prop@1.11.1': - resolution: {integrity: sha512-tvfThJmSw88Lgk5qVYzVckZ2FY8T376mGvP1cWUC5SR58AYm82ZKEFciDbGOQKcyN70rF9qqJBB5JVWgJo3JmA==} - '@paralleldrive/cuid2@2.3.1': resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==} - '@phc/format@1.0.0': - resolution: {integrity: sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==} - engines: {node: '>=10'} - '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@popperjs/core@2.11.8': - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - - '@prisma/client@5.22.0': - resolution: {integrity: sha512-M0SVXfyHnQREBKxCgyo7sffrKttwE6R8PMq330MIUF0pTwjUhLbW84pFDlf06B27XyCR++VtjugEnIHdr07SVA==} - engines: {node: '>=16.13'} + '@prisma/client@6.19.3': + resolution: {integrity: sha512-mKq3jQFhjvko5LTJFHGilsuQs+W+T3Gm451NzuTDGQxwCzwXHYnIu2zGkRoW+Exq3Rob7yp2MfzSrdIiZVhrBg==} + engines: {node: '>=18.18'} peerDependencies: prisma: '*' + typescript: '>=5.1.0' peerDependenciesMeta: prisma: optional: true - - '@prisma/debug@5.22.0': - resolution: {integrity: sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ==} - - '@prisma/engines-version@5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2': - resolution: {integrity: sha512-2PTmxFR2yHW/eB3uqWtcgRcgAbG1rwG9ZriSvQw+nnb7c4uCr3RAcGMb6/zfE88SKlC1Nj2ziUvc96Z379mHgQ==} - - '@prisma/engines@5.22.0': - resolution: {integrity: sha512-UNjfslWhAt06kVL3CjkuYpHAWSO6L4kDCVPegV6itt7nD1kSJavd3vhgAEhjglLJJKEdJ7oIqDJ+yHk6qO8gPA==} - - '@prisma/fetch-engine@5.22.0': - resolution: {integrity: sha512-bkrD/Mc2fSvkQBV5EpoFcZ87AvOgDxbG99488a5cexp5Ccny+UM6MAe/UFkUC0wLYD9+9befNOqGiIJhhq+HbA==} - - '@prisma/get-platform@5.22.0': - resolution: {integrity: sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q==} - - '@radix-ui/number@1.1.1': - resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} - - '@radix-ui/primitive@1.1.3': - resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} - - '@radix-ui/react-accordion@1.2.12': - resolution: {integrity: sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': + typescript: optional: true - '@radix-ui/react-alert-dialog@1.1.15': - resolution: {integrity: sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@prisma/config@6.19.3': + resolution: {integrity: sha512-CBPT44BjlQxEt8kiMEauji2WHTDoVBOKl7UlewXmUgBPnr/oPRZC3psci5chJnYmH0ivEIog2OU9PGWoki3DLQ==} - '@radix-ui/react-arrow@1.1.7': - resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@prisma/debug@6.19.3': + resolution: {integrity: sha512-ljkJ+SgpXNktLG0Q/n4JGYCkKf0f8oYLyjImS2I8e2q2WCfdRRtWER062ZV/ixaNP2M2VKlWXVJiGzZaUgbKZw==} - '@radix-ui/react-avatar@1.1.11': - resolution: {integrity: sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@prisma/engines-version@7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7': + resolution: {integrity: sha512-03bgb1VD5gvuumNf+7fVGBzfpJPjmqV423l/WxsWk2cNQ42JD0/SsFBPhN6z8iAvdHs07/7ei77SKu7aZfq8bA==} - '@radix-ui/react-checkbox@1.3.3': - resolution: {integrity: sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@prisma/engines@6.19.3': + resolution: {integrity: sha512-RSYxtlYFl5pJ8ZePgMv0lZ9IzVCOdTPOegrs2qcbAEFrBI1G33h6wyC9kjQvo0DnYEhEVY0X4LsuFHXLKQk88g==} - '@radix-ui/react-collapsible@1.1.12': - resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@prisma/fetch-engine@6.19.3': + resolution: {integrity: sha512-tKtl/qco9Nt7LU5iKhpultD8O4vMCZcU2CHjNTnRrL1QvSUr5W/GcyFPjNL87GtRrwBc7ubXXD9xy4EvLvt8JA==} - '@radix-ui/react-collection@1.1.7': - resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-compose-refs@1.1.2': - resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-context-menu@2.2.16': - resolution: {integrity: sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-context@1.1.2': - resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-context@1.1.3': - resolution: {integrity: sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-dialog@1.1.15': - resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-direction@1.1.1': - resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-dismissable-layer@1.1.11': - resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-dropdown-menu@2.1.16': - resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-focus-guards@1.1.3': - resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-focus-scope@1.1.7': - resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-hover-card@1.1.15': - resolution: {integrity: sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-id@1.1.1': - resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-label@2.1.8': - resolution: {integrity: sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-menu@2.1.16': - resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-navigation-menu@1.2.14': - resolution: {integrity: sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-popover@1.1.15': - resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-popper@1.2.8': - resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-portal@1.1.9': - resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-presence@1.1.5': - resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-primitive@2.1.3': - resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-primitive@2.1.4': - resolution: {integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-progress@1.1.8': - resolution: {integrity: sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-radio-group@1.3.8': - resolution: {integrity: sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-roving-focus@1.1.11': - resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-scroll-area@1.2.10': - resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-select@2.2.6': - resolution: {integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-separator@1.1.8': - resolution: {integrity: sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-slider@1.3.6': - resolution: {integrity: sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-slot@1.2.3': - resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-slot@1.2.4': - resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-switch@1.2.6': - resolution: {integrity: sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-tabs@1.1.13': - resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-toast@1.2.15': - resolution: {integrity: sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-toggle-group@1.1.11': - resolution: {integrity: sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-toggle@1.1.10': - resolution: {integrity: sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-tooltip@1.2.8': - resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-use-callback-ref@1.1.1': - resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-controllable-state@1.2.2': - resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-effect-event@0.0.2': - resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-escape-keydown@1.1.1': - resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-is-hydrated@0.1.0': - resolution: {integrity: sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-layout-effect@1.1.1': - resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-previous@1.1.1': - resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-rect@1.1.1': - resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-size@1.1.1': - resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-visually-hidden@1.2.3': - resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/rect@1.1.1': - resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - - '@react-pdf-viewer/attachment@3.12.0': - resolution: {integrity: sha512-mhwrYJSIpCvHdERpLUotqhMgSjhtF+BTY1Yb9Fnzpcq3gLZP+Twp5Rynq21tCrVdDizPaVY7SKu400GkgdMfZw==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - '@react-pdf-viewer/bookmark@3.12.0': - resolution: {integrity: sha512-i7nEit8vIFMAES8RFGwprZ9cXOOZb9ZStPW6E6yuObJEXcvBj/ctsbBJGZxqUZOGklM0JoB7sjHyxAriHfe92A==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - '@react-pdf-viewer/core@3.12.0': - resolution: {integrity: sha512-8MsdlQJ4jaw3GT+zpCHS33nwnvzpY0ED6DEahZg9WngG++A5RMhk8LSlxdHelwaFFHFiXBjmOaj2Kpxh50VQRg==} - peerDependencies: - pdfjs-dist: ^3.11.174 - react: 18.3.1 - react-dom: 18.3.1 - - '@react-pdf-viewer/default-layout@3.12.0': - resolution: {integrity: sha512-K2fS4+TJynHxxCBFuIDiFuAw3nqOh4bkBgtVZ/2pGvnFn9lLg46YGLMnTXCQqtyZzzXYh696jmlFViun3is4pA==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - '@react-pdf-viewer/full-screen@3.12.0': - resolution: {integrity: sha512-hQouJ26QUaRBCXNMU1aI1zpJn4l4PJRvlHhuE2dZYtLl37ycjl7vBCQYZW1FwnuxMWztZsY47R43DKaZORg0pg==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - '@react-pdf-viewer/get-file@3.12.0': - resolution: {integrity: sha512-Uhq45n2RWlZ7Ec/BtBJ0WQESRciaYIltveDXHNdWvXgFdOS8XsvB+mnTh/wzm7Cfl9hpPyzfeezifdU9AkQgQg==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - '@react-pdf-viewer/open@3.12.0': - resolution: {integrity: sha512-vhiDEYsiQLxvZkIKT9VPYHZ1BOnv46x9eCEmRWxO1DJ8fa/GRDTA9ivXmq/ap0dGEJs6t+epleCkCEfllLR/Yw==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - '@react-pdf-viewer/page-navigation@3.12.0': - resolution: {integrity: sha512-tVEJ48Dd5kajV1nKkrPWijglJRNBiKBTyYDKVexhiRdTHUP1f6QQXiSyDgCUb0IGSZeJzOJb1h7ApKHe8OTtuw==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - '@react-pdf-viewer/print@3.12.0': - resolution: {integrity: sha512-xJn76CgbU/M2iNaN7wLHTg+sdOekkRMfCakFLwPrE+SR7qD6NUF4vQQKJBSVCCK5bUijzb6cWfKGfo8VA72o4Q==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - '@react-pdf-viewer/properties@3.12.0': - resolution: {integrity: sha512-dYTCHtVwFNkpDo7QxL2qk/8zAKndLwdD1FFxBftl6jIlQbtvNdxkFfkv1HcQING9Ic+7DBryOiD7W0ze4IERYg==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - '@react-pdf-viewer/rotate@3.12.0': - resolution: {integrity: sha512-yaxaMYPChvNOjR8+AxRmj0kvojyJKPq4XHEcIB2lJJgBY1Zra3mliDUP3Nlb4yV8BS9+yBqWn9U9mtnopQD+tw==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - '@react-pdf-viewer/scroll-mode@3.12.0': - resolution: {integrity: sha512-okII7Xqhl6cMvl1izdEvlXNJ+vJVq/qdg53hJIDYVgBCWskLk/cpjUg/ZonBxseG9lIDP3w2VO1McT8Gn11OAg==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - '@react-pdf-viewer/search@3.12.0': - resolution: {integrity: sha512-jAkLpis49fsDDY/HrbUZIOIhzF5vynONQNA4INQKI38r/MjveblrkNv7qbr9j5lQ/WFic5+gD1e+Mtpf1/7DiA==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - '@react-pdf-viewer/selection-mode@3.12.0': - resolution: {integrity: sha512-yysWEu2aCtBvzSgbhgI9kT5cq2hf0FU6Z+3B7MMXz14Kxyc3y18wUqxtgbvpFEfWF0bNUUq16JtWRljtxvZ83w==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - '@react-pdf-viewer/theme@3.12.0': - resolution: {integrity: sha512-cdBi+wR1VOZ6URCcO9plmAZQu4ZGFcd7HJdBe7VIFiGyrvl9I/Of74ONLycnDImSuONt8D3uNjPBLieeaShVeg==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - '@react-pdf-viewer/thumbnail@3.12.0': - resolution: {integrity: sha512-Vc8j3bO6wumWZV4o6pAbktPWKDSC9tQAzOCJ3cof541u4i44C11ccYC4W9aNcsMMUSO3bNwAGWtP8OFthV5akQ==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - '@react-pdf-viewer/toolbar@3.12.0': - resolution: {integrity: sha512-qACTU3qXHgtNK8J+T13EWio+0liilj86SJ87BdapqXynhl720OKPlSKOQqskUGqg3oTUJAhrse9XG6SFdHJx+g==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - '@react-pdf-viewer/zoom@3.12.0': - resolution: {integrity: sha512-V0GUTyPM77+LzhoKX+T3XI10/HfGdqRTbgeP7ID60FCzcwu6kXWqJn5tzabjDKLTlFv8mJmn0aa/ppkIU97nfA==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - '@react-pdf/fns@3.1.3': - resolution: {integrity: sha512-0I7pApDr1/RLAKbizuLy/IHTEa93LSPy/bEwYniboC3Xqnp6Od8xFJKbKEzGw2wh/5zKFFwl00g4t9RwgIMc3w==} - - '@react-pdf/font@4.0.8': - resolution: {integrity: sha512-deNd+emtZAJho1IlzKL9bRoLAGv/6oXOIKO2oZfs4RuXUrK1onLHbJO7e2YoVLPFP/sQxisRTnzdJFtd35iKwA==} - - '@react-pdf/image@3.1.0': - resolution: {integrity: sha512-ks7Ry8v711r8NvKWSELehj0BXBNPRihSnWsM09nDD8Ur175zbWBCK217LLwQMKDNYDVpkZaipdoJPom1LGaE9g==} - - '@react-pdf/layout@4.6.1': - resolution: {integrity: sha512-gN6PmWoEffvlIkifLfEhMsVucRywVMyH3rnxdyOVOhGy0nWJKKGpHyPc4plbDdpP6EfZ0r8prHXujDSkIG2nSA==} - - '@react-pdf/pdfkit@5.1.1': - resolution: {integrity: sha512-wNcdSsNlNYyGHGAgIdt453egBF7fiF9UxpRlklUfVvu8OWCrUppG9xiUrPLVoKiqWet5tMi0w6LmuFUJuYqjEg==} - - '@react-pdf/primitives@4.3.0': - resolution: {integrity: sha512-nYXoZ36pvwNzbc54+DbL8RCn15jU7woJ9D/svnh5tpUXekJ+CbI4mZLo6boSv24CvJgychOu6h7gxX03B4ps0A==} - - '@react-pdf/reconciler@2.0.0': - resolution: {integrity: sha512-7zaPRujpbHSmCpIrZ+b9HSTJHthcVZzX0Wx7RzvQGsGBUbHP4p6s5itXrAIOuQuPvDepoHGNOvf6xUuMVvdoyw==} - peerDependencies: - react: 18.3.1 - - '@react-pdf/render@4.5.1': - resolution: {integrity: sha512-IW/N4HWJWtioBXCf7n02IR24VJJ8gbdS3jGypf+vW/rSErEx3/URRzh9UK6Ma8Fpog9+T/W6GE2NHJ5AAKHhVA==} - - '@react-pdf/renderer@4.5.1': - resolution: {integrity: sha512-5r1VQrE6FRLXX5wWUxwZzM24E2BJMo6g8AQWuS8WyPs9ugu5yMnb2g8/RpPYka/Z6J+RUEWc32wty2NoUJF42Q==} - peerDependencies: - react: 18.3.1 - - '@react-pdf/stylesheet@6.2.1': - resolution: {integrity: sha512-2+UEk+7e+z8baaWi2l5kPLWmwtJeOI+T5wW9GGeN3iDH7vd3kbTqOpN1yt9mmfNVZFxQsnDHpznFb5v5UF983A==} - - '@react-pdf/svg@1.1.0': - resolution: {integrity: sha512-cTIHXiz9x1HrbfqzfxfZP3FRdDwUXG77QWF6Fb5MP/lV3ONxR+g0Z3hwtBatCS9HeGBQCpxX/Lzb8wHE+co1PA==} - - '@react-pdf/textkit@6.3.0': - resolution: {integrity: sha512-v6+V8nAcVwm7s2s1jIG2MD3Iw//x/k+XrH1foWOELBE4b32pyDgKyPXN/6KJE0dnX7+fVy27uctLNCLNMvzKzQ==} - - '@react-pdf/types@2.11.1': - resolution: {integrity: sha512-i9xQgfaDU9QoeNnbp6rltXCWg1huEh195rpOuN8cE4BZ2FuLdQrsIcb2dhFF9aOxXf+XBA6LOSpIW051MDD/bw==} - - '@reduxjs/toolkit@2.11.2': - resolution: {integrity: sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==} - peerDependencies: - react: 18.3.1 - react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 - peerDependenciesMeta: - react: - optional: true - react-redux: - optional: true + '@prisma/get-platform@6.19.3': + resolution: {integrity: sha512-xFj1VcJ1N3MKooOQAGO0W5tsd0W2QzIvW7DD7c/8H14Zmp4jseeWAITm+w2LLoLrlhoHdPPh0NMZ8mfL6puoHA==} '@remix-run/router@1.23.2': resolution: {integrity: sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==} @@ -2930,335 +1532,20 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@socket.io/component-emitter@3.1.2': - resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - '@sqltools/formatter@1.2.5': resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@standard-schema/utils@0.3.0': - resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} - - '@swc/helpers@0.5.21': - resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} - - '@tabby_ai/hijri-converter@1.0.5': - resolution: {integrity: sha512-r5bClKrcIusDoo049dSL8CawnHR6mRdDwhlQuIgZRNty68q0x8k3Lf1BtPAMxRf/GgnHBnIO4ujd3+GQdLWzxQ==} - engines: {node: '>=16.0.0'} - - '@tabler/icons-react@3.44.0': - resolution: {integrity: sha512-8+rvzBbVm/1Z3sG3x7GUNAaxIKxwgz8xaMhRs23nrCnMTKRFAhEC+82zAIFeAA0seXdrAGX5HFCkaLpGK2rVHg==} - peerDependencies: - react: 18.3.1 - - '@tabler/icons@3.44.0': - resolution: {integrity: sha512-Wn0AOZG9sg0L+bjfMqq4eNhC6pQjIrk94LvvWYNYkY8KH8wC3YILRzQlrnVJc4FUeMxH/AK97QsYCX35H3LndA==} - - '@tailwindcss/node@4.3.0': - resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} - - '@tailwindcss/oxide-android-arm64@4.3.0': - resolution: {integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [android] - - '@tailwindcss/oxide-darwin-arm64@4.3.0': - resolution: {integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [darwin] - - '@tailwindcss/oxide-darwin-x64@4.3.0': - resolution: {integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==} - engines: {node: '>= 20'} - cpu: [x64] - os: [darwin] - - '@tailwindcss/oxide-freebsd-x64@4.3.0': - resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==} - engines: {node: '>= 20'} - cpu: [x64] - os: [freebsd] - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': - resolution: {integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==} - engines: {node: '>= 20'} - cpu: [arm] - os: [linux] - - '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': - resolution: {integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - - '@tailwindcss/oxide-linux-arm64-musl@4.3.0': - resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - - '@tailwindcss/oxide-linux-x64-gnu@4.3.0': - resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - - '@tailwindcss/oxide-linux-x64-musl@4.3.0': - resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - - '@tailwindcss/oxide-wasm32-wasi@4.3.0': - resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - bundledDependencies: - - '@napi-rs/wasm-runtime' - - '@emnapi/core' - - '@emnapi/runtime' - - '@tybys/wasm-util' - - '@emnapi/wasi-threads' - - tslib - - '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': - resolution: {integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [win32] - - '@tailwindcss/oxide-win32-x64-msvc@4.3.0': - resolution: {integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==} - engines: {node: '>= 20'} - cpu: [x64] - os: [win32] - - '@tailwindcss/oxide@4.3.0': - resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==} - engines: {node: '>= 20'} - - '@tailwindcss/vite@4.3.0': - resolution: {integrity: sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==} - peerDependencies: - vite: ^5.2.0 || ^6 || ^7 || ^8 - '@tanstack/query-core@5.100.10': resolution: {integrity: sha512-8UR0yJR+GiQ40m3lPhUr0xbfAupe6GSQiksSBSa9SM2NjezFyxXCIA69/lz8cSoNKZLrw1/PktIyQBJcVeMi3w==} - '@tanstack/query-devtools@5.100.10': - resolution: {integrity: sha512-3DmJf25hDPus5IpVvp6ujXv6bKV2zPzI9vpbAmpJigsL/H6DPvPjmf7/Q9yVKEke//8fgeQ45abjgnLuyYxAiw==} - - '@tanstack/react-query-devtools@5.100.10': - resolution: {integrity: sha512-zes0+o9ef5rAZXJ9f/SeaLs2nufJaeVkZkl/Or9NGrWVF41kL9Od9ED9nCwtQlgiF2VGtrzhEw5AU/igAO+aAg==} - peerDependencies: - '@tanstack/react-query': ^5.100.10 - react: 18.3.1 - '@tanstack/react-query@5.100.10': resolution: {integrity: sha512-FLaZf2RCrA/Zgp4aiu5tG3TyasTRO7aZ99skxQpr3Hg/zXOhu6yq5FZCYQ/tRaJtM9ylnoK8tFK7PolXQadv6Q==} peerDependencies: react: 18.3.1 - '@tanstack/react-table@8.21.3': - resolution: {integrity: sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==} - engines: {node: '>=12'} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - '@tanstack/table-core@8.21.3': - resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} - engines: {node: '>=12'} - - '@tinymce/tinymce-react@6.3.0': - resolution: {integrity: sha512-E++xnn0XzDzpKr40jno2Kj7umfAE6XfINZULEBBeNjTMvbACWzA6CjiR6V8eTDc9yVmdVhIPqVzV4PqD5TZ/4g==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - tinymce: ^8.0.0 || ^7.0.0 || ^6.0.0 || ^5.5.1 - peerDependenciesMeta: - tinymce: - optional: true - - '@tiptap/core@3.23.1': - resolution: {integrity: sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw==} - peerDependencies: - '@tiptap/pm': 3.23.1 - - '@tiptap/extension-blockquote@3.23.1': - resolution: {integrity: sha512-FdVZLZOkL06j3WLXOC2UeX7++Cj3qI2vfohruMJiz4vk1Q5UUH7G4+AykFzjzBJHrdEpkiRUkRpU1KZIWdbluw==} - peerDependencies: - '@tiptap/core': 3.23.1 - - '@tiptap/extension-bold@3.23.1': - resolution: {integrity: sha512-EAYdNzyOjlQh2VBY1EhdxtiTjVMaOAD6P0ezms60dKRjd4oj/8grfXfUqwgo4NVdFb11Ks85vXoHuXJSylfR4A==} - peerDependencies: - '@tiptap/core': 3.23.1 - - '@tiptap/extension-bubble-menu@3.23.1': - resolution: {integrity: sha512-1advMCpPkHD/3ucZhYmNau8B4tF0L6iRAFhUOglp5bBZDuq13+rYujh3cm4vFmjH9KqThzpcUDn+ZU2c+mTMyw==} - peerDependencies: - '@tiptap/core': 3.23.1 - '@tiptap/pm': 3.23.1 - - '@tiptap/extension-bullet-list@3.23.1': - resolution: {integrity: sha512-owWnBBI4t+jqVDY0naDjhsAmrNGldh4czouef2K+mEf032B7uGsDVCwKp1qaX1JZesyYDfvXOaIwT22hNID2mw==} - peerDependencies: - '@tiptap/extension-list': 3.23.1 - - '@tiptap/extension-code-block@3.23.1': - resolution: {integrity: sha512-BdJGqM57CsKgYrQUZz78vIG8Yn7EpsE2pA7iKn5tYoSXpYtt0IaU4qB1heH7lwWD/vVCAm0YQVD7/0F+0++yhA==} - peerDependencies: - '@tiptap/core': 3.23.1 - '@tiptap/pm': 3.23.1 - - '@tiptap/extension-code@3.23.1': - resolution: {integrity: sha512-nGuhb4YghgTfkejwWHrD9GSpwcC5kkVmm2sN/UY4yceDw+PkyysYKJWZehRLTOC8GNgSAhq/EeQeq14Xwk6dyg==} - peerDependencies: - '@tiptap/core': 3.23.1 - - '@tiptap/extension-color@3.23.1': - resolution: {integrity: sha512-OYk/fT3h8Bz4B6GUVTQDvKGpPnpI5d6QHkuqjVhdFsgH3oo58PdLE1TdIGgeavuYPLaFxgBtEXmm3oTY9jPWxw==} - peerDependencies: - '@tiptap/extension-text-style': 3.23.1 - - '@tiptap/extension-document@3.23.1': - resolution: {integrity: sha512-NA5Rx59HRwG6Hb6LwLpC5lE7z6vCj6f90S7RNNsnE+CyiXNR/OhY2BcjuxiGnascHvsnsAbvxGU3ymKMDgvDVg==} - peerDependencies: - '@tiptap/core': 3.23.1 - - '@tiptap/extension-dropcursor@3.23.1': - resolution: {integrity: sha512-WRN7e/h9m3uI5j9/+L6jcPhHbTL6aKxfFfQWZHNf5M8TqSL1P+/2h034td0XMj3n48i4fWyzjVUV9+sz6t2fDw==} - peerDependencies: - '@tiptap/extensions': 3.23.1 - - '@tiptap/extension-floating-menu@3.23.1': - resolution: {integrity: sha512-XrYHpLn1DpLFSGTko9F9xgbNamL6fGpWkK4wqgwPVbg/SJwQCDO/9p5D3DtJTwD+xgw4sQ9as4O6rt6jx8JT+Q==} - peerDependencies: - '@floating-ui/dom': ^1.0.0 - '@tiptap/core': 3.23.1 - '@tiptap/pm': 3.23.1 - - '@tiptap/extension-gapcursor@3.23.1': - resolution: {integrity: sha512-E4hB0xquUpEXy7kboLBazrFyRCsN0j0fsTFR8udgQf5xetAVPhOexSTKuzOcU/n0kxsKJin7laYYEag/Fd2KNw==} - peerDependencies: - '@tiptap/extensions': 3.23.1 - - '@tiptap/extension-hard-break@3.23.1': - resolution: {integrity: sha512-XYkCKC5RVqMmmBk+nd22/6IDDx1OC54sdStH5VEHtfOrarriO0JztK8Mr0TijPPk9N4rKXsmndYZM2xyWZZytQ==} - peerDependencies: - '@tiptap/core': 3.23.1 - - '@tiptap/extension-heading@3.23.1': - resolution: {integrity: sha512-1z9yCSp8fevgX3r/4kWXO3of0WFCQWfYjWfHANvoJ4JQTYBkARjXlj1tbk5rrAJBFDDfKRkUpZOurXKgGo+h+g==} - peerDependencies: - '@tiptap/core': 3.23.1 - - '@tiptap/extension-highlight@3.23.1': - resolution: {integrity: sha512-Bf5u5KBb6SLveKzPgUEbHoU5uWTUcEvSSZr/mpQZpvCpE6MlXZbvengmFj1OkKnrNZWg0Um2p9e6zKnZHH07sA==} - peerDependencies: - '@tiptap/core': 3.23.1 - - '@tiptap/extension-horizontal-rule@3.23.1': - resolution: {integrity: sha512-30XUHXdEZxcz1FCWjz9HW2EEq06NQcAye6rXGnvHo6Y60iJ6MRsrX5byvceFNF9DTVtOIcUFBQ/psIiRcoi0KA==} - peerDependencies: - '@tiptap/core': 3.23.1 - '@tiptap/pm': 3.23.1 - - '@tiptap/extension-image@3.23.1': - resolution: {integrity: sha512-rAyfh8HS0PfXS8PKl1VQUiDFzXtF5SlrILpOPmz+4Oc4pmI+/vN+ain4z8k6HRxWM03YVpvLvyeQ0OFwi/fq3A==} - peerDependencies: - '@tiptap/core': 3.23.1 - - '@tiptap/extension-italic@3.23.1': - resolution: {integrity: sha512-lZB9YCjoVNDoPMguya66nBvaS/2YpGN5iAcjAGx/JQkCAZeOAtl9+ALMzbWPKH6tQP6m98YtkY1T7RXr++T0bA==} - peerDependencies: - '@tiptap/core': 3.23.1 - - '@tiptap/extension-link@3.23.1': - resolution: {integrity: sha512-uOeyLqYQI0WG62agpFG24kVHSn3Z48gD8Y0uLLJbtzh/nDFC3d9So2sQGWlSVyMzsgkJ4k/9jNnxxsVO8qgJOg==} - peerDependencies: - '@tiptap/core': 3.23.1 - '@tiptap/pm': 3.23.1 - - '@tiptap/extension-list-item@3.23.1': - resolution: {integrity: sha512-Fk/884un5OSLCFxe2TbOmfp3sLMB5b76CnMjaSrvgfiaZnsV2WlJZGPXxCAPbxNIATTykNlSBsVuMBO7we64Vg==} - peerDependencies: - '@tiptap/extension-list': 3.23.1 - - '@tiptap/extension-list-keymap@3.23.1': - resolution: {integrity: sha512-sHbE5sxiJzhgGn94GUAzD4qKM9SyImBrOlAGS/EIe+pausjqQE7xi+YW0gRo2jG+gXhSYl4/oAGXQXzmSInSUQ==} - peerDependencies: - '@tiptap/extension-list': 3.23.1 - - '@tiptap/extension-list@3.23.1': - resolution: {integrity: sha512-v1AeXPpagslgRZdOp7WdjCoO4TjjNP8RM2R6Gqx0/inGaNXnM8zCMshOxZlAb03Ad7kq/4RGJmkpM/Jjsi6dEQ==} - peerDependencies: - '@tiptap/core': 3.23.1 - '@tiptap/pm': 3.23.1 - - '@tiptap/extension-ordered-list@3.23.1': - resolution: {integrity: sha512-3GG7YFhVJWw/HWmRxvMMUC296x7TPBQRLsH4ryEC1SMAmVJnbTIvetyvIcLqLEXGW7Rj41S7SO8qjOXVceSOTA==} - peerDependencies: - '@tiptap/extension-list': 3.23.1 - - '@tiptap/extension-paragraph@3.23.1': - resolution: {integrity: sha512-GC7b6yAjASl1q9sNkPmukZmVYMfxx03EEhpMMrLYJY9GBz82Ald927yYQsOqf2aKA/Rjo/aZMYCGtjXkGk6aBA==} - peerDependencies: - '@tiptap/core': 3.23.1 - - '@tiptap/extension-strike@3.23.1': - resolution: {integrity: sha512-+R5LG0ZW9SDZc4weA79uq6uUduVsCEph9tRcoQCRA82IVIiPYSTxTLew9odalmk/Mc7vdZvOK5jjtO5jUVw/rg==} - peerDependencies: - '@tiptap/core': 3.23.1 - - '@tiptap/extension-text-align@3.23.1': - resolution: {integrity: sha512-ap4ZN31v57mVX2P+0OoW5iO+ehsUNe0C5MgF/Ta2F/HRmTCc1M1mFqYUCk8zJYX1TFRV18vqK2j6STRBk0R8ng==} - peerDependencies: - '@tiptap/core': 3.23.1 - - '@tiptap/extension-text-style@3.23.1': - resolution: {integrity: sha512-q3GQQo+lBhrtNkqdbhYWnv/byG/RYAxVnNhYPQMubRzavGdXBU8NhpJ/47YYjPimG1sahzcs2aqy7amVd8ri/A==} - peerDependencies: - '@tiptap/core': 3.23.1 - - '@tiptap/extension-text@3.23.1': - resolution: {integrity: sha512-k1Ki9bBV6mLz1mFP+Laqh1YHJ2MY0P8XzaMqpkgMndEBIJQ3XcpWQc5bfAlRnYcOI9ZXDbAgQ8CwgArxHmQWCQ==} - peerDependencies: - '@tiptap/core': 3.23.1 - - '@tiptap/extension-underline@3.23.1': - resolution: {integrity: sha512-+PvHyVozHyxJ9oWCIQx5JHBZ7LAa/sFJUOFaKyfmel4gL9AbP52MmvrciXARlZHd1WCULJtdbLan0+x5/D/9hQ==} - peerDependencies: - '@tiptap/core': 3.23.1 - - '@tiptap/extensions@3.23.1': - resolution: {integrity: sha512-7UIn+idaVTVhdlP0KmgzBh8Csmwck357Dq4te5DuAxhSkN1gsXHlq39mpx907UYKJdSOgd+GMFeyOziPwSmbOQ==} - peerDependencies: - '@tiptap/core': 3.23.1 - '@tiptap/pm': 3.23.1 - - '@tiptap/pm@3.23.1': - resolution: {integrity: sha512-8G+TkNsUHHAAJYREpA6fw+Dw/m2Y3Go4/QMQM8RYepid+wTeE1wSv7sBA/CBrphhYmJSWeTyCPtgQIxnTJXMCA==} - - '@tiptap/react@3.23.1': - resolution: {integrity: sha512-43zUwKOcsxRIcgiDbcEUagojhPIez2OIryaNG/uiDcRzkrUteiTu2wSJndkQqwouwh3wJEm+KOw8xybNYvU+qA==} - peerDependencies: - '@tiptap/core': 3.23.1 - '@tiptap/pm': 3.23.1 - '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - '@types/react-dom': ^17.0.0 || ^18.0.0 || ^19.0.0 - react: 18.3.1 - react-dom: 18.3.1 - - '@tiptap/starter-kit@3.23.1': - resolution: {integrity: sha512-CURePHQagBaZIDJrHH3of4Nmi0VYGpZ6yBlkdFxFHBxY9aeG2/h5kn+oHo8GbzkSFsRV+9olzRgDTOULVgs8pQ==} - '@tokenizer/inflate@0.4.1': resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} engines: {node: '>=18'} @@ -3266,46 +1553,6 @@ packages: '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} - '@tria-plc/api-common@0.1.4': - resolution: {integrity: sha512-lm9esp5PDxUyggqxYXbx2CQhZKwtcAaAcGFuuUURw3u5DlzGUNwMOFkQkDLM/fbgN+33+s1RKC7UynnG9NZFww==, tarball: https://npm.pkg.github.com/download/@tria-plc/api-common/0.1.4/de160e4bb61a882efd9c877b4614028f1ffd7cb8} - peerDependencies: - '@nestjs/common': ^11.0.0 - '@nestjs/core': ^11.0.0 - '@nestjs/jwt': ^11.0.0 - '@nestjs/microservices': ^11.0.0 - '@nestjs/passport': ^11.0.0 - '@nestjs/swagger': ^11.0.0 - '@nestjs/throttler': ^6.0.0 - '@nestjs/typeorm': ^11.0.0 - '@tria-plc/iamapi-common': '*' - reflect-metadata: ^0.2.0 - rxjs: ^7.8.0 - typeorm: ^0.3.0 - - '@tria-plc/iamapi-common@0.1.6': - resolution: {integrity: sha512-qaCLZ1TgbcQ5XciRuA/aZjRCM/GmGYgcmsyDDIlhiMNw3FL3DCiR/QiFuQpERvV4FqgQNBJg66+S/jXO3I2jbw==, tarball: https://npm.pkg.github.com/download/@tria-plc/iamapi-common/0.1.6/e2a8f3357b650bb9477facae4aaa7044382acebf} - engines: {node: '>=20'} - peerDependencies: - '@nestjs/axios': ^4.0.0 - '@nestjs/common': ^11.0.0 - '@nestjs/core': ^11.0.0 - '@nestjs/jwt': ^11.0.0 - '@nestjs/microservices': ^11.0.0 - '@nestjs/passport': ^11.0.0 - '@nestjs/swagger': ^11.0.0 - '@nestjs/throttler': ^6.0.0 - '@nestjs/typeorm': ^11.0.0 - '@tria-plc/api-common': ^0.1.0 - axios: ^1.9.0 - class-transformer: ^0.5.1 - class-validator: ^0.14.1 - reflect-metadata: ^0.2.0 - rxjs: ^7.8.0 - typeorm: ^0.3.0 - - '@tria-plc/iamui-common@1.0.3': - resolution: {integrity: sha512-RebVPhbHpV4VtaUlBi/sqJlGf0vXrDO6iVq/VvSFgxd10YlEVR7lGvkXC1ManVOK+Aq3d+mBKdDUAVgI5ATZJA==, tarball: https://npm.pkg.github.com/download/@tria-plc/iamui-common/1.0.3/61c1cb36a5737a5c1f2d8595dec8aeca055a3a62} - '@tsconfig/node10@1.0.12': resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} @@ -3375,33 +1622,6 @@ packages: '@types/cookiejar@2.1.5': resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} - '@types/d3-array@3.2.2': - resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} - - '@types/d3-color@3.1.3': - resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} - - '@types/d3-ease@3.0.2': - resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} - - '@types/d3-interpolate@3.0.4': - resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} - - '@types/d3-path@3.1.1': - resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} - - '@types/d3-scale@4.0.9': - resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} - - '@types/d3-shape@3.1.8': - resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==} - - '@types/d3-time@3.0.4': - resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} - - '@types/d3-timer@3.0.2': - resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} - '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -3423,11 +1643,6 @@ packages: '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - '@types/hoist-non-react-statics@3.3.7': - resolution: {integrity: sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==} - peerDependencies: - '@types/react': '*' - '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} @@ -3443,9 +1658,6 @@ packages: '@types/jest@29.5.14': resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} - '@types/jquery@4.0.0': - resolution: {integrity: sha512-Z+to+A2VkaHq1DfI2oSwsoCdhCHMpTSgjWzNcbNlRGYzksDBpPUgEcAL+RQjOBJRaLoEAOHXxqDGBVP+BblBwg==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -3467,18 +1679,12 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@14.18.63': - resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} - '@types/node@20.19.41': resolution: {integrity: sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==} '@types/node@24.12.4': resolution: {integrity: sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA==} - '@types/pako@2.0.4': - resolution: {integrity: sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==} - '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -3500,9 +1706,6 @@ packages: '@types/qs@6.15.1': resolution: {integrity: sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==} - '@types/raf@3.4.3': - resolution: {integrity: sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==} - '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} @@ -3511,11 +1714,6 @@ packages: peerDependencies: '@types/react': ^18.0.0 - '@types/react-transition-group@4.4.12': - resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} - peerDependencies: - '@types/react': '*' - '@types/react@18.3.28': resolution: {integrity: sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==} @@ -3525,9 +1723,6 @@ packages: '@types/serve-static@2.2.0': resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} - '@types/signature_pad@2.3.6': - resolution: {integrity: sha512-v3j92gCQJoxomHhd+yaG4Vsf8tRS/XbzWKqDv85UsqjMGy4zhokuwKe4b6vhbgncKkh+thF+gpz6+fypTtnFqQ==} - '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -3537,15 +1732,6 @@ packages: '@types/supertest@6.0.3': resolution: {integrity: sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==} - '@types/tinymce@4.6.9': - resolution: {integrity: sha512-pDxBUlV4v1jgJ97SlnVOSyf3KUy3OQ3s5Ddpfh1L9M5lXlBmX7TJ2OLSozx1WBxp91acHvYPWDwz2U/kMM1oxQ==} - - '@types/trusted-types@2.0.7': - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - - '@types/use-sync-external-store@0.0.6': - resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} - '@types/validator@13.15.10': resolution: {integrity: sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==} @@ -3703,243 +1889,6 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - '@zag-js/accordion@1.40.0': - resolution: {integrity: sha512-YDdyvZJ6fr92RZazyXQq+juT3ZA0ubjDISptb5YPgMoTPdnjKNiICPpMeCeVj1ncYRDkHXrOdChS/5CtuX/K6g==} - - '@zag-js/anatomy@1.40.0': - resolution: {integrity: sha512-oiB4uAaV//L38JluLVPtOHO3xvqambrfrXVOoq4kmNrBv1LLlCmFvrXA2HOR9lakn4ExK27XSUrKhUN7YlKjfQ==} - - '@zag-js/angle-slider@1.40.0': - resolution: {integrity: sha512-6X6bOBoCyYG0/lFY0Y+AXJZZG6CeYQiWkcMXvegxCC2zxthodqOVzkVOASW+6rzLjn2bru+V5O9RMjNgmCumKg==} - - '@zag-js/aria-hidden@1.40.0': - resolution: {integrity: sha512-lNWujEIlfGKwMQIcgfXuOZSsJD2avrgPsQHrXNVF9mkXygjLFcIRKz2pEexTSCqFh/HuUZJ6rG4pM/hJ/BiVCw==} - - '@zag-js/async-list@1.40.0': - resolution: {integrity: sha512-hLGUTtwRFl6FIdYxSIYSeLQjJeG4isKpdmGCUvtWNnKr7ayf1yAkkSwX10SdBMWOCldbtvKCZXumKvP6dDwNvw==} - - '@zag-js/auto-resize@1.40.0': - resolution: {integrity: sha512-eZC+AGKUip7UMu41/ApeT1wCIgn2fmo63FJeGAdMMD8E9M8M7QLsfISMIoieNNGBAYWhSyqELQ3jPgkUf6xReA==} - - '@zag-js/avatar@1.40.0': - resolution: {integrity: sha512-DayZDsNXbipT+1GUkX29tVhO4hZonDnidwE3SjEQv9Ic9vCdnwP95+B0FPEuaca03F5ZXFqVXjnPmRVbRMyDYQ==} - - '@zag-js/carousel@1.40.0': - resolution: {integrity: sha512-9svWc2jjvUP8iQ0afuu/ZAI75PuPLm4qB7h+10rmDrAgUPn7fwUBVzyATKubJPdtmaYQQvTTIiZU2B8mV88oGg==} - - '@zag-js/cascade-select@1.40.0': - resolution: {integrity: sha512-0fkE0Fd2VQ4QsaWXHdgQxHWiaef3UWW0l6Jd47frtMNnrvg5t5Xfqowa7c2S23hcduOUfz2WC0xEuGXnO4UVDQ==} - - '@zag-js/checkbox@1.40.0': - resolution: {integrity: sha512-oFCgnkOjrUDejB1wEp5s3cyJ+uFe/GoI3+wqNyckqOtcdKL1MBxy193GYVdj0LDfuCNrk8V0aIJGTdusCD2b4A==} - - '@zag-js/clipboard@1.40.0': - resolution: {integrity: sha512-QbFhJMwwUxTKcbWyb9ZrKgAp13U4+IzfHSLhPxbDVSQ15mIrjIkjW68gS6ElzhRDwGr1qawkZVApsqcToUqSaQ==} - - '@zag-js/collapsible@1.40.0': - resolution: {integrity: sha512-xDLY4j9D3gdoTirkwzMaCtelfCjnMhBzPyY6c/mh4oPvD3RB6dr3V3kI80i3yxHaUUeDCIUm/XAxK0InPsRBug==} - - '@zag-js/collection@1.40.0': - resolution: {integrity: sha512-+3o1nvbcA9Kz2hDDFf8Kngpd+of33S4TS5Tb9KvrHlU5ieQdvEUtc7/pWG2aCTkGpmgda+j91akB6ZB8+oVkvA==} - - '@zag-js/color-picker@1.40.0': - resolution: {integrity: sha512-lT93xd1BlNBbitl2RxST8ARYE6q/HZD5a0QhMIT1RbndB8F4e9j/NxkStgE9f0QqgpC/rO+nKHLoR+H1xs/EkA==} - - '@zag-js/color-utils@1.40.0': - resolution: {integrity: sha512-PZihcGheb5bn0/cEUwozjJjPoKkEwlJNpTA5mUxj/+sOElLaZM+zY2AnGYeMl6w5zIyZZUDoJMIT5rcb5sN87g==} - - '@zag-js/combobox@1.40.0': - resolution: {integrity: sha512-5IVCDrB8m7XrKBu28j7bIRE5KiyKJLPDZB3AJ+PLJyL69D+9z1anhLDmkUYcPseyCasszLKzIejby+kYQJgHlA==} - - '@zag-js/core@1.40.0': - resolution: {integrity: sha512-0YcqCh7TmhSonkbKM/7NWolxlaQgvvXgqedocW9oeRYiDJIpBZyRqnHPoGAS2XwbBPkCnrqSosxSF5yBjhZpgw==} - - '@zag-js/date-input@1.40.0': - resolution: {integrity: sha512-/VU8g3dugggC5xW2OJW1KONWzPkEbK/yLA0lPxymW/Uo0ixh2mKJUVTOTqDFWf1b0vzLX2XlYoLL+I2ryUyPvA==} - peerDependencies: - '@internationalized/date': '>=3.0.0' - - '@zag-js/date-picker@1.40.0': - resolution: {integrity: sha512-Nm3aSKn/5tGOZk8rIddLyBk+oeE0zr/ZsJuuTc3rysd04owVy1UhmUh6X9CqfTJtwTDpUZe+orHaIvKlE3Rd0w==} - peerDependencies: - '@internationalized/date': '>=3.0.0' - - '@zag-js/date-utils@1.40.0': - resolution: {integrity: sha512-nuB1QM3X7yY0k2JiZbHHm6wigY+Cl1QK6sRlh+C7mOyzEKnNEqNSVIqgSionCtWO6zAZh1R8Znp5ZeCdbbc27w==} - peerDependencies: - '@internationalized/date': '>=3.0.0' - - '@zag-js/dialog@1.40.0': - resolution: {integrity: sha512-1FHxR7/Kuu+9K2dxH7dKlSckCZ26n5ec79qWr0aMSSs2DF+ypQf5GUlaS6z2UqroZvIoJCvABVMm9OMko/qxlA==} - - '@zag-js/dismissable@1.40.0': - resolution: {integrity: sha512-bBkFvPg/zbYn31ZgEfx8not6s2Ekx7zU2sO8tGXb8rYPnHBfGDYEzVQansUStJn0Atzw+y7XR7B3G3u5AFQJKw==} - - '@zag-js/dom-query@1.40.0': - resolution: {integrity: sha512-4J3EO2gHpZ1VZiGLuMlH6G1Tsp4gKB8PPt2yKeNQWYGEXyrHUXrvMhRUzv7Z4/2I1s1tnxlFG4F8ovB3kTpz/Q==} - - '@zag-js/drawer@1.40.0': - resolution: {integrity: sha512-N2OR5ZYuTsWkYYmwsNgmL+wfuM3qUxB8GAfo53AWvOh07QUVz1Dvh1WP4km5L6Tkz4UBQZACu8T/ZLyeZ+PdWg==} - - '@zag-js/editable@1.40.0': - resolution: {integrity: sha512-X23wOg42BPvFWfJQi3yd8HiL8xtisrpL5ouFEzba56SQIxWZHDRpeWoqXqyLODq2/z2+SsZ0wV3laRD3ZH0C2g==} - - '@zag-js/file-upload@1.40.0': - resolution: {integrity: sha512-hUZlJYjSGk7SAflTmQIjZv6M+icujaHS6I+dik2LM48rLWwNa/GYTNx+uY4zJLd9oW1eEj+6NcCYZpPWzKku4Q==} - - '@zag-js/file-utils@1.40.0': - resolution: {integrity: sha512-BGny4rafiBQ5TPCBXfzbH7lSyFdnoix7brq/+FllKpDqpWPQz0tIsgSZueF/Z8GPTrAkwMKOFI99P7OVhAhRig==} - - '@zag-js/floating-panel@1.40.0': - resolution: {integrity: sha512-e2QXwapCbjLJnU+MAz06CoByj4XJ3sdSBgWF+PSe2X2T8dd/FkZUnaDPaX0yyfyTWKzBbyRRNyon2LMAs8ndHw==} - - '@zag-js/focus-trap@1.40.0': - resolution: {integrity: sha512-Q6W+DU7pix5rtRwoDnYzTYMkUV2kMWrFV0/EdNN3spFSvnUSkDWRmcNpzf+56AuCNeqsAZxaLJpsHLZkcT2xrw==} - - '@zag-js/focus-visible@1.40.0': - resolution: {integrity: sha512-63byl/kLVzDYlnHFma4HKEKrqB1Vx2zg0sBmUSENPyh+Ia1xhEVVC5vu6GX7nu4t/8QRy3Jn0q7T5og81FGb1A==} - - '@zag-js/highlight-word@1.40.0': - resolution: {integrity: sha512-+aeVn3S5NPG6Tk4Sanl0VZk/0atjnF7Xy7POPs1HD5SBui29/6i3vn3bUBNXJXrnhUoNrUhuySVYVhgkffcQ7w==} - - '@zag-js/hover-card@1.40.0': - resolution: {integrity: sha512-lkuLaikPLBIOnR0X75kSXdDYgv3ritAsn4TF1eGs12iYnZVX4PTL3J39tVNm9QrEXZ+iKcA1D2cUXNhEteCTyA==} - - '@zag-js/i18n-utils@1.40.0': - resolution: {integrity: sha512-8D3ki9V81gMKZvtRfNVoHCBDVYjr+WJLBvdfSv3cdOsVM2/E8//xAfYbYzl5Fdmeny3H71fxBNqOX05GN4K6OA==} - - '@zag-js/image-cropper@1.40.0': - resolution: {integrity: sha512-bpTCaiUXM0Mh6ddoJ1fA1B/YXp5Fc8LA0hg8CuEByDwGRVKPJ0KotL6QXMF6cEJZ1fcHF3Lcmpbj5Xotfkr4mA==} - - '@zag-js/interact-outside@1.40.0': - resolution: {integrity: sha512-Fws+O4uD9vS0I5KVcf3U2tNjLKvqlv+RExFbTywckDLOCJ145M/pMQWTr1FHil04jk5PFyM1iGfsbom8tozHpQ==} - - '@zag-js/json-tree-utils@1.40.0': - resolution: {integrity: sha512-7zEzU59Gz76nV7n3l70uMB5yAOOQMmt1PTAni6S97uw7/6KzPktsEWBcw7ocC4IIA42PKdT7akpq721H0vthbA==} - - '@zag-js/listbox@1.40.0': - resolution: {integrity: sha512-zB33y+dk6/e0ZTs3wun2KsuPaH/wygOuD8scnH2a2Y/W9a2P1rq503Kgm5d5kVXBKQLxOBwievWJ8Blajv8LnA==} - - '@zag-js/live-region@1.40.0': - resolution: {integrity: sha512-i1Dx02KGcQOAZGNhkFe8kz26gYJcn7KsT/M1UovjS9RTbl9diY8ShiyfIAhqruoaHQyqsHMRh/f7Idu45HdiDA==} - - '@zag-js/marquee@1.40.0': - resolution: {integrity: sha512-XfvAwSNYXV3fEIRc44a9sAsoJoLKt+CWbpSPgQBpiFPpWh0rZ8frUZCslevTzBB3ifIWoSg+svDHQOGsDa8wGA==} - - '@zag-js/menu@1.40.0': - resolution: {integrity: sha512-FRBqwsOjxBi0eSwqwrOw2td1rd0Xxl0f41J2lGc8E7z+2PabbBcJ/poqSiEn8YoaCT4mAWNjt4QQU/Pe1bRJ/g==} - - '@zag-js/navigation-menu@1.40.0': - resolution: {integrity: sha512-aJkEGYH8P9NfsQOjxMzxuF4YrrV2N1GQj6Y5Ow19MKuLh42o35bUhwoGsYjFbxgEcImabINtZJqtAPAkOdJXmQ==} - - '@zag-js/number-input@1.40.0': - resolution: {integrity: sha512-WffdeqSOpsKmgPzBkNZl9nAolQPlyl9dIabaPguGgXdYtZW/OGCGj8jCYqyEu4VL3kDPPVVQRWEqC/XzwzVCRg==} - - '@zag-js/pagination@1.40.0': - resolution: {integrity: sha512-Ykotky0A/7rswb6BfOD9aXL1EssKwUYfBRbdWGe52uhVc7dGagMSTUDRVeNhVsP/MEdtwqys7urvDbAlEqq+GA==} - - '@zag-js/password-input@1.40.0': - resolution: {integrity: sha512-mD4tbA4m82oV+0NbJ+P00Q4Gwz+zf1kZEZ3Z48ohICfK/WO1KhCgviY7vu/7bCMnRiD3dbi+nEeym8Kb29wRHw==} - - '@zag-js/pin-input@1.40.0': - resolution: {integrity: sha512-iJIXDJC+9DUx+A3sRdTmHV7vPZXCw9O6le3R0lKf/8kQOgj7FKjbVw2SkUMAoOZ0u5J7Zwg2oZc7ddt1pwUk9w==} - - '@zag-js/popover@1.40.0': - resolution: {integrity: sha512-bjvOep1YNlsvIYGh/rPsFCHjH2cCt2aKsVLyRvzTT1jhGZJvBdQKQBJjSuG5Nh4y1PUqtrrz69ZMWRrJGQ3rNg==} - - '@zag-js/popper@1.40.0': - resolution: {integrity: sha512-rCkgqgwlpgMwcnuSVrZK2xXl1Mvptpuw3cZy6rC2C5F3yE1GmWohdts5VkeQNro+sd/xHTdVovOqY6cU9Htj1w==} - - '@zag-js/presence@1.40.0': - resolution: {integrity: sha512-P0bAuzEIDuMglE1xfmW5xTuSBlWjNZ8nOGXoIksKOKb+b+jy2Vys6WjZjKipV/jop4u85wfzKchcPc3C+cXuog==} - - '@zag-js/progress@1.40.0': - resolution: {integrity: sha512-V61a5CHEs8suevQVS+/1ENj1RDVYNOUUTawK6uriCA6Ol59xe30DmF+eV6Y9miM7L/pN3YjZRq9uEDJMXXK32g==} - - '@zag-js/qr-code@1.40.0': - resolution: {integrity: sha512-xD37tVrQ46CeqVLqkSm61kURoJ4Z/uOFcB8z7Hu3UX+1OFTfkhgrns6iLUneoRjO3hsqQaTaVkxVOQeLYWb+wA==} - - '@zag-js/radio-group@1.40.0': - resolution: {integrity: sha512-sFJCdyOKzQC9hylSP19R71yv44by/C78D9EHfsxQJtvOgDv9E+h13NNX4n9wWyubC20xftlxkja8sNT5NfJKUw==} - - '@zag-js/rating-group@1.40.0': - resolution: {integrity: sha512-UMBI3xAMcm7otpAczMGPEA7jC1hvV8NhnZ4mN3oftJB0bc1winoXxJdCkrXN58TTNWrGNSRzjtm048G+HPCdpw==} - - '@zag-js/react@1.40.0': - resolution: {integrity: sha512-2TFS1HYABYGc0lurC+4WEXvKkpxsVv6vKm+t8QAL7wfoeZnw6HDQWLc91kINp89vln+A2kwCfYqIq8HSm+9EeA==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - '@zag-js/rect-utils@1.40.0': - resolution: {integrity: sha512-ikgLuE4rLlACm4mGLp6Ga8sJA44uFwohA1nVmb95sQ+VIyx2naf91CEF7SMrZVEwFKHaHpxdKVQSZLRjJqO/dw==} - - '@zag-js/remove-scroll@1.40.0': - resolution: {integrity: sha512-f6EgODnJMRtkbgdJCgyllND8jui+RtPrCZy6JYhhOg7KQ+bFfV36KzWQMty38ZdOyrh23UUO7MJ3WGcFXPvk3g==} - - '@zag-js/scroll-area@1.40.0': - resolution: {integrity: sha512-7EtWETRIn8dY7xqAeMOlnEuzhOrtc65mN/0YvT3XYcBz/CzmHzyZTmos3UXBJGnKHSGj61aEpP9g3RK+x/w63A==} - - '@zag-js/scroll-snap@1.40.0': - resolution: {integrity: sha512-XtjeOd+pwGX0+K7NvsQncrKwV8CTSzHfVVJrdQ+MweiWBpGNeAh43ySN4L+KSTgtnUiZbuwBIxlKK0tX+WupgQ==} - - '@zag-js/select@1.40.0': - resolution: {integrity: sha512-auMI9SvocVvKHNWF2DobyQN6+1k3OO6UsQTdkofvbHxX7maosy8ZXA6k1r9Ndt4qLUu7CbdAAQ+qJ4VkgJyvxA==} - - '@zag-js/signature-pad@1.40.0': - resolution: {integrity: sha512-L0LTxcpdckaGdDDXcQCr4AG+J9xUHH+lsenH7NG4ZI7rSr4nRmHMdDH0GR7nBa6MMdPIIimjWIE/TwZ1OuHzCQ==} - - '@zag-js/slider@1.40.0': - resolution: {integrity: sha512-xZGycm+ghGFG3kTYq8g0t1Av1moxg45WiFz5E3bRgP7YU9beSTaFZI8h6f65NiC5P3YuwA0RoYxA46GH22qoZg==} - - '@zag-js/splitter@1.40.0': - resolution: {integrity: sha512-64KNKwlIjyUIjp7i/whDCpREiSFrNI/cF7MpBJvBGRPUWq8NpNxMGKWD+vBCV+JC61QF9xg/NgNoigFycS9sYw==} - - '@zag-js/steps@1.40.0': - resolution: {integrity: sha512-5sVFzcIYubCn1nJSQIx9WWNlJuFoOJMpkD/ZMwNp0LzpnmnspsCOmdnQUWEftMQ1KdwZ+qNgfo/+kHclb9cBjg==} - - '@zag-js/store@1.40.0': - resolution: {integrity: sha512-EmgYIdbNZ4TN4Qht/jugY4UVkaWx69l8P1qiX23U4YwqNLq10tyOJmcXWbvsrprU1dGb24B+xq0WBm/RIjw4WA==} - - '@zag-js/switch@1.40.0': - resolution: {integrity: sha512-hUH3AF79ndSFZxt7Plw7mVZV0QlM0kFqKwrAGBEOE77P3rKpOsMJ3wWgMb3w6nwlxGQsbwmMgAFvYUslLpM4Lg==} - - '@zag-js/tabs@1.40.0': - resolution: {integrity: sha512-xqfPC2nQ6Bn4nqy1L+1CVcQcg/Z7K2q753OvsX2C8Wtu+7tF//HyMbOpF6fGikqlLkUzCkvjkqDjdOXcfWN9ZQ==} - - '@zag-js/tags-input@1.40.0': - resolution: {integrity: sha512-3cB7nPlUvzZNZwQw5AaTuxwcRn1n2qkDCjLEb2NEwtmI+YxHbK3k1MtXjTccjcYjU8cAkv+jaeyZPs6KFKQcHA==} - - '@zag-js/timer@1.40.0': - resolution: {integrity: sha512-Rvet226fhUtZnItjHpUYV7MH0uEFZfXT9PSRrX5jdiU4/P0eWKbirwi//AVeqcWFexXvw6ajYSfQN7EVyr2x4w==} - - '@zag-js/toast@1.40.0': - resolution: {integrity: sha512-EDH43zdiH4Bz30cE6YI9g//qXGOOfWObM3dFLG8I0q/cJRf7/6jO82rwZAHPwfOSfKhUDxStirD8F6eoY6BWXA==} - - '@zag-js/toggle-group@1.40.0': - resolution: {integrity: sha512-+JKcnfEbdQnr5p7uRvYLdivhUsM6iio71UC10tK74nXYRnYm0/Uvxg3oQzvbNTq9WdcU/DIh3gZVZ2Vex9nBnQ==} - - '@zag-js/toggle@1.40.0': - resolution: {integrity: sha512-DW7682lzTP2eDlMvrS7tUX3zAm7ufrrKr7VDiX8BB6oXBRETXrVIxCYNuoIdqjwXebdjAoxaCiUZEreRVucYQg==} - - '@zag-js/tooltip@1.40.0': - resolution: {integrity: sha512-pyrvit+nB8dIwVNTGBRlHPsh7yMJGAxxM1zfY7HOTJqF+n6+6xYTQ4gQ/Ocy1Q7I5kO88+m16naEh0qLFiTZww==} - - '@zag-js/tour@1.40.0': - resolution: {integrity: sha512-VczYGFQM9xsSbfy5N0NP91GdKxbYvfPCDAguD+WQSs1umEIgAAozSKPUdV3NNCX5Pq6B1F3dBxi6gYPdNqrAHg==} - - '@zag-js/tree-view@1.40.0': - resolution: {integrity: sha512-v/20ekjbM+HXDEkpHAz6k8WpoZRmZmdCApDIkIgXVHPRQk+kwAiiIPY20ZDG+DjRu7Lh0MUdQavdZtGj6Ihwkw==} - - '@zag-js/types@1.40.0': - resolution: {integrity: sha512-LVvxEyqFv/u9SEe5xdivvG2vYb9cCmbkD+5r6s+IGljpDLaRgv4BYyxEh40ri1ai070tL08ZKmoLfx2/xfvY/A==} - - '@zag-js/utils@1.40.0': - resolution: {integrity: sha512-XUpqDtXfHe7CySjOhLPLj9H8rxbiFUJAGgmBzNdpsGPP4wx12cpOXrpSjRXZ2kMwooMPz/P7RPDBteto8sqhAQ==} - - '@zxing/text-encoding@0.9.0': - resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} - JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true @@ -3947,25 +1896,10 @@ packages: abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - - abs-svg-path@0.1.1: - resolution: {integrity: sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==} - - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} - acorn-dynamic-import@2.0.2: - resolution: {integrity: sha512-GKp5tQ8h0KMPWIYGRHHXI1s5tUpZixZ3IHF2jAu42wSCf6In/G873s6/y4DdKdhWvzhu1T6mE1JgvnhAKqyYYQ==} - deprecated: This is probably built in to whatever tool you're using. If you still need it... idk - acorn-import-phases@1.0.4: resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} engines: {node: '>=10.13.0'} @@ -3981,25 +1915,11 @@ packages: resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} engines: {node: '>=0.4.0'} - acorn@4.0.13: - resolution: {integrity: sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==} - engines: {node: '>=0.4.0'} - hasBin: true - - acorn@5.7.4: - resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} - engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.16.0: resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true - adler-32@1.3.1: - resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==} - engines: {node: '>=0.8'} - agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -4043,70 +1963,10 @@ packages: ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} - align-text@0.1.4: - resolution: {integrity: sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==} - engines: {node: '>=0.10.0'} - - ansi-bgblack@0.1.1: - resolution: {integrity: sha512-tp8M/NCmSr6/skdteeo9UgJ2G1rG88X3ZVNZWXUxFw4Wh0PAGaAAWQS61sfBt/1QNcwMTY3EBKOMPujwioJLaw==} - engines: {node: '>=0.10.0'} - - ansi-bgblue@0.1.1: - resolution: {integrity: sha512-R8JmX2Xv3+ichUQE99oL+LvjsyK+CDWo/BtVb4QUz3hOfmf2bdEmiDot3fQcpn2WAHW3toSRdjSLm6bgtWRDlA==} - engines: {node: '>=0.10.0'} - - ansi-bgcyan@0.1.1: - resolution: {integrity: sha512-6SByK9q2H978bmqzuzA5NPT1lRDXl3ODLz/DjC4URO5f/HqK7dnRKfoO/xQLx/makOz7zWIbRf6+Uf7bmaPSkQ==} - engines: {node: '>=0.10.0'} - - ansi-bggreen@0.1.1: - resolution: {integrity: sha512-8TRtOKmIPOuxjpklrkhUbqD2NnVb4WZQuIjXrT+TGKFKzl7NrL7wuNvEap3leMt2kQaCngIN1ZzazSbJNzF+Aw==} - engines: {node: '>=0.10.0'} - - ansi-bgmagenta@0.1.1: - resolution: {integrity: sha512-UZYhobiGAlV4NiwOlKAKbkCyxOl1PPZNvdIdl/Ce5by45vwiyNdBetwHk/AjIpo1Ji9z+eE29PUBAjjfVmz5SA==} - engines: {node: '>=0.10.0'} - - ansi-bgred@0.1.1: - resolution: {integrity: sha512-BpPHMnYmRBhcjY5knRWKjQmPDPvYU7wrgBSW34xj7JCH9+a/SEIV7+oSYVOgMFopRIadOz9Qm4zIy+mEBvUOPA==} - engines: {node: '>=0.10.0'} - - ansi-bgwhite@0.1.1: - resolution: {integrity: sha512-KIF19t+HOYOorUnHTOhZpeZ3bJsjzStBG2hSGM0WZ8YQQe4c7lj9CtwnucscJDPrNwfdz6GBF+pFkVfvHBq6uw==} - engines: {node: '>=0.10.0'} - - ansi-bgyellow@0.1.1: - resolution: {integrity: sha512-WyRoOFSIvOeM7e7YdlSjfAV82Z6K1+VUVbygIQ7C/VGzWYuO/d30F0PG7oXeo4uSvSywR0ozixDQvtXJEorq4Q==} - engines: {node: '>=0.10.0'} - - ansi-black@0.1.1: - resolution: {integrity: sha512-hl7re02lWus7lFOUG6zexhoF5gssAfG5whyr/fOWK9hxNjUFLTjhbU/b4UHWOh2dbJu9/STSUv+80uWYzYkbTQ==} - engines: {node: '>=0.10.0'} - - ansi-blue@0.1.1: - resolution: {integrity: sha512-8Um59dYNDdQyoczlf49RgWLzYgC2H/28W3JAIyOAU/+WkMcfZmaznm+0i1ikrE0jME6Ypk9CJ9CY2+vxbPs7Fg==} - engines: {node: '>=0.10.0'} - - ansi-bold@0.1.1: - resolution: {integrity: sha512-wWKwcViX1E28U6FohtWOP4sHFyArELHJ2p7+3BzbibqJiuISeskq6t7JnrLisUngMF5zMhgmXVw8Equjzz9OlA==} - engines: {node: '>=0.10.0'} - - ansi-colors@0.2.0: - resolution: {integrity: sha512-ScRNUT0TovnYw6+Xo3iKh6G+VXDw2Ds7ZRnMIuKBgHY02DgvT2T2K22/tc/916Fi0W/5Z1RzDaHQwnp75hqdbA==} - engines: {node: '>=0.10.0'} - ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} - ansi-cyan@0.1.1: - resolution: {integrity: sha512-eCjan3AVo/SxZ0/MyIYRtkpxIu/H3xZN7URr1vXVrISxeyz8fUFz0FJziamK4sS8I+t35y4rHg1b2PklyBe/7A==} - engines: {node: '>=0.10.0'} - - ansi-dim@0.1.1: - resolution: {integrity: sha512-zAfb1fokXsq4BoZBkL0eK+6MfFctbzX3R4UMcoWrL1n2WHewFKentTvOZv2P11u6P4NtW/V47hVjaN7fJiefOg==} - engines: {node: '>=0.10.0'} - ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -4115,51 +1975,6 @@ packages: resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} engines: {node: '>=18'} - ansi-gray@0.1.1: - resolution: {integrity: sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==} - engines: {node: '>=0.10.0'} - - ansi-green@0.1.1: - resolution: {integrity: sha512-WJ70OI4jCaMy52vGa/ypFSKFb/TrYNPaQ2xco5nUwE0C5H8piume/uAZNNdXXiMQ6DbRmiE7l8oNBHu05ZKkrw==} - engines: {node: '>=0.10.0'} - - ansi-grey@0.1.1: - resolution: {integrity: sha512-+J1nM4lC+whSvf3T4jsp1KR+C63lypb+VkkwtLQMc1Dlt+nOvdZpFT0wwFTYoSlSwCcLUAaOpHF6kPkYpSa24A==} - engines: {node: '>=0.10.0'} - - ansi-hidden@0.1.1: - resolution: {integrity: sha512-8gB1bo9ym9qZ/Obvrse1flRsfp2RE+40B23DhQcKxY+GSeaOJblLnzBOxzvmLTWbi5jNON3as7wd9rC0fNK73Q==} - engines: {node: '>=0.10.0'} - - ansi-html@0.0.7: - resolution: {integrity: sha512-JoAxEa1DfP9m2xfB/y2r/aKcwXNlltr4+0QSBC4TrLfcxyvepX2Pv0t/xpgGV5bGsDzCYV8SzjWgyCW0T9yYbA==} - engines: {'0': node >= 0.8.0} - hasBin: true - - ansi-inverse@0.1.1: - resolution: {integrity: sha512-Kq8Z0dBRhQhDMN/Rso1Nu9niwiTsRkJncfJZXiyj7ApbfJrGrrubHXqXI37feJZkYcIx6SlTBdNCeK0OQ6X6ag==} - engines: {node: '>=0.10.0'} - - ansi-italic@0.1.1: - resolution: {integrity: sha512-jreCxifSAqbaBvcibeQxcwhQDbEj7gF69XnpA6x83qbECEBaRBD1epqskrmov1z4B+zzQuEdwbWxgzvhKa+PkA==} - engines: {node: '>=0.10.0'} - - ansi-magenta@0.1.1: - resolution: {integrity: sha512-A1Giu+HRwyWuiXKyXPw2AhG1yWZjNHWO+5mpt+P+VWYkmGRpLPry0O5gmlJQEvpjNpl4RjFV7DJQ4iozWOmkbQ==} - engines: {node: '>=0.10.0'} - - ansi-red@0.1.1: - resolution: {integrity: sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow==} - engines: {node: '>=0.10.0'} - - ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - - ansi-regex@3.0.1: - resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} - engines: {node: '>=4'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -4168,14 +1983,6 @@ packages: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} - ansi-reset@0.1.1: - resolution: {integrity: sha512-n+D0qD3B+h/lP0dSwXX1SZMoXufdUVotLMwUuvXa50LtBAh3f+WV8b5nFMfLL/hgoPBUt+rG/pqqzF8krlZKcw==} - engines: {node: '>=0.10.0'} - - ansi-strikethrough@0.1.1: - resolution: {integrity: sha512-gWkLPDvHH2pC9YEKqp8dIl0mg3sRglMPvioqGDIOXiwxjxUwIJ1gF86E2o4R5yLNh8IAkwHbaMtASkJfkQ2hIA==} - engines: {node: '>=0.10.0'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -4188,22 +1995,6 @@ packages: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} - ansi-underline@0.1.1: - resolution: {integrity: sha512-D+Bzwio/0/a0Fu5vJzrIT6bFk43TW46vXfSvzysOTEHcXOAUJTVMHWDbELIzGU4AVxVw2rCTb7YyWS4my2cSKQ==} - engines: {node: '>=0.10.0'} - - ansi-white@0.1.1: - resolution: {integrity: sha512-DJHaF2SRzBb9wZBgqIJNjjTa7JUJTO98sHeTS1sDopyKKRopL1KpaJ20R6W2f/ZGras8bYyIZDtNwYOVXNgNFg==} - engines: {node: '>=0.10.0'} - - ansi-wrap@0.1.0: - resolution: {integrity: sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==} - engines: {node: '>=0.10.0'} - - ansi-yellow@0.1.1: - resolution: {integrity: sha512-6E3D4BQLXHLl3c/NwirWVZ+BCkMq2qsYxdeAGGOijKrx09FaqU+HktFL6QwAwNvgJiMLnv6AQ2C1gFZx0h1CBg==} - engines: {node: '>=0.10.0'} - ansis@4.2.0: resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} engines: {node: '>=14'} @@ -4215,9 +2006,6 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@2.0.0: - resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} - anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -4232,18 +2020,6 @@ packages: aproba@2.1.0: resolution: {integrity: sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==} - archiver-utils@2.1.0: - resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} - engines: {node: '>= 6'} - - archiver-utils@3.0.4: - resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} - engines: {node: '>= 10'} - - archiver@5.3.2: - resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} - engines: {node: '>= 10'} - are-we-there-yet@2.0.0: resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} engines: {node: '>=10'} @@ -4255,46 +2031,16 @@ packages: arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - argon2@0.43.1: - resolution: {integrity: sha512-TfOzvDWUaQPurCT1hOwIeFNkgrAJDpbBGBGWDgzDsm11nNhImc13WhdGdCU6K7brkp8VpeY07oGtSex0Wmhg8w==} - engines: {node: '>=16.17.0'} - argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-hidden@1.2.6: - resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} - engines: {node: '>=10'} - - arr-diff@4.0.0: - resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} - engines: {node: '>=0.10.0'} - - arr-flatten@1.1.0: - resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} - engines: {node: '>=0.10.0'} - - arr-union@3.1.0: - resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} - engines: {node: '>=0.10.0'} - array-buffer-byte-length@1.0.2: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} - array-find-index@1.0.2: - resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} - engines: {node: '>=0.10.0'} - - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - - array-flatten@2.1.2: - resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} - array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} @@ -4302,25 +2048,9 @@ packages: resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} - array-sort@0.1.4: - resolution: {integrity: sha512-BNcM+RXxndPxiZ2rd76k6nyQLRZr2/B/sdi8pQ+Joafr5AH279L40dfokSUTp8O+AaqYjXWhblBWa2st2nc4fQ==} - engines: {node: '>=0.10.0'} - array-timsort@1.0.3: resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} - array-union@1.0.2: - resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} - engines: {node: '>=0.10.0'} - - array-uniq@1.0.3: - resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} - engines: {node: '>=0.10.0'} - - array-unique@0.3.2: - resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} - engines: {node: '>=0.10.0'} - array.prototype.findlast@1.2.5: resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} @@ -4348,55 +2078,17 @@ packages: asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - asn1.js@4.10.1: - resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} - - asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - - assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} - - assert@1.5.1: - resolution: {integrity: sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - assign-symbols@1.0.0: - resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} - engines: {node: '>=0.10.0'} - - async-each@1.0.6: - resolution: {integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==} - async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} - async@2.6.4: - resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} - - async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - atob@2.1.2: - resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} - engines: {node: '>= 4.5.0'} - hasBin: true - - attr-accept@2.2.5: - resolution: {integrity: sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==} - engines: {node: '>=4'} - - autolinker@0.28.1: - resolution: {integrity: sha512-zQAFO1Dlsn69eXaO6+7YZc+v84aquQKbwpzCE3L0stj56ERn9hutFxPopViLjo9G+rWwjozRhgS5KJ25Xy19cQ==} - autoprefixer@10.5.0: resolution: {integrity: sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==} engines: {node: ^10 || ^12 || >=14} @@ -4408,11 +2100,9 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - - aws4@1.13.2: - resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + aws-ssl-profiles@1.1.2: + resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==} + engines: {node: '>= 6.0.0'} axios@1.16.0: resolution: {integrity: sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==} @@ -4453,92 +2143,29 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - base64-arraybuffer@1.0.2: - resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} - engines: {node: '>= 0.6.0'} - - base64-js@0.0.8: - resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} - engines: {node: '>= 0.4'} - base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - base@0.11.2: - resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} - engines: {node: '>=0.10.0'} - baseline-browser-mapping@2.10.29: resolution: {integrity: sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==} engines: {node: '>=6.0.0'} hasBin: true - batch@0.6.1: - resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - - bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - bcrypt@5.1.1: resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==} engines: {node: '>= 10.0.0'} - bidi-js@1.0.3: - resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} - - big-integer@1.6.52: - resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} - engines: {node: '>=0.6'} - - big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - - binary-extensions@1.13.1: - resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} - engines: {node: '>=0.10.0'} - binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - binary@0.3.0: - resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} - - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - block-stream2@2.1.0: - resolution: {integrity: sha512-suhjmLI57Ewpmq00qaygS8UgEq2ly2PCItenIyhMqVjo4t4pGzqMvfgJuX8iWTeSDdfSSqS6j38fL4ToNL7Pfg==} - - bluebird@3.4.7: - resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} - - bmp-js@0.1.0: - resolution: {integrity: sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==} - - bn.js@4.12.3: - resolution: {integrity: sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==} - - bn.js@5.2.3: - resolution: {integrity: sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==} - - body-parser@1.20.5: - resolution: {integrity: sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - body-parser@2.2.2: resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} engines: {node: '>=18'} - bonjour@3.5.1: - resolution: {integrity: sha512-xONzj4PfpPJw6xSqCcT2SmQkBOXpUINUz3o3qXcWJwYlXbkZNcNaUae0o5lle7tKt4HHV6dTgkIRhAXZ3nBMsQ==} - - boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - brace-expansion@1.1.14: resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} @@ -4549,43 +2176,10 @@ packages: resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} engines: {node: 18 || 20 || >=22} - braces@2.3.2: - resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} - engines: {node: '>=0.10.0'} - braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - - brotli@1.3.3: - resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} - - browser-or-node@2.1.1: - resolution: {integrity: sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==} - - browserify-aes@1.2.0: - resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} - - browserify-cipher@1.0.1: - resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} - - browserify-des@1.0.2: - resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} - - browserify-rsa@4.1.1: - resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} - engines: {node: '>= 0.10'} - - browserify-sign@4.2.5: - resolution: {integrity: sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==} - engines: {node: '>= 0.10'} - - browserify-zlib@0.2.0: - resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - browserslist@4.28.2: resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -4598,41 +2192,18 @@ packages: bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer-indexof-polyfill@1.0.2: - resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} - engines: {node: '>=0.10'} - - buffer-indexof@1.1.1: - resolution: {integrity: sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==} - - buffer-xor@1.0.3: - resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} - - buffer@4.9.2: - resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} - buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - buffers@0.1.1: - resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} - engines: {node: '>=0.2.0'} - - builtin-status-codes@3.0.0: - resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} - busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -4641,14 +2212,18 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + c12@3.1.0: + resolution: {integrity: sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==} + peerDependencies: + magicast: ^0.3.5 + peerDependenciesMeta: + magicast: + optional: true + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - cache-base@1.0.1: - resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} - engines: {node: '>=0.10.0'} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -4669,26 +2244,6 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - camelcase-keys@2.1.0: - resolution: {integrity: sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==} - engines: {node: '>=0.10.0'} - - camelcase@1.2.1: - resolution: {integrity: sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==} - engines: {node: '>=0.10.0'} - - camelcase@2.1.1: - resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} - engines: {node: '>=0.10.0'} - - camelcase@3.0.0: - resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} - engines: {node: '>=0.10.0'} - - camelcase@4.1.0: - resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} - engines: {node: '>=4'} - camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -4704,28 +2259,10 @@ packages: resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} engines: {node: '>=6'} - canvg@3.0.11: - resolution: {integrity: sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==} - engines: {node: '>=10.0.0'} - - caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - - center-align@0.1.3: - resolution: {integrity: sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==} - engines: {node: '>=0.10.0'} - - cfb@1.2.2: - resolution: {integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==} - engines: {node: '>=0.8'} - chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} - chainsaw@0.1.0: - resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -4734,9 +2271,6 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - change-case@5.4.4: - resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} - char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} @@ -4748,9 +2282,6 @@ packages: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} - chokidar@2.1.8: - resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -4771,9 +2302,11 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - cipher-base@1.0.7: - resolution: {integrity: sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==} - engines: {node: '>= 0.10'} + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + + citty@0.2.2: + resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==} cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} @@ -4781,16 +2314,9 @@ packages: class-transformer@0.5.1: resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} - class-utils@0.3.6: - resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} - engines: {node: '>=0.10.0'} - class-validator@0.14.4: resolution: {integrity: sha512-AwNusCCam51q703dW82x95tOqQp6oC9HNUl724KxJJOfnKscI8dOloXFgyez7LbTTKWuRBA37FScqVbJEoq8Yw==} - class-variance-authority@0.7.1: - resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} - cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -4815,12 +2341,6 @@ packages: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} - cliui@2.1.0: - resolution: {integrity: sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==} - - cliui@3.2.0: - resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} - cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} @@ -4828,47 +2348,21 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} - cliui@9.0.1: - resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} - engines: {node: '>=20'} - clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} - clone@2.1.2: - resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} - engines: {node: '>=0.8'} - clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - cmdk@1.1.1: - resolution: {integrity: sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - code-point-at@1.1.0: - resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} - engines: {node: '>=0.10.0'} - - codepage@1.15.0: - resolution: {integrity: sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==} - engines: {node: '>=0.8'} - collect-v8-coverage@1.0.3: resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} - collection-visit@1.0.0: - resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} - engines: {node: '>=0.10.0'} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -4876,14 +2370,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-name@2.1.0: - resolution: {integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==} - engines: {node: '>=12.20'} - - color-string@2.1.4: - resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==} - engines: {node: '>=18'} - color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true @@ -4916,18 +2402,6 @@ packages: component-emitter@1.3.1: resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} - compress-commons@4.1.2: - resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} - engines: {node: '>= 10'} - - compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - - compression@1.8.1: - resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} - engines: {node: '>= 0.8.0'} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -4935,30 +2409,16 @@ packages: resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} engines: {'0': node >= 6.0} - concat-with-sourcemaps@1.1.0: - resolution: {integrity: sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==} - - connect-history-api-fallback@1.6.0: - resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} - engines: {node: '>=0.8'} + confbox@0.2.4: + resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} - console-browserify@1.2.0: - resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} - console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - constants-browserify@1.0.0: - resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} - - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - content-disposition@1.1.0: resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} engines: {node: '>=18'} @@ -4980,15 +2440,9 @@ packages: engines: {node: '>=16'} hasBin: true - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-signature@1.0.7: - resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} - cookie-signature@1.2.2: resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} @@ -4997,26 +2451,9 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - cookie@1.1.1: - resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} - engines: {node: '>=18'} - cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} - copy-descriptor@0.1.1: - resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} - engines: {node: '>=0.10.0'} - - core-js@3.49.0: - resolution: {integrity: sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==} - - core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cors@2.8.6: resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} @@ -5051,28 +2488,6 @@ packages: typescript: optional: true - crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true - - crc32-stream@4.0.3: - resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} - engines: {node: '>= 10'} - - create-ecdh@4.0.4: - resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} - - create-frame@1.0.0: - resolution: {integrity: sha512-SnJYqAwa5Jon3cP8e3LMFBoRG2m/hX20vtOnC3ynhyAa6jmy+BqrPoicBtmKUutnJuphXPj7C54yOXF58Tl71Q==} - engines: {node: '>=0.10.0'} - - create-hash@1.2.0: - resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} - - create-hmac@1.1.7: - resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} - create-jest@29.7.0: resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5085,31 +2500,10 @@ packages: resolution: {integrity: sha512-fkdfq+b+AHI4cKdhZlppHveI/mgz2qpiYxcm+t5E5TsxX7QrLS1VE0+7GENEk9z0EeGPcpSciGv6ez24duWhwQ==} engines: {node: '>=18.x'} - cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - crypto-browserify@3.12.1: - resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==} - engines: {node: '>= 0.10'} - - css-line-break@2.1.0: - resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==} - - css-select@5.2.2: - resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} - - css-tree@1.1.3: - resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} - engines: {node: '>=8.0.0'} - - css-what@6.2.2: - resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} - engines: {node: '>= 6'} - cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -5122,66 +2516,10 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - currently-unhandled@0.4.1: - resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} - engines: {node: '>=0.10.0'} - - d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} - - d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - - d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} - - d3-format@3.1.2: - resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==} - engines: {node: '>=12'} - - d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} - - d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} - - d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} - - d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} - - d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} - - d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} - - d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - - d@1.0.2: - resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} - engines: {node: '>=0.12'} - dargs@8.1.0: resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} engines: {node: '>=12'} - dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} - data-urls@5.0.0: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} @@ -5198,34 +2536,9 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} - date-fns-jalali@4.1.0-0: - resolution: {integrity: sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg==} - - date-fns@3.6.0: - resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} - - date.js@0.3.3: - resolution: {integrity: sha512-HgigOS3h3k6HnW011nAb43c5xx5rBXk8P2v/WIT9Zv4koIaVXiH2BURguI78VVp+5Qc076T7OR378JViCnZtBw==} - dayjs@1.11.20: resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@3.1.0: - resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -5247,16 +2560,9 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - decimal.js-light@2.5.1: - resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} - decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} - decompress-response@4.2.1: resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} engines: {node: '>=8'} @@ -5269,29 +2575,21 @@ packages: babel-plugin-macros: optional: true - deep-diff@1.0.2: - resolution: {integrity: sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} - deep-equal@1.1.2: - resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==} - engines: {node: '>= 0.4'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge-ts@7.1.5: + resolution: {integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==} + engines: {node: '>=16.0.0'} + deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - default-compare@1.0.0: - resolution: {integrity: sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==} - engines: {node: '>=0.10.0'} - defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -5303,21 +2601,8 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - define-property@0.2.5: - resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} - engines: {node: '>=0.10.0'} - - define-property@1.0.0: - resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} - engines: {node: '>=0.10.0'} - - define-property@2.0.2: - resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} - engines: {node: '>=0.10.0'} - - del@3.0.0: - resolution: {integrity: sha512-7yjqSoVSlJzA4t/VUwazuEagGeANEKB3f/aNI//06pfKgwoCb7f6Q1gETN1sZzYaj6chTQ0AhIwDiPdfOjko4A==} - engines: {node: '>=4'} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} @@ -5326,28 +2611,17 @@ packages: delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - des.js@1.1.0: - resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} - destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -5356,18 +2630,9 @@ packages: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} - detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - - detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - dezalgo@1.0.4: resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} - dfa@1.2.0: - resolution: {integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==} - didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -5379,25 +2644,12 @@ packages: resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} engines: {node: '>=0.3.1'} - diffie-hellman@5.0.3: - resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} - dijkstrajs@1.0.3: resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dns-equal@1.0.0: - resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} - - dns-packet@5.6.1: - resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} - engines: {node: '>=6'} - - dns-txt@2.0.2: - resolution: {integrity: sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==} - doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -5406,29 +2658,6 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} - dom-helpers@5.2.1: - resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} - - dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - - domain-browser@1.2.0: - resolution: {integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==} - engines: {node: '>=0.4', npm: '>=1.2'} - - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - - dompurify@3.4.2: - resolution: {integrity: sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA==} - - domutils@3.2.2: - resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} @@ -5449,40 +2678,25 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - duplexer2@0.1.4: - resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ebec@1.1.1: - resolution: {integrity: sha512-JZ1vcvPQtR+8LGbZmbjG21IxLQq/v47iheJqn2F6yB2CgnGfn8ZVg3myHrf3buIZS8UCwQK0jOSIb3oHX7aH8g==} - - ebec@2.3.0: - resolution: {integrity: sha512-bt+0tSL7223VU3PSVi0vtNLZ8pO1AfWolcPPMk2a/a5H+o/ZU9ky0n3A0zhrR4qzJTN61uPsGIO4ShhOukdzxA==} - - ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + effect@3.21.0: + resolution: {integrity: sha512-PPN80qRokCd1f015IANNhrwOnLO7GrrMQfk4/lnZRE/8j7UPWrNNjPV0uBrZutI/nHzernbW+J0hdqQysHiSnQ==} + electron-to-chromium@1.5.353: resolution: {integrity: sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w==} - elliptic@6.6.1: - resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} - emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} - emoji-regex-xs@1.0.0: - resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} - emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -5492,40 +2706,18 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} + empathic@2.0.0: + resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + engines: {node: '>=14'} encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - - engine.io-client@6.6.4: - resolution: {integrity: sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==} - - engine.io-parser@5.2.3: - resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} - engines: {node: '>=10.0.0'} - - enhanced-resolve@3.4.1: - resolution: {integrity: sha512-ZaAux1rigq1e2nQrztHn4h2ugvpzZxs64qneNah+8Mh/K0CRqJFJc+UoXnUsq+1yX+DmQFPPdVqboKAJ89e0Iw==} - engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} - enhanced-resolve@5.21.3: resolution: {integrity: sha512-QyL119InA+XXEkNLNTPCXPugSvOfhwv0JOlGNzvxs0hZaiHLNvXSpudUWsOlsXGWJh8G6ckCScEkVHfX3kw/2Q==} engines: {node: '>=10.13.0'} - ent@2.2.2: - resolution: {integrity: sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==} - engines: {node: '>= 0.4'} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - entities@6.0.1: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} @@ -5538,21 +2730,9 @@ packages: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} - envix@1.5.0: - resolution: {integrity: sha512-IOxTKT+tffjxgvX2O5nq6enbkv6kBQ/QdMy18bZWo0P0rKPvsRp2/EypIPwTvJfnmk3VdOlq/KcRSZCswefM/w==} - engines: {node: '>=18.0.0'} - - errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} - hasBin: true - error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - error-symbol@0.1.0: - resolution: {integrity: sha512-VyjaKxUmeDX/m2lxm/aknsJ1GWDWUO2Ze2Ad8S1Pb9dykAm9TjSKp5CjrNyltYqZ5W/PO6TInAmO2/BfwMyT1g==} - engines: {node: '>=0.10.0'} - es-abstract@1.24.2: resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} engines: {node: '>= 0.4'} @@ -5591,30 +2771,6 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - es-toolkit@1.46.1: - resolution: {integrity: sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==} - - es5-ext@0.10.64: - resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} - engines: {node: '>=0.10'} - - es6-iterator@2.0.3: - resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} - - es6-map@0.1.5: - resolution: {integrity: sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==} - - es6-set@0.1.6: - resolution: {integrity: sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==} - engines: {node: '>=0.12'} - - es6-symbol@3.1.4: - resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} - engines: {node: '>=0.12'} - - es6-weak-map@2.0.3: - resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} - esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -5635,10 +2791,6 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - escope@3.6.0: - resolution: {integrity: sha512-75IUQsusDdalQEW/G/2esa87J7raqdJF+Ca0/Xm5C3Q58Nr4yVYjZGp/P1+2xiEVgXRrA39dpRb8LcshajbqDQ==} - engines: {node: '>=0.4.0'} - eslint-config-prettier@9.1.2: resolution: {integrity: sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==} hasBin: true @@ -5718,10 +2870,6 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true - esniff@2.0.1: - resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} - engines: {node: '>=0.10'} - espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5758,29 +2906,9 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - ethiopian-calendar-date-converter@2.1.6: - resolution: {integrity: sha512-qqOPkFQlMfLXF4gP70+2z6DrJNvKKcj+VIC37e72A5qs/LXCYQVt8egahDUfGkI0s92FyV7lfSUtGrX4rdM+3w==} - - ethiopian-calendar-new@1.1.0: - resolution: {integrity: sha512-5M0vB1Jb2lmK/l6s1mSykn4+/R4dElF89WXUp4HBdnwLYgHAnZ2nShebY5mgc/Noc5b9Sg8gTF+MYbmNUk+qSA==} - engines: {node: '>=16.0.0'} - - ethiopian-date@0.0.6: - resolution: {integrity: sha512-O+8hYimosZVn85MWcHtq9HQLR2HdELZPbv1zk3Xc6nm1cYvBl3V1fezrcMkqWKt8tin9dr3/vk0JkQAEWQZzXA==} - - event-emitter@0.3.5: - resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} - - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - eventemitter2@6.4.9: resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} @@ -5788,21 +2916,6 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - eventsource@0.1.6: - resolution: {integrity: sha512-bbB5tEuvC+SuRUG64X8ghvjgiRniuA4WlehWbFnoN4z6TxDXpyX+BMHF7rMgZAqoe+EbyNRUbHN0uuP9phy5jQ==} - engines: {node: '>=0.8.0'} - - evp_bytestokey@1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} - - exceljs@4.4.0: - resolution: {integrity: sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==} - engines: {node: '>=8.3.0'} - - execa@0.7.0: - resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} - engines: {node: '>=4'} - execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -5815,10 +2928,6 @@ packages: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} - expand-brackets@2.1.4: - resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} - engines: {node: '>=0.10.0'} - expect-type@1.3.0: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} @@ -5827,51 +2936,20 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - express@4.22.2: - resolution: {integrity: sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==} - engines: {node: '>= 0.10.0'} - express@5.2.1: resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} engines: {node: '>= 18'} - ext@1.7.0: - resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - - extend-shallow@3.0.2: - resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} - engines: {node: '>=0.10.0'} - - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - - extglob@2.0.4: - resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} - engines: {node: '>=0.10.0'} - - extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} - - falsey@0.3.2: - resolution: {integrity: sha512-lxEuefF5MBIVDmE6XeqCdM4BWk1+vYmGZtkbKZ/VFcg6uBBw6fXNEbWmxCjDdQlFc9hy450nkiWwM3VAW6G1qg==} - engines: {node: '>=0.10.0'} - - fast-csv@4.3.6: - resolution: {integrity: sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==} - engines: {node: '>=10.0.0'} + fast-check@3.23.2: + resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==} + engines: {node: '>=8.0.0'} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-equals@5.4.0: - resolution: {integrity: sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==} - engines: {node: '>=6.0.0'} - fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -5882,34 +2960,15 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-png@6.4.0: - resolution: {integrity: sha512-kAqZq1TlgBjZcLr5mcN6NP5Rv4V2f22z00c3g8vRrwkcqjerx7BEhPbOnWCPqaHUl2XWQBJQvOT/FQhdMT7X/Q==} - fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} fast-uri@3.1.2: resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} - fast-xml-parser@4.5.6: - resolution: {integrity: sha512-Yd4vkROfJf8AuJrDIVMVmYfULKmIJszVsMv7Vo71aocsKgFxpdlpSHXSaInvyYfgw2PRuObQSW2GFpVMUjxu9A==} - hasBin: true - fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} - faye-websocket@0.10.0: - resolution: {integrity: sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ==} - engines: {node: '>=0.4.0'} - - faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} - - faye@0.8.11: - resolution: {integrity: sha512-d2SXlWy+wR8D2AgYjCnJrA8v4RvwKeRQeTB2aLUetyhrNKTU28mAvSMezSZDNyOONVrsF0IY1s4625QgggM2XA==} - engines: {node: '>=0.1.96'} - fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} @@ -5922,59 +2981,22 @@ packages: picomatch: optional: true - fflate@0.8.2: - resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} - file-selector@2.1.2: - resolution: {integrity: sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==} - engines: {node: '>= 12'} - - file-type@18.7.0: - resolution: {integrity: sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw==} - engines: {node: '>=14.16'} - file-type@21.3.4: resolution: {integrity: sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==} engines: {node: '>=20'} - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - fill-range@4.0.0: - resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} - engines: {node: '>=0.10.0'} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - filter-obj@1.1.0: - resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} - engines: {node: '>=0.10.0'} - - finalhandler@1.3.2: - resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} - engines: {node: '>= 0.8'} - finalhandler@2.1.1: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} - find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - - find-up@1.1.2: - resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} - engines: {node: '>=0.10.0'} - - find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} - find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -5991,10 +3013,6 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} @@ -6007,31 +3025,14 @@ packages: debug: optional: true - fontkit@2.0.4: - resolution: {integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==} - for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - for-in@1.0.2: - resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} - engines: {node: '>=0.10.0'} - - for-own@1.0.0: - resolution: {integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==} - engines: {node: '>=0.10.0'} - - force@0.0.3: - resolution: {integrity: sha512-B/4gl3/7o8Q4jYfXNKSvTHlAPxB1ruYCkxVkiVUUuHziYbDa2NsURljSgpm+Q+d4cGmN1EaAD5QXhLodGN44zA==} - foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - fork-ts-checker-webpack-plugin@9.1.0: resolution: {integrity: sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q==} engines: {node: '>=14.21.3'} @@ -6039,10 +3040,6 @@ packages: typescript: '>3.6.0' webpack: ^5.11.0 - form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} - form-data@4.0.5: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} @@ -6055,46 +3052,13 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - frac@1.1.2: - resolution: {integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==} - engines: {node: '>=0.8'} - fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - fragment-cache@0.2.1: - resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} - engines: {node: '>=0.10.0'} - - framer-motion@12.38.0: - resolution: {integrity: sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==} - peerDependencies: - '@emotion/is-prop-valid': '*' - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@emotion/is-prop-valid': - optional: true - react: - optional: true - react-dom: - optional: true - - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - fresh@2.0.0: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - - fs-exists-sync@0.1.0: - resolution: {integrity: sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==} - engines: {node: '>=0.10.0'} - fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -6109,22 +3073,11 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@1.2.13: - resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} - engines: {node: '>= 4.0'} - os: [darwin] - deprecated: Upgrade to fsevents v2 to mitigate potential security issues - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - fstream@1.0.12: - resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} - engines: {node: '>=0.6'} - deprecated: This package is no longer supported. - function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} @@ -6140,6 +3093,9 @@ packages: engines: {node: '>=10'} deprecated: This package is no longer supported. + generate-function@2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + generator-function@2.0.1: resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} engines: {node: '>= 0.4'} @@ -6148,9 +3104,6 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - get-caller-file@1.0.3: - resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} - get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -6163,14 +3116,6 @@ packages: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} - get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} - - get-object@0.2.0: - resolution: {integrity: sha512-7P6y6k6EzEFmO/XyUyFlXm1YLJy9xeA1x/grNV8276abX5GuwUtYgKFkRFkLixw4hf4Pz9q2vgv/8Ar42R0HuQ==} - engines: {node: '>=0.10.0'} - get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} @@ -6179,14 +3124,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-stdin@4.0.1: - resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==} - engines: {node: '>=0.10.0'} - - get-stream@3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} - get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -6199,12 +3136,9 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-value@2.0.6: - resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} - engines: {node: '>=0.10.0'} - - getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + giget@2.0.0: + resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} + hasBin: true git-raw-commits@4.0.0: resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} @@ -6212,9 +3146,6 @@ packages: deprecated: This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead. hasBin: true - glob-parent@3.1.0: - resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -6251,10 +3182,6 @@ packages: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - globby@6.1.0: - resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} - engines: {node: '>=0.10.0'} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -6265,51 +3192,15 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - gulp-header@1.8.12: - resolution: {integrity: sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==} - deprecated: Removed event-stream from gulp-header - - handle-thing@2.0.1: - resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} - - handlebars-helper-create-frame@0.1.0: - resolution: {integrity: sha512-yR99Rh8JYcWSsARw/unaOUUICqG0M+SV3U4vBl3Psn78r0qXjU+cT9+IGXglNuuI3RfahvFDyEQ0l1KWthavRQ==} - engines: {node: '>=4'} - - handlebars-helpers@0.10.0: - resolution: {integrity: sha512-QiyhQz58u/DbuV41VnfpE0nhy6YCH4vB514ajysV8SoKmP+DxU+pR+fahVyNECHj+jiwEN2VrvxD/34/yHaLUg==} - engines: {node: '>=0.12.0'} - - handlebars-utils@1.0.6: - resolution: {integrity: sha512-d5mmoQXdeEqSKMtQQZ9WkiUcO1E3tPbWxluCK9hVgIDPzQa9WsKo3Lbe/sGflTe7TomHEeZaOgwIkyIr1kfzkw==} - engines: {node: '>=0.10.0'} - handlebars@4.7.9: resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} engines: {node: '>=0.4.7'} hasBin: true - har-schema@2.0.0: - resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} - engines: {node: '>=4'} - - har-validator@5.1.5: - resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} - engines: {node: '>=6'} - deprecated: this library is no longer supported - has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} - has-flag@2.0.0: - resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} - engines: {node: '>=0.10.0'} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -6332,129 +3223,25 @@ packages: has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - has-value@0.3.1: - resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} - engines: {node: '>=0.10.0'} - - has-value@1.0.0: - resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} - engines: {node: '>=0.10.0'} - - has-values@0.1.4: - resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} - engines: {node: '>=0.10.0'} - - has-values@1.0.0: - resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} - engines: {node: '>=0.10.0'} - - hash-base@3.0.5: - resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} - engines: {node: '>= 0.10'} - - hash-base@3.1.2: - resolution: {integrity: sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==} - engines: {node: '>= 0.8'} - - hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - hasown@2.0.3: resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - helper-date@1.0.1: - resolution: {integrity: sha512-wU3VOwwTJvGr/w5rZr3cprPHO+hIhlblTJHD6aFBrKLuNbf4lAmkawd2iK3c6NbJEvY7HAmDpqjOFSI5/+Ey2w==} - engines: {node: '>=4.0'} - - helper-markdown@1.0.0: - resolution: {integrity: sha512-AnDqMS4ejkQK0MXze7pA9TM3pu01ZY+XXsES6gEE0RmCGk5/NIfvTn0NmItfyDOjRAzyo9z6X7YHbHX4PzIvOA==} - engines: {node: '>=0.10.0'} - - helper-md@0.2.2: - resolution: {integrity: sha512-49TaQzK+Ic7ZVTq4i1UZxRUJEmAilTk8hz7q4I0WNUaTclLR8ArJV5B3A1fe1xF2HtsDTr2gYKLaVTof/Lt84Q==} - engines: {node: '>=0.10.0'} - - highlight.js@9.18.5: - resolution: {integrity: sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA==} - deprecated: Support has ended for 9.x series. Upgrade to @latest - - hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - - hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - - hpack.js@2.1.6: - resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} - - hsl-to-hex@1.0.0: - resolution: {integrity: sha512-K6GVpucS5wFf44X0h2bLVRDsycgJmf9FF2elg+CrqD8GcFU8c6vYhgXn8NjUkFCwj+xDFb70qgLbTUm6sxwPmA==} - - hsl-to-rgb-for-reals@1.1.1: - resolution: {integrity: sha512-LgOWAkrN0rFaQpfdWBQlv/VhkOxb5AsBjk6NQVx4yEzWS923T07X0M1Y0VNko2H52HeSpZrZNNMJ0aFqsdVzQg==} - html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} - html-entities@1.4.0: - resolution: {integrity: sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==} - html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - html-parse-stringify@3.0.1: - resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} - - html-tag@2.0.0: - resolution: {integrity: sha512-XxzooSo6oBoxBEUazgjdXj7VwTn/iSTSZzTYKzYY6I916tkaYzypHxy+pbVU1h+0UQ9JlVf5XkNQyxOAiiQO1g==} - engines: {node: '>=0.10.0'} - - html2canvas@1.4.1: - resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==} - engines: {node: '>=8.0.0'} - - http-deceiver@1.2.7: - resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - - http-errors@1.8.1: - resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} - engines: {node: '>= 0.6'} - http-errors@2.0.1: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} - http-parser-js@0.5.10: - resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==} - http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} - http-proxy-middleware@0.19.2: - resolution: {integrity: sha512-aYk1rTKqLTus23X3L96LGNCGNgWpG4cG0XoZIT1GUPhhulEHX/QalnO6Vbo+WmKWi4AL2IidjuC0wZtbpg0yhQ==} - engines: {node: '>=4.0.0'} - - http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} - - http-signature@1.2.0: - resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} - engines: {node: '>=0.8', npm: '>=1.3.7'} - - https-browserify@1.0.0: - resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} - https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -6476,24 +3263,6 @@ packages: engines: {node: '>=18'} hasBin: true - hyphen@1.14.1: - resolution: {integrity: sha512-kvL8xYl5QMTh+LwohVN72ciOxC0OEV79IPdJSTwEXok9y9QHebXGdFgrED4sWfiax/ODx++CAMk3hMy4XPJPOw==} - - i18next-browser-languagedetector@8.2.1: - resolution: {integrity: sha512-bZg8+4bdmaOiApD7N7BPT9W8MLZG+nPTOFlLiJiT8uzKXFjhxw4v2ierCXOwB5sFDMtuA5G4kgYZ0AznZxQ/cw==} - - i18next@25.10.10: - resolution: {integrity: sha512-cqUW2Z3EkRx7NqSyywjkgCLK7KLCL6IFVFcONG7nVYIJ3ekZ1/N5jUsihHV6Bq37NfhgtczxJcxduELtjTwkuQ==} - peerDependencies: - typescript: ^5 || ^6 - peerDependenciesMeta: - typescript: - optional: true - - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -6502,9 +3271,6 @@ packages: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} - idb-keyval@6.2.2: - resolution: {integrity: sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==} - ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -6516,12 +3282,6 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} - immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - - immer@10.2.0: - resolution: {integrity: sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==} - immer@11.1.8: resolution: {integrity: sha512-/tbkHMW7y10Lx6i1crLjD4/OhNkRG+Fo7byZHtah0547nIeXYcpIXaUh0IAQY6gO5459qpGGYapcEOHtFXkIuA==} @@ -6529,11 +3289,6 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} - import-local@1.0.0: - resolution: {integrity: sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==} - engines: {node: '>=4'} - hasBin: true - import-local@3.2.0: resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} @@ -6546,21 +3301,10 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - indent-string@2.1.0: - resolution: {integrity: sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==} - engines: {node: '>=0.10.0'} - inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - info-symbol@0.1.0: - resolution: {integrity: sha512-qkc9wjLDQ+dYYZnY5uJXGNNHyZ0UOMDUnhvy0SEZGVVYmQ5s4i8cPAin2MbU6OxJgi8dfj/AnwqPx0CJE6+Lsw==} - engines: {node: '>=0.10.0'} - - inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -6568,49 +3312,14 @@ packages: resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - internal-ip@1.2.0: - resolution: {integrity: sha512-DzGfTasXPmwizQP4XV2rR6r2vp8TjlOpMnJqG9Iy2i1pl1lkZdZj5rSpIc7YFGX2nS46PPgAGEyT+Q5hE2FB2g==} - engines: {node: '>=0.10.0'} - hasBin: true - internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - - interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} - - invert-kv@1.0.0: - resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} - engines: {node: '>=0.10.0'} - - iobuffer@5.4.0: - resolution: {integrity: sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA==} - - ip@1.1.9: - resolution: {integrity: sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==} - ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - ipaddr.js@2.4.0: - resolution: {integrity: sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==} - engines: {node: '>= 10'} - - is-accessor-descriptor@1.0.2: - resolution: {integrity: sha512-AIbwAcazqP3R65dGvqk1V+a+vE5Fg1yu/ZKMOiBWSUIXXiwQkYmXQcVa2O0nh0tSDKDFKxG2mY7dB1Sr4hEP1g==} - engines: {node: '>= 0.4'} - - is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} - engines: {node: '>= 0.4'} - is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -6626,10 +3335,6 @@ packages: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} - is-binary-path@1.0.1: - resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} - engines: {node: '>=0.10.0'} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -6638,9 +3343,6 @@ packages: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} - is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -6649,10 +3351,6 @@ packages: resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} - is-data-descriptor@1.0.1: - resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} - engines: {node: '>= 0.4'} - is-data-view@1.0.2: resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'} @@ -6661,26 +3359,6 @@ packages: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} - is-descriptor@0.1.8: - resolution: {integrity: sha512-SceYGWXvdqlWa/OnQ5FQuV+NxvNmMRhMw/w9AHkH71hTzveND4BTYgvp16g+oITK47qbOl/3D0bl0iygehWAWQ==} - engines: {node: '>= 0.4'} - - is-descriptor@1.0.4: - resolution: {integrity: sha512-bv5z95W0dDtLfKwDfkTNxaRxmISBD3eQBKJeVxv2AQ7MjuUnDNG7cIQqvFtMOUYhsILWHhMayWdoGqNqYYYjww==} - engines: {node: '>= 0.4'} - - is-even@1.0.0: - resolution: {integrity: sha512-LEhnkAdJqic4Dbqn58A0y52IXoHWlsueqQkKfMfdEnIYG8A1sm/GHidKkS6yvXlMoRrkM34csHnXQtOqcb+Jzg==} - engines: {node: '>=0.10.0'} - - is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - - is-extendable@1.0.1: - resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} - engines: {node: '>=0.10.0'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -6689,18 +3367,6 @@ packages: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} - is-finite@1.1.0: - resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@1.0.0: - resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -6721,10 +3387,6 @@ packages: resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} - is-glob@3.1.0: - resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} - engines: {node: '>=0.10.0'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -6733,12 +3395,6 @@ packages: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} - is-lite@0.8.2: - resolution: {integrity: sha512-JZfH47qTsslwaAsqbMI3Q6HNNjUuq6Cmzzww50TdP5Esb6e1y2sK2UAaZZuzfAzpoI2AkxoPQapZdlDuP6Vlsw==} - - is-lite@1.2.1: - resolution: {integrity: sha512-pgF+L5bxC+10hLBgf6R2P4ZZUBOQIIacbdo8YvuCP8/JvsWxG7aZ9p10DYuLtifFci4l3VITphhMlMV4Y+urPw==} - is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -6751,18 +3407,6 @@ packages: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} - is-number@2.1.0: - resolution: {integrity: sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==} - engines: {node: '>=0.10.0'} - - is-number@3.0.0: - resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} - engines: {node: '>=0.10.0'} - - is-number@4.0.0: - resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} - engines: {node: '>=0.10.0'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -6771,44 +3415,23 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} - is-odd@0.1.2: - resolution: {integrity: sha512-Ri7C2K7o5IrUU9UEI8losXJCCD/UtsaIrkR5sxIcFg4xQ9cRJXlWA5DQvTE0yDc0krvSNLsRGXN11UPS6KyfBw==} - engines: {node: '>=0.10.0'} - - is-path-cwd@1.0.0: - resolution: {integrity: sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==} - engines: {node: '>=0.10.0'} - - is-path-in-cwd@1.0.1: - resolution: {integrity: sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==} - engines: {node: '>=0.10.0'} - - is-path-inside@1.0.1: - resolution: {integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==} - engines: {node: '>=0.10.0'} - is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + is-property@1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} - is-self-closing@1.0.1: - resolution: {integrity: sha512-E+60FomW7Blv5GXTlYee2KDrnG6srxF7Xt1SjrhWUGUEsTFIqY/nq2y3DaftCsgUMdh89V07IVfhY9KIJhLezg==} - engines: {node: '>=0.12.0'} - is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -6817,10 +3440,6 @@ packages: resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} - is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -6845,19 +3464,10 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} - is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - is-url@1.2.4: - resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} - - is-utf8@0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} - is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -6870,38 +3480,12 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - - is-wsl@1.1.0: - resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} - engines: {node: '>=4'} - - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isobject@0.2.0: - resolution: {integrity: sha512-VaWq6XYAsbvM0wf4dyBO7WH9D7GosB7ZZlqrawI9BBiTMINBeCyqSKBa35m870MY3O4aM31pYyZi9DfGrYMJrQ==} - engines: {node: '>=0.10.0'} - - isobject@2.1.0: - resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} - engines: {node: '>=0.10.0'} - - isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - - isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -6937,9 +3521,6 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jay-peg@1.1.1: - resolution: {integrity: sha512-D62KEuBxz/ip2gQKOEhk/mx14o7eiFRaU+VNNSP4MOiIkwb/D6B3G1Mfas7C/Fit8EsSV2/IWjZElx/Gs6A4ww==} - jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7081,27 +3662,6 @@ packages: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true - jiti@2.7.0: - resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} - hasBin: true - - jmespath@0.16.0: - resolution: {integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==} - engines: {node: '>= 0.6.0'} - - jose@5.10.0: - resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} - - jquery@3.7.1: - resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==} - - js-cookie@3.0.5: - resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} - engines: {node: '>=14'} - - js-md5@0.8.3: - resolution: {integrity: sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==} - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -7117,9 +3677,6 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true - jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - jsdom@25.0.1: resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==} engines: {node: '>=18'} @@ -7137,9 +3694,6 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-loader@0.5.7: - resolution: {integrity: sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==} - json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -7149,25 +3703,9 @@ packages: 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==} - json-stream@1.0.0: - resolution: {integrity: sha512-H/ZGY0nIAg3QcOwE1QN/rK/Fa7gJn7Ii5obwp6zyPO4xiPNwpIMjqy2gwjBEGqzkF/vSWEIBQCBuN19hYiL6Qg==} - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json3@3.3.3: - resolution: {integrity: sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==} - - json5@0.5.1: - resolution: {integrity: sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==} - hasBin: true - json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true @@ -7195,20 +3733,10 @@ packages: resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} engines: {node: '>=12', npm: '>=6'} - jspdf@3.0.4: - resolution: {integrity: sha512-dc6oQ8y37rRcHn316s4ngz/nOjayLF/FFxBF4V9zamQKRqXxyiH1zagkCdktdWhtoQId5K20xt1lB90XzkB+hQ==} - - jsprim@1.4.2: - resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} - engines: {node: '>=0.6.0'} - jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} - jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} - jwa@1.4.2: resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} @@ -7224,45 +3752,10 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - killable@1.0.1: - resolution: {integrity: sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==} - - kind-of@3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} - - kind-of@4.0.0: - resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} - engines: {node: '>=0.10.0'} - - kind-of@5.1.0: - resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} - engines: {node: '>=0.10.0'} - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - lazy-cache@1.0.4: - resolution: {integrity: sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==} - engines: {node: '>=0.10.0'} - - lazy-cache@2.0.2: - resolution: {integrity: sha512-7vp2Acd2+Kz4XkzxGxaB1FWOi8KjWIWsgdfD5MCb86DWvlLqhRPM+d6Pro3iNEL5VT9mstz5hKAlcd+QR6H3aA==} - engines: {node: '>=0.10.0'} - - lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} - engines: {node: '>= 0.6.3'} - - lcid@1.0.0: - resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} - engines: {node: '>=0.10.0'} - leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -7274,13 +3767,6 @@ packages: libphonenumber-js@1.13.1: resolution: {integrity: sha512-GEw0GLL7YUUA6nv21IsCvVjtI5Ejn84sjbdfQ9KxdbqEVOk1PZh7xejn01EEiniKw+dBeCfim+8MGeuvVuE2BA==} - libreoffice-convert@1.8.1: - resolution: {integrity: sha512-iZ1DD/EMTlPvol8G++QQ/0w4pVecSwRuhMLXRm7nRim/gcaSscSXuTO9Tgbkieyw5UdJg7UXD+lkFT8SCi51Dw==} - engines: {node: '>=6'} - - lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - lightningcss-android-arm64@1.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} @@ -7355,23 +3841,14 @@ packages: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} - linebreak@1.1.0: - resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} - lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - linkifyjs@4.3.2: - resolution: {integrity: sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==} - lint-staged@15.5.2: resolution: {integrity: sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==} engines: {node: '>=18.12.0'} hasBin: true - listenercount@1.0.1: - resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} - listr2@8.3.3: resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==} engines: {node: '>=18.0.0'} @@ -7380,34 +3857,10 @@ packages: resolution: {integrity: sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==} engines: {node: '>=13.2.0'} - load-json-file@1.1.0: - resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} - engines: {node: '>=0.10.0'} - - load-json-file@2.0.0: - resolution: {integrity: sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==} - engines: {node: '>=4'} - - loadash@1.0.0: - resolution: {integrity: sha512-xlX5HBsXB3KG0FJbJJG/3kYWCfsCyCSus3T+uHVu6QL6YxAdggmm3QeyLgn54N2yi5/UE6xxL5ZWJAAiHzHYEg==} - deprecated: Package is unsupport. Please use the lodash package instead. - - loader-runner@2.4.0: - resolution: {integrity: sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==} - engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} - loader-runner@4.3.2: resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} engines: {node: '>=6.11.5'} - loader-utils@1.4.2: - resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} - engines: {node: '>=4.0.0'} - - locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} - locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -7420,50 +3873,18 @@ packages: resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - locter@2.2.1: - resolution: {integrity: sha512-Cc7mowptFl7ug5he6Iuos7aGRd9xbwTfnx1ng4AX/7F4iqemPaXAIJDi13IBwQZrKgli9OPEYXm6uCKr7ynxUQ==} - engines: {node: '>=22.0.0'} - - lodash._reinterpolate@3.0.0: - resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} - lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - - lodash.difference@4.5.0: - resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} - - lodash.escaperegexp@4.1.2: - resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} - - lodash.flatten@4.4.0: - resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} - - lodash.groupby@4.6.0: - resolution: {integrity: sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==} - lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} lodash.isboolean@3.0.3: resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. - - lodash.isfunction@3.0.9: - resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} - lodash.isinteger@4.0.4: resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - lodash.isnil@4.0.0: - resolution: {integrity: sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==} - lodash.isnumber@3.0.3: resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} @@ -7473,9 +3894,6 @@ packages: lodash.isstring@4.0.1: resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - lodash.isundefined@3.0.1: - resolution: {integrity: sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==} - lodash.kebabcase@4.1.1: resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} @@ -7497,16 +3915,6 @@ packages: lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - lodash.template@4.18.1: - resolution: {integrity: sha512-5urZrLnV/VD6zHK5KsVtZgt7H19v51mIzoS0aBNH8yp3I8tbswrEjOABOPY8m8uB7NuibubLrMX+Y0PXsU9X+w==} - deprecated: This package is deprecated. Use https://socket.dev/npm/package/eta instead. - - lodash.templatesettings@4.2.0: - resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} - - lodash.union@4.6.0: - resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} - lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} @@ -7519,10 +3927,6 @@ packages: lodash@4.18.1: resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} - log-ok@0.1.1: - resolution: {integrity: sha512-cc8VrkS6C+9TFuYAwuHpshrcrGRAv7d0tUJ0GdM72ZBlKXtlgjUZF84O+OhQUdiVHoF7U/nVxwpjOdwUJ8d3Vg==} - engines: {node: '>=0.10.0'} - log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} @@ -7531,39 +3935,16 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} - log-utils@0.2.1: - resolution: {integrity: sha512-udyegKoMz9eGfpKAX//Khy7sVAZ8b1F7oLDnepZv/1/y8xTvsyPgqQrM94eG8V0vcc2BieYI2kVW4+aa6m+8Qw==} - engines: {node: '>=0.10.0'} - - logging-helpers@1.0.0: - resolution: {integrity: sha512-qyIh2goLt1sOgQQrrIWuwkRjUx4NUcEqEGAcYqD8VOnOC6ItwkrVE8/tA4smGpjzyp4Svhc6RodDp9IO5ghpyA==} - engines: {node: '>=0.10.0'} - - loglevel@1.9.2: - resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} - engines: {node: '>= 0.6.0'} - - longest@1.0.1: - resolution: {integrity: sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==} - engines: {node: '>=0.10.0'} + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - lottie-web@5.13.0: - resolution: {integrity: sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ==} - - loud-rejection@1.6.0: - resolution: {integrity: sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==} - engines: {node: '>=0.10.0'} - loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -7571,16 +3952,12 @@ packages: resolution: {integrity: sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==} engines: {node: 20 || >=22} - lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lucide-react@0.513.0: - resolution: {integrity: sha512-CJZKq2g8Y8yN4Aq002GahSXbG2JpFv9kXwyiOAMvUBv7pxeOFHUWKB0mO7MiY4ZVFCV4aNjv2BJFq/z3DgKPQg==} - peerDependencies: - react: 18.3.1 + lru.min@1.1.4: + resolution: {integrity: sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==} + engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'} luxon@3.7.2: resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} @@ -7592,9 +3969,6 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - make-cancellable-promise@2.0.0: - resolution: {integrity: sha512-3SEQqTpV9oqVsIWqAcmDuaNeo7yBO3tqPtqGRcKkEo0lrzD3wqbKG9mkxO65KoOgXqj+zH2phJ2LiAsdzlogSw==} - make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -7606,37 +3980,13 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - make-event-props@2.0.0: - resolution: {integrity: sha512-G/hncXrl4Qt7mauJEXSg3AcdYzmpkIITTNl5I+rH9sog5Yw0kK6vseJjCaPfOXqOqQuPUP89Rkhfz5kPS8ijtw==} - makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - map-cache@0.2.2: - resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} - engines: {node: '>=0.10.0'} - - map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - - map-visit@1.0.0: - resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} - engines: {node: '>=0.10.0'} - math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} - - mdn-data@2.0.14: - resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} - - media-engine@1.0.3: - resolution: {integrity: sha512-aa5tG6sDoK+k70B9iEX1NeyfT8ObCKhNDs6lJVpwF6r8vhUfuKMslIcirq6HIUYuuUYLefcEQOn9bSBOvawtwg==} - media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -7645,40 +3995,18 @@ packages: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} - mem@1.1.0: - resolution: {integrity: sha512-nOBDrc/wgpkd3X/JOhMqYR+/eLqlfLP4oQfoBA6QExIxEl+GU01oyEkwWyueyO8110pUKijtiHGhEmYoOn88oQ==} - engines: {node: '>=4'} - memfs@3.5.3: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} - memory-fs@0.4.1: - resolution: {integrity: sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==} - meow@12.1.1: resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} engines: {node: '>=16.10'} - meow@3.7.0: - resolution: {integrity: sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==} - engines: {node: '>=0.10.0'} - - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - merge-descriptors@2.0.0: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} - merge-refs@2.0.0: - resolution: {integrity: sha512-3+B21mYK2IqUWnd2EivABLT7ueDhb0b8/dGK8LoFQPrU61YITeCMn14F7y7qZafWNZhUEKb24cJdiT5Wxs3prg==} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -7690,18 +4018,10 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - micromatch@3.1.10: - resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} - engines: {node: '>=0.10.0'} - micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - miller-rabin@4.0.1: - resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} - hasBin: true - mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -7718,23 +4038,11 @@ packages: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} - mime@1.2.11: - resolution: {integrity: sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw==} - - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - mime@2.6.0: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} engines: {node: '>=4.0.0'} hasBin: true - mimic-fn@1.2.0: - resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} - engines: {node: '>=4'} - mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -7751,12 +4059,6 @@ packages: resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} engines: {node: '>=8'} - minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - - minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - minimatch@10.2.5: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} @@ -7764,10 +4066,6 @@ packages: minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - minimatch@5.1.9: - resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} - engines: {node: '>=10'} - minimatch@9.0.9: resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} engines: {node: '>=16 || 14 >=14.17'} @@ -7775,10 +4073,6 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minio@7.1.3: - resolution: {integrity: sha512-xPrLjWkTT5E7H7VnzOjF//xBp9I40jYB4aWhb2xTFopXXfw+Wo82DDWngdUju7Doy3Wk7R8C4LAgwhLHHnf0wA==} - engines: {node: ^16 || ^18 || >=20} - minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} @@ -7795,64 +4089,33 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} - mixin-deep@1.3.2: - resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} - engines: {node: '>=0.10.0'} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true - moment@2.30.1: - resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} - - motion-dom@12.38.0: - resolution: {integrity: sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==} - - motion-utils@12.36.0: - resolution: {integrity: sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==} - - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mui-ethiopian-datepicker@0.3.2: - resolution: {integrity: sha512-I8TZ8lvloAxhFNl8tDl7NmgT7RPJslfnArNMpT2Sd9GbpfsdRrOwH/JBMcOhLQyaNUee9due0W6J85io1WLjlg==} - peerDependencies: - '@emotion/react': ^11.11.0 - '@emotion/styled': ^11.11.0 - '@mui/icons-material': ^5.11.16 - '@mui/material': ^5.13.3 - '@mui/x-date-pickers': ^6.7.0 - date-fns: ^3.6.0 - react: 18.3.1 - react-dom: 18.3.1 - multer@2.1.1: resolution: {integrity: sha512-mo+QTzKlx8R7E5ylSXxWzGoXoZbOsRMpyitcht8By2KHvMbf3tjwosZ/Mu/XYU6UuJ3VZnODIrak5ZrPiPyB6A==} engines: {node: '>= 10.16.0'} - multicast-dns-service-types@1.1.0: - resolution: {integrity: sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==} - - multicast-dns@7.2.5: - resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} - hasBin: true - mute-stream@2.0.0: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} engines: {node: ^18.17.0 || >=20.5.0} + mysql2@3.15.3: + resolution: {integrity: sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==} + engines: {node: '>= 8.0'} + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + named-placeholders@1.1.6: + resolution: {integrity: sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==} + engines: {node: '>=8.0.0'} + nan@2.26.2: resolution: {integrity: sha512-0tTvBTYkt3tdGw22nrAy50x7gpbGCCFH3AFcyS5WiUu7Eu4vWlri1woE6qHBSfy11vksDqkiwjOnlR7WV8G1Hw==} @@ -7861,21 +4124,9 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanomatch@1.2.13: - resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} - engines: {node: '>=0.10.0'} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - - negotiator@0.6.4: - resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} - engines: {node: '>= 0.6'} - negotiator@1.0.0: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} @@ -7883,34 +4134,12 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - nestjs-minio-client@2.2.0: - resolution: {integrity: sha512-mz1vfJq/7YfSyVCIeZwOCfIfBz+msI9QynHS2QGO9GB+tVNnQOYta8PxFsH9tMxN7gNrjrf5jXsEIpgBB1oTeA==} - peerDependencies: - '@nestjs/common': '>=9.0.0' - '@nestjs/core': '>=9.0.0' - - next-themes@0.4.6: - resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - next-tick@1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - - no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} node-addon-api@5.1.0: resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} - node-addon-api@8.7.0: - resolution: {integrity: sha512-9MdFxmkKaOYVTV+XVRG8ArDwwQ77XIgIPyKASB1k3JPq3M8fGQQQE3YpMOrKm6g//Ktx8ivZr8xo1Qmtqub+GA==} - engines: {node: ^18 || ^20 || >= 21} - node-emoji@1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} @@ -7918,6 +4147,9 @@ packages: resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} engines: {node: '>= 0.4'} + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -7927,23 +4159,9 @@ packages: encoding: optional: true - node-forge@0.10.0: - resolution: {integrity: sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==} - engines: {node: '>= 6.0.0'} - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - node-html-parser@6.1.13: - resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} - node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-libs-browser@2.2.1: - resolution: {integrity: sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==} - node-releases@2.0.44: resolution: {integrity: sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==} @@ -7952,24 +4170,10 @@ packages: engines: {node: '>=6'} hasBin: true - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - - normalize-path@2.1.1: - resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} - engines: {node: '>=0.10.0'} - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - normalize-svg-path@1.1.0: - resolution: {integrity: sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==} - - npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} - npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -7982,27 +4186,18 @@ packages: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} deprecated: This package is no longer supported. - nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - - number-is-nan@1.0.1: - resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} - engines: {node: '>=0.10.0'} - nwsapi@2.2.23: resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} - oauth-sign@0.9.0: - resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + nypm@0.6.6: + resolution: {integrity: sha512-vRyr0r4cbBapw07Xw8xrj9Teq3o7MUD35rSaTcanDbW+aK2XHDgJFiU6ZTj2GBw7Q12ysdsyFss+Vdz4hQ0Y6Q==} + engines: {node: '>=18'} + hasBin: true object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-copy@0.1.0: - resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} - engines: {node: '>=0.10.0'} - object-hash@3.0.0: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} @@ -8011,18 +4206,10 @@ packages: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - object-visit@1.0.1: - resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} - engines: {node: '>=0.10.0'} - object.assign@4.1.7: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} @@ -8039,25 +4226,17 @@ packages: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'} - object.pick@1.3.0: - resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} - engines: {node: '>=0.10.0'} - object.values@1.2.1: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} - obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} - on-headers@1.1.0: - resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} - engines: {node: '>= 0.8'} - once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -8073,14 +4252,6 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} - opencollective-postinstall@2.0.3: - resolution: {integrity: sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==} - hasBin: true - - opn@5.5.0: - resolution: {integrity: sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==} - engines: {node: '>=4'} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -8089,35 +4260,10 @@ packages: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} - orderedmap@2.1.1: - resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} - - original@1.0.2: - resolution: {integrity: sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==} - - os-browserify@0.3.0: - resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} - - os-locale@1.4.0: - resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} - engines: {node: '>=0.10.0'} - - os-locale@2.1.0: - resolution: {integrity: sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==} - engines: {node: '>=4'} - own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - - p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} - p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -8130,10 +4276,6 @@ packages: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} - p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -8146,14 +4288,6 @@ packages: resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-map@1.2.0: - resolution: {integrity: sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==} - engines: {node: '>=4'} - - p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} - p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -8161,34 +4295,14 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - pako@0.2.9: - resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - - pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - - pako@2.1.0: - resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} - parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse-asn1@5.1.9: - resolution: {integrity: sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==} - engines: {node: '>= 0.10'} - - parse-json@2.2.0: - resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} - engines: {node: '>=0.10.0'} - parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse-svg-path@0.1.2: - resolution: {integrity: sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==} - parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} @@ -8196,13 +4310,6 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - - pascalcase@0.1.1: - resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} - engines: {node: '>=0.10.0'} - passport-jwt@4.0.1: resolution: {integrity: sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==} @@ -8214,20 +4321,6 @@ packages: resolution: {integrity: sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==} engines: {node: '>= 0.4.0'} - path-browserify@0.0.1: - resolution: {integrity: sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==} - - path-dirname@1.0.2: - resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} - - path-exists@2.1.0: - resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} - engines: {node: '>=0.10.0'} - - path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -8240,13 +4333,6 @@ packages: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} - path-is-inside@1.0.2: - resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} - - path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -8266,37 +4352,22 @@ packages: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} - path-to-regexp@0.1.13: - resolution: {integrity: sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==} - path-to-regexp@3.3.0: resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} path-to-regexp@8.4.2: resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} - path-type@1.1.0: - resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} - engines: {node: '>=0.10.0'} - - path-type@2.0.0: - resolution: {integrity: sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==} - engines: {node: '>=4'} - path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - path2d-polyfill@2.0.1: - resolution: {integrity: sha512-ad/3bsalbbWhmBo0D6FZ4RNMwsLsPpL6gnvhuSaU5Vm7b06Kr5ubSltQQ0T7YKsiJQO+g22zJ4dJKNTXIyOXtA==} - engines: {node: '>=8'} - - path@0.12.7: - resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} - pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@2.0.1: resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} @@ -8304,23 +4375,8 @@ packages: pause@0.0.1: resolution: {integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==} - pbkdf2@3.1.5: - resolution: {integrity: sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==} - engines: {node: '>= 0.10'} - - pdfjs-dist@3.11.174: - resolution: {integrity: sha512-TdTZPf1trZ8/UFu5Cx/GXB7GZM30LT+wWUNfsi6Bq8ePLnb+woNKtDymI2mxZYBpMbonNFqKmiz684DIfnd8dA==} - engines: {node: '>=18'} - - peek-readable@5.4.2: - resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} - engines: {node: '>=14.16'} - - perfect-freehand@1.2.3: - resolution: {integrity: sha512-bHZSfqDHGNlPpgH2yxXgPHlQSPpEbo+qg7li0M78J9vNAi2yjwLeA4x79BEQhX44lEWpCLSFCeRZwpw0niiXPA==} - - performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} pg-cloudflare@1.3.0: resolution: {integrity: sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==} @@ -8376,53 +4432,25 @@ packages: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} - pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - - pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} - - pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} - pkg-dir@2.0.0: - resolution: {integrity: sha512-ojakdnUgL5pzJYWw2AIDEupaQCX5OPbM688ZevubICjdIX01PRSYKqm33fJoCOJBRseYCTUlQRnBNX+Pchaejw==} - engines: {node: '>=4'} - pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + pkg-types@2.3.1: + resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} + pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - png-js@2.0.0: - resolution: {integrity: sha512-GdzJuUMc6ZSpxFJWVxtOH1bzYHym+TOnveqUjb+VJIbZWbZzyiRGFiKhbiielfpYbgMlhHVhsJ0FTazfuRFkMA==} - pngjs@5.0.0: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} engines: {node: '>=10.13.0'} - popper.js@1.16.1: - resolution: {integrity: sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==} - deprecated: You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1 - - portfinder@1.0.38: - resolution: {integrity: sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==} - engines: {node: '>= 10.12'} - - posix-character-classes@0.1.1: - resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} - engines: {node: '>=0.10.0'} - possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -8503,17 +4531,15 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - prisma@5.22.0: - resolution: {integrity: sha512-vtpjW3XuYCSnMsNVBjLMNkTj6OZbudcPPTPYHqX0CJfpcdWciI1dM8uHETwmDxxiqEwCIE6WvXucWUetJgfu/A==} - engines: {node: '>=16.13'} + prisma@6.19.3: + resolution: {integrity: sha512-++ZJ0ijLrDJF6hNB4t4uxg2br3fC4H9Yc9tcbjr2fcNFP3rh/SBNrAgjhsqBU4Ght8JPrVofG/ZkXfnSfnYsFg==} + engines: {node: '>=18.18'} hasBin: true - - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} + peerDependencies: + typescript: '>=5.1.0' + peerDependenciesMeta: + typescript: + optional: true prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} @@ -8522,71 +4548,14 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - prosemirror-changeset@2.4.1: - resolution: {integrity: sha512-96WBLhOaYhJ+kPhLg3uW359Tz6I/MfcrQfL4EGv4SrcqKEMC1gmoGrXHecPE8eOwTVCJ4IwgfzM8fFad25wNfw==} - - prosemirror-commands@1.7.1: - resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==} - - prosemirror-dropcursor@1.8.2: - resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==} - - prosemirror-gapcursor@1.4.1: - resolution: {integrity: sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==} - - prosemirror-history@1.5.0: - resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==} - - prosemirror-keymap@1.2.3: - resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} - - prosemirror-model@1.25.4: - resolution: {integrity: sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==} - - prosemirror-schema-list@1.5.1: - resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} - - prosemirror-state@1.4.4: - resolution: {integrity: sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==} - - prosemirror-tables@1.8.5: - resolution: {integrity: sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==} - - prosemirror-transform@1.12.0: - resolution: {integrity: sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==} - - prosemirror-view@1.41.8: - resolution: {integrity: sha512-TnKDdohEatgyZNGCDWIdccOHXhYloJwbwU+phw/a23KBvJIR9lWQWW7WHHK3vBdOLDNuF7TaX98GObUZOWkOnA==} - proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} - proxy-compare@3.0.1: - resolution: {integrity: sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q==} - proxy-from-env@2.1.0: resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} engines: {node: '>=10'} - proxy-memoize@3.0.1: - resolution: {integrity: sha512-VDdG/VYtOgdGkWJx7y0o7p+zArSf2383Isci8C+BP3YXgMYDoPd3cCBjw0JdWb6YBb9sFiOPbAADDVTPJnh+9g==} - - prr@1.0.1: - resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - - psl@1.15.0: - resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} - - public-encrypt@4.0.3: - resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} - - punycode@1.4.1: - resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -8603,215 +4572,35 @@ packages: resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} engines: {node: '>=0.6'} - qs@6.5.5: - resolution: {integrity: sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ==} - engines: {node: '>=0.6'} - - query-string@7.1.3: - resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} - engines: {node: '>=6'} - - querystring-es3@0.2.1: - resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} - engines: {node: '>=0.4.x'} - - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - queue@6.0.2: - resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} - - raf@3.4.1: - resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - randomfill@1.0.4: - resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} - range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - rapiq@0.9.0: - resolution: {integrity: sha512-k4oT4RarFBrlLMJ49xUTeQpa/us0uU4I70D/UEnK3FWQ4GENzei01rEQAmvPKAIzACo4NMW+YcYJ7EVfSa7EFg==} - - raw-body@2.5.3: - resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} - engines: {node: '>= 0.8'} - raw-body@3.0.2: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} - react-cookie@8.1.2: - resolution: {integrity: sha512-S45Z1y1dHyYfLEI4bFKQICuP+SwJqTPWbdc2ZpE6aQSdjSVJAjUDfwTPq8B7BWieIsgyyEWMb/QOrudtwJMjXA==} - peerDependencies: - react: 18.3.1 - - react-datepicker@8.10.0: - resolution: {integrity: sha512-JIXuA+g+qP3c4MVJpx24o7n1gnv3WV/8A/D6964HucY1FlSEc30+ITPNUfbKZXYHl5rruCtxYCwi2lzn7gaz7g==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - react-day-picker@9.14.0: - resolution: {integrity: sha512-tBaoDWjPwe0M5pGrum4H0SR6Lyk+BO9oHnp9JbKpGKW2mlraNPgP9BMfsg5pWpwrssARmeqk7YBl2oXutZTaHA==} - engines: {node: '>=18'} - peerDependencies: - react: 18.3.1 + rc9@2.1.2: + resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: react: 18.3.1 - react-dropzone@14.4.1: - resolution: {integrity: sha512-QDuV76v3uKbHiH34SpwifZ+gOLi1+RdsCO1kl5vxMT4wW8R82+sthjvBw4th3NHF/XX6FBsqDYZVNN+pnhaw0g==} - engines: {node: '>= 10.13'} - peerDependencies: - react: 18.3.1 - - react-floater@0.7.9: - resolution: {integrity: sha512-NXqyp9o8FAXOATOEo0ZpyaQ2KPb4cmPMXGWkx377QtJkIXHlHRAGer7ai0r0C1kG5gf+KJ6Gy+gdNIiosvSicg==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - react-hook-form@7.75.0: - resolution: {integrity: sha512-Ovv94H+0p3sJ7B9B5QxPuCP1u8V/cHuVGyH55cSwodYDtoJwK+fqk3vjfIgSX59I2U/bU4z0nRJ9HMLpNiWEmw==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: 18.3.1 - - react-i18next@15.7.4: - resolution: {integrity: sha512-nyU8iKNrI5uDJch0z9+Y5XEr34b0wkyYj3Rp+tfbahxtlswxSCjcUL9H0nqXo9IR3/t5Y5PKIA3fx3MfUyR9Xw==} - peerDependencies: - i18next: '>= 23.4.0' - react: 18.3.1 - react-dom: '*' - react-native: '*' - typescript: ^5 - peerDependenciesMeta: - react-dom: - optional: true - react-native: - optional: true - typescript: - optional: true - - react-icons@5.6.0: - resolution: {integrity: sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA==} - peerDependencies: - react: 18.3.1 - - react-image-crop@11.0.10: - resolution: {integrity: sha512-+5FfDXUgYLLqBh1Y/uQhIycpHCbXkI50a+nbfkB1C0xXXUTwkisHDo2QCB1SQJyHCqIuia4FeyReqXuMDKWQTQ==} - peerDependencies: - react: 18.3.1 - - react-innertext@1.1.5: - resolution: {integrity: sha512-PWAqdqhxhHIv80dT9znP2KvS+hfkbRovFp4zFYHFFlOoQLRiawIic81gKb3U1wEyJZgMwgs3JoLtwryASRWP3Q==} - peerDependencies: - '@types/react': '>=0.0.0 <=99' - react: 18.3.1 - - react-intersection-observer@9.16.0: - resolution: {integrity: sha512-w9nJSEp+DrW9KmQmeWHQyfaP6b03v+TdXynaoA964Wxt7mdR3An11z4NNCQgL4gKSK7y1ver2Fq+JKH6CWEzUA==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - react-dom: - optional: true - react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-is@19.2.6: - resolution: {integrity: sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw==} - - react-joyride@2.9.3: - resolution: {integrity: sha512-1+Mg34XK5zaqJ63eeBhqdbk7dlGCFp36FXwsEvgpjqrtyywX2C6h9vr3jgxP0bGHCw8Ilsp/nRDzNVq6HJ3rNw==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - react-number-format@5.4.5: - resolution: {integrity: sha512-y8O2yHHj3w0aE9XO8d2BCcUOOdQTRSVq+WIuMlLVucAm5XNjJAy+BoOJiuQMldVYVOKTMyvVNfnbl2Oqp+YxGw==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - react-pdf-html@2.1.5: - resolution: {integrity: sha512-KhmiTUcnUNbLVdZbxMcV/+Rp+PyBt+eVJHu425eNwjSsDUtytvcwS/SBdBbbpM0c4+MnnOQBOs3AiColUesM8A==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@react-pdf/renderer': '>=3.4.4' - react: 18.3.1 - - react-pdf-viewer@0.1.0: - resolution: {integrity: sha512-JO0bZEA6EMtljhTrLNyn9T03nIOXY6/tzK8guOdwfYpImdOpYfACy47G9AKXrVrtob9bEW2d1jR3MkC0NEGajw==} - - react-pdf@10.4.1: - resolution: {integrity: sha512-kS/35staVCBqS29verTQJQZXw7RfsRCPO3fdJoW1KXylcv7A9dw6DZ3vJXC2w+bIBgLw5FN4pOFvKSQtkQhPfA==} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - react-redux@9.2.0: - resolution: {integrity: sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==} - peerDependencies: - '@types/react': ^18.2.25 || ^19 - react: 18.3.1 - redux: ^5.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - redux: - optional: true - react-refresh@0.17.0: resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} - react-remove-scroll-bar@2.3.8: - resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - react-remove-scroll@2.7.2: - resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - react-resizable-panels@3.0.6: - resolution: {integrity: sha512-b3qKHQ3MLqOgSS+FRYKapNkJZf5EQzuf6+RLiq1/IlTHw99YrZ2NJZLk4hQIzTnnIkRg2LUqyVinu6YWWpUYew==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - react-router-dom@6.30.3: resolution: {integrity: sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==} engines: {node: '>=14.0.0'} @@ -8819,65 +4608,12 @@ packages: react: 18.3.1 react-dom: 18.3.1 - react-router-dom@7.15.0: - resolution: {integrity: sha512-VcrVg64Fo8nwBvDscajG8gRTLIuTC6N50nb22l2HOOV4PTOHgoGp8mUjy9wLiHYoYTSYI36tUnXZgasSRFZorQ==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - react-router@6.30.3: resolution: {integrity: sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==} engines: {node: '>=14.0.0'} peerDependencies: react: 18.3.1 - react-router@7.15.0: - resolution: {integrity: sha512-HW9vYwuM8f4yx66Izy8xfrzCM+SBJluoZcCbww9A1TySax11S5Vgw6fi3ZjMONw9J4gQwngL7PzkyIpJJpJ7RQ==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - react-dom: - optional: true - - react-signature-canvas@1.1.0-alpha.2: - resolution: {integrity: sha512-tKUNk3Gmh04Ug4K8p5g8Is08BFUKvbXxi0PyetQ/f8OgCBzcx4vqNf9+OArY/TdNdfHtswXQNRwZD6tyELjkjQ==} - peerDependencies: - '@types/prop-types': ^15.7.3 - '@types/react': 0.14 - 19 - prop-types: ^15.5.8 - react: 18.3.1 - react-dom: 18.3.1 - peerDependenciesMeta: - '@types/prop-types': - optional: true - '@types/react': - optional: true - - react-style-singleton@2.2.3: - resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - react-textarea-autosize@8.5.9: - resolution: {integrity: sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==} - engines: {node: '>=10'} - peerDependencies: - react: 18.3.1 - - react-transition-group@4.4.5: - resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -8885,44 +4621,10 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - read-pkg-up@1.0.1: - resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} - engines: {node: '>=0.10.0'} - - read-pkg-up@2.0.0: - resolution: {integrity: sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==} - engines: {node: '>=4'} - - read-pkg@1.1.0: - resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} - engines: {node: '>=0.10.0'} - - read-pkg@2.0.0: - resolution: {integrity: sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==} - engines: {node: '>=4'} - - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} - readable-stream@4.7.0: - resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - readable-web-to-node-stream@3.0.4: - resolution: {integrity: sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw==} - engines: {node: '>=8'} - - readdir-glob@1.1.3: - resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} - - readdirp@2.2.1: - resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} - engines: {node: '>=0.10'} - readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -8931,29 +4633,6 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} - recharts@3.8.1: - resolution: {integrity: sha512-mwzmO1s9sFL0TduUpwndxCUNoXsBw3u3E/0+A+cLcrSfQitSG62L32N69GhqUrrT5qKcAE3pCGVINC6pqkBBQg==} - engines: {node: '>=18'} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - react-is: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - redent@1.0.0: - resolution: {integrity: sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==} - engines: {node: '>=0.10.0'} - - redux-thunk@3.1.0: - resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} - peerDependencies: - redux: ^5.0.0 - - redux@5.0.1: - resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} - - reflect-metadata@0.1.14: - resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} - reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} @@ -8961,46 +4640,10 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - - regex-not@1.0.2: - resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} - engines: {node: '>=0.10.0'} - regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} - relative@3.0.2: - resolution: {integrity: sha512-Q5W2qeYtY9GbiR8z1yHNZ1DGhyjb4AnLEjt8iE6XfcC1QIu+FAtj3HQaO0wH28H1mX6cqNLvAqWhP402dxJGyA==} - engines: {node: '>= 0.8.0'} - - remarkable@1.7.4: - resolution: {integrity: sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==} - engines: {node: '>= 0.10.0'} - hasBin: true - - remove-trailing-separator@1.1.0: - resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} - - repeat-element@1.1.4: - resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} - engines: {node: '>=0.10.0'} - - repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - - repeating@2.0.1: - resolution: {integrity: sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==} - engines: {node: '>=0.10.0'} - - request@2.88.2: - resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} - engines: {node: '>= 6'} - deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -9009,30 +4652,13 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - require-main-filename@1.0.1: - resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} - require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - - reselect@5.1.1: - resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} - - resolve-cwd@2.0.0: - resolution: {integrity: sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==} - engines: {node: '>=4'} - resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} - resolve-from@3.0.0: - resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} - engines: {node: '>=4'} - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -9041,10 +4667,6 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve-url@0.2.1: - resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} - deprecated: https://github.com/lydell/resolve-url#deprecated - resolve.exports@2.0.3: resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} @@ -9067,13 +4689,6 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} - restructure@3.0.2: - resolution: {integrity: sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==} - - ret@0.1.15: - resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} - engines: {node: '>=0.12'} - reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -9081,36 +4696,16 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rgbcolor@1.0.1: - resolution: {integrity: sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==} - engines: {node: '>= 0.8.15'} - - right-align@0.1.3: - resolution: {integrity: sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==} - engines: {node: '>=0.10.0'} - - rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - ripemd160@2.0.3: - resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==} - engines: {node: '>= 0.8'} - rollup@4.60.3: resolution: {integrity: sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rope-sequence@1.3.4: - resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} - router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} @@ -9134,9 +4729,6 @@ packages: resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} engines: {node: '>=0.4'} - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -9148,20 +4740,9 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} - safe-regex@1.1.0: - resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sax@1.6.0: - resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} - engines: {node: '>=11.0.0'} - - saxes@5.0.1: - resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} - engines: {node: '>=10'} - saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} @@ -9169,9 +4750,6 @@ packages: scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - scheduler@0.25.0-rc-603e6108-20241029: - resolution: {integrity: sha512-pFwF6H1XrSdYYNLfOcGlM28/j8CGLu8IvdrxqhjWULe2bPcKiKW4CV+OWqR/9fT52mywx65l7ysNkjLKBda7eA==} - schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} @@ -9180,26 +4758,6 @@ packages: resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} - scroll@3.0.1: - resolution: {integrity: sha512-pz7y517OVls1maEzlirKO5nPYle9AXsFzTMNJrRGmT951mzpIBy7sNHOg5o/0MQd/NqliCiWnAi0kZneMPFLcg==} - - scrollparent@2.1.0: - resolution: {integrity: sha512-bnnvJL28/Rtz/kz2+4wpBjHzWoEzXhVg/TE8BeVGJHUqE8THNIRnDxDWMktwM+qahvlRdvlLdsQfYe+cuqfZeA==} - - select-hose@2.0.0: - resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} - - self-closing-tags@1.0.1: - resolution: {integrity: sha512-7t6hNbYMxM+VHXTgJmxwgZgLGktuXtVVD5AivWzNTdJBM4DBjnDKDzkf2SrNjihaArpeJYNjxkELBu1evI4lQA==} - engines: {node: '>=0.12.0'} - - selfsigned@1.10.14: - resolution: {integrity: sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==} - - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -9209,21 +4767,12 @@ packages: engines: {node: '>=10'} hasBin: true - send@0.19.2: - resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} - engines: {node: '>= 0.8.0'} - send@1.2.1: resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} engines: {node: '>= 18'} - serve-index@1.9.2: - resolution: {integrity: sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==} - engines: {node: '>= 0.8.0'} - - serve-static@1.16.3: - resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} - engines: {node: '>= 0.8.0'} + seq-queue@0.0.5: + resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} serve-static@2.2.1: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} @@ -9232,9 +4781,6 @@ packages: set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - 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'} @@ -9243,21 +4789,10 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} - set-getter@0.1.1: - resolution: {integrity: sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==} - engines: {node: '>=0.10.0'} - set-proto@1.0.0: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} - set-value@2.0.1: - resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} - engines: {node: '>=0.10.0'} - - setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -9266,18 +4801,10 @@ packages: engines: {node: '>= 0.10'} hasBin: true - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} @@ -9308,9 +4835,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - signature_pad@2.3.2: - resolution: {integrity: sha512-peYXLxOsIY6MES2TrRLDiNg2T++8gGbpP2yaC+6Ohtxr+a2dzoaqWosWDY9sWqTAAk6E/TyQO+LJw9zQwyu5kA==} - simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} @@ -9332,67 +4856,16 @@ packages: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} - smob@1.6.1: - resolution: {integrity: sha512-KAkBqZl3c2GvNgNhcoyJae1aKldDW0LO279wF9bk1PnluRTETKBq0WyzRXxEhoQLk56yHaOY4JCBEKDuJIET5g==} - engines: {node: '>=20.0.0'} - - snapdragon-node@2.1.1: - resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} - engines: {node: '>=0.10.0'} - - snapdragon-util@3.0.1: - resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} - engines: {node: '>=0.10.0'} - - snapdragon@0.8.2: - resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} - engines: {node: '>=0.10.0'} - - socket.io-client@4.8.3: - resolution: {integrity: sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==} - engines: {node: '>=10.0.0'} - - socket.io-parser@4.2.6: - resolution: {integrity: sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==} - engines: {node: '>=10.0.0'} - - sockjs-client@1.1.5: - resolution: {integrity: sha512-PmPRkAYIeuRgX+ZSieViT4Z3Q23bLS2Itm/ck1tSf5P0/yVuFDiI5q9mcnpXoMdToaPSRS9MEyUx/aaBxrFzyw==} - - sockjs@0.3.19: - resolution: {integrity: sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==} - - sonner@2.0.7: - resolution: {integrity: sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - source-list-map@2.0.1: - resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map-resolve@0.5.3: - resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} - deprecated: See https://github.com/lydell/source-map-resolve#deprecated - source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - source-map-url@0.4.1: - resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} - deprecated: See https://github.com/lydell/source-map-url#deprecated - - source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -9401,37 +4874,6 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} - source-map@0.7.6: - resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} - engines: {node: '>= 12'} - - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.23: - resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} - - spdy-transport@3.0.0: - resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} - - spdy@4.0.2: - resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} - engines: {node: '>=6.0.0'} - - split-on-first@1.1.0: - resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} - engines: {node: '>=6'} - - split-string@3.1.0: - resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} - engines: {node: '>=0.10.0'} - split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -9443,14 +4885,9 @@ packages: resolution: {integrity: sha512-ed7OK4e9ywpE7pgRMkMQmZDPKSVdm0oX5IEtZiKnFucSF0zu6c80GZBe38UqHuVhTWJ9xsKgSMjCG2bml86KvA==} engines: {node: '>=14'} - ssf@0.11.2: - resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==} - engines: {node: '>=0.8'} - - sshpk@1.18.0: - resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} - engines: {node: '>=0.10.0'} - hasBin: true + sqlstring@2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} + engines: {node: '>= 0.6'} stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} @@ -9459,18 +4896,6 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - stackblur-canvas@2.7.0: - resolution: {integrity: sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==} - engines: {node: '>=0.1.14'} - - static-extend@0.1.2: - resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} - engines: {node: '>=0.10.0'} - - statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} - statuses@2.0.2: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} @@ -9482,20 +4907,10 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} - stream-browserify@2.0.2: - resolution: {integrity: sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==} - - stream-http@2.8.3: - resolution: {integrity: sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==} - streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - strict-uri-encode@2.0.0: - resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} - engines: {node: '>=4'} - string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -9504,14 +4919,6 @@ packages: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} - string-width@1.0.2: - resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} - engines: {node: '>=0.10.0'} - - string-width@2.1.1: - resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} - engines: {node: '>=4'} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -9543,20 +4950,9 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} - - strip-ansi@4.0.0: - resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} - engines: {node: '>=4'} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -9565,10 +4961,6 @@ packages: resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} - strip-bom@2.0.0: - resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} - engines: {node: '>=0.10.0'} - strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -9577,10 +4969,6 @@ packages: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} - strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -9589,39 +4977,14 @@ packages: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} - strip-indent@1.0.1: - resolution: {integrity: sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==} - engines: {node: '>=0.10.0'} - hasBin: true - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - striptags@3.2.0: - resolution: {integrity: sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==} - - strnum@1.1.2: - resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} - strtok3@10.3.5: resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==} engines: {node: '>=18'} - strtok3@7.1.1: - resolution: {integrity: sha512-mKX8HA/cdBqMKUr0MMZAFssCkIGoZeSCMXgnt79yKxNFguMLVFgRe6wB+fsL0NmoHDbeyZXczy7vEPSoo3rkzg==} - engines: {node: '>=16'} - - style-object-to-css-string@1.1.3: - resolution: {integrity: sha512-bISQoUsir/qGfo7vY8rw00ia9nnyE1jvYt3zZ2jhdkcXZ6dAEi74inMzQ6On57vFI+I4Fck6wOv5UI9BEwJDgw==} - - stylis@4.2.0: - resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} - - success-symbol@0.1.0: - resolution: {integrity: sha512-7S6uOTxPklNGxOSbDIg4KlVLBQw1UiGVyfCUYgYxrZUKRblUkmGj7r8xlfQoFudvqLv6Ap5gd76/IIFfI9JG2A==} - engines: {node: '>=0.10.0'} - sucrase@3.35.1: resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} engines: {node: '>=16 || 14 >=14.17'} @@ -9635,14 +4998,6 @@ packages: resolution: {integrity: sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA==} engines: {node: '>=14.18.0'} - supports-color@4.5.0: - resolution: {integrity: sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==} - engines: {node: '>=4'} - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -9655,13 +5010,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svg-arc-to-cubic-bezier@3.2.0: - resolution: {integrity: sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==} - - svg-pathdata@6.0.3: - resolution: {integrity: sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==} - engines: {node: '>=12.0.0'} - swagger-ui-dist@5.17.14: resolution: {integrity: sha512-CVbSfaLpstV65OnSjbXfVd6Sta3q3F7Cj/yYuvHMp1P90LztOLs6PfUnKEVAeiIVQt9u2SaPwv0LiH/OyMjHRw==} @@ -9681,42 +5029,15 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - tabbable@6.4.0: - resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} - - tailwind-merge@3.6.0: - resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} - - tailwind-scrollbar-hide@4.0.0: - resolution: {integrity: sha512-gobtvVcThB2Dxhy0EeYSS1RKQJ5baDFkamkhwBvzvevwX6L4XQfpZ3me9s25Ss1ecFVT5jPYJ50n+7xTBJG9WQ==} - peerDependencies: - tailwindcss: '>=3.0.0 || >= 4.0.0 || >= 4.0.0-beta.8 || >= 4.0.0-alpha.20' - - tailwindcss-animate@1.0.7: - resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} - peerDependencies: - tailwindcss: '>=3.0.0 || insiders' - tailwindcss@3.4.19: resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} engines: {node: '>=14.0.0'} hasBin: true - tailwindcss@4.3.0: - resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} - - tapable@0.2.9: - resolution: {integrity: sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==} - engines: {node: '>=0.6'} - tapable@2.3.3: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} @@ -9770,12 +5091,6 @@ packages: engines: {node: '>=10'} hasBin: true - tesseract.js-core@7.0.0: - resolution: {integrity: sha512-WnNH518NzmbSq9zgTPeoF8c+xmilS8rFIl1YKbk/ptuuc7p6cLNELNuPAzcmsYw450ca6bLa8j3t0VAtq435Vw==} - - tesseract.js@7.0.0: - resolution: {integrity: sha512-exPBkd+z+wM1BuMkx/Bjv43OeLBxhL5kKWsz/9JY+DXcXdiBjiAch0V49QR3oAJqCaL5qURE0vx9Eo+G5YE7mA==} - test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -9784,9 +5099,6 @@ packages: resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} engines: {node: '>=8'} - text-segmentation@1.0.3: - resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==} - text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -9797,36 +5109,9 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - - through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} - through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - thunky@1.1.0: - resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} - - time-stamp@1.1.0: - resolution: {integrity: sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==} - engines: {node: '>=0.10.0'} - - time-stamp@2.2.0: - resolution: {integrity: sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==} - engines: {node: '>=0.10.0'} - - timers-browserify@2.0.12: - resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} - engines: {node: '>=0.6.0'} - - tiny-inflate@1.0.3: - resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} - - tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -9841,9 +5126,6 @@ packages: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} - tinymce@7.9.2: - resolution: {integrity: sha512-zS2gn2CPQmZhUqLzkhwYH+WGsx/DIRY/mS18RVzsIcuQg2lN2uzaqoHSJU6DdMUpvXBtBFnLNpumC3QrDwLBzA==} - tinypool@1.1.1: resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} @@ -9863,56 +5145,25 @@ packages: resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} hasBin: true - tmp@0.2.5: - resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} - engines: {node: '>=14.14'} - tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - to-arraybuffer@1.0.1: - resolution: {integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==} - to-buffer@1.2.2: resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} engines: {node: '>= 0.4'} - to-gfm-code-block@0.1.1: - resolution: {integrity: sha512-LQRZWyn8d5amUKnfR9A9Uu7x9ss7Re8peuWR2gkh1E+ildOfv2aF26JpuDg8JtvCduu5+hOrMIH+XstZtnagqg==} - engines: {node: '>=0.10.0'} - - to-object-path@0.3.0: - resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} - engines: {node: '>=0.10.0'} - - to-regex-range@2.1.1: - resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} - engines: {node: '>=0.10.0'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - to-regex@3.0.2: - resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} - engines: {node: '>=0.10.0'} - toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - token-types@5.0.1: - resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} - engines: {node: '>=14.16'} - token-types@6.1.2: resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} engines: {node: '>=14.16'} - tough-cookie@2.5.0: - resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} - engines: {node: '>=0.8'} - tough-cookie@5.1.2: resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} engines: {node: '>=16'} @@ -9924,22 +5175,6 @@ packages: resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} engines: {node: '>=18'} - traverse@0.3.9: - resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} - - tree-changes@0.11.3: - resolution: {integrity: sha512-r14mvDZ6tqz8PRQmlFKjhUVngu4VZ9d92ON3tp0EGpFBE6PAHOq8Bx8m8ahbNoGE3uI/npjYcJiqVydyOiYXag==} - - tree-changes@0.9.3: - resolution: {integrity: sha512-vvvS+O6kEeGRzMglTKbc19ltLWNtmNt1cpBoSYLj/iEcPVvpJasemKOlxBrmZaCtDJoF+4bwv3m01UKYi8mukQ==} - - trim-canvas@0.1.2: - resolution: {integrity: sha512-nd4Ga3iLFV94mdhW9JFMLpQbHUyCQuhFOD71PEAt1NjtMD5wbZctzhX8c3agHNybMR5zXD1XTGoIEWk995E6pQ==} - - trim-newlines@1.0.0: - resolution: {integrity: sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==} - engines: {node: '>=0.10.0'} - ts-api-utils@2.5.0: resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} @@ -9976,13 +5211,6 @@ packages: jest-util: optional: true - ts-loader@9.5.7: - resolution: {integrity: sha512-/ZNrKgA3K3PtpMYOC71EeMWIloGw3IYEa5/t1cyz2r5/PyUwTXGzYJvcD3kfUvmhlfpz1rhV8B2O6IVTQ0avsg==} - engines: {node: '>=12.0.0'} - peerDependencies: - typescript: '*' - webpack: ^5.0.0 - ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -10011,19 +5239,10 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tty-browserify@0.0.0: - resolution: {integrity: sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==} - - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - turbo@2.9.12: resolution: {integrity: sha512-lCPgus1NuTiBdaITWqzSH/Ff6HVL8HHGBtOXHg1dHRfcshN79XkygSdh0M6g8b0td91ILLG5MTkLOkp5UvyPJw==} hasBin: true - tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -10052,9 +5271,6 @@ packages: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} - type@2.7.3: - resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} - typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -10074,18 +5290,6 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typeof-article@0.1.1: - resolution: {integrity: sha512-Vn42zdX3FhmUrzEmitX3iYyLb+Umwpmv8fkZRIknYh84lmdrwqZA5xYaoKiIj2Rc5i/5wcDrpUmZcbk1U51vTw==} - engines: {node: '>=4'} - - typeorm-extension@3.9.0: - resolution: {integrity: sha512-LCVo/7zEh59/+Ig+WsXFbuu1gvU7EilIOH1vwxTG2eAiKmteaTQlID9c1x/PQH2IyZ+Lk4htbWf1d9QieKrpPQ==} - engines: {node: ^20.19.0 || ^22.13.0 || ^23.5.0 || >=24.0.0} - hasBin: true - peerDependencies: - '@faker-js/faker': '>=8.4.1' - typeorm: ~0.3.0 - typeorm@0.3.29: resolution: {integrity: sha512-wwPEX/df4l72gCmOsrs0otJZYLGA9lLQkUZCkukbsymEycV4zXv2KM7wU7v2r8L01TaCgY9ApSSqHQWBOUhEoQ==} engines: {node: '>=16.13.0'} @@ -10146,25 +5350,11 @@ packages: engines: {node: '>=14.17'} hasBin: true - uglify-js@2.8.29: - resolution: {integrity: sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==} - engines: {node: '>=0.8.0'} - hasBin: true - uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} hasBin: true - uglify-to-browserify@1.0.2: - resolution: {integrity: sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==} - - uglifyjs-webpack-plugin@0.4.6: - resolution: {integrity: sha512-TNM20HMW67kxHRNCZdvLyiwE1ST6WyY5Ae+TG55V81NpvNwJ9+V4/po4LHA1R9afV/WrqzfedG2UJCk2+swirw==} - engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} - peerDependencies: - webpack: ^1.9 || ^2 || ^2.1.0-beta || ^2.2.0-rc || ^3.0.0 - uid@2.0.2: resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} engines: {node: '>=8'} @@ -10183,23 +5373,10 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - unicode-properties@1.4.1: - resolution: {integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==} - - unicode-trie@2.0.0: - resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} - unicorn-magic@0.1.0: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} - union-value@1.0.1: - resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} - engines: {node: '>=0.10.0'} - - universal-cookie@8.1.2: - resolution: {integrity: sha512-kcKzTGNsxVytujrYOvQbvh//QyFrA53HrzCGyzh6i9ujCww5gfPrLK0tG+jJD40SIIldiEjBNPPSR8fBMS21GA==} - universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -10208,129 +5385,31 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unset-value@1.0.0: - resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} - engines: {node: '>=0.10.0'} - - unzipper@0.10.14: - resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==} - - 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' - uqr@0.1.2: - resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} - uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - urix@0.1.0: - resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} - deprecated: Please see https://github.com/lydell/urix#deprecated - - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - - url@0.11.4: - resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} - engines: {node: '>= 0.4'} - - use-callback-ref@1.3.3: - resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - use-composed-ref@1.4.0: - resolution: {integrity: sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - use-isomorphic-layout-effect@1.2.1: - resolution: {integrity: sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - use-latest@1.3.0: - resolution: {integrity: sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - - use-sidecar@1.1.3: - resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: 18.3.1 - peerDependenciesMeta: - '@types/react': - optional: true - use-sync-external-store@1.6.0: resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} peerDependencies: react: 18.3.1 - use@3.1.1: - resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} - engines: {node: '>=0.10.0'} - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - util@0.10.4: - resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} - - util@0.11.1: - resolution: {integrity: sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==} - - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - utrie@1.0.2: - resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==} - uuid@11.1.1: resolution: {integrity: sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==} hasBin: true - uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). - hasBin: true - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). - hasBin: true - v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -10338,9 +5417,6 @@ packages: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - validator@13.15.35: resolution: {integrity: sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==} engines: {node: '>= 0.10'} @@ -10349,23 +5425,6 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vaul@1.1.2: - resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==} - peerDependencies: - react: 18.3.1 - react-dom: 18.3.1 - - verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} - - victory-vendor@37.3.6: - resolution: {integrity: sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==} - - vite-compatible-readable-stream@3.6.1: - resolution: {integrity: sha512-t20zYkrSf868+j/p31cRIGN28Phrjm3nRSLR2fyc2tiWi4cZGVdv68yNlwnIINTkMTmPoMiSlc0OadaO7DXZaQ==} - engines: {node: '>= 6'} - vite-node@2.1.9: resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -10427,16 +5486,6 @@ packages: jsdom: optional: true - vm-browserify@1.1.2: - resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} - - void-elements@3.1.0: - resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} - engines: {node: '>=0.10.0'} - - w3c-keyname@2.2.8: - resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} - w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} @@ -10444,35 +5493,13 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - warning-symbol@0.1.0: - resolution: {integrity: sha512-1S0lwbHo3kNUKA4VomBAhqn4DPjQkIKSdbOin5K7EFUQNwyIKx+wZMGXKI53RUjla8V2B8ouQduUlgtx8LoSMw==} - engines: {node: '>=0.10.0'} - - warning@4.0.3: - resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} - - wasm-feature-detect@1.8.0: - resolution: {integrity: sha512-zksaLKM2fVlnB5jQQDqKXXwYHLQUVH9es+5TOOHwGOVJOCeRBCiPjwSg+3tN2AdTCzjgli4jijCH290kXb/zWQ==} - - watchpack-chokidar2@2.0.1: - resolution: {integrity: sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==} - - watchpack@1.7.5: - resolution: {integrity: sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==} - watchpack@2.5.1: resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} engines: {node: '>=10.13.0'} - wbuf@1.7.3: - resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} - wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - web-encoding@1.1.5: - resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} - webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -10480,47 +5507,14 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - webpack-dev-middleware@1.12.2: - resolution: {integrity: sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==} - engines: {node: '>=0.6'} - peerDependencies: - webpack: ^1.0.0 || ^2.0.0 || ^3.0.0 - - webpack-dev-server@2.11.5: - resolution: {integrity: sha512-7TdOKKt7G3sWEhPKV0zP+nD0c4V9YKUJ3wDdBwQsZNo58oZIRoVIu66pg7PYkBW8A74msP9C2kLwmxGHndz/pw==} - engines: {node: '>=4.7'} - hasBin: true - peerDependencies: - webpack: ^2.2.0 || ^3.0.0 - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - webpack-node-externals@3.0.0: resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} engines: {node: '>=6'} - webpack-sources@1.4.3: - resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} - webpack-sources@3.4.1: resolution: {integrity: sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==} engines: {node: '>=10.13.0'} - webpack@3.12.0: - resolution: {integrity: sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==} - engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} - hasBin: true - peerDependencies: - webpack-cli: '*' - webpack-command: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - webpack-command: - optional: true - webpack@5.106.0: resolution: {integrity: sha512-Pkx5joZ9RrdgO5LBkyX1L2ZAJeK/Taz3vqZ9CbcP0wS5LEMx5QkKsEwLl29QJfihZ+DKRBFldzy1O30pJ1MDpA==} engines: {node: '>=10.13.0'} @@ -10531,14 +5525,6 @@ packages: webpack-cli: optional: true - websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} - - websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} - whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -10567,9 +5553,6 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-module@1.0.0: - resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} - which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} @@ -10577,10 +5560,6 @@ packages: resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} engines: {node: '>= 0.4'} - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -10594,33 +5573,13 @@ packages: wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - window-size@0.1.0: - resolution: {integrity: sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==} - engines: {node: '>= 0.8.0'} - - wmf@1.0.2: - resolution: {integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==} - engines: {node: '>=0.8'} - word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - word@0.3.0: - resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==} - engines: {node: '>=0.8'} - - wordwrap@0.0.2: - resolution: {integrity: sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==} - engines: {node: '>=0.4.0'} - wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - wrap-ansi@2.1.0: - resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} - engines: {node: '>=0.10.0'} - wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -10644,18 +5603,6 @@ packages: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} - 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 - ws@8.20.0: resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} engines: {node: '>=10.0.0'} @@ -10668,40 +5615,17 @@ packages: utf-8-validate: optional: true - xlsx@0.18.5: - resolution: {integrity: sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==} - engines: {node: '>=0.8'} - hasBin: true - xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} - xml2js@0.5.0: - resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} - engines: {node: '>=4.0.0'} - - xml@1.0.1: - resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} - - xmlbuilder@11.0.1: - resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} - engines: {node: '>=4.0'} - xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - xmlhttprequest-ssl@2.1.2: - resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} - engines: {node: '>=0.4.0'} - xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - y18n@3.2.2: - resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} - y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} @@ -10709,9 +5633,6 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -10735,16 +5656,6 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yargs-parser@22.0.0: - resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=23} - - yargs-parser@4.2.1: - resolution: {integrity: sha512-+QQWqC2xeL0N5/TE+TY6OGEqyNRM+g2/r712PDNYgiCdXYCApXf1vzfmDSLBxfGRwV+moTq/V8FnMI24JCm2Yg==} - - yargs-parser@7.0.0: - resolution: {integrity: sha512-WhzC+xgstid9MbVUktco/bf+KJG+Uu6vMX0LN1sLJvwmbCQVxb4D8LzogobonKycNasCZLdOzTAk1SK7+K7swg==} - yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} @@ -10753,23 +5664,6 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} - yargs@18.0.0: - resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=23} - - yargs@3.10.0: - resolution: {integrity: sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==} - - yargs@6.6.0: - resolution: {integrity: sha512-6/QWTdisjnu5UHUzQGst+UOEuEVwIzFVGBjq3jMTFNs5WJQsH/X6nMURSaScIdF5txylr1Ao9bvbWiKi2yXbwA==} - - yargs@8.0.2: - resolution: {integrity: sha512-3RiZrpLpjrzIAKgGdPktBcMP/eG5bDFlkI+PHle1qwzyVXyDQL+pD/eZaMoOOO0Y7LLBfjpucObuUm/icvbpKQ==} - - year@0.2.1: - resolution: {integrity: sha512-9GnJUZ0QM4OgXuOzsKNzTJ5EOkums1Xc+3YQXp+Q+UxFjf7zLucp9dQ8QMIft0Szs1E1hUiXFim1OYfEKFq97w==} - engines: {node: '>=0.8'} - yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -10786,19 +5680,6 @@ packages: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} - yoga-layout@3.2.1: - resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==} - - zip-stream@4.1.1: - resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} - engines: {node: '>= 10'} - - zlibjs@0.3.1: - resolution: {integrity: sha512-+J9RrgTKOmlxFSDHo0pI1xM6BLVUv+o0ZT9ANtCxGkjIVCCUdx9alUF8Gm+dGLKbkkkidWIHFDZHDMpfITt4+w==} - - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zustand@5.0.13: resolution: {integrity: sha512-efI2tVaVQPqtOh114loML/Z80Y4NP3yc+Ff0fYiZJPauNeWZeIp/bRFD7I9bfmCOYBh/PHxlglQ9+wvlwnPikQ==} engines: {node: '>=12.20.0'} @@ -10854,78 +5735,6 @@ snapshots: transitivePeerDependencies: - chokidar - '@ark-ui/react@5.36.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@internationalized/date': 3.12.0 - '@zag-js/accordion': 1.40.0 - '@zag-js/anatomy': 1.40.0 - '@zag-js/angle-slider': 1.40.0 - '@zag-js/async-list': 1.40.0 - '@zag-js/auto-resize': 1.40.0 - '@zag-js/avatar': 1.40.0 - '@zag-js/carousel': 1.40.0 - '@zag-js/cascade-select': 1.40.0 - '@zag-js/checkbox': 1.40.0 - '@zag-js/clipboard': 1.40.0 - '@zag-js/collapsible': 1.40.0 - '@zag-js/collection': 1.40.0 - '@zag-js/color-picker': 1.40.0 - '@zag-js/color-utils': 1.40.0 - '@zag-js/combobox': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/date-input': 1.40.0(@internationalized/date@3.12.0) - '@zag-js/date-picker': 1.40.0(@internationalized/date@3.12.0) - '@zag-js/date-utils': 1.40.0(@internationalized/date@3.12.0) - '@zag-js/dialog': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/drawer': 1.40.0 - '@zag-js/editable': 1.40.0 - '@zag-js/file-upload': 1.40.0 - '@zag-js/file-utils': 1.40.0 - '@zag-js/floating-panel': 1.40.0 - '@zag-js/focus-trap': 1.40.0 - '@zag-js/focus-visible': 1.40.0 - '@zag-js/highlight-word': 1.40.0 - '@zag-js/hover-card': 1.40.0 - '@zag-js/i18n-utils': 1.40.0 - '@zag-js/image-cropper': 1.40.0 - '@zag-js/json-tree-utils': 1.40.0 - '@zag-js/listbox': 1.40.0 - '@zag-js/marquee': 1.40.0 - '@zag-js/menu': 1.40.0 - '@zag-js/navigation-menu': 1.40.0 - '@zag-js/number-input': 1.40.0 - '@zag-js/pagination': 1.40.0 - '@zag-js/password-input': 1.40.0 - '@zag-js/pin-input': 1.40.0 - '@zag-js/popover': 1.40.0 - '@zag-js/presence': 1.40.0 - '@zag-js/progress': 1.40.0 - '@zag-js/qr-code': 1.40.0 - '@zag-js/radio-group': 1.40.0 - '@zag-js/rating-group': 1.40.0 - '@zag-js/react': 1.40.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@zag-js/scroll-area': 1.40.0 - '@zag-js/select': 1.40.0 - '@zag-js/signature-pad': 1.40.0 - '@zag-js/slider': 1.40.0 - '@zag-js/splitter': 1.40.0 - '@zag-js/steps': 1.40.0 - '@zag-js/switch': 1.40.0 - '@zag-js/tabs': 1.40.0 - '@zag-js/tags-input': 1.40.0 - '@zag-js/timer': 1.40.0 - '@zag-js/toast': 1.40.0 - '@zag-js/toggle': 1.40.0 - '@zag-js/toggle-group': 1.40.0 - '@zag-js/tooltip': 1.40.0 - '@zag-js/tour': 1.40.0 - '@zag-js/tree-view': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - '@asamuzakjp/css-color@3.2.0': 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) @@ -11108,7 +5917,8 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/runtime@7.29.2': {} + '@babel/runtime@7.29.2': + optional: true '@babel/template@7.28.6': dependencies: @@ -11137,19 +5947,6 @@ snapshots: '@borewit/text-codec@0.2.2': {} - '@chakra-ui/react@3.35.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@ark-ui/react': 5.36.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@emotion/is-prop-valid': 1.4.0 - '@emotion/react': 11.14.0(@types/react@18.3.28)(react@18.3.1) - '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1) - '@emotion/utils': 1.4.2 - '@pandacss/is-valid-prop': 1.11.1 - csstype: 3.2.3 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - '@colors/colors@1.5.0': optional: true @@ -11287,91 +6084,6 @@ snapshots: '@csstools/css-tokenizer@3.0.4': {} - '@date-fns/tz@1.4.1': {} - - '@emotion/babel-plugin@11.13.5': - dependencies: - '@babel/helper-module-imports': 7.28.6 - '@babel/runtime': 7.29.2 - '@emotion/hash': 0.9.2 - '@emotion/memoize': 0.9.0 - '@emotion/serialize': 1.3.3 - babel-plugin-macros: 3.1.0 - convert-source-map: 1.9.0 - escape-string-regexp: 4.0.0 - find-root: 1.1.0 - source-map: 0.5.7 - stylis: 4.2.0 - transitivePeerDependencies: - - supports-color - - '@emotion/cache@11.14.0': - dependencies: - '@emotion/memoize': 0.9.0 - '@emotion/sheet': 1.4.0 - '@emotion/utils': 1.4.2 - '@emotion/weak-memoize': 0.4.0 - stylis: 4.2.0 - - '@emotion/hash@0.9.2': {} - - '@emotion/is-prop-valid@1.4.0': - dependencies: - '@emotion/memoize': 0.9.0 - - '@emotion/memoize@0.9.0': {} - - '@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.29.2 - '@emotion/babel-plugin': 11.13.5 - '@emotion/cache': 11.14.0 - '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1) - '@emotion/utils': 1.4.2 - '@emotion/weak-memoize': 0.4.0 - hoist-non-react-statics: 3.3.2 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.28 - transitivePeerDependencies: - - supports-color - - '@emotion/serialize@1.3.3': - dependencies: - '@emotion/hash': 0.9.2 - '@emotion/memoize': 0.9.0 - '@emotion/unitless': 0.10.0 - '@emotion/utils': 1.4.2 - csstype: 3.2.3 - - '@emotion/sheet@1.4.0': {} - - '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.29.2 - '@emotion/babel-plugin': 11.13.5 - '@emotion/is-prop-valid': 1.4.0 - '@emotion/react': 11.14.0(@types/react@18.3.28)(react@18.3.1) - '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1) - '@emotion/utils': 1.4.2 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.28 - transitivePeerDependencies: - - supports-color - - '@emotion/unitless@0.10.0': {} - - '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@18.3.1)': - dependencies: - react: 18.3.1 - - '@emotion/utils@1.4.2': {} - - '@emotion/weak-memoize@0.4.0': {} - '@esbuild/aix-ppc64@0.21.5': optional: true @@ -11464,61 +6176,6 @@ snapshots: '@eslint/js@8.57.1': {} - '@faker-js/faker@10.4.0': {} - - '@fast-csv/format@4.3.5': - dependencies: - '@types/node': 14.18.63 - lodash.escaperegexp: 4.1.2 - lodash.isboolean: 3.0.3 - lodash.isequal: 4.5.0 - lodash.isfunction: 3.0.9 - lodash.isnil: 4.0.0 - - '@fast-csv/parse@4.3.6': - dependencies: - '@types/node': 14.18.63 - lodash.escaperegexp: 4.1.2 - lodash.groupby: 4.6.0 - lodash.isfunction: 3.0.9 - lodash.isnil: 4.0.0 - lodash.isundefined: 3.0.1 - lodash.uniq: 4.5.0 - - '@floating-ui/core@1.7.5': - dependencies: - '@floating-ui/utils': 0.2.11 - - '@floating-ui/dom@1.7.6': - dependencies: - '@floating-ui/core': 1.7.5 - '@floating-ui/utils': 0.2.11 - - '@floating-ui/react-dom@2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/dom': 1.7.6 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@floating-ui/react@0.27.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/react-dom': 2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@floating-ui/utils': 0.2.11 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - tabbable: 6.4.0 - - '@floating-ui/utils@0.2.11': {} - - '@gilbarbara/deep-equal@0.1.2': {} - - '@gilbarbara/deep-equal@0.3.1': {} - - '@hookform/resolvers@5.2.2(react-hook-form@7.75.0(react@18.3.1))': - dependencies: - '@standard-schema/utils': 0.3.0 - react-hook-form: 7.75.0(react@18.3.1) - '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -11671,14 +6328,6 @@ snapshots: optionalDependencies: '@types/node': 20.19.41 - '@internationalized/date@3.12.0': - dependencies: - '@swc/helpers': 0.5.21 - - '@internationalized/number@3.6.5': - dependencies: - '@swc/helpers': 0.5.21 - '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -11889,42 +6538,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@leichtgewicht/ip-codec@2.0.5': {} - - '@lottiefiles/react-lottie-player@3.6.0(react@18.3.1)': - dependencies: - lottie-web: 5.13.0 - react: 18.3.1 - '@lukeed/csprng@1.1.0': {} - '@mantine/core@8.3.18(@mantine/hooks@8.3.18(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/react': 0.27.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mantine/hooks': 8.3.18(react@18.3.1) - clsx: 2.1.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-number-format: 5.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-remove-scroll: 2.7.2(@types/react@18.3.28)(react@18.3.1) - react-textarea-autosize: 8.5.9(@types/react@18.3.28)(react@18.3.1) - type-fest: 4.41.0 - transitivePeerDependencies: - - '@types/react' - - '@mantine/dates@8.3.18(@mantine/core@8.3.18(@mantine/hooks@8.3.18(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@8.3.18(react@18.3.1))(dayjs@1.11.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@mantine/core': 8.3.18(@mantine/hooks@8.3.18(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mantine/hooks': 8.3.18(react@18.3.1) - clsx: 2.1.1 - dayjs: 1.11.20 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@mantine/hooks@8.3.18(react@18.3.1)': - dependencies: - react: 18.3.1 - '@mapbox/node-pre-gyp@1.0.11': dependencies: detect-libc: 2.1.2 @@ -11942,140 +6557,6 @@ snapshots: '@microsoft/tsdoc@0.15.1': {} - '@microsoft/tsdoc@0.16.0': {} - - '@mui/base@5.0.0-beta.70(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.29.2 - '@floating-ui/react-dom': 2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.24(@types/react@18.3.28) - '@mui/utils': 6.4.9(@types/react@18.3.28)(react@18.3.1) - '@popperjs/core': 2.11.8 - clsx: 2.1.1 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - - '@mui/core-downloads-tracker@5.18.0': {} - - '@mui/icons-material@5.18.0(@mui/material@5.18.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.29.2 - '@mui/material': 5.18.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.28 - - '@mui/material@5.18.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.29.2 - '@mui/core-downloads-tracker': 5.18.0 - '@mui/system': 5.18.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) - '@mui/types': 7.2.24(@types/react@18.3.28) - '@mui/utils': 5.17.1(@types/react@18.3.28)(react@18.3.1) - '@popperjs/core': 2.11.8 - '@types/react-transition-group': 4.4.12(@types/react@18.3.28) - clsx: 2.1.1 - csstype: 3.2.3 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-is: 19.2.6 - react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - optionalDependencies: - '@emotion/react': 11.14.0(@types/react@18.3.28)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) - '@types/react': 18.3.28 - - '@mui/private-theming@5.17.1(@types/react@18.3.28)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.29.2 - '@mui/utils': 5.17.1(@types/react@18.3.28)(react@18.3.1) - prop-types: 15.8.1 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.28 - - '@mui/styled-engine@5.18.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.29.2 - '@emotion/cache': 11.14.0 - '@emotion/serialize': 1.3.3 - csstype: 3.2.3 - prop-types: 15.8.1 - react: 18.3.1 - optionalDependencies: - '@emotion/react': 11.14.0(@types/react@18.3.28)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) - - '@mui/system@5.18.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.29.2 - '@mui/private-theming': 5.17.1(@types/react@18.3.28)(react@18.3.1) - '@mui/styled-engine': 5.18.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.24(@types/react@18.3.28) - '@mui/utils': 5.17.1(@types/react@18.3.28)(react@18.3.1) - clsx: 2.1.1 - csstype: 3.2.3 - prop-types: 15.8.1 - react: 18.3.1 - optionalDependencies: - '@emotion/react': 11.14.0(@types/react@18.3.28)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) - '@types/react': 18.3.28 - - '@mui/types@7.2.24(@types/react@18.3.28)': - optionalDependencies: - '@types/react': 18.3.28 - - '@mui/utils@5.17.1(@types/react@18.3.28)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.29.2 - '@mui/types': 7.2.24(@types/react@18.3.28) - '@types/prop-types': 15.7.15 - clsx: 2.1.1 - prop-types: 15.8.1 - react: 18.3.1 - react-is: 19.2.6 - optionalDependencies: - '@types/react': 18.3.28 - - '@mui/utils@6.4.9(@types/react@18.3.28)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.29.2 - '@mui/types': 7.2.24(@types/react@18.3.28) - '@types/prop-types': 15.7.15 - clsx: 2.1.1 - prop-types: 15.8.1 - react: 18.3.1 - react-is: 19.2.6 - optionalDependencies: - '@types/react': 18.3.28 - - '@mui/x-date-pickers@6.20.2(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@mui/material@5.18.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@5.18.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(date-fns@3.6.0)(dayjs@1.11.20)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.29.2 - '@mui/base': 5.0.0-beta.70(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/material': 5.18.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/system': 5.18.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) - '@mui/utils': 5.17.1(@types/react@18.3.28)(react@18.3.1) - '@types/react-transition-group': 4.4.12(@types/react@18.3.28) - clsx: 2.1.1 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - optionalDependencies: - '@emotion/react': 11.14.0(@types/react@18.3.28)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) - date-fns: 3.6.0 - dayjs: 1.11.20 - moment: 2.30.1 - transitivePeerDependencies: - - '@types/react' - '@nestjs/axios@4.0.1(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(axios@1.16.0)(rxjs@7.8.2)': dependencies: '@nestjs/common': 11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -12168,12 +6649,6 @@ snapshots: '@types/jsonwebtoken': 9.0.5 jsonwebtoken: 9.0.2 - '@nestjs/jwt@11.0.2(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))': - dependencies: - '@nestjs/common': 11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@types/jsonwebtoken': 9.0.10 - jsonwebtoken: 9.0.3 - '@nestjs/mapped-types@2.0.5(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)': dependencies: '@nestjs/common': 11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -12182,14 +6657,6 @@ snapshots: class-transformer: 0.5.1 class-validator: 0.14.4 - '@nestjs/mapped-types@2.1.1(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)': - dependencies: - '@nestjs/common': 11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) - reflect-metadata: 0.2.2 - optionalDependencies: - class-transformer: 0.5.1 - class-validator: 0.14.4 - '@nestjs/microservices@11.1.19(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2)': dependencies: '@nestjs/common': 11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -12198,17 +6665,13 @@ snapshots: reflect-metadata: 0.2.2 rxjs: 7.8.2 tslib: 2.8.1 + optional: true '@nestjs/passport@10.0.3(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(passport@0.7.0)': dependencies: '@nestjs/common': 11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) passport: 0.7.0 - '@nestjs/passport@11.0.5(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(passport@0.7.0)': - dependencies: - '@nestjs/common': 11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) - passport: 0.7.0 - '@nestjs/platform-express@11.1.19(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)': dependencies: '@nestjs/common': 11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -12240,21 +6703,6 @@ snapshots: transitivePeerDependencies: - chokidar - '@nestjs/swagger@11.4.2(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)': - dependencies: - '@microsoft/tsdoc': 0.16.0 - '@nestjs/common': 11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 11.1.19(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/microservices@11.1.19)(@nestjs/platform-express@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/mapped-types': 2.1.1(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2) - js-yaml: 4.1.1 - lodash: 4.18.1 - path-to-regexp: 8.4.2 - reflect-metadata: 0.2.2 - swagger-ui-dist: 5.32.4 - optionalDependencies: - class-transformer: 0.5.1 - class-validator: 0.14.4 - '@nestjs/swagger@7.4.2(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)': dependencies: '@microsoft/tsdoc': 0.15.1 @@ -12279,22 +6727,6 @@ snapshots: '@nestjs/microservices': 11.1.19(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/platform-express': 11.1.19(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19) - '@nestjs/throttler@6.5.0(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(reflect-metadata@0.2.2)': - dependencies: - '@nestjs/common': 11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 11.1.19(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/microservices@11.1.19)(@nestjs/platform-express@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2) - reflect-metadata: 0.2.2 - - '@nestjs/typeorm@11.0.1(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2)(typeorm@0.3.29(babel-plugin-macros@3.1.0)(pg@8.20.0)(ts-node@10.9.2(@types/node@20.19.41)(typescript@5.9.3)))': - dependencies: - '@nestjs/common': 11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 11.1.19(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/microservices@11.1.19)(@nestjs/platform-express@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2) - reflect-metadata: 0.2.2 - rxjs: 7.8.2 - typeorm: 0.3.29(babel-plugin-macros@3.1.0)(pg@8.20.0)(ts-node@10.9.2(@types/node@20.19.41)(typescript@5.9.3)) - - '@noble/ciphers@1.3.0': {} - '@noble/hashes@1.8.0': {} '@nodelib/fs.scandir@2.1.5': @@ -12313,991 +6745,47 @@ snapshots: dependencies: consola: 3.4.2 - '@onlyoffice/document-editor-react@2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - lodash: 4.17.21 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@pandacss/is-valid-prop@1.11.1': {} - '@paralleldrive/cuid2@2.3.1': dependencies: '@noble/hashes': 1.8.0 - '@phc/format@1.0.0': {} - '@pkgjs/parseargs@0.11.0': optional: true - '@popperjs/core@2.11.8': {} - - '@prisma/client@5.22.0(prisma@5.22.0)': + '@prisma/client@6.19.3(prisma@6.19.3(typescript@5.9.3))(typescript@5.9.3)': optionalDependencies: - prisma: 5.22.0 + prisma: 6.19.3(typescript@5.9.3) + typescript: 5.9.3 - '@prisma/debug@5.22.0': {} - - '@prisma/engines-version@5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2': {} - - '@prisma/engines@5.22.0': + '@prisma/config@6.19.3': dependencies: - '@prisma/debug': 5.22.0 - '@prisma/engines-version': 5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2 - '@prisma/fetch-engine': 5.22.0 - '@prisma/get-platform': 5.22.0 - - '@prisma/fetch-engine@5.22.0': - dependencies: - '@prisma/debug': 5.22.0 - '@prisma/engines-version': 5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2 - '@prisma/get-platform': 5.22.0 - - '@prisma/get-platform@5.22.0': - dependencies: - '@prisma/debug': 5.22.0 - - '@radix-ui/number@1.1.1': {} - - '@radix-ui/primitive@1.1.3': {} - - '@radix-ui/react-accordion@1.2.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-direction': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-id': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.3(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-arrow@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-avatar@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-context': 1.1.3(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-checkbox@1.3.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-collapsible@1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-id': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-collection@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.3(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.28)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.28 - - '@radix-ui/react-context-menu@2.2.16(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-context@1.1.2(@types/react@18.3.28)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.28 - - '@radix-ui/react-context@1.1.3(@types/react@18.3.28)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.28 - - '@radix-ui/react-dialog@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.3(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) - aria-hidden: 1.2.6 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.7.2(@types/react@18.3.28)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-direction@1.1.1(@types/react@18.3.28)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.28 - - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-id': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-focus-guards@1.1.3(@types/react@18.3.28)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.28 - - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-hover-card@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-id@1.1.1(@types/react@18.3.28)(react@18.3.1)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.28 - - '@radix-ui/react-label@2.1.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-menu@2.1.16(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-direction': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.3(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.28)(react@18.3.1) - aria-hidden: 1.2.6 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.7.2(@types/react@18.3.28)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-direction': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.3(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) - aria-hidden: 1.2.6 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.7.2(@types/react@18.3.28)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-popper@1.2.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/react-dom': 2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-rect': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/rect': 1.1.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-portal@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-presence@1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-primitive@2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-primitive@2.1.4(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-slot': 1.2.4(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-progress@1.1.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-context': 1.1.3(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-radio-group@1.3.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-direction': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-direction': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-id': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/number': 1.1.1 - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-direction': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-select@2.2.6(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/number': 1.1.1 - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-direction': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.3(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - aria-hidden: 1.2.6 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.7.2(@types/react@18.3.28)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-separator@1.1.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-slider@1.3.6(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/number': 1.1.1 - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-direction': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-slot@1.2.3(@types/react@18.3.28)(react@18.3.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.28 - - '@radix-ui/react-slot@1.2.4(@types/react@18.3.28)(react@18.3.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.28 - - '@radix-ui/react-switch@1.2.6(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-tabs@1.1.13(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-direction': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-id': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-toast@1.2.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-direction': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-toggle': 1.1.10(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-toggle@1.1.10(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-tooltip@1.2.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.3(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@18.3.28)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.28 - - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@18.3.28)(react@18.3.1)': - dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.28 - - '@radix-ui/react-use-effect-event@0.0.2(@types/react@18.3.28)(react@18.3.1)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.28 - - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@18.3.28)(react@18.3.1)': - dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.28 - - '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@18.3.28)(react@18.3.1)': - dependencies: - react: 18.3.1 - use-sync-external-store: 1.6.0(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@18.3.28)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.28 - - '@radix-ui/react-use-previous@1.1.1(@types/react@18.3.28)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.28 - - '@radix-ui/react-use-rect@1.1.1(@types/react@18.3.28)(react@18.3.1)': - dependencies: - '@radix-ui/rect': 1.1.1 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.28 - - '@radix-ui/react-use-size@1.1.1(@types/react@18.3.28)(react@18.3.1)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.28)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.28 - - '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - - '@radix-ui/rect@1.1.1': {} - - '@react-pdf-viewer/attachment@3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-pdf-viewer/core': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + c12: 3.1.0 + deepmerge-ts: 7.1.5 + effect: 3.21.0 + empathic: 2.0.0 transitivePeerDependencies: - - pdfjs-dist + - magicast - '@react-pdf-viewer/bookmark@3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@prisma/debug@6.19.3': {} + + '@prisma/engines-version@7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7': {} + + '@prisma/engines@6.19.3': dependencies: - '@react-pdf-viewer/core': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - pdfjs-dist + '@prisma/debug': 6.19.3 + '@prisma/engines-version': 7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7 + '@prisma/fetch-engine': 6.19.3 + '@prisma/get-platform': 6.19.3 - '@react-pdf-viewer/core@3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@prisma/fetch-engine@6.19.3': dependencies: - pdfjs-dist: 3.11.174 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@prisma/debug': 6.19.3 + '@prisma/engines-version': 7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7 + '@prisma/get-platform': 6.19.3 - '@react-pdf-viewer/default-layout@3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@prisma/get-platform@6.19.3': dependencies: - '@react-pdf-viewer/attachment': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-pdf-viewer/bookmark': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-pdf-viewer/core': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-pdf-viewer/thumbnail': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-pdf-viewer/toolbar': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - pdfjs-dist - - '@react-pdf-viewer/full-screen@3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-pdf-viewer/core': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - pdfjs-dist - - '@react-pdf-viewer/get-file@3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-pdf-viewer/core': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - pdfjs-dist - - '@react-pdf-viewer/open@3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-pdf-viewer/core': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - pdfjs-dist - - '@react-pdf-viewer/page-navigation@3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-pdf-viewer/core': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - pdfjs-dist - - '@react-pdf-viewer/print@3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-pdf-viewer/core': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - pdfjs-dist - - '@react-pdf-viewer/properties@3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-pdf-viewer/core': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - pdfjs-dist - - '@react-pdf-viewer/rotate@3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-pdf-viewer/core': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - pdfjs-dist - - '@react-pdf-viewer/scroll-mode@3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-pdf-viewer/core': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - pdfjs-dist - - '@react-pdf-viewer/search@3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-pdf-viewer/core': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - pdfjs-dist - - '@react-pdf-viewer/selection-mode@3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-pdf-viewer/core': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - pdfjs-dist - - '@react-pdf-viewer/theme@3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-pdf-viewer/core': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - pdfjs-dist - - '@react-pdf-viewer/thumbnail@3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-pdf-viewer/core': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - pdfjs-dist - - '@react-pdf-viewer/toolbar@3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-pdf-viewer/core': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-pdf-viewer/full-screen': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-pdf-viewer/get-file': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-pdf-viewer/open': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-pdf-viewer/page-navigation': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-pdf-viewer/print': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-pdf-viewer/properties': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-pdf-viewer/rotate': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-pdf-viewer/scroll-mode': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-pdf-viewer/search': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-pdf-viewer/selection-mode': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-pdf-viewer/theme': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-pdf-viewer/zoom': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - pdfjs-dist - - '@react-pdf-viewer/zoom@3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-pdf-viewer/core': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - pdfjs-dist - - '@react-pdf/fns@3.1.3': {} - - '@react-pdf/font@4.0.8': - dependencies: - '@react-pdf/pdfkit': 5.1.1 - '@react-pdf/types': 2.11.1 - fontkit: 2.0.4 - is-url: 1.2.4 - - '@react-pdf/image@3.1.0': - dependencies: - '@react-pdf/svg': 1.1.0 - jay-peg: 1.1.1 - png-js: 2.0.0 - - '@react-pdf/layout@4.6.1': - dependencies: - '@react-pdf/fns': 3.1.3 - '@react-pdf/image': 3.1.0 - '@react-pdf/primitives': 4.3.0 - '@react-pdf/stylesheet': 6.2.1 - '@react-pdf/textkit': 6.3.0 - '@react-pdf/types': 2.11.1 - emoji-regex-xs: 1.0.0 - queue: 6.0.2 - yoga-layout: 3.2.1 - - '@react-pdf/pdfkit@5.1.1': - dependencies: - '@babel/runtime': 7.29.2 - '@noble/ciphers': 1.3.0 - '@noble/hashes': 1.8.0 - browserify-zlib: 0.2.0 - fontkit: 2.0.4 - jay-peg: 1.1.1 - js-md5: 0.8.3 - linebreak: 1.1.0 - png-js: 2.0.0 - vite-compatible-readable-stream: 3.6.1 - - '@react-pdf/primitives@4.3.0': {} - - '@react-pdf/reconciler@2.0.0(react@18.3.1)': - dependencies: - object-assign: 4.1.1 - react: 18.3.1 - scheduler: 0.25.0-rc-603e6108-20241029 - - '@react-pdf/render@4.5.1': - dependencies: - '@babel/runtime': 7.29.2 - '@react-pdf/fns': 3.1.3 - '@react-pdf/primitives': 4.3.0 - '@react-pdf/textkit': 6.3.0 - '@react-pdf/types': 2.11.1 - abs-svg-path: 0.1.1 - color-string: 2.1.4 - normalize-svg-path: 1.1.0 - parse-svg-path: 0.1.2 - svg-arc-to-cubic-bezier: 3.2.0 - - '@react-pdf/renderer@4.5.1(react@18.3.1)': - dependencies: - '@babel/runtime': 7.29.2 - '@react-pdf/fns': 3.1.3 - '@react-pdf/font': 4.0.8 - '@react-pdf/layout': 4.6.1 - '@react-pdf/pdfkit': 5.1.1 - '@react-pdf/primitives': 4.3.0 - '@react-pdf/reconciler': 2.0.0(react@18.3.1) - '@react-pdf/render': 4.5.1 - '@react-pdf/types': 2.11.1 - events: 3.3.0 - object-assign: 4.1.1 - prop-types: 15.8.1 - queue: 6.0.2 - react: 18.3.1 - - '@react-pdf/stylesheet@6.2.1': - dependencies: - '@react-pdf/fns': 3.1.3 - '@react-pdf/types': 2.11.1 - color-string: 2.1.4 - hsl-to-hex: 1.0.0 - media-engine: 1.0.3 - postcss-value-parser: 4.2.0 - - '@react-pdf/svg@1.1.0': - dependencies: - '@react-pdf/primitives': 4.3.0 - - '@react-pdf/textkit@6.3.0': - dependencies: - '@react-pdf/fns': 3.1.3 - bidi-js: 1.0.3 - hyphen: 1.14.1 - unicode-properties: 1.4.1 - - '@react-pdf/types@2.11.1': - dependencies: - '@react-pdf/font': 4.0.8 - '@react-pdf/primitives': 4.3.0 - '@react-pdf/stylesheet': 6.2.1 - - '@reduxjs/toolkit@2.11.2(react-redux@9.2.0(@types/react@18.3.28)(react@18.3.1)(redux@5.0.1))(react@18.3.1)': - dependencies: - '@standard-schema/spec': 1.1.0 - '@standard-schema/utils': 0.3.0 - immer: 11.1.8 - redux: 5.0.1 - redux-thunk: 3.1.0(redux@5.0.1) - reselect: 5.1.1 - optionalDependencies: - react: 18.3.1 - react-redux: 9.2.0(@types/react@18.3.28)(react@18.3.1)(redux@5.0.1) + '@prisma/debug': 6.19.3 '@remix-run/router@1.23.2': {} @@ -13410,317 +6898,17 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@socket.io/component-emitter@3.1.2': {} - '@sqltools/formatter@1.2.5': {} '@standard-schema/spec@1.1.0': {} - '@standard-schema/utils@0.3.0': {} - - '@swc/helpers@0.5.21': - dependencies: - tslib: 2.8.1 - - '@tabby_ai/hijri-converter@1.0.5': {} - - '@tabler/icons-react@3.44.0(react@18.3.1)': - dependencies: - '@tabler/icons': 3.44.0 - react: 18.3.1 - - '@tabler/icons@3.44.0': {} - - '@tailwindcss/node@4.3.0': - dependencies: - '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.21.3 - jiti: 2.7.0 - lightningcss: 1.32.0 - magic-string: 0.30.21 - source-map-js: 1.2.1 - tailwindcss: 4.3.0 - - '@tailwindcss/oxide-android-arm64@4.3.0': - optional: true - - '@tailwindcss/oxide-darwin-arm64@4.3.0': - optional: true - - '@tailwindcss/oxide-darwin-x64@4.3.0': - optional: true - - '@tailwindcss/oxide-freebsd-x64@4.3.0': - optional: true - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': - optional: true - - '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': - optional: true - - '@tailwindcss/oxide-linux-arm64-musl@4.3.0': - optional: true - - '@tailwindcss/oxide-linux-x64-gnu@4.3.0': - optional: true - - '@tailwindcss/oxide-linux-x64-musl@4.3.0': - optional: true - - '@tailwindcss/oxide-wasm32-wasi@4.3.0': - optional: true - - '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': - optional: true - - '@tailwindcss/oxide-win32-x64-msvc@4.3.0': - optional: true - - '@tailwindcss/oxide@4.3.0': - optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.3.0 - '@tailwindcss/oxide-darwin-arm64': 4.3.0 - '@tailwindcss/oxide-darwin-x64': 4.3.0 - '@tailwindcss/oxide-freebsd-x64': 4.3.0 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.0 - '@tailwindcss/oxide-linux-arm64-gnu': 4.3.0 - '@tailwindcss/oxide-linux-arm64-musl': 4.3.0 - '@tailwindcss/oxide-linux-x64-gnu': 4.3.0 - '@tailwindcss/oxide-linux-x64-musl': 4.3.0 - '@tailwindcss/oxide-wasm32-wasi': 4.3.0 - '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 - '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 - - '@tailwindcss/vite@4.3.0(vite@5.4.21(@types/node@24.12.4)(lightningcss@1.32.0)(terser@5.47.1))': - dependencies: - '@tailwindcss/node': 4.3.0 - '@tailwindcss/oxide': 4.3.0 - tailwindcss: 4.3.0 - vite: 5.4.21(@types/node@24.12.4)(lightningcss@1.32.0)(terser@5.47.1) - '@tanstack/query-core@5.100.10': {} - '@tanstack/query-devtools@5.100.10': {} - - '@tanstack/react-query-devtools@5.100.10(@tanstack/react-query@5.100.10(react@18.3.1))(react@18.3.1)': - dependencies: - '@tanstack/query-devtools': 5.100.10 - '@tanstack/react-query': 5.100.10(react@18.3.1) - react: 18.3.1 - '@tanstack/react-query@5.100.10(react@18.3.1)': dependencies: '@tanstack/query-core': 5.100.10 react: 18.3.1 - '@tanstack/react-table@8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@tanstack/table-core': 8.21.3 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@tanstack/table-core@8.21.3': {} - - '@tinymce/tinymce-react@6.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tinymce@7.9.2)': - dependencies: - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - tinymce: 7.9.2 - - '@tiptap/core@3.23.1(@tiptap/pm@3.23.1)': - dependencies: - '@tiptap/pm': 3.23.1 - - '@tiptap/extension-blockquote@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': - dependencies: - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - - '@tiptap/extension-bold@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': - dependencies: - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - - '@tiptap/extension-bubble-menu@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)': - dependencies: - '@floating-ui/dom': 1.7.6 - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - '@tiptap/pm': 3.23.1 - optional: true - - '@tiptap/extension-bullet-list@3.23.1(@tiptap/extension-list@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1))': - dependencies: - '@tiptap/extension-list': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) - - '@tiptap/extension-code-block@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)': - dependencies: - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - '@tiptap/pm': 3.23.1 - - '@tiptap/extension-code@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': - dependencies: - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - - '@tiptap/extension-color@3.23.1(@tiptap/extension-text-style@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)))': - dependencies: - '@tiptap/extension-text-style': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) - - '@tiptap/extension-document@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': - dependencies: - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - - '@tiptap/extension-dropcursor@3.23.1(@tiptap/extensions@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1))': - dependencies: - '@tiptap/extensions': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) - - '@tiptap/extension-floating-menu@3.23.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)': - dependencies: - '@floating-ui/dom': 1.7.6 - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - '@tiptap/pm': 3.23.1 - optional: true - - '@tiptap/extension-gapcursor@3.23.1(@tiptap/extensions@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1))': - dependencies: - '@tiptap/extensions': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) - - '@tiptap/extension-hard-break@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': - dependencies: - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - - '@tiptap/extension-heading@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': - dependencies: - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - - '@tiptap/extension-highlight@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': - dependencies: - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - - '@tiptap/extension-horizontal-rule@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)': - dependencies: - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - '@tiptap/pm': 3.23.1 - - '@tiptap/extension-image@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': - dependencies: - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - - '@tiptap/extension-italic@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': - dependencies: - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - - '@tiptap/extension-link@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)': - dependencies: - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - '@tiptap/pm': 3.23.1 - linkifyjs: 4.3.2 - - '@tiptap/extension-list-item@3.23.1(@tiptap/extension-list@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1))': - dependencies: - '@tiptap/extension-list': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) - - '@tiptap/extension-list-keymap@3.23.1(@tiptap/extension-list@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1))': - dependencies: - '@tiptap/extension-list': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) - - '@tiptap/extension-list@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)': - dependencies: - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - '@tiptap/pm': 3.23.1 - - '@tiptap/extension-ordered-list@3.23.1(@tiptap/extension-list@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1))': - dependencies: - '@tiptap/extension-list': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) - - '@tiptap/extension-paragraph@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': - dependencies: - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - - '@tiptap/extension-strike@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': - dependencies: - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - - '@tiptap/extension-text-align@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': - dependencies: - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - - '@tiptap/extension-text-style@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': - dependencies: - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - - '@tiptap/extension-text@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': - dependencies: - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - - '@tiptap/extension-underline@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': - dependencies: - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - - '@tiptap/extensions@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)': - dependencies: - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - '@tiptap/pm': 3.23.1 - - '@tiptap/pm@3.23.1': - dependencies: - prosemirror-changeset: 2.4.1 - prosemirror-commands: 1.7.1 - prosemirror-dropcursor: 1.8.2 - prosemirror-gapcursor: 1.4.1 - prosemirror-history: 1.5.0 - prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.4 - prosemirror-schema-list: 1.5.1 - prosemirror-state: 1.4.4 - prosemirror-tables: 1.8.5 - prosemirror-transform: 1.12.0 - prosemirror-view: 1.41.8 - - '@tiptap/react@3.23.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - '@tiptap/pm': 3.23.1 - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - '@types/use-sync-external-store': 0.0.6 - fast-equals: 5.4.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - use-sync-external-store: 1.6.0(react@18.3.1) - optionalDependencies: - '@tiptap/extension-bubble-menu': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) - '@tiptap/extension-floating-menu': 3.23.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) - transitivePeerDependencies: - - '@floating-ui/dom' - - '@tiptap/starter-kit@3.23.1': - dependencies: - '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - '@tiptap/extension-blockquote': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) - '@tiptap/extension-bold': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) - '@tiptap/extension-bullet-list': 3.23.1(@tiptap/extension-list@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)) - '@tiptap/extension-code': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) - '@tiptap/extension-code-block': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) - '@tiptap/extension-document': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) - '@tiptap/extension-dropcursor': 3.23.1(@tiptap/extensions@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)) - '@tiptap/extension-gapcursor': 3.23.1(@tiptap/extensions@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)) - '@tiptap/extension-hard-break': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) - '@tiptap/extension-heading': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) - '@tiptap/extension-horizontal-rule': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) - '@tiptap/extension-italic': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) - '@tiptap/extension-link': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) - '@tiptap/extension-list': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) - '@tiptap/extension-list-item': 3.23.1(@tiptap/extension-list@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)) - '@tiptap/extension-list-keymap': 3.23.1(@tiptap/extension-list@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)) - '@tiptap/extension-ordered-list': 3.23.1(@tiptap/extension-list@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)) - '@tiptap/extension-paragraph': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) - '@tiptap/extension-strike': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) - '@tiptap/extension-text': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) - '@tiptap/extension-underline': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) - '@tiptap/extensions': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) - '@tiptap/pm': 3.23.1 - '@tokenizer/inflate@0.4.1': dependencies: debug: 4.4.3 @@ -13730,221 +6918,6 @@ snapshots: '@tokenizer/token@0.3.0': {} - '@tria-plc/api-common@0.1.4(dlk6rffkpcjlebt3tne6hjqwx4)': - dependencies: - '@nestjs/axios': 4.0.1(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(axios@1.16.0)(rxjs@7.8.2) - '@nestjs/common': 11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 11.1.19(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/microservices@11.1.19)(@nestjs/platform-express@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/jwt': 11.0.2(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)) - '@nestjs/microservices': 11.1.19(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/passport': 11.0.5(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(passport@0.7.0) - '@nestjs/swagger': 11.4.2(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2) - '@nestjs/throttler': 6.5.0(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(reflect-metadata@0.2.2) - '@nestjs/typeorm': 11.0.1(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2)(typeorm@0.3.29(babel-plugin-macros@3.1.0)(pg@8.20.0)(ts-node@10.9.2(@types/node@20.19.41)(typescript@5.9.3))) - '@tria-plc/iamapi-common': 0.1.6(nhzmwbpvzw5m5dv4mcbu7ilapi) - argon2: 0.43.1 - axios: 1.16.0 - change-case: 5.4.4 - class-transformer: 0.5.1 - class-validator: 0.14.4 - dotenv: 16.6.1 - ethiopian-calendar-date-converter: 2.1.6 - ethiopian-date: 0.0.6 - exceljs: 4.4.0 - file-type: 21.3.4 - handlebars: 4.7.9 - handlebars-helpers: 0.10.0 - jmespath: 0.16.0 - jose: 5.10.0 - jsonwebtoken: 9.0.3 - libphonenumber-js: 1.13.1 - libreoffice-convert: 1.8.1 - nestjs-minio-client: 2.2.0(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19) - passport-jwt: 4.0.1 - qrcode: 1.5.4 - reflect-metadata: 0.2.2 - rxjs: 7.8.2 - style-object-to-css-string: 1.1.3 - typeorm: 0.3.29(babel-plugin-macros@3.1.0)(pg@8.20.0)(ts-node@10.9.2(@types/node@20.19.41)(typescript@5.9.3)) - typeorm-extension: 3.9.0(@faker-js/faker@10.4.0)(typeorm@0.3.29(babel-plugin-macros@3.1.0)(pg@8.20.0)(ts-node@10.9.2(@types/node@20.19.41)(typescript@5.9.3))) - uuid: 11.1.1 - xlsx: 0.18.5 - transitivePeerDependencies: - - '@faker-js/faker' - - debug - - supports-color - - '@tria-plc/iamapi-common@0.1.6(nhzmwbpvzw5m5dv4mcbu7ilapi)': - dependencies: - '@nestjs/axios': 4.0.1(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(axios@1.16.0)(rxjs@7.8.2) - '@nestjs/common': 11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 11.1.19(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/microservices@11.1.19)(@nestjs/platform-express@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/jwt': 11.0.2(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)) - '@nestjs/microservices': 11.1.19(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/passport': 11.0.5(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(passport@0.7.0) - '@nestjs/swagger': 11.4.2(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2) - '@nestjs/throttler': 6.5.0(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(reflect-metadata@0.2.2) - '@nestjs/typeorm': 11.0.1(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2)(typeorm@0.3.29(babel-plugin-macros@3.1.0)(pg@8.20.0)(ts-node@10.9.2(@types/node@20.19.41)(typescript@5.9.3))) - '@tria-plc/api-common': 0.1.4(dlk6rffkpcjlebt3tne6hjqwx4) - argon2: 0.43.1 - axios: 1.16.0 - class-transformer: 0.5.1 - class-validator: 0.14.4 - ethiopian-date: 0.0.6 - file-type: 21.3.4 - jose: 5.10.0 - jsonwebtoken: 9.0.3 - libphonenumber-js: 1.13.1 - nestjs-minio-client: 2.2.0(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19) - passport-jwt: 4.0.1 - qrcode: 1.5.4 - reflect-metadata: 0.2.2 - rxjs: 7.8.2 - typeorm: 0.3.29(babel-plugin-macros@3.1.0)(pg@8.20.0)(ts-node@10.9.2(@types/node@20.19.41)(typescript@5.9.3)) - typeorm-extension: 3.9.0(@faker-js/faker@10.4.0)(typeorm@0.3.29(babel-plugin-macros@3.1.0)(pg@8.20.0)(ts-node@10.9.2(@types/node@20.19.41)(typescript@5.9.3))) - uuid: 11.1.1 - transitivePeerDependencies: - - '@faker-js/faker' - - supports-color - - '@tria-plc/iamui-common@1.0.3(iv2eyyfavqphryq7oznx6tfwre)': - dependencies: - '@chakra-ui/react': 3.35.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@emotion/react': 11.14.0(@types/react@18.3.28)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) - '@hookform/resolvers': 5.2.2(react-hook-form@7.75.0(react@18.3.1)) - '@lottiefiles/react-lottie-player': 3.6.0(react@18.3.1) - '@mantine/core': 8.3.18(@mantine/hooks@8.3.18(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mantine/dates': 8.3.18(@mantine/core@8.3.18(@mantine/hooks@8.3.18(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@8.3.18(react@18.3.1))(dayjs@1.11.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mantine/hooks': 8.3.18(react@18.3.1) - '@onlyoffice/document-editor-react': 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-accordion': 1.2.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-alert-dialog': 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-avatar': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-context-menu': 2.2.16(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-hover-card': 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-label': 2.1.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-popover': 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-progress': 1.1.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-radio-group': 1.3.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-select': 2.2.6(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-separator': 1.1.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slider': 1.3.6(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.4(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-switch': 1.2.6(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-tabs': 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-toast': 1.2.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-pdf-viewer/core': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-pdf-viewer/default-layout': 3.12.0(pdfjs-dist@3.11.174)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-pdf/renderer': 4.5.1(react@18.3.1) - '@reduxjs/toolkit': 2.11.2(react-redux@9.2.0(@types/react@18.3.28)(react@18.3.1)(redux@5.0.1))(react@18.3.1) - '@tabler/icons-react': 3.44.0(react@18.3.1) - '@tailwindcss/vite': 4.3.0(vite@5.4.21(@types/node@24.12.4)(lightningcss@1.32.0)(terser@5.47.1)) - '@tanstack/react-query': 5.100.10(react@18.3.1) - '@tanstack/react-query-devtools': 5.100.10(@tanstack/react-query@5.100.10(react@18.3.1))(react@18.3.1) - '@tanstack/react-table': 8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tinymce/tinymce-react': 6.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tinymce@7.9.2) - '@tiptap/extension-color': 3.23.1(@tiptap/extension-text-style@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))) - '@tiptap/extension-highlight': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) - '@tiptap/extension-image': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) - '@tiptap/extension-link': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) - '@tiptap/extension-text-align': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) - '@tiptap/extension-text-style': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) - '@tiptap/extension-underline': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) - '@tiptap/react': 3.23.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tiptap/starter-kit': 3.23.1 - '@types/node': 24.12.4 - '@types/tinymce': 4.6.9 - axios: 1.16.0 - class-variance-authority: 0.7.1 - clsx: 2.1.1 - cmdk: 1.1.1(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - date-fns: 3.6.0 - dayjs: 1.11.20 - ethiopian-calendar-date-converter: 2.1.6 - ethiopian-calendar-new: 1.1.0 - file-type: 18.7.0 - force: 0.0.3 - framer-motion: 12.38.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - html2canvas: 1.4.1 - i18next: 25.10.10(typescript@5.9.3) - i18next-browser-languagedetector: 8.2.1 - jquery: 3.7.1 - js-cookie: 3.0.5 - jspdf: 3.0.4 - loadash: 1.0.0 - lodash: 4.18.1 - lucide-react: 0.513.0(react@18.3.1) - mui-ethiopian-datepicker: 0.3.2(hjxdxgubdlhng5uhyvidfkiyo4) - next-themes: 0.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - path: 0.12.7 - qs: 6.15.1 - react: 18.3.1 - react-cookie: 8.1.2(@types/react@18.3.28)(react@18.3.1) - react-datepicker: 8.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-day-picker: 9.14.0(react@18.3.1) - react-dom: 18.3.1(react@18.3.1) - react-dropzone: 14.4.1(react@18.3.1) - react-hook-form: 7.75.0(react@18.3.1) - react-i18next: 15.7.4(i18next@25.10.10(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - react-icons: 5.6.0(react@18.3.1) - react-image-crop: 11.0.10(react@18.3.1) - react-intersection-observer: 9.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-is: 19.2.6 - react-joyride: 2.9.3(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-pdf: 10.4.1(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-pdf-html: 2.1.5(@react-pdf/renderer@4.5.1(react@18.3.1))(react@18.3.1) - react-pdf-viewer: 0.1.0 - react-redux: 9.2.0(@types/react@18.3.28)(react@18.3.1)(redux@5.0.1) - react-resizable-panels: 3.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-router-dom: 7.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-signature-canvas: 1.1.0-alpha.2(@types/prop-types@15.7.15)(@types/react@18.3.28)(prop-types@15.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - recharts: 3.8.1(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react-is@19.2.6)(react@18.3.1)(redux@5.0.1) - socket.io-client: 4.8.3 - sonner: 2.0.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - tailwind-merge: 3.6.0 - tailwind-scrollbar-hide: 4.0.0(tailwindcss@4.3.0) - tailwindcss: 4.3.0 - tailwindcss-animate: 1.0.7(tailwindcss@4.3.0) - tesseract.js: 7.0.0 - tinymce: 7.9.2 - url: 0.11.4 - vaul: 1.1.2(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - xlsx: 0.18.5 - zod: 3.25.76 - transitivePeerDependencies: - - '@emotion/is-prop-valid' - - '@floating-ui/dom' - - '@mui/icons-material' - - '@mui/material' - - '@mui/x-date-pickers' - - '@tiptap/core' - - '@tiptap/pm' - - '@types/prop-types' - - '@types/react' - - '@types/react-dom' - - bufferutil - - debug - - encoding - - pdfjs-dist - - prop-types - - react-native - - redux - - supports-color - - typescript - - utf-8-validate - - vite - - webpack-cli - - webpack-command - '@tsconfig/node10@1.0.12': {} '@tsconfig/node12@1.0.11': {} @@ -14011,30 +6984,6 @@ snapshots: '@types/cookiejar@2.1.5': {} - '@types/d3-array@3.2.2': {} - - '@types/d3-color@3.1.3': {} - - '@types/d3-ease@3.0.2': {} - - '@types/d3-interpolate@3.0.4': - dependencies: - '@types/d3-color': 3.1.3 - - '@types/d3-path@3.1.1': {} - - '@types/d3-scale@4.0.9': - dependencies: - '@types/d3-time': 3.0.4 - - '@types/d3-shape@3.1.8': - dependencies: - '@types/d3-path': 3.1.1 - - '@types/d3-time@3.0.4': {} - - '@types/d3-timer@3.0.2': {} - '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 @@ -14066,11 +7015,6 @@ snapshots: dependencies: '@types/node': 20.19.41 - '@types/hoist-non-react-statics@3.3.7(@types/react@18.3.28)': - dependencies: - '@types/react': 18.3.28 - hoist-non-react-statics: 3.3.2 - '@types/http-errors@2.0.5': {} '@types/istanbul-lib-coverage@2.0.6': {} @@ -14088,8 +7032,6 @@ snapshots: expect: 29.7.0 pretty-format: 29.7.0 - '@types/jquery@4.0.0': {} - '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} @@ -14109,8 +7051,6 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@14.18.63': {} - '@types/node@20.19.41': dependencies: undici-types: 6.21.0 @@ -14119,9 +7059,8 @@ snapshots: dependencies: undici-types: 7.16.0 - '@types/pako@2.0.4': {} - - '@types/parse-json@4.0.2': {} + '@types/parse-json@4.0.2': + optional: true '@types/passport-jwt@4.0.1': dependencies: @@ -14145,19 +7084,12 @@ snapshots: '@types/qs@6.15.1': {} - '@types/raf@3.4.3': - optional: true - '@types/range-parser@1.2.7': {} '@types/react-dom@18.3.7(@types/react@18.3.28)': dependencies: '@types/react': 18.3.28 - '@types/react-transition-group@4.4.12(@types/react@18.3.28)': - dependencies: - '@types/react': 18.3.28 - '@types/react@18.3.28': dependencies: '@types/prop-types': 15.7.15 @@ -14172,8 +7104,6 @@ snapshots: '@types/http-errors': 2.0.5 '@types/node': 20.19.41 - '@types/signature_pad@2.3.6': {} - '@types/stack-utils@2.0.3': {} '@types/superagent@8.1.9': @@ -14188,15 +7118,6 @@ snapshots: '@types/methods': 1.1.4 '@types/superagent': 8.1.9 - '@types/tinymce@4.6.9': - dependencies: - '@types/jquery': 4.0.0 - - '@types/trusted-types@2.0.7': - optional: true - - '@types/use-sync-external-store@0.0.6': {} - '@types/validator@13.15.10': {} '@types/yargs-parser@21.0.3': {} @@ -14430,576 +7351,6 @@ snapshots: '@xtuc/long@4.2.2': {} - '@zag-js/accordion@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/anatomy@1.40.0': {} - - '@zag-js/angle-slider@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/rect-utils': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/aria-hidden@1.40.0': - dependencies: - '@zag-js/dom-query': 1.40.0 - - '@zag-js/async-list@1.40.0': - dependencies: - '@zag-js/core': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/auto-resize@1.40.0': - dependencies: - '@zag-js/dom-query': 1.40.0 - - '@zag-js/avatar@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/carousel@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/scroll-snap': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/cascade-select@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/collection': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dismissable': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/focus-visible': 1.40.0 - '@zag-js/popper': 1.40.0 - '@zag-js/rect-utils': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/checkbox@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/focus-visible': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/clipboard@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/collapsible@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/collection@1.40.0': - dependencies: - '@zag-js/utils': 1.40.0 - - '@zag-js/color-picker@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/color-utils': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dismissable': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/popper': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/color-utils@1.40.0': - dependencies: - '@zag-js/utils': 1.40.0 - - '@zag-js/combobox@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/collection': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dismissable': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/focus-visible': 1.40.0 - '@zag-js/live-region': 1.40.0 - '@zag-js/popper': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/core@1.40.0': - dependencies: - '@zag-js/dom-query': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/date-input@1.40.0(@internationalized/date@3.12.0)': - dependencies: - '@internationalized/date': 3.12.0 - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/date-utils': 1.40.0(@internationalized/date@3.12.0) - '@zag-js/dom-query': 1.40.0 - '@zag-js/live-region': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/date-picker@1.40.0(@internationalized/date@3.12.0)': - dependencies: - '@internationalized/date': 3.12.0 - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/date-utils': 1.40.0(@internationalized/date@3.12.0) - '@zag-js/dismissable': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/live-region': 1.40.0 - '@zag-js/popper': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/date-utils@1.40.0(@internationalized/date@3.12.0)': - dependencies: - '@internationalized/date': 3.12.0 - - '@zag-js/dialog@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/aria-hidden': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dismissable': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/focus-trap': 1.40.0 - '@zag-js/remove-scroll': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/dismissable@1.40.0': - dependencies: - '@zag-js/dom-query': 1.40.0 - '@zag-js/interact-outside': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/dom-query@1.40.0': - dependencies: - '@zag-js/types': 1.40.0 - - '@zag-js/drawer@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/aria-hidden': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dismissable': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/focus-trap': 1.40.0 - '@zag-js/remove-scroll': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/editable@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/interact-outside': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/file-upload@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/file-utils': 1.40.0 - '@zag-js/i18n-utils': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/file-utils@1.40.0': - dependencies: - '@zag-js/i18n-utils': 1.40.0 - - '@zag-js/floating-panel@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/popper': 1.40.0 - '@zag-js/rect-utils': 1.40.0 - '@zag-js/store': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/focus-trap@1.40.0': - dependencies: - '@zag-js/dom-query': 1.40.0 - - '@zag-js/focus-visible@1.40.0': - dependencies: - '@zag-js/dom-query': 1.40.0 - - '@zag-js/highlight-word@1.40.0': {} - - '@zag-js/hover-card@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dismissable': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/popper': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/i18n-utils@1.40.0': - dependencies: - '@zag-js/dom-query': 1.40.0 - - '@zag-js/image-cropper@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/interact-outside@1.40.0': - dependencies: - '@zag-js/dom-query': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/json-tree-utils@1.40.0': {} - - '@zag-js/listbox@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/collection': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/focus-visible': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/live-region@1.40.0': {} - - '@zag-js/marquee@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/menu@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dismissable': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/focus-visible': 1.40.0 - '@zag-js/popper': 1.40.0 - '@zag-js/rect-utils': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/navigation-menu@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dismissable': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/number-input@1.40.0': - dependencies: - '@internationalized/number': 3.6.5 - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/pagination@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/password-input@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/pin-input@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/popover@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/aria-hidden': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dismissable': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/focus-trap': 1.40.0 - '@zag-js/popper': 1.40.0 - '@zag-js/remove-scroll': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/popper@1.40.0': - dependencies: - '@floating-ui/dom': 1.7.6 - '@zag-js/dom-query': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/presence@1.40.0': - dependencies: - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - - '@zag-js/progress@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/qr-code@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - proxy-memoize: 3.0.1 - uqr: 0.1.2 - - '@zag-js/radio-group@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/focus-visible': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/rating-group@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/react@1.40.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@zag-js/core': 1.40.0 - '@zag-js/store': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@zag-js/rect-utils@1.40.0': {} - - '@zag-js/remove-scroll@1.40.0': - dependencies: - '@zag-js/dom-query': 1.40.0 - - '@zag-js/scroll-area@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/scroll-snap@1.40.0': - dependencies: - '@zag-js/dom-query': 1.40.0 - - '@zag-js/select@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/collection': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dismissable': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/focus-visible': 1.40.0 - '@zag-js/popper': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/signature-pad@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - perfect-freehand: 1.2.3 - - '@zag-js/slider@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/splitter@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/steps@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/store@1.40.0': - dependencies: - proxy-compare: 3.0.1 - - '@zag-js/switch@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/focus-visible': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/tabs@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/tags-input@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/auto-resize': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/interact-outside': 1.40.0 - '@zag-js/live-region': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/timer@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/toast@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dismissable': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/toggle-group@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/toggle@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/tooltip@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/focus-visible': 1.40.0 - '@zag-js/popper': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/tour@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dismissable': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/focus-trap': 1.40.0 - '@zag-js/interact-outside': 1.40.0 - '@zag-js/popper': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/tree-view@1.40.0': - dependencies: - '@zag-js/anatomy': 1.40.0 - '@zag-js/collection': 1.40.0 - '@zag-js/core': 1.40.0 - '@zag-js/dom-query': 1.40.0 - '@zag-js/types': 1.40.0 - '@zag-js/utils': 1.40.0 - - '@zag-js/types@1.40.0': - dependencies: - csstype: 3.2.3 - - '@zag-js/utils@1.40.0': {} - - '@zxing/text-encoding@0.9.0': - optional: true - JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 @@ -15007,26 +7358,11 @@ snapshots: abbrev@1.1.1: {} - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - - abs-svg-path@0.1.1: {} - - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - accepts@2.0.0: dependencies: mime-types: 3.0.2 negotiator: 1.0.0 - acorn-dynamic-import@2.0.2: - dependencies: - acorn: 4.0.13 - acorn-import-phases@1.0.4(acorn@8.16.0): dependencies: acorn: 8.16.0 @@ -15039,14 +7375,8 @@ snapshots: dependencies: acorn: 8.16.0 - acorn@4.0.13: {} - - acorn@5.7.4: {} - acorn@8.16.0: {} - adler-32@1.3.1: {} - agent-base@6.0.2: dependencies: debug: 4.4.3 @@ -15093,96 +7423,8 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - align-text@0.1.4: - dependencies: - kind-of: 3.2.2 - longest: 1.0.1 - repeat-string: 1.6.1 - - ansi-bgblack@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-bgblue@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-bgcyan@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-bggreen@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-bgmagenta@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-bgred@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-bgwhite@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-bgyellow@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-black@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-blue@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-bold@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-colors@0.2.0: - dependencies: - ansi-bgblack: 0.1.1 - ansi-bgblue: 0.1.1 - ansi-bgcyan: 0.1.1 - ansi-bggreen: 0.1.1 - ansi-bgmagenta: 0.1.1 - ansi-bgred: 0.1.1 - ansi-bgwhite: 0.1.1 - ansi-bgyellow: 0.1.1 - ansi-black: 0.1.1 - ansi-blue: 0.1.1 - ansi-bold: 0.1.1 - ansi-cyan: 0.1.1 - ansi-dim: 0.1.1 - ansi-gray: 0.1.1 - ansi-green: 0.1.1 - ansi-grey: 0.1.1 - ansi-hidden: 0.1.1 - ansi-inverse: 0.1.1 - ansi-italic: 0.1.1 - ansi-magenta: 0.1.1 - ansi-red: 0.1.1 - ansi-reset: 0.1.1 - ansi-strikethrough: 0.1.1 - ansi-underline: 0.1.1 - ansi-white: 0.1.1 - ansi-yellow: 0.1.1 - lazy-cache: 2.0.2 - ansi-colors@4.1.3: {} - ansi-cyan@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-dim@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -15191,56 +7433,10 @@ snapshots: dependencies: environment: 1.1.0 - ansi-gray@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-green@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-grey@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-hidden@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-html@0.0.7: {} - - ansi-inverse@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-italic@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-magenta@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-red@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-regex@2.1.1: {} - - ansi-regex@3.0.1: {} - ansi-regex@5.0.1: {} ansi-regex@6.2.2: {} - ansi-reset@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-strikethrough@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -15249,41 +7445,12 @@ snapshots: ansi-styles@6.2.3: {} - ansi-underline@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-white@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - - ansi-wrap@0.1.0: {} - - ansi-yellow@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - ansis@4.2.0: {} ansis@4.3.0: {} any-promise@1.3.0: {} - anymatch@2.0.0(supports-color@4.5.0): - dependencies: - micromatch: 3.1.10(supports-color@4.5.0) - normalize-path: 2.1.1 - transitivePeerDependencies: - - supports-color - optional: true - - anymatch@2.0.0(supports-color@5.5.0): - dependencies: - micromatch: 3.1.10(supports-color@5.5.0) - normalize-path: 2.1.1 - transitivePeerDependencies: - - supports-color - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -15295,42 +7462,6 @@ snapshots: aproba@2.1.0: {} - archiver-utils@2.1.0: - dependencies: - glob: 7.2.3 - graceful-fs: 4.2.11 - lazystream: 1.0.1 - lodash.defaults: 4.2.0 - lodash.difference: 4.5.0 - lodash.flatten: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.union: 4.6.0 - normalize-path: 3.0.0 - readable-stream: 2.3.8 - - archiver-utils@3.0.4: - dependencies: - glob: 7.2.3 - graceful-fs: 4.2.11 - lazystream: 1.0.1 - lodash.defaults: 4.2.0 - lodash.difference: 4.5.0 - lodash.flatten: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.union: 4.6.0 - normalize-path: 3.0.0 - readable-stream: 3.6.2 - - archiver@5.3.2: - dependencies: - archiver-utils: 2.1.0 - async: 3.2.6 - buffer-crc32: 0.2.13 - readable-stream: 3.6.2 - readdir-glob: 1.1.3 - tar-stream: 2.2.0 - zip-stream: 4.1.1 - are-we-there-yet@2.0.0: dependencies: delegates: 1.0.0 @@ -15340,39 +7471,17 @@ snapshots: arg@5.0.2: {} - argon2@0.43.1: - dependencies: - '@phc/format': 1.0.0 - node-addon-api: 8.7.0 - node-gyp-build: 4.8.4 - argparse@1.0.10: dependencies: sprintf-js: 1.0.3 argparse@2.0.1: {} - aria-hidden@1.2.6: - dependencies: - tslib: 2.8.1 - - arr-diff@4.0.0: {} - - arr-flatten@1.1.0: {} - - arr-union@3.1.0: {} - array-buffer-byte-length@1.0.2: dependencies: call-bound: 1.0.4 is-array-buffer: 3.0.5 - array-find-index@1.0.2: {} - - array-flatten@1.1.1: {} - - array-flatten@2.1.2: {} - array-ify@1.0.0: {} array-includes@3.1.9: @@ -15386,22 +7495,8 @@ snapshots: is-string: 1.1.1 math-intrinsics: 1.1.0 - array-sort@0.1.4: - dependencies: - default-compare: 1.0.0 - get-value: 2.0.6 - kind-of: 5.1.0 - array-timsort@1.0.3: {} - array-union@1.0.2: - dependencies: - array-uniq: 1.0.3 - - array-uniq@1.0.3: {} - - array-unique@0.3.2: {} - array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.9 @@ -15455,47 +7550,12 @@ snapshots: asap@2.0.6: {} - asn1.js@4.10.1: - dependencies: - bn.js: 4.12.3 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - - asn1@0.2.6: - dependencies: - safer-buffer: 2.1.2 - - assert-plus@1.0.0: {} - - assert@1.5.1: - dependencies: - object.assign: 4.1.7 - util: 0.10.4 - assertion-error@2.0.1: {} - assign-symbols@1.0.0: {} - - async-each@1.0.6: {} - async-function@1.0.0: {} - async@2.6.4: - dependencies: - lodash: 4.18.1 - - async@3.2.6: {} - asynckit@0.4.0: {} - atob@2.1.2: {} - - attr-accept@2.2.5: {} - - autolinker@0.28.1: - dependencies: - gulp-header: 1.8.12 - autoprefixer@10.5.0(postcss@8.5.14): dependencies: browserslist: 4.28.2 @@ -15509,9 +7569,8 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - aws-sign2@0.7.0: {} - - aws4@1.13.2: {} + aws-ssl-profiles@1.1.2: + optional: true axios@1.16.0: dependencies: @@ -15556,6 +7615,7 @@ snapshots: '@babel/runtime': 7.29.2 cosmiconfig: 7.1.0 resolve: 1.22.12 + optional: true babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.0): dependencies: @@ -15586,30 +7646,10 @@ snapshots: balanced-match@4.0.4: {} - base64-arraybuffer@1.0.2: {} - - base64-js@0.0.8: {} - base64-js@1.5.1: {} - base@0.11.2: - dependencies: - cache-base: 1.0.1 - class-utils: 0.3.6 - component-emitter: 1.3.1 - define-property: 1.0.0 - isobject: 3.0.1 - mixin-deep: 1.3.2 - pascalcase: 0.1.1 - baseline-browser-mapping@2.10.29: {} - batch@0.6.1: {} - - bcrypt-pbkdf@1.0.2: - dependencies: - tweetnacl: 0.14.5 - bcrypt@5.1.1: dependencies: '@mapbox/node-pre-gyp': 1.0.11 @@ -15618,63 +7658,14 @@ snapshots: - encoding - supports-color - bidi-js@1.0.3: - dependencies: - require-from-string: 2.0.2 - - big-integer@1.6.52: {} - - big.js@5.2.2: {} - - binary-extensions@1.13.1: {} - binary-extensions@2.3.0: {} - binary@0.3.0: - dependencies: - buffers: 0.1.1 - chainsaw: 0.1.0 - - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - optional: true - bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - block-stream2@2.1.0: - dependencies: - readable-stream: 3.6.2 - - bluebird@3.4.7: {} - - bmp-js@0.1.0: {} - - bn.js@4.12.3: {} - - bn.js@5.2.3: {} - - body-parser@1.20.5(supports-color@5.5.0): - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9(supports-color@5.5.0) - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.1 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.15.1 - raw-body: 2.5.3 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - body-parser@2.2.2: dependencies: bytes: 3.1.2 @@ -15689,17 +7680,6 @@ snapshots: transitivePeerDependencies: - supports-color - bonjour@3.5.1: - dependencies: - array-flatten: 2.1.2 - deep-equal: 1.1.2 - dns-equal: 1.0.0 - dns-txt: 2.0.2 - multicast-dns: 7.2.5 - multicast-dns-service-types: 1.1.0 - - boolbase@1.0.0: {} - brace-expansion@1.1.14: dependencies: balanced-match: 1.0.2 @@ -15713,108 +7693,10 @@ snapshots: dependencies: balanced-match: 4.0.4 - braces@2.3.2: - dependencies: - arr-flatten: 1.1.0 - array-unique: 0.3.2 - extend-shallow: 2.0.1 - fill-range: 4.0.0 - isobject: 3.0.1 - repeat-element: 1.1.4 - snapdragon: 0.8.2 - snapdragon-node: 2.1.1 - split-string: 3.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - - braces@2.3.2(supports-color@4.5.0): - dependencies: - arr-flatten: 1.1.0 - array-unique: 0.3.2 - extend-shallow: 2.0.1 - fill-range: 4.0.0 - isobject: 3.0.1 - repeat-element: 1.1.4 - snapdragon: 0.8.2(supports-color@4.5.0) - snapdragon-node: 2.1.1 - split-string: 3.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - optional: true - - braces@2.3.2(supports-color@5.5.0): - dependencies: - arr-flatten: 1.1.0 - array-unique: 0.3.2 - extend-shallow: 2.0.1 - fill-range: 4.0.0 - isobject: 3.0.1 - repeat-element: 1.1.4 - snapdragon: 0.8.2(supports-color@5.5.0) - snapdragon-node: 2.1.1 - split-string: 3.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - braces@3.0.3: dependencies: fill-range: 7.1.1 - brorand@1.1.0: {} - - brotli@1.3.3: - dependencies: - base64-js: 1.5.1 - - browser-or-node@2.1.1: {} - - browserify-aes@1.2.0: - dependencies: - buffer-xor: 1.0.3 - cipher-base: 1.0.7 - create-hash: 1.2.0 - evp_bytestokey: 1.0.3 - inherits: 2.0.4 - safe-buffer: 5.2.1 - - browserify-cipher@1.0.1: - dependencies: - browserify-aes: 1.2.0 - browserify-des: 1.0.2 - evp_bytestokey: 1.0.3 - - browserify-des@1.0.2: - dependencies: - cipher-base: 1.0.7 - des.js: 1.1.0 - inherits: 2.0.4 - safe-buffer: 5.2.1 - - browserify-rsa@4.1.1: - dependencies: - bn.js: 5.2.3 - randombytes: 2.1.0 - safe-buffer: 5.2.1 - - browserify-sign@4.2.5: - dependencies: - bn.js: 5.2.3 - browserify-rsa: 4.1.1 - create-hash: 1.2.0 - create-hmac: 1.1.7 - elliptic: 6.6.1 - inherits: 2.0.4 - parse-asn1: 5.1.9 - readable-stream: 2.3.8 - safe-buffer: 5.2.1 - - browserify-zlib@0.2.0: - dependencies: - pako: 1.0.11 - browserslist@4.28.2: dependencies: baseline-browser-mapping: 2.10.29 @@ -15831,24 +7713,10 @@ snapshots: dependencies: node-int64: 0.4.0 - buffer-crc32@0.2.13: {} - buffer-equal-constant-time@1.0.1: {} buffer-from@1.1.2: {} - buffer-indexof-polyfill@1.0.2: {} - - buffer-indexof@1.1.1: {} - - buffer-xor@1.0.3: {} - - buffer@4.9.2: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - isarray: 1.0.0 - buffer@5.7.1: dependencies: base64-js: 1.5.1 @@ -15859,29 +7727,28 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - buffers@0.1.1: {} - - builtin-status-codes@3.0.0: {} - busboy@1.6.0: dependencies: streamsearch: 1.1.0 bytes@3.1.2: {} - cac@6.7.14: {} - - cache-base@1.0.1: + c12@3.1.0: dependencies: - collection-visit: 1.0.0 - component-emitter: 1.3.1 - get-value: 2.0.6 - has-value: 1.0.0 - isobject: 3.0.1 - set-value: 2.0.1 - to-object-path: 0.3.0 - union-value: 1.0.1 - unset-value: 1.0.0 + chokidar: 4.0.3 + confbox: 0.2.4 + defu: 6.1.7 + dotenv: 16.6.1 + exsolve: 1.0.8 + giget: 2.0.0 + jiti: 2.6.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 1.0.0 + pkg-types: 2.3.1 + rc9: 2.1.2 + + cac@6.7.14: {} call-bind-apply-helpers@1.0.2: dependencies: @@ -15904,19 +7771,6 @@ snapshots: camelcase-css@2.0.1: {} - camelcase-keys@2.1.0: - dependencies: - camelcase: 2.1.1 - map-obj: 1.0.1 - - camelcase@1.2.1: {} - - camelcase@2.1.1: {} - - camelcase@3.0.0: {} - - camelcase@4.1.0: {} - camelcase@5.3.1: {} camelcase@6.3.0: {} @@ -15933,30 +7787,6 @@ snapshots: - supports-color optional: true - canvg@3.0.11: - dependencies: - '@babel/runtime': 7.29.2 - '@types/raf': 3.4.3 - core-js: 3.49.0 - raf: 3.4.1 - regenerator-runtime: 0.13.11 - rgbcolor: 1.0.1 - stackblur-canvas: 2.7.0 - svg-pathdata: 6.0.3 - optional: true - - caseless@0.12.0: {} - - center-align@0.1.3: - dependencies: - align-text: 0.1.4 - lazy-cache: 1.0.4 - - cfb@1.2.2: - dependencies: - adler-32: 1.3.1 - crc-32: 1.2.2 - chai@5.3.3: dependencies: assertion-error: 2.0.1 @@ -15965,10 +7795,6 @@ snapshots: loupe: 3.2.1 pathval: 2.0.1 - chainsaw@0.1.0: - dependencies: - traverse: 0.3.9 - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -15976,51 +7802,12 @@ snapshots: chalk@5.6.2: {} - change-case@5.4.4: {} - char-regex@1.0.2: {} chardet@2.1.1: {} check-error@2.1.3: {} - chokidar@2.1.8(supports-color@4.5.0): - dependencies: - anymatch: 2.0.0(supports-color@4.5.0) - async-each: 1.0.6 - braces: 2.3.2(supports-color@4.5.0) - glob-parent: 3.1.0 - inherits: 2.0.4 - is-binary-path: 1.0.1 - is-glob: 4.0.3 - normalize-path: 3.0.0 - path-is-absolute: 1.0.1 - readdirp: 2.2.1(supports-color@4.5.0) - upath: 1.2.0 - optionalDependencies: - fsevents: 1.2.13 - transitivePeerDependencies: - - supports-color - optional: true - - chokidar@2.1.8(supports-color@5.5.0): - dependencies: - anymatch: 2.0.0(supports-color@5.5.0) - async-each: 1.0.6 - braces: 2.3.2(supports-color@5.5.0) - glob-parent: 3.1.0 - inherits: 2.0.4 - is-binary-path: 1.0.1 - is-glob: 4.0.3 - normalize-path: 3.0.0 - path-is-absolute: 1.0.1 - readdirp: 2.2.1(supports-color@5.5.0) - upath: 1.2.0 - optionalDependencies: - fsevents: 1.2.13 - transitivePeerDependencies: - - supports-color - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -16043,33 +7830,22 @@ snapshots: ci-info@3.9.0: {} - cipher-base@1.0.7: + citty@0.1.6: dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - to-buffer: 1.2.2 + consola: 3.4.2 + + citty@0.2.2: {} cjs-module-lexer@1.4.3: {} class-transformer@0.5.1: {} - class-utils@0.3.6: - dependencies: - arr-union: 3.1.0 - define-property: 0.2.5 - isobject: 3.0.1 - static-extend: 0.1.2 - class-validator@0.14.4: dependencies: '@types/validator': 13.15.10 libphonenumber-js: 1.13.1 validator: 13.15.35 - class-variance-authority@0.7.1: - dependencies: - clsx: 2.1.1 - cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 @@ -16093,18 +7869,6 @@ snapshots: cli-width@4.1.0: {} - cliui@2.1.0: - dependencies: - center-align: 0.1.3 - right-align: 0.1.3 - wordwrap: 0.0.2 - - cliui@3.2.0: - dependencies: - string-width: 1.0.2 - strip-ansi: 3.0.1 - wrap-ansi: 2.1.0 - cliui@6.0.0: dependencies: string-width: 4.2.3 @@ -16117,55 +7881,20 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - cliui@9.0.1: - dependencies: - string-width: 7.2.0 - strip-ansi: 7.2.0 - wrap-ansi: 9.0.2 - clone@1.0.4: {} - clone@2.1.2: {} - clsx@2.1.1: {} - cmdk@1.1.1(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.1(@types/react@18.3.28)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - co@4.6.0: {} - code-point-at@1.1.0: {} - - codepage@1.15.0: {} - collect-v8-coverage@1.0.3: {} - collection-visit@1.0.0: - dependencies: - map-visit: 1.0.0 - object-visit: 1.0.1 - color-convert@2.0.1: dependencies: color-name: 1.1.4 color-name@1.1.4: {} - color-name@2.1.0: {} - - color-string@2.1.4: - dependencies: - color-name: 2.1.0 - color-support@1.1.3: {} colorette@2.0.20: {} @@ -16192,29 +7921,6 @@ snapshots: component-emitter@1.3.1: {} - compress-commons@4.1.2: - dependencies: - buffer-crc32: 0.2.13 - crc32-stream: 4.0.3 - normalize-path: 3.0.0 - readable-stream: 3.6.2 - - compressible@2.0.18: - dependencies: - mime-db: 1.54.0 - - compression@1.8.1(supports-color@5.5.0): - dependencies: - bytes: 3.1.2 - compressible: 2.0.18 - debug: 2.6.9(supports-color@5.5.0) - negotiator: 0.6.4 - on-headers: 1.1.0 - safe-buffer: 5.2.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - concat-map@0.0.1: {} concat-stream@2.0.0: @@ -16224,24 +7930,12 @@ snapshots: readable-stream: 3.6.2 typedarray: 0.0.6 - concat-with-sourcemaps@1.1.0: - dependencies: - source-map: 0.6.1 - - connect-history-api-fallback@1.6.0: {} + confbox@0.2.4: {} consola@3.4.2: {} - console-browserify@1.2.0: {} - console-control-strings@1.1.0: {} - constants-browserify@1.0.0: {} - - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - content-disposition@1.1.0: {} content-type@1.0.5: {} @@ -16261,29 +7955,14 @@ snapshots: meow: 12.1.1 split2: 4.2.0 - convert-source-map@1.9.0: {} - convert-source-map@2.0.0: {} - cookie-signature@1.0.7: {} - cookie-signature@1.2.2: {} cookie@0.7.2: {} - cookie@1.1.1: {} - cookiejar@2.1.4: {} - copy-descriptor@0.1.1: {} - - core-js@3.49.0: - optional: true - - core-util-is@1.0.2: {} - - core-util-is@1.0.3: {} - cors@2.8.6: dependencies: object-assign: 4.1.1 @@ -16303,6 +7982,7 @@ snapshots: parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.3 + optional: true cosmiconfig@8.3.6(typescript@5.9.3): dependencies: @@ -16322,42 +8002,6 @@ snapshots: optionalDependencies: typescript: 5.9.3 - crc-32@1.2.2: {} - - crc32-stream@4.0.3: - dependencies: - crc-32: 1.2.2 - readable-stream: 3.6.2 - - create-ecdh@4.0.4: - dependencies: - bn.js: 4.12.3 - elliptic: 6.6.1 - - create-frame@1.0.0: - dependencies: - define-property: 0.2.5 - extend-shallow: 2.0.1 - isobject: 3.0.1 - lazy-cache: 2.0.2 - - create-hash@1.2.0: - dependencies: - cipher-base: 1.0.7 - inherits: 2.0.4 - md5.js: 1.3.5 - ripemd160: 2.0.3 - sha.js: 2.4.12 - - create-hmac@1.1.7: - dependencies: - cipher-base: 1.0.7 - create-hash: 1.2.0 - inherits: 2.0.4 - ripemd160: 2.0.3 - safe-buffer: 5.2.1 - sha.js: 2.4.12 - create-jest@29.7.0(@types/node@20.19.41)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.41)(typescript@5.9.3)): dependencies: '@jest/types': 29.6.3 @@ -16380,52 +8024,12 @@ snapshots: '@types/luxon': 3.7.1 luxon: 3.7.2 - cross-spawn@5.1.0: - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - crypto-browserify@3.12.1: - dependencies: - browserify-cipher: 1.0.1 - browserify-sign: 4.2.5 - create-ecdh: 4.0.4 - create-hash: 1.2.0 - create-hmac: 1.1.7 - diffie-hellman: 5.0.3 - hash-base: 3.0.5 - inherits: 2.0.4 - pbkdf2: 3.1.5 - public-encrypt: 4.0.3 - randombytes: 2.1.0 - randomfill: 1.0.4 - - css-line-break@2.1.0: - dependencies: - utrie: 1.0.2 - - css-select@5.2.2: - dependencies: - boolbase: 1.0.0 - css-what: 6.2.2 - domhandler: 5.0.3 - domutils: 3.2.2 - nth-check: 2.1.1 - - css-tree@1.1.3: - dependencies: - mdn-data: 2.0.14 - source-map: 0.6.1 - - css-what@6.2.2: {} - cssesc@3.0.0: {} cssstyle@4.6.0: @@ -16435,59 +8039,8 @@ snapshots: csstype@3.2.3: {} - currently-unhandled@0.4.1: - dependencies: - array-find-index: 1.0.2 - - d3-array@3.2.4: - dependencies: - internmap: 2.0.3 - - d3-color@3.1.0: {} - - d3-ease@3.0.1: {} - - d3-format@3.1.2: {} - - d3-interpolate@3.0.1: - dependencies: - d3-color: 3.1.0 - - d3-path@3.1.0: {} - - d3-scale@4.0.2: - dependencies: - d3-array: 3.2.4 - d3-format: 3.1.2 - d3-interpolate: 3.0.1 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - - d3-shape@3.2.0: - dependencies: - d3-path: 3.1.0 - - d3-time-format@4.1.0: - dependencies: - d3-time: 3.1.0 - - d3-time@3.1.0: - dependencies: - d3-array: 3.2.4 - - d3-timer@3.0.1: {} - - d@1.0.2: - dependencies: - es5-ext: 0.10.64 - type: 2.7.3 - dargs@8.1.0: {} - dashdash@1.14.1: - dependencies: - assert-plus: 1.0.0 - data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 @@ -16511,63 +8064,20 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - date-fns-jalali@4.1.0-0: {} - - date-fns@3.6.0: {} - - date.js@0.3.3: - dependencies: - debug: 3.1.0 - transitivePeerDependencies: - - supports-color - dayjs@1.11.20: {} - debug@2.6.9(supports-color@4.5.0): - dependencies: - ms: 2.0.0 - optionalDependencies: - supports-color: 4.5.0 - optional: true - - debug@2.6.9(supports-color@5.5.0): - dependencies: - ms: 2.0.0 - optionalDependencies: - supports-color: 5.5.0 - - debug@3.1.0: - dependencies: - ms: 2.0.0 - debug@3.2.7: dependencies: ms: 2.1.3 - debug@3.2.7(supports-color@5.5.0): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 5.5.0 - debug@4.4.3: dependencies: ms: 2.1.3 - debug@4.4.3(supports-color@5.5.0): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 5.5.0 - decamelize@1.2.0: {} - decimal.js-light@2.5.1: {} - decimal.js@10.6.0: {} - decode-uri-component@0.2.2: {} - decompress-response@4.2.1: dependencies: mimic-response: 2.1.0 @@ -16577,26 +8087,13 @@ snapshots: optionalDependencies: babel-plugin-macros: 3.1.0 - deep-diff@1.0.2: {} - deep-eql@5.0.2: {} - deep-equal@1.1.2: - dependencies: - is-arguments: 1.2.0 - is-date-object: 1.1.0 - is-regex: 1.2.1 - object-is: 1.1.6 - object-keys: 1.1.1 - regexp.prototype.flags: 1.5.4 - deep-is@0.1.4: {} - deepmerge@4.3.1: {} + deepmerge-ts@7.1.5: {} - default-compare@1.0.0: - dependencies: - kind-of: 5.1.0 + deepmerge@4.3.1: {} defaults@1.0.4: dependencies: @@ -16614,88 +8111,38 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - define-property@0.2.5: - dependencies: - is-descriptor: 0.1.8 - - define-property@1.0.0: - dependencies: - is-descriptor: 1.0.4 - - define-property@2.0.2: - dependencies: - is-descriptor: 1.0.4 - isobject: 3.0.1 - - del@3.0.0: - dependencies: - globby: 6.1.0 - is-path-cwd: 1.0.0 - is-path-in-cwd: 1.0.1 - p-map: 1.2.0 - pify: 3.0.0 - rimraf: 2.7.1 + defu@6.1.7: {} delayed-stream@1.0.0: {} delegates@1.0.0: {} - depd@1.1.2: {} + denque@2.1.0: + optional: true depd@2.0.0: {} - dequal@2.0.3: {} - - des.js@1.1.0: - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - destr@2.0.5: {} - destroy@1.2.0: {} - detect-libc@2.1.2: {} detect-newline@3.1.0: {} - detect-node-es@1.1.0: {} - - detect-node@2.1.0: {} - dezalgo@1.0.4: dependencies: asap: 2.0.6 wrappy: 1.0.2 - dfa@1.2.0: {} - didyoumean@1.2.2: {} diff-sequences@29.6.3: {} diff@4.0.4: {} - diffie-hellman@5.0.3: - dependencies: - bn.js: 4.12.3 - miller-rabin: 4.0.1 - randombytes: 2.1.0 - dijkstrajs@1.0.3: {} dlv@1.1.3: {} - dns-equal@1.0.0: {} - - dns-packet@5.6.1: - dependencies: - '@leichtgewicht/ip-codec': 2.0.5 - - dns-txt@2.0.2: - dependencies: - buffer-indexof: 1.1.1 - doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -16704,36 +8151,6 @@ snapshots: dependencies: esutils: 2.0.3 - dom-helpers@5.2.1: - dependencies: - '@babel/runtime': 7.29.2 - csstype: 3.2.3 - - dom-serializer@2.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - - domain-browser@1.2.0: {} - - domelementtype@2.3.0: {} - - domhandler@5.0.3: - dependencies: - domelementtype: 2.3.0 - - dompurify@3.4.2: - optionalDependencies: - '@types/trusted-types': 2.0.7 - optional: true - - domutils@3.2.2: - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - dot-prop@5.3.0: dependencies: is-obj: 2.0.0 @@ -16752,114 +8169,48 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - duplexer2@0.1.4: - dependencies: - readable-stream: 2.3.8 - eastasianwidth@0.2.0: {} - ebec@1.1.1: - dependencies: - smob: 1.6.1 - - ebec@2.3.0: {} - - ecc-jsbn@0.1.2: - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer: 5.2.1 ee-first@1.1.1: {} + effect@3.21.0: + dependencies: + '@standard-schema/spec': 1.1.0 + fast-check: 3.23.2 + electron-to-chromium@1.5.353: {} - elliptic@6.6.1: - dependencies: - bn.js: 4.12.3 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - emittery@0.13.1: {} - emoji-regex-xs@1.0.0: {} - emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} - emojis-list@3.0.0: {} + empathic@2.0.0: {} encodeurl@2.0.0: {} - end-of-stream@1.4.5: - dependencies: - once: 1.4.0 - - engine.io-client@6.6.4: - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.4.3(supports-color@5.5.0) - engine.io-parser: 5.2.3 - ws: 8.18.3 - xmlhttprequest-ssl: 2.1.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - engine.io-parser@5.2.3: {} - - enhanced-resolve@3.4.1: - dependencies: - graceful-fs: 4.2.11 - memory-fs: 0.4.1 - object-assign: 4.1.1 - tapable: 0.2.9 - enhanced-resolve@5.21.3: dependencies: graceful-fs: 4.2.11 tapable: 2.3.3 - ent@2.2.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - punycode: 1.4.1 - safe-regex-test: 1.1.0 - - entities@4.5.0: {} - entities@6.0.1: {} env-paths@2.2.1: {} environment@1.1.0: {} - envix@1.5.0: - dependencies: - std-env: 3.10.0 - - errno@0.1.8: - dependencies: - prr: 1.0.1 - error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 - error-symbol@0.1.0: {} - es-abstract@1.24.2: dependencies: array-buffer-byte-length: 1.0.2 @@ -16965,51 +8316,6 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - es-toolkit@1.46.1: {} - - es5-ext@0.10.64: - dependencies: - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - esniff: 2.0.1 - next-tick: 1.1.0 - - es6-iterator@2.0.3: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-symbol: 3.1.4 - - es6-map@0.1.5: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - es6-set: 0.1.6 - es6-symbol: 3.1.4 - event-emitter: 0.3.5 - - es6-set@0.1.6: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - event-emitter: 0.3.5 - type: 2.7.3 - - es6-symbol@3.1.4: - dependencies: - d: 1.0.2 - ext: 1.7.0 - - es6-weak-map@2.0.3: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -17044,13 +8350,6 @@ snapshots: escape-string-regexp@4.0.0: {} - escope@3.6.0: - dependencies: - es6-map: 0.1.5 - es6-weak-map: 2.0.3 - esrecurse: 4.3.0 - estraverse: 4.3.0 - eslint-config-prettier@9.1.2(eslint@8.57.1): dependencies: eslint: 8.57.1 @@ -17189,13 +8488,6 @@ snapshots: transitivePeerDependencies: - supports-color - esniff@2.0.1: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - event-emitter: 0.3.5 - type: 2.7.3 - espree@9.6.1: dependencies: acorn: 8.16.0 @@ -17224,58 +8516,12 @@ snapshots: etag@1.8.1: {} - ethiopian-calendar-date-converter@2.1.6: {} - - ethiopian-calendar-new@1.1.0: {} - - ethiopian-date@0.0.6: {} - - event-emitter@0.3.5: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - - event-target-shim@5.0.1: {} - eventemitter2@6.4.9: {} - eventemitter3@4.0.7: {} - eventemitter3@5.0.4: {} events@3.3.0: {} - eventsource@0.1.6: - dependencies: - original: 1.0.2 - - evp_bytestokey@1.0.3: - dependencies: - md5.js: 1.3.5 - safe-buffer: 5.2.1 - - exceljs@4.4.0: - dependencies: - archiver: 5.3.2 - dayjs: 1.11.20 - fast-csv: 4.3.6 - jszip: 3.10.1 - readable-stream: 3.6.2 - saxes: 5.0.1 - tmp: 0.2.5 - unzipper: 0.10.14 - uuid: 8.3.2 - - execa@0.7.0: - dependencies: - cross-spawn: 5.1.0 - get-stream: 3.0.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -17302,43 +8548,6 @@ snapshots: exit@0.1.2: {} - expand-brackets@2.1.4: - dependencies: - debug: 2.6.9(supports-color@5.5.0) - define-property: 0.2.5 - extend-shallow: 2.0.1 - posix-character-classes: 0.1.1 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - - expand-brackets@2.1.4(supports-color@4.5.0): - dependencies: - debug: 2.6.9(supports-color@4.5.0) - define-property: 0.2.5 - extend-shallow: 2.0.1 - posix-character-classes: 0.1.1 - regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@4.5.0) - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - optional: true - - expand-brackets@2.1.4(supports-color@5.5.0): - dependencies: - debug: 2.6.9(supports-color@5.5.0) - define-property: 0.2.5 - extend-shallow: 2.0.1 - posix-character-classes: 0.1.1 - regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@5.5.0) - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - expect-type@1.3.0: {} expect@29.7.0: @@ -17349,42 +8558,6 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - express@4.22.2(supports-color@5.5.0): - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.5(supports-color@5.5.0) - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.0.7 - debug: 2.6.9(supports-color@5.5.0) - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.3.2(supports-color@5.5.0) - fresh: 0.5.2 - http-errors: 2.0.1 - merge-descriptors: 1.0.3 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.13 - proxy-addr: 2.0.7 - qs: 6.15.1 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.2(supports-color@5.5.0) - serve-static: 1.16.3(supports-color@5.5.0) - setprototypeof: 1.2.0 - statuses: 2.0.2 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - express@5.2.1: dependencies: accepts: 2.0.0 @@ -17418,76 +8591,14 @@ snapshots: transitivePeerDependencies: - supports-color - ext@1.7.0: + exsolve@1.0.8: {} + + fast-check@3.23.2: dependencies: - type: 2.7.3 - - extend-shallow@2.0.1: - dependencies: - is-extendable: 0.1.1 - - extend-shallow@3.0.2: - dependencies: - assign-symbols: 1.0.0 - is-extendable: 1.0.1 - - extend@3.0.2: {} - - extglob@2.0.4: - dependencies: - array-unique: 0.3.2 - define-property: 1.0.0 - expand-brackets: 2.1.4 - extend-shallow: 2.0.1 - fragment-cache: 0.2.1 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - - extglob@2.0.4(supports-color@4.5.0): - dependencies: - array-unique: 0.3.2 - define-property: 1.0.0 - expand-brackets: 2.1.4(supports-color@4.5.0) - extend-shallow: 2.0.1 - fragment-cache: 0.2.1 - regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@4.5.0) - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - optional: true - - extglob@2.0.4(supports-color@5.5.0): - dependencies: - array-unique: 0.3.2 - define-property: 1.0.0 - expand-brackets: 2.1.4(supports-color@5.5.0) - extend-shallow: 2.0.1 - fragment-cache: 0.2.1 - regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@5.5.0) - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - - extsprintf@1.3.0: {} - - falsey@0.3.2: - dependencies: - kind-of: 5.1.0 - - fast-csv@4.3.6: - dependencies: - '@fast-csv/format': 4.3.5 - '@fast-csv/parse': 4.3.6 + pure-rand: 6.1.0 fast-deep-equal@3.1.3: {} - fast-equals@5.4.0: {} - fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -17500,37 +8611,14 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-png@6.4.0: - dependencies: - '@types/pako': 2.0.4 - iobuffer: 5.4.0 - pako: 2.1.0 - fast-safe-stringify@2.1.1: {} fast-uri@3.1.2: {} - fast-xml-parser@4.5.6: - dependencies: - strnum: 1.1.2 - fastq@1.20.1: dependencies: reusify: 1.1.0 - faye-websocket@0.10.0: - dependencies: - websocket-driver: 0.7.4 - - faye-websocket@0.11.4: - dependencies: - websocket-driver: 0.7.4 - - faye@0.8.11: - dependencies: - cookiejar: 2.1.4 - faye-websocket: 0.11.4 - fb-watchman@2.0.2: dependencies: bser: 2.1.1 @@ -17539,22 +8627,10 @@ snapshots: optionalDependencies: picomatch: 4.0.4 - fflate@0.8.2: {} - file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 - file-selector@2.1.2: - dependencies: - tslib: 2.8.1 - - file-type@18.7.0: - dependencies: - readable-web-to-node-stream: 3.0.4 - strtok3: 7.1.1 - token-types: 5.0.1 - file-type@21.3.4: dependencies: '@tokenizer/inflate': 0.4.1 @@ -17564,34 +8640,10 @@ snapshots: transitivePeerDependencies: - supports-color - file-uri-to-path@1.0.0: - optional: true - - fill-range@4.0.0: - dependencies: - extend-shallow: 2.0.1 - is-number: 3.0.0 - repeat-string: 1.6.1 - to-regex-range: 2.1.1 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - filter-obj@1.1.0: {} - - finalhandler@1.3.2(supports-color@5.5.0): - dependencies: - debug: 2.6.9(supports-color@5.5.0) - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - finalhandler@2.1.1: dependencies: debug: 4.4.3 @@ -17603,17 +8655,6 @@ snapshots: transitivePeerDependencies: - supports-color - find-root@1.1.0: {} - - find-up@1.1.2: - dependencies: - path-exists: 2.1.0 - pinkie-promise: 2.0.1 - - find-up@2.1.0: - dependencies: - locate-path: 2.0.0 - find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -17636,51 +8677,19 @@ snapshots: keyv: 4.5.4 rimraf: 3.0.2 - flat@5.0.2: {} - flatted@3.4.2: {} follow-redirects@1.16.0: {} - follow-redirects@1.16.0(debug@3.2.7(supports-color@5.5.0)): - optionalDependencies: - debug: 3.2.7(supports-color@5.5.0) - - fontkit@2.0.4: - dependencies: - '@swc/helpers': 0.5.21 - brotli: 1.3.3 - clone: 2.1.2 - dfa: 1.2.0 - fast-deep-equal: 3.1.3 - restructure: 3.0.2 - tiny-inflate: 1.0.3 - unicode-properties: 1.4.1 - unicode-trie: 2.0.0 - for-each@0.3.5: dependencies: is-callable: 1.2.7 - for-in@1.0.2: {} - - for-own@1.0.0: - dependencies: - for-in: 1.0.2 - - force@0.0.3: - dependencies: - faye: 0.8.11 - mime: 1.2.11 - request: 2.88.2 - foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 - forever-agent@0.6.1: {} - fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.106.0): dependencies: '@babel/code-frame': 7.29.0 @@ -17698,12 +8707,6 @@ snapshots: typescript: 5.9.3 webpack: 5.106.0 - form-data@2.3.3: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - form-data@4.0.5: dependencies: asynckit: 0.4.0 @@ -17720,32 +8723,10 @@ snapshots: forwarded@0.2.0: {} - frac@1.1.2: {} - fraction.js@5.3.4: {} - fragment-cache@0.2.1: - dependencies: - map-cache: 0.2.2 - - framer-motion@12.38.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - motion-dom: 12.38.0 - motion-utils: 12.36.0 - tslib: 2.8.1 - optionalDependencies: - '@emotion/is-prop-valid': 1.4.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - fresh@0.5.2: {} - fresh@2.0.0: {} - fs-constants@1.0.0: {} - - fs-exists-sync@0.1.0: {} - fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 @@ -17760,22 +8741,9 @@ snapshots: fs.realpath@1.0.0: {} - fsevents@1.2.13: - dependencies: - bindings: 1.5.0 - nan: 2.26.2 - optional: true - fsevents@2.3.3: optional: true - fstream@1.0.12: - dependencies: - graceful-fs: 4.2.11 - inherits: 2.0.4 - mkdirp: 0.5.6 - rimraf: 2.7.1 - function-bind@1.1.2: {} function.prototype.name@1.1.8: @@ -17801,12 +8769,15 @@ snapshots: strip-ansi: 6.0.1 wide-align: 1.1.5 + generate-function@2.3.1: + dependencies: + is-property: 1.0.2 + optional: true + generator-function@2.0.1: {} gensync@1.0.0-beta.2: {} - get-caller-file@1.0.3: {} - get-caller-file@2.0.5: {} get-east-asian-width@1.6.0: {} @@ -17824,13 +8795,6 @@ snapshots: hasown: 2.0.3 math-intrinsics: 1.1.0 - get-nonce@1.0.1: {} - - get-object@0.2.0: - dependencies: - is-number: 2.1.0 - isobject: 0.2.0 - get-package-type@0.1.0: {} get-proto@1.0.1: @@ -17838,10 +8802,6 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-stdin@4.0.1: {} - - get-stream@3.0.0: {} - get-stream@6.0.1: {} get-stream@8.0.1: {} @@ -17852,11 +8812,14 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-value@2.0.6: {} - - getpass@0.1.7: + giget@2.0.0: dependencies: - assert-plus: 1.0.0 + citty: 0.1.6 + consola: 3.4.2 + defu: 6.1.7 + node-fetch-native: 1.6.7 + nypm: 0.6.6 + pathe: 2.0.3 git-raw-commits@4.0.0: dependencies: @@ -17864,11 +8827,6 @@ snapshots: meow: 12.1.1 split2: 4.2.0 - glob-parent@3.1.0: - dependencies: - is-glob: 3.1.0 - path-dirname: 1.0.2 - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -17916,71 +8874,12 @@ snapshots: define-properties: 1.2.1 gopd: 1.2.0 - globby@6.1.0: - dependencies: - array-union: 1.0.2 - glob: 7.2.3 - object-assign: 4.1.1 - pify: 2.3.0 - pinkie-promise: 2.0.1 - gopd@1.2.0: {} graceful-fs@4.2.11: {} graphemer@1.4.0: {} - gulp-header@1.8.12: - dependencies: - concat-with-sourcemaps: 1.1.0 - lodash.template: 4.18.1 - through2: 2.0.5 - - handle-thing@2.0.1: {} - - handlebars-helper-create-frame@0.1.0: - dependencies: - create-frame: 1.0.0 - isobject: 3.0.1 - - handlebars-helpers@0.10.0: - dependencies: - arr-flatten: 1.1.0 - array-sort: 0.1.4 - create-frame: 1.0.0 - define-property: 1.0.0 - falsey: 0.3.2 - for-in: 1.0.2 - for-own: 1.0.0 - get-object: 0.2.0 - get-value: 2.0.6 - handlebars: 4.7.9 - handlebars-helper-create-frame: 0.1.0 - handlebars-utils: 1.0.6 - has-value: 1.0.0 - helper-date: 1.0.1 - helper-markdown: 1.0.0 - helper-md: 0.2.2 - html-tag: 2.0.0 - is-even: 1.0.0 - is-glob: 4.0.3 - is-number: 4.0.0 - kind-of: 6.0.3 - lazy-cache: 2.0.2 - logging-helpers: 1.0.0 - micromatch: 3.1.10 - relative: 3.0.2 - striptags: 3.2.0 - to-gfm-code-block: 0.1.1 - year: 0.2.1 - transitivePeerDependencies: - - supports-color - - handlebars-utils@1.0.6: - dependencies: - kind-of: 6.0.3 - typeof-article: 0.1.1 - handlebars@4.7.9: dependencies: minimist: 1.2.8 @@ -17990,19 +8889,8 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - har-schema@2.0.0: {} - - har-validator@5.1.5: - dependencies: - ajv: 6.15.0 - har-schema: 2.0.0 - has-bigints@1.1.0: {} - has-flag@2.0.0: {} - - has-flag@3.0.0: {} - has-flag@4.0.0: {} has-property-descriptors@1.0.2: @@ -18021,128 +8909,16 @@ snapshots: has-unicode@2.0.1: {} - has-value@0.3.1: - dependencies: - get-value: 2.0.6 - has-values: 0.1.4 - isobject: 2.1.0 - - has-value@1.0.0: - dependencies: - get-value: 2.0.6 - has-values: 1.0.0 - isobject: 3.0.1 - - has-values@0.1.4: {} - - has-values@1.0.0: - dependencies: - is-number: 3.0.0 - kind-of: 4.0.0 - - hash-base@3.0.5: - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - - hash-base@3.1.2: - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - safe-buffer: 5.2.1 - to-buffer: 1.2.2 - - hash.js@1.1.7: - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - hasown@2.0.3: dependencies: function-bind: 1.1.2 - he@1.2.0: {} - - helper-date@1.0.1: - dependencies: - date.js: 0.3.3 - handlebars-utils: 1.0.6 - moment: 2.30.1 - transitivePeerDependencies: - - supports-color - - helper-markdown@1.0.0: - dependencies: - handlebars-utils: 1.0.6 - highlight.js: 9.18.5 - remarkable: 1.7.4 - - helper-md@0.2.2: - dependencies: - ent: 2.2.2 - extend-shallow: 2.0.1 - fs-exists-sync: 0.1.0 - remarkable: 1.7.4 - - highlight.js@9.18.5: {} - - hmac-drbg@1.0.1: - dependencies: - hash.js: 1.1.7 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - - hoist-non-react-statics@3.3.2: - dependencies: - react-is: 16.13.1 - - hosted-git-info@2.8.9: {} - - hpack.js@2.1.6: - dependencies: - inherits: 2.0.4 - obuf: 1.1.2 - readable-stream: 2.3.8 - wbuf: 1.7.3 - - hsl-to-hex@1.0.0: - dependencies: - hsl-to-rgb-for-reals: 1.1.1 - - hsl-to-rgb-for-reals@1.1.1: {} - html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 - html-entities@1.4.0: {} - html-escaper@2.0.2: {} - html-parse-stringify@3.0.1: - dependencies: - void-elements: 3.1.0 - - html-tag@2.0.0: - dependencies: - is-self-closing: 1.0.1 - kind-of: 6.0.3 - - html2canvas@1.4.1: - dependencies: - css-line-break: 2.1.0 - text-segmentation: 1.0.3 - - http-deceiver@1.2.7: {} - - http-errors@1.8.1: - dependencies: - depd: 1.1.2 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 1.5.0 - toidentifier: 1.0.1 - http-errors@2.0.1: dependencies: depd: 2.0.0 @@ -18151,8 +8927,6 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 - http-parser-js@0.5.10: {} - http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 @@ -18160,32 +8934,6 @@ snapshots: transitivePeerDependencies: - supports-color - http-proxy-middleware@0.19.2(debug@3.2.7(supports-color@5.5.0))(supports-color@5.5.0): - dependencies: - http-proxy: 1.18.1(debug@3.2.7(supports-color@5.5.0)) - is-glob: 4.0.3 - lodash: 4.18.1 - micromatch: 3.1.10(supports-color@5.5.0) - transitivePeerDependencies: - - debug - - supports-color - - http-proxy@1.18.1(debug@3.2.7(supports-color@5.5.0)): - dependencies: - eventemitter3: 4.0.7 - follow-redirects: 1.16.0(debug@3.2.7(supports-color@5.5.0)) - requires-port: 1.0.0 - transitivePeerDependencies: - - debug - - http-signature@1.2.0: - dependencies: - assert-plus: 1.0.0 - jsprim: 1.4.2 - sshpk: 1.18.0 - - https-browserify@1.0.0: {} - https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -18206,22 +8954,6 @@ snapshots: husky@9.1.7: {} - hyphen@1.14.1: {} - - i18next-browser-languagedetector@8.2.1: - dependencies: - '@babel/runtime': 7.29.2 - - i18next@25.10.10(typescript@5.9.3): - dependencies: - '@babel/runtime': 7.29.2 - optionalDependencies: - typescript: 5.9.3 - - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 @@ -18230,30 +8962,20 @@ snapshots: dependencies: safer-buffer: 2.1.2 - idb-keyval@6.2.2: {} - ieee754@1.2.1: {} ignore@5.3.2: {} ignore@7.0.5: {} - immediate@3.0.6: {} - - immer@10.2.0: {} - - immer@11.1.8: {} + immer@11.1.8: + optional: true import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - import-local@1.0.0: - dependencies: - pkg-dir: 2.0.0 - resolve-cwd: 2.0.0 - import-local@3.2.0: dependencies: pkg-dir: 4.2.0 @@ -18263,56 +8985,23 @@ snapshots: imurmurhash@0.1.4: {} - indent-string@2.1.0: - dependencies: - repeating: 2.0.1 - inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - info-symbol@0.1.0: {} - - inherits@2.0.3: {} - inherits@2.0.4: {} ini@4.1.1: {} - internal-ip@1.2.0: - dependencies: - meow: 3.7.0 - internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.3 side-channel: 1.1.0 - internmap@2.0.3: {} - - interpret@1.4.0: {} - - invert-kv@1.0.0: {} - - iobuffer@5.4.0: {} - - ip@1.1.9: {} - ipaddr.js@1.9.1: {} - ipaddr.js@2.4.0: {} - - is-accessor-descriptor@1.0.2: - dependencies: - hasown: 2.0.3 - - is-arguments@1.2.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-array-buffer@3.0.5: dependencies: call-bind: 1.0.9 @@ -18333,10 +9022,6 @@ snapshots: dependencies: has-bigints: 1.1.0 - is-binary-path@1.0.1: - dependencies: - binary-extensions: 1.13.1 - is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 @@ -18346,18 +9031,12 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-buffer@1.1.6: {} - is-callable@1.2.7: {} is-core-module@2.16.2: dependencies: hasown: 2.0.3 - is-data-descriptor@1.0.1: - dependencies: - hasown: 2.0.3 - is-data-view@1.0.2: dependencies: call-bound: 1.0.4 @@ -18369,40 +9048,12 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-descriptor@0.1.8: - dependencies: - is-accessor-descriptor: 1.0.2 - is-data-descriptor: 1.0.1 - - is-descriptor@1.0.4: - dependencies: - is-accessor-descriptor: 1.0.2 - is-data-descriptor: 1.0.1 - - is-even@1.0.0: - dependencies: - is-odd: 0.1.2 - - is-extendable@0.1.1: {} - - is-extendable@1.0.1: - dependencies: - is-plain-object: 2.0.4 - is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: dependencies: call-bound: 1.0.4 - is-finite@1.1.0: {} - - is-fullwidth-code-point@1.0.0: - dependencies: - number-is-nan: 1.0.1 - - is-fullwidth-code-point@2.0.0: {} - is-fullwidth-code-point@3.0.0: {} is-fullwidth-code-point@4.0.0: {} @@ -18421,20 +9072,12 @@ snapshots: has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 - is-glob@3.1.0: - dependencies: - is-extglob: 2.1.1 - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 is-interactive@1.0.0: {} - is-lite@0.8.2: {} - - is-lite@1.2.1: {} - is-map@2.0.3: {} is-negative-zero@2.0.3: {} @@ -18444,44 +9087,19 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-number@2.1.0: - dependencies: - kind-of: 3.2.2 - - is-number@3.0.0: - dependencies: - kind-of: 3.2.2 - - is-number@4.0.0: {} - is-number@7.0.0: {} is-obj@2.0.0: {} - is-odd@0.1.2: - dependencies: - is-number: 3.0.0 - - is-path-cwd@1.0.0: {} - - is-path-in-cwd@1.0.1: - dependencies: - is-path-inside: 1.0.1 - - is-path-inside@1.0.1: - dependencies: - path-is-inside: 1.0.2 - is-path-inside@3.0.3: {} - is-plain-object@2.0.4: - dependencies: - isobject: 3.0.1 - is-potential-custom-element-name@1.0.1: {} is-promise@4.0.0: {} + is-property@1.0.2: + optional: true + is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -18489,18 +9107,12 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.3 - is-self-closing@1.0.1: - dependencies: - self-closing-tags: 1.0.1 - is-set@2.0.3: {} is-shared-array-buffer@1.0.4: dependencies: call-bound: 1.0.4 - is-stream@1.1.0: {} - is-stream@2.0.1: {} is-stream@3.0.0: {} @@ -18524,14 +9136,8 @@ snapshots: dependencies: which-typed-array: 1.1.20 - is-typedarray@1.0.0: {} - is-unicode-supported@0.1.0: {} - is-url@1.2.4: {} - - is-utf8@0.2.1: {} - is-weakmap@2.0.2: {} is-weakref@1.1.1: @@ -18543,26 +9149,10 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 - is-windows@1.0.2: {} - - is-wsl@1.1.0: {} - - isarray@1.0.0: {} - isarray@2.0.5: {} isexe@2.0.0: {} - isobject@0.2.0: {} - - isobject@2.1.0: - dependencies: - isarray: 1.0.0 - - isobject@3.0.1: {} - - isstream@0.1.2: {} - istanbul-lib-coverage@3.2.2: {} istanbul-lib-instrument@5.2.1: @@ -18621,10 +9211,6 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jay-peg@1.1.1: - dependencies: - restructure: 3.0.2 - jest-changed-files@29.7.0: dependencies: execa: 5.1.1 @@ -18944,18 +9530,6 @@ snapshots: jiti@2.6.1: {} - jiti@2.7.0: {} - - jmespath@0.16.0: {} - - jose@5.10.0: {} - - jquery@3.7.1: {} - - js-cookie@3.0.5: {} - - js-md5@0.8.3: {} - js-tokens@4.0.0: {} js-yaml@3.14.2: @@ -18971,8 +9545,6 @@ snapshots: dependencies: argparse: 2.0.1 - jsbn@0.1.1: {} - jsdom@25.0.1(canvas@2.11.2): dependencies: cssstyle: 4.6.0 @@ -19007,26 +9579,14 @@ snapshots: json-buffer@3.0.1: {} - json-loader@0.5.7: {} - json-parse-even-better-errors@2.3.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: {} - json-stream@1.0.0: {} - - json-stringify-safe@5.0.1: {} - - json3@3.3.3: {} - - json5@0.5.1: {} - json5@1.0.2: dependencies: minimist: 1.2.8 @@ -19069,24 +9629,6 @@ snapshots: ms: 2.1.3 semver: 7.8.0 - jspdf@3.0.4: - dependencies: - '@babel/runtime': 7.29.2 - fast-png: 6.4.0 - fflate: 0.8.2 - optionalDependencies: - canvg: 3.0.11 - core-js: 3.49.0 - dompurify: 3.4.2 - html2canvas: 1.4.1 - - jsprim@1.4.2: - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.9 @@ -19094,13 +9636,6 @@ snapshots: object.assign: 4.1.7 object.values: 1.2.1 - jszip@3.10.1: - dependencies: - lie: 3.3.0 - pako: 1.0.11 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - jwa@1.4.2: dependencies: buffer-equal-constant-time: 1.0.1 @@ -19127,36 +9662,8 @@ snapshots: dependencies: json-buffer: 3.0.1 - killable@1.0.1: {} - - kind-of@3.2.2: - dependencies: - is-buffer: 1.1.6 - - kind-of@4.0.0: - dependencies: - is-buffer: 1.1.6 - - kind-of@5.1.0: {} - - kind-of@6.0.3: {} - kleur@3.0.3: {} - lazy-cache@1.0.4: {} - - lazy-cache@2.0.2: - dependencies: - set-getter: 0.1.1 - - lazystream@1.0.1: - dependencies: - readable-stream: 2.3.8 - - lcid@1.0.0: - dependencies: - invert-kv: 1.0.0 - leven@3.1.0: {} levn@0.4.1: @@ -19166,15 +9673,6 @@ snapshots: libphonenumber-js@1.13.1: {} - libreoffice-convert@1.8.1: - dependencies: - async: 3.2.6 - tmp: 0.2.5 - - lie@3.3.0: - dependencies: - immediate: 3.0.6 - lightningcss-android-arm64@1.32.0: optional: true @@ -19223,18 +9721,12 @@ snapshots: lightningcss-linux-x64-musl: 1.32.0 lightningcss-win32-arm64-msvc: 1.32.0 lightningcss-win32-x64-msvc: 1.32.0 + optional: true lilconfig@3.1.3: {} - linebreak@1.1.0: - dependencies: - base64-js: 0.0.8 - unicode-trie: 2.0.0 - lines-and-columns@1.2.4: {} - linkifyjs@4.3.2: {} - lint-staged@15.5.2: dependencies: chalk: 5.6.2 @@ -19250,8 +9742,6 @@ snapshots: transitivePeerDependencies: - supports-color - listenercount@1.0.1: {} - listr2@8.3.3: dependencies: cli-truncate: 4.0.0 @@ -19263,38 +9753,8 @@ snapshots: load-esm@1.0.3: {} - load-json-file@1.1.0: - dependencies: - graceful-fs: 4.2.11 - parse-json: 2.2.0 - pify: 2.3.0 - pinkie-promise: 2.0.1 - strip-bom: 2.0.0 - - load-json-file@2.0.0: - dependencies: - graceful-fs: 4.2.11 - parse-json: 2.2.0 - pify: 2.3.0 - strip-bom: 3.0.0 - - loadash@1.0.0: {} - - loader-runner@2.4.0: {} - loader-runner@4.3.2: {} - loader-utils@1.4.2: - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 1.0.2 - - locate-path@2.0.0: - dependencies: - p-locate: 2.0.0 - path-exists: 3.0.0 - locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -19307,49 +9767,20 @@ snapshots: dependencies: p-locate: 6.0.0 - locter@2.2.1: - dependencies: - destr: 2.0.5 - ebec: 2.3.0 - fast-glob: 3.3.3 - flat: 5.0.2 - jiti: 2.7.0 - yaml: 2.9.0 - - lodash._reinterpolate@3.0.0: {} - lodash.camelcase@4.3.0: {} - lodash.defaults@4.2.0: {} - - lodash.difference@4.5.0: {} - - lodash.escaperegexp@4.1.2: {} - - lodash.flatten@4.4.0: {} - - lodash.groupby@4.6.0: {} - lodash.includes@4.3.0: {} lodash.isboolean@3.0.3: {} - lodash.isequal@4.5.0: {} - - lodash.isfunction@3.0.9: {} - lodash.isinteger@4.0.4: {} - lodash.isnil@4.0.0: {} - lodash.isnumber@3.0.3: {} lodash.isplainobject@4.0.6: {} lodash.isstring@4.0.1: {} - lodash.isundefined@3.0.1: {} - lodash.kebabcase@4.1.1: {} lodash.memoize@4.1.2: {} @@ -19364,17 +9795,6 @@ snapshots: lodash.startcase@4.4.0: {} - lodash.template@4.18.1: - dependencies: - lodash._reinterpolate: 3.0.0 - lodash.templatesettings: 4.2.0 - - lodash.templatesettings@4.2.0: - dependencies: - lodash._reinterpolate: 3.0.0 - - lodash.union@4.6.0: {} - lodash.uniq@4.5.0: {} lodash.upperfirst@4.3.1: {} @@ -19383,11 +9803,6 @@ snapshots: lodash@4.18.1: {} - log-ok@0.1.1: - dependencies: - ansi-green: 0.1.1 - success-symbol: 0.1.0 - log-symbols@4.1.0: dependencies: chalk: 4.1.2 @@ -19401,58 +9816,25 @@ snapshots: strip-ansi: 7.2.0 wrap-ansi: 9.0.2 - log-utils@0.2.1: - dependencies: - ansi-colors: 0.2.0 - error-symbol: 0.1.0 - info-symbol: 0.1.0 - log-ok: 0.1.1 - success-symbol: 0.1.0 - time-stamp: 1.1.0 - warning-symbol: 0.1.0 - - logging-helpers@1.0.0: - dependencies: - isobject: 3.0.1 - log-utils: 0.2.1 - - loglevel@1.9.2: {} - - longest@1.0.1: {} + long@5.3.2: + optional: true loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - lottie-web@5.13.0: {} - - loud-rejection@1.6.0: - dependencies: - currently-unhandled: 0.4.1 - signal-exit: 3.0.7 - loupe@3.2.1: {} - lower-case@2.0.2: - dependencies: - tslib: 2.8.1 - lru-cache@10.4.3: {} lru-cache@11.3.6: {} - lru-cache@4.1.5: - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - lru-cache@5.1.1: dependencies: yallist: 3.1.1 - lucide-react@0.513.0(react@18.3.1): - dependencies: - react: 18.3.1 + lru.min@1.1.4: + optional: true luxon@3.7.2: {} @@ -19464,8 +9846,6 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - make-cancellable-promise@2.0.0: {} - make-dir@3.1.0: dependencies: semver: 6.3.1 @@ -19476,143 +9856,35 @@ snapshots: make-error@1.3.6: {} - make-event-props@2.0.0: {} - makeerror@1.0.12: dependencies: tmpl: 1.0.5 - map-cache@0.2.2: {} - - map-obj@1.0.1: {} - - map-visit@1.0.0: - dependencies: - object-visit: 1.0.1 - math-intrinsics@1.1.0: {} - md5.js@1.3.5: - dependencies: - hash-base: 3.0.5 - inherits: 2.0.4 - safe-buffer: 5.2.1 - - mdn-data@2.0.14: {} - - media-engine@1.0.3: {} - media-typer@0.3.0: {} media-typer@1.1.0: {} - mem@1.1.0: - dependencies: - mimic-fn: 1.2.0 - memfs@3.5.3: dependencies: fs-monkey: 1.1.0 - memory-fs@0.4.1: - dependencies: - errno: 0.1.8 - readable-stream: 2.3.8 - meow@12.1.1: {} - meow@3.7.0: - dependencies: - camelcase-keys: 2.1.0 - decamelize: 1.2.0 - loud-rejection: 1.6.0 - map-obj: 1.0.1 - minimist: 1.2.8 - normalize-package-data: 2.5.0 - object-assign: 4.1.1 - read-pkg-up: 1.0.1 - redent: 1.0.0 - trim-newlines: 1.0.0 - - merge-descriptors@1.0.3: {} - merge-descriptors@2.0.0: {} - merge-refs@2.0.0(@types/react@18.3.28): - optionalDependencies: - '@types/react': 18.3.28 - merge-stream@2.0.0: {} merge2@1.4.1: {} methods@1.1.2: {} - micromatch@3.1.10: - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - braces: 2.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - extglob: 2.0.4 - fragment-cache: 0.2.1 - kind-of: 6.0.3 - nanomatch: 1.2.13 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - - micromatch@3.1.10(supports-color@4.5.0): - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - braces: 2.3.2(supports-color@4.5.0) - define-property: 2.0.2 - extend-shallow: 3.0.2 - extglob: 2.0.4(supports-color@4.5.0) - fragment-cache: 0.2.1 - kind-of: 6.0.3 - nanomatch: 1.2.13(supports-color@4.5.0) - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@4.5.0) - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - optional: true - - micromatch@3.1.10(supports-color@5.5.0): - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - braces: 2.3.2(supports-color@5.5.0) - define-property: 2.0.2 - extend-shallow: 3.0.2 - extglob: 2.0.4(supports-color@5.5.0) - fragment-cache: 0.2.1 - kind-of: 6.0.3 - nanomatch: 1.2.13(supports-color@5.5.0) - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@5.5.0) - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.2 - miller-rabin@4.0.1: - dependencies: - bn.js: 4.12.3 - brorand: 1.1.0 - mime-db@1.52.0: {} mime-db@1.54.0: {} @@ -19625,14 +9897,8 @@ snapshots: dependencies: mime-db: 1.54.0 - mime@1.2.11: {} - - mime@1.6.0: {} - mime@2.6.0: {} - mimic-fn@1.2.0: {} - mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} @@ -19642,10 +9908,6 @@ snapshots: mimic-response@2.1.0: optional: true - minimalistic-assert@1.0.1: {} - - minimalistic-crypto-utils@1.0.1: {} - minimatch@10.2.5: dependencies: brace-expansion: 5.0.6 @@ -19654,33 +9916,12 @@ snapshots: dependencies: brace-expansion: 1.1.14 - minimatch@5.1.9: - dependencies: - brace-expansion: 2.1.0 - minimatch@9.0.9: dependencies: brace-expansion: 2.1.0 minimist@1.2.8: {} - minio@7.1.3: - dependencies: - async: 3.2.6 - block-stream2: 2.1.0 - browser-or-node: 2.1.1 - buffer-crc32: 0.2.13 - fast-xml-parser: 4.5.6 - ipaddr.js: 2.4.0 - json-stream: 1.0.0 - lodash: 4.18.1 - mime-types: 2.1.35 - query-string: 7.1.3 - through2: 4.0.2 - web-encoding: 1.1.5 - xml: 1.0.1 - xml2js: 0.5.0 - minipass@3.3.6: dependencies: yallist: 4.0.0 @@ -19694,40 +9935,10 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 - mixin-deep@1.3.2: - dependencies: - for-in: 1.0.2 - is-extendable: 1.0.1 - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - mkdirp@1.0.4: {} - moment@2.30.1: {} - - motion-dom@12.38.0: - dependencies: - motion-utils: 12.36.0 - - motion-utils@12.36.0: {} - - ms@2.0.0: {} - ms@2.1.3: {} - mui-ethiopian-datepicker@0.3.2(hjxdxgubdlhng5uhyvidfkiyo4): - dependencies: - '@emotion/react': 11.14.0(@types/react@18.3.28)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) - '@mui/icons-material': 5.18.0(@mui/material@5.18.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) - '@mui/material': 5.18.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/x-date-pickers': 6.20.2(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@mui/material@5.18.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@5.18.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(date-fns@3.6.0)(dayjs@1.11.20)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - date-fns: 3.6.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - multer@2.1.1: dependencies: append-field: 1.0.0 @@ -19735,111 +9946,47 @@ snapshots: concat-stream: 2.0.0 type-is: 1.6.18 - multicast-dns-service-types@1.1.0: {} - - multicast-dns@7.2.5: - dependencies: - dns-packet: 5.6.1 - thunky: 1.1.0 - mute-stream@2.0.0: {} + mysql2@3.15.3: + dependencies: + aws-ssl-profiles: 1.1.2 + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.7.2 + long: 5.3.2 + lru.min: 1.1.4 + named-placeholders: 1.1.6 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + optional: true + mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 + named-placeholders@1.1.6: + dependencies: + lru.min: 1.1.4 + optional: true + nan@2.26.2: optional: true nanoid@3.3.12: {} - nanomatch@1.2.13: - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - fragment-cache: 0.2.1 - is-windows: 1.0.2 - kind-of: 6.0.3 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - - nanomatch@1.2.13(supports-color@4.5.0): - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - fragment-cache: 0.2.1 - is-windows: 1.0.2 - kind-of: 6.0.3 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@4.5.0) - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - optional: true - - nanomatch@1.2.13(supports-color@5.5.0): - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - fragment-cache: 0.2.1 - is-windows: 1.0.2 - kind-of: 6.0.3 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@5.5.0) - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - natural-compare@1.4.0: {} - negotiator@0.6.3: {} - - negotiator@0.6.4: {} - negotiator@1.0.0: {} neo-async@2.6.2: {} - nestjs-minio-client@2.2.0(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19): - dependencies: - '@nestjs/common': 11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 11.1.19(@nestjs/common@11.1.19(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/microservices@11.1.19)(@nestjs/platform-express@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2) - minio: 7.1.3 - reflect-metadata: 0.1.14 - rxjs: 7.8.2 - - next-themes@0.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - next-tick@1.1.0: {} - - no-case@3.0.4: - dependencies: - lower-case: 2.0.2 - tslib: 2.8.1 - node-abort-controller@3.1.1: {} node-addon-api@5.1.0: {} - node-addon-api@8.7.0: {} - node-emoji@1.11.0: dependencies: lodash: 4.18.1 @@ -19851,74 +9998,22 @@ snapshots: object.entries: 1.1.9 semver: 6.3.1 + node-fetch-native@1.6.7: {} + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - node-forge@0.10.0: {} - - node-gyp-build@4.8.4: {} - - node-html-parser@6.1.13: - dependencies: - css-select: 5.2.2 - he: 1.2.0 - node-int64@0.4.0: {} - node-libs-browser@2.2.1: - dependencies: - assert: 1.5.1 - browserify-zlib: 0.2.0 - buffer: 4.9.2 - console-browserify: 1.2.0 - constants-browserify: 1.0.0 - crypto-browserify: 3.12.1 - domain-browser: 1.2.0 - events: 3.3.0 - https-browserify: 1.0.0 - os-browserify: 0.3.0 - path-browserify: 0.0.1 - process: 0.11.10 - punycode: 1.4.1 - querystring-es3: 0.2.1 - readable-stream: 2.3.8 - stream-browserify: 2.0.2 - stream-http: 2.8.3 - string_decoder: 1.3.0 - timers-browserify: 2.0.12 - tty-browserify: 0.0.0 - url: 0.11.4 - util: 0.11.1 - vm-browserify: 1.1.2 - node-releases@2.0.44: {} nopt@5.0.0: dependencies: abbrev: 1.1.1 - normalize-package-data@2.5.0: - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.12 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - - normalize-path@2.1.1: - dependencies: - remove-trailing-separator: 1.1.0 - normalize-path@3.0.0: {} - normalize-svg-path@1.1.0: - dependencies: - svg-arc-to-cubic-bezier: 3.2.0 - - npm-run-path@2.0.2: - dependencies: - path-key: 2.0.1 - npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -19934,39 +10029,22 @@ snapshots: gauge: 3.0.2 set-blocking: 2.0.0 - nth-check@2.1.1: - dependencies: - boolbase: 1.0.0 - - number-is-nan@1.0.1: {} - nwsapi@2.2.23: {} - oauth-sign@0.9.0: {} + nypm@0.6.6: + dependencies: + citty: 0.2.2 + pathe: 2.0.3 + tinyexec: 1.1.2 object-assign@4.1.1: {} - object-copy@0.1.0: - dependencies: - copy-descriptor: 0.1.1 - define-property: 0.2.5 - kind-of: 3.2.2 - object-hash@3.0.0: {} object-inspect@1.13.4: {} - object-is@1.1.6: - dependencies: - call-bind: 1.0.9 - define-properties: 1.2.1 - object-keys@1.1.1: {} - object-visit@1.0.1: - dependencies: - isobject: 3.0.1 - object.assign@4.1.7: dependencies: call-bind: 1.0.9 @@ -19996,10 +10074,6 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.24.2 - object.pick@1.3.0: - dependencies: - isobject: 3.0.1 - object.values@1.2.1: dependencies: call-bind: 1.0.9 @@ -20007,14 +10081,12 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 - obuf@1.1.2: {} + ohash@2.0.11: {} on-finished@2.4.1: dependencies: ee-first: 1.1.1 - on-headers@1.1.0: {} - once@1.4.0: dependencies: wrappy: 1.0.2 @@ -20031,12 +10103,6 @@ snapshots: dependencies: mimic-function: 5.0.1 - opencollective-postinstall@2.0.3: {} - - opn@5.5.0: - dependencies: - is-wsl: 1.1.0 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -20058,36 +10124,12 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 - orderedmap@2.1.1: {} - - original@1.0.2: - dependencies: - url-parse: 1.5.10 - - os-browserify@0.3.0: {} - - os-locale@1.4.0: - dependencies: - lcid: 1.0.0 - - os-locale@2.1.0: - dependencies: - execa: 0.7.0 - lcid: 1.0.0 - mem: 1.1.0 - own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 - p-finally@1.0.0: {} - - p-limit@1.3.0: - dependencies: - p-try: 1.0.0 - p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -20100,10 +10142,6 @@ snapshots: dependencies: yocto-queue: 1.2.2 - p-locate@2.0.0: - dependencies: - p-limit: 1.3.0 - p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -20116,36 +10154,14 @@ snapshots: dependencies: p-limit: 4.0.0 - p-map@1.2.0: {} - - p-try@1.0.0: {} - p-try@2.2.0: {} package-json-from-dist@1.0.1: {} - pako@0.2.9: {} - - pako@1.0.11: {} - - pako@2.1.0: {} - parent-module@1.0.1: dependencies: callsites: 3.1.0 - parse-asn1@5.1.9: - dependencies: - asn1.js: 4.10.1 - browserify-aes: 1.2.0 - evp_bytestokey: 1.0.3 - pbkdf2: 3.1.5 - safe-buffer: 5.2.1 - - parse-json@2.2.0: - dependencies: - error-ex: 1.3.4 - parse-json@5.2.0: dependencies: '@babel/code-frame': 7.29.0 @@ -20153,21 +10169,12 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse-svg-path@0.1.2: {} - parse5@7.3.0: dependencies: entities: 6.0.1 parseurl@1.3.3: {} - pascal-case@3.1.2: - dependencies: - no-case: 3.0.4 - tslib: 2.8.1 - - pascalcase@0.1.1: {} - passport-jwt@4.0.1: dependencies: jsonwebtoken: 9.0.3 @@ -20181,26 +10188,12 @@ snapshots: pause: 0.0.1 utils-merge: 1.0.1 - path-browserify@0.0.1: {} - - path-dirname@1.0.2: {} - - path-exists@2.1.0: - dependencies: - pinkie-promise: 2.0.1 - - path-exists@3.0.0: {} - path-exists@4.0.0: {} path-exists@5.0.0: {} path-is-absolute@1.0.1: {} - path-is-inside@1.0.2: {} - - path-key@2.0.1: {} - path-key@3.1.1: {} path-key@4.0.0: {} @@ -20217,73 +10210,38 @@ snapshots: lru-cache: 11.3.6 minipass: 7.1.3 - path-to-regexp@0.1.13: {} - path-to-regexp@3.3.0: {} path-to-regexp@8.4.2: {} - path-type@1.1.0: - dependencies: - graceful-fs: 4.2.11 - pify: 2.3.0 - pinkie-promise: 2.0.1 - - path-type@2.0.0: - dependencies: - pify: 2.3.0 - path-type@4.0.0: {} - path2d-polyfill@2.0.1: - optional: true - - path@0.12.7: - dependencies: - process: 0.11.10 - util: 0.10.4 - pathe@1.1.2: {} + pathe@2.0.3: {} + pathval@2.0.1: {} pause@0.0.1: {} - pbkdf2@3.1.5: - dependencies: - create-hash: 1.2.0 - create-hmac: 1.1.7 - ripemd160: 2.0.3 - safe-buffer: 5.2.1 - sha.js: 2.4.12 - to-buffer: 1.2.2 - - pdfjs-dist@3.11.174: - optionalDependencies: - canvas: 2.11.2 - path2d-polyfill: 2.0.1 - transitivePeerDependencies: - - encoding - - supports-color - - peek-readable@5.4.2: {} - - perfect-freehand@1.2.3: {} - - performance-now@2.1.0: {} + perfect-debounce@1.0.0: {} pg-cloudflare@1.3.0: optional: true - pg-connection-string@2.12.0: {} + pg-connection-string@2.12.0: + optional: true - pg-int8@1.0.1: {} + pg-int8@1.0.1: + optional: true pg-pool@3.13.0(pg@8.20.0): dependencies: pg: 8.20.0 + optional: true - pg-protocol@1.13.0: {} + pg-protocol@1.13.0: + optional: true pg-types@2.2.0: dependencies: @@ -20292,6 +10250,7 @@ snapshots: postgres-bytea: 1.0.1 postgres-date: 1.0.7 postgres-interval: 1.2.0 + optional: true pg@8.20.0: dependencies: @@ -20302,10 +10261,12 @@ snapshots: pgpass: 1.0.5 optionalDependencies: pg-cloudflare: 1.3.0 + optional: true pgpass@1.0.5: dependencies: split2: 4.2.0 + optional: true picocolors@1.1.1: {} @@ -20317,43 +10278,22 @@ snapshots: pify@2.3.0: {} - pify@3.0.0: {} - - pinkie-promise@2.0.1: - dependencies: - pinkie: 2.0.4 - - pinkie@2.0.4: {} - pirates@4.0.7: {} - pkg-dir@2.0.0: - dependencies: - find-up: 2.1.0 - pkg-dir@4.2.0: dependencies: find-up: 4.1.0 + pkg-types@2.3.1: + dependencies: + confbox: 0.2.4 + exsolve: 1.0.8 + pathe: 2.0.3 + pluralize@8.0.0: {} - png-js@2.0.0: - dependencies: - fflate: 0.8.2 - pngjs@5.0.0: {} - popper.js@1.16.1: {} - - portfinder@1.0.38(supports-color@5.5.0): - dependencies: - async: 3.2.6 - debug: 4.4.3(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - - posix-character-classes@0.1.1: {} - possible-typed-array-names@1.1.0: {} postcss-import@15.1.0(postcss@8.5.14): @@ -20394,15 +10334,19 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postgres-array@2.0.0: {} + postgres-array@2.0.0: + optional: true - postgres-bytea@1.0.1: {} + postgres-bytea@1.0.1: + optional: true - postgres-date@1.0.7: {} + postgres-date@1.0.7: + optional: true postgres-interval@1.2.0: dependencies: xtend: 4.0.2 + optional: true prelude-ls@1.2.1: {} @@ -20414,15 +10358,14 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 - prisma@5.22.0: + prisma@6.19.3(typescript@5.9.3): dependencies: - '@prisma/engines': 5.22.0 + '@prisma/config': 6.19.3 + '@prisma/engines': 6.19.3 optionalDependencies: - fsevents: 2.3.3 - - process-nextick-args@2.0.1: {} - - process@0.11.10: {} + typescript: 5.9.3 + transitivePeerDependencies: + - magicast prompts@2.4.2: dependencies: @@ -20435,107 +10378,13 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 - prosemirror-changeset@2.4.1: - dependencies: - prosemirror-transform: 1.12.0 - - prosemirror-commands@1.7.1: - dependencies: - prosemirror-model: 1.25.4 - prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 - - prosemirror-dropcursor@1.8.2: - dependencies: - prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 - prosemirror-view: 1.41.8 - - prosemirror-gapcursor@1.4.1: - dependencies: - prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.4 - prosemirror-state: 1.4.4 - prosemirror-view: 1.41.8 - - prosemirror-history@1.5.0: - dependencies: - prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 - prosemirror-view: 1.41.8 - rope-sequence: 1.3.4 - - prosemirror-keymap@1.2.3: - dependencies: - prosemirror-state: 1.4.4 - w3c-keyname: 2.2.8 - - prosemirror-model@1.25.4: - dependencies: - orderedmap: 2.1.1 - - prosemirror-schema-list@1.5.1: - dependencies: - prosemirror-model: 1.25.4 - prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 - - prosemirror-state@1.4.4: - dependencies: - prosemirror-model: 1.25.4 - prosemirror-transform: 1.12.0 - prosemirror-view: 1.41.8 - - prosemirror-tables@1.8.5: - dependencies: - prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.4 - prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 - prosemirror-view: 1.41.8 - - prosemirror-transform@1.12.0: - dependencies: - prosemirror-model: 1.25.4 - - prosemirror-view@1.41.8: - dependencies: - prosemirror-model: 1.25.4 - prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 - proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 - proxy-compare@3.0.1: {} - proxy-from-env@2.1.0: {} - proxy-memoize@3.0.1: - dependencies: - proxy-compare: 3.0.1 - - prr@1.0.1: {} - - pseudomap@1.0.2: {} - - psl@1.15.0: - dependencies: - punycode: 2.3.1 - - public-encrypt@4.0.3: - dependencies: - bn.js: 4.12.3 - browserify-rsa: 4.1.1 - create-hash: 1.2.0 - parse-asn1: 5.1.9 - randombytes: 2.1.0 - safe-buffer: 5.2.1 - - punycode@1.4.1: {} - punycode@2.3.1: {} pure-rand@6.1.0: {} @@ -20550,53 +10399,10 @@ snapshots: dependencies: side-channel: 1.1.0 - qs@6.5.5: {} - - query-string@7.1.3: - dependencies: - decode-uri-component: 0.2.2 - filter-obj: 1.1.0 - split-on-first: 1.1.0 - strict-uri-encode: 2.0.0 - - querystring-es3@0.2.1: {} - - querystringify@2.2.0: {} - queue-microtask@1.2.3: {} - queue@6.0.2: - dependencies: - inherits: 2.0.4 - - raf@3.4.1: - dependencies: - performance-now: 2.1.0 - optional: true - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - randomfill@1.0.4: - dependencies: - randombytes: 2.1.0 - safe-buffer: 5.2.1 - range-parser@1.2.1: {} - rapiq@0.9.0: - dependencies: - ebec: 1.1.1 - smob: 1.6.1 - - raw-body@2.5.3: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - raw-body@3.0.2: dependencies: bytes: 3.1.2 @@ -20604,30 +10410,10 @@ snapshots: iconv-lite: 0.7.2 unpipe: 1.0.0 - react-cookie@8.1.2(@types/react@18.3.28)(react@18.3.1): + rc9@2.1.2: dependencies: - '@types/hoist-non-react-statics': 3.3.7(@types/react@18.3.28) - hoist-non-react-statics: 3.3.2 - react: 18.3.1 - universal-cookie: 8.1.2 - transitivePeerDependencies: - - '@types/react' - - react-datepicker@8.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@floating-ui/react': 0.27.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - clsx: 2.1.1 - date-fns: 3.6.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - react-day-picker@9.14.0(react@18.3.1): - dependencies: - '@date-fns/tz': 1.4.1 - '@tabby_ai/hijri-converter': 1.0.5 - date-fns: 3.6.0 - date-fns-jalali: 4.1.0-0 - react: 18.3.1 + defu: 6.1.7 + destr: 2.0.5 react-dom@18.3.1(react@18.3.1): dependencies: @@ -20635,158 +10421,12 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-dropzone@14.4.1(react@18.3.1): - dependencies: - attr-accept: 2.2.5 - file-selector: 2.1.2 - prop-types: 15.8.1 - react: 18.3.1 - - react-floater@0.7.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - deepmerge: 4.3.1 - is-lite: 0.8.2 - popper.js: 1.16.1 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - tree-changes: 0.9.3 - - react-hook-form@7.75.0(react@18.3.1): - dependencies: - react: 18.3.1 - - react-i18next@15.7.4(i18next@25.10.10(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3): - dependencies: - '@babel/runtime': 7.29.2 - html-parse-stringify: 3.0.1 - i18next: 25.10.10(typescript@5.9.3) - react: 18.3.1 - optionalDependencies: - react-dom: 18.3.1(react@18.3.1) - typescript: 5.9.3 - - react-icons@5.6.0(react@18.3.1): - dependencies: - react: 18.3.1 - - react-image-crop@11.0.10(react@18.3.1): - dependencies: - react: 18.3.1 - - react-innertext@1.1.5(@types/react@18.3.28)(react@18.3.1): - dependencies: - '@types/react': 18.3.28 - react: 18.3.1 - - react-intersection-observer@9.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - optionalDependencies: - react-dom: 18.3.1(react@18.3.1) - react-is@16.13.1: {} react-is@18.3.1: {} - react-is@19.2.6: {} - - react-joyride@2.9.3(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@gilbarbara/deep-equal': 0.3.1 - deep-diff: 1.0.2 - deepmerge: 4.3.1 - is-lite: 1.2.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-floater: 0.7.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-innertext: 1.1.5(@types/react@18.3.28)(react@18.3.1) - react-is: 16.13.1 - scroll: 3.0.1 - scrollparent: 2.1.0 - tree-changes: 0.11.3 - type-fest: 4.41.0 - transitivePeerDependencies: - - '@types/react' - - react-number-format@5.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - react-pdf-html@2.1.5(@react-pdf/renderer@4.5.1(react@18.3.1))(react@18.3.1): - dependencies: - '@react-pdf/renderer': 4.5.1(react@18.3.1) - css-tree: 1.1.3 - node-html-parser: 6.1.13 - react: 18.3.1 - - react-pdf-viewer@0.1.0: - dependencies: - pdfjs-dist: 3.11.174 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - webpack: 3.12.0 - webpack-dev-server: 2.11.5(webpack@3.12.0) - transitivePeerDependencies: - - encoding - - supports-color - - webpack-cli - - webpack-command - - react-pdf@10.4.1(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - clsx: 2.1.1 - dequal: 2.0.3 - make-cancellable-promise: 2.0.0 - make-event-props: 2.0.0 - merge-refs: 2.0.0(@types/react@18.3.28) - pdfjs-dist: 3.11.174 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - tiny-invariant: 1.3.3 - warning: 4.0.3 - optionalDependencies: - '@types/react': 18.3.28 - transitivePeerDependencies: - - encoding - - supports-color - - react-redux@9.2.0(@types/react@18.3.28)(react@18.3.1)(redux@5.0.1): - dependencies: - '@types/use-sync-external-store': 0.0.6 - react: 18.3.1 - use-sync-external-store: 1.6.0(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - redux: 5.0.1 - react-refresh@0.17.0: {} - react-remove-scroll-bar@2.3.8(@types/react@18.3.28)(react@18.3.1): - dependencies: - react: 18.3.1 - react-style-singleton: 2.2.3(@types/react@18.3.28)(react@18.3.1) - tslib: 2.8.1 - optionalDependencies: - '@types/react': 18.3.28 - - react-remove-scroll@2.7.2(@types/react@18.3.28)(react@18.3.1): - dependencies: - react: 18.3.1 - react-remove-scroll-bar: 2.3.8(@types/react@18.3.28)(react@18.3.1) - react-style-singleton: 2.2.3(@types/react@18.3.28)(react@18.3.1) - tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@18.3.28)(react@18.3.1) - use-sidecar: 1.1.3(@types/react@18.3.28)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - - react-resizable-panels@3.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@remix-run/router': 1.23.2 @@ -20794,64 +10434,11 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-router: 6.30.3(react@18.3.1) - react-router-dom@7.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-router: 7.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-router@6.30.3(react@18.3.1): dependencies: '@remix-run/router': 1.23.2 react: 18.3.1 - react-router@7.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - cookie: 1.1.1 - react: 18.3.1 - set-cookie-parser: 2.7.2 - optionalDependencies: - react-dom: 18.3.1(react@18.3.1) - - react-signature-canvas@1.1.0-alpha.2(@types/prop-types@15.7.15)(@types/react@18.3.28)(prop-types@15.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.29.2 - '@types/signature_pad': 2.3.6 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - signature_pad: 2.3.2 - trim-canvas: 0.1.2 - optionalDependencies: - '@types/prop-types': 15.7.15 - '@types/react': 18.3.28 - - react-style-singleton@2.2.3(@types/react@18.3.28)(react@18.3.1): - dependencies: - get-nonce: 1.0.1 - react: 18.3.1 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 18.3.28 - - react-textarea-autosize@8.5.9(@types/react@18.3.28)(react@18.3.1): - dependencies: - '@babel/runtime': 7.29.2 - react: 18.3.1 - use-composed-ref: 1.4.0(@types/react@18.3.28)(react@18.3.1) - use-latest: 1.3.0(@types/react@18.3.28)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.29.2 - dom-helpers: 5.2.1 - loose-envify: 1.4.0 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react@18.3.1: dependencies: loose-envify: 1.4.0 @@ -20860,116 +10447,18 @@ snapshots: dependencies: pify: 2.3.0 - read-pkg-up@1.0.1: - dependencies: - find-up: 1.1.2 - read-pkg: 1.1.0 - - read-pkg-up@2.0.0: - dependencies: - find-up: 2.1.0 - read-pkg: 2.0.0 - - read-pkg@1.1.0: - dependencies: - load-json-file: 1.1.0 - normalize-package-data: 2.5.0 - path-type: 1.1.0 - - read-pkg@2.0.0: - dependencies: - load-json-file: 2.0.0 - normalize-package-data: 2.5.0 - path-type: 2.0.0 - - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - readable-stream@4.7.0: - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - - readable-web-to-node-stream@3.0.4: - dependencies: - readable-stream: 4.7.0 - - readdir-glob@1.1.3: - dependencies: - minimatch: 5.1.9 - - readdirp@2.2.1(supports-color@4.5.0): - dependencies: - graceful-fs: 4.2.11 - micromatch: 3.1.10(supports-color@4.5.0) - readable-stream: 2.3.8 - transitivePeerDependencies: - - supports-color - optional: true - - readdirp@2.2.1(supports-color@5.5.0): - dependencies: - graceful-fs: 4.2.11 - micromatch: 3.1.10(supports-color@5.5.0) - readable-stream: 2.3.8 - transitivePeerDependencies: - - supports-color - readdirp@3.6.0: dependencies: picomatch: 2.3.2 readdirp@4.1.2: {} - recharts@3.8.1(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react-is@19.2.6)(react@18.3.1)(redux@5.0.1): - dependencies: - '@reduxjs/toolkit': 2.11.2(react-redux@9.2.0(@types/react@18.3.28)(react@18.3.1)(redux@5.0.1))(react@18.3.1) - clsx: 2.1.1 - decimal.js-light: 2.5.1 - es-toolkit: 1.46.1 - eventemitter3: 5.0.4 - immer: 10.2.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-is: 19.2.6 - react-redux: 9.2.0(@types/react@18.3.28)(react@18.3.1)(redux@5.0.1) - reselect: 5.1.1 - tiny-invariant: 1.3.3 - use-sync-external-store: 1.6.0(react@18.3.1) - victory-vendor: 37.3.6 - transitivePeerDependencies: - - '@types/react' - - redux - - redent@1.0.0: - dependencies: - indent-string: 2.1.0 - strip-indent: 1.0.1 - - redux-thunk@3.1.0(redux@5.0.1): - dependencies: - redux: 5.0.1 - - redux@5.0.1: {} - - reflect-metadata@0.1.14: {} - reflect-metadata@0.2.2: {} reflect.getprototypeof@1.0.10: @@ -20983,13 +10472,6 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 - regenerator-runtime@0.13.11: {} - - regex-not@1.0.2: - dependencies: - extend-shallow: 3.0.2 - safe-regex: 1.1.0 - regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.9 @@ -20999,76 +10481,20 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 - relative@3.0.2: - dependencies: - isobject: 2.1.0 - - remarkable@1.7.4: - dependencies: - argparse: 1.0.10 - autolinker: 0.28.1 - - remove-trailing-separator@1.1.0: {} - - repeat-element@1.1.4: {} - - repeat-string@1.6.1: {} - - repeating@2.0.1: - dependencies: - is-finite: 1.1.0 - - request@2.88.2: - dependencies: - aws-sign2: 0.7.0 - aws4: 1.13.2 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - har-validator: 5.1.5 - http-signature: 1.2.0 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.35 - oauth-sign: 0.9.0 - performance-now: 2.1.0 - qs: 6.5.5 - safe-buffer: 5.2.1 - tough-cookie: 2.5.0 - tunnel-agent: 0.6.0 - uuid: 3.4.0 - require-directory@2.1.1: {} require-from-string@2.0.2: {} - require-main-filename@1.0.1: {} - require-main-filename@2.0.0: {} - requires-port@1.0.0: {} - - reselect@5.1.1: {} - - resolve-cwd@2.0.0: - dependencies: - resolve-from: 3.0.0 - resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 - resolve-from@3.0.0: {} - resolve-from@4.0.0: {} resolve-from@5.0.0: {} - resolve-url@0.2.1: {} - resolve.exports@2.0.3: {} resolve@1.22.12: @@ -21097,34 +10523,14 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 - restructure@3.0.2: {} - - ret@0.1.15: {} - reusify@1.1.0: {} rfdc@1.4.1: {} - rgbcolor@1.0.1: - optional: true - - right-align@0.1.3: - dependencies: - align-text: 0.1.4 - - rimraf@2.7.1: - dependencies: - glob: 7.2.3 - rimraf@3.0.2: dependencies: glob: 7.2.3 - ripemd160@2.0.3: - dependencies: - hash-base: 3.1.2 - inherits: 2.0.4 - rollup@4.60.3: dependencies: '@types/estree': 1.0.8 @@ -21156,8 +10562,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.60.3 fsevents: 2.3.3 - rope-sequence@1.3.4: {} - router@2.2.0: dependencies: debug: 4.4.3 @@ -21192,8 +10596,6 @@ snapshots: has-symbols: 1.1.0 isarray: 2.0.5 - safe-buffer@5.1.2: {} - safe-buffer@5.2.1: {} safe-push-apply@1.0.0: @@ -21207,18 +10609,8 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 - safe-regex@1.1.0: - dependencies: - ret: 0.1.15 - safer-buffer@2.1.2: {} - sax@1.6.0: {} - - saxes@5.0.1: - dependencies: - xmlchars: 2.2.0 - saxes@6.0.0: dependencies: xmlchars: 2.2.0 @@ -21227,8 +10619,6 @@ snapshots: dependencies: loose-envify: 1.4.0 - scheduler@0.25.0-rc-603e6108-20241029: {} - schema-utils@3.3.0: dependencies: '@types/json-schema': 7.0.15 @@ -21242,42 +10632,10 @@ snapshots: ajv-formats: 2.1.1(ajv@8.20.0) ajv-keywords: 5.1.0(ajv@8.20.0) - scroll@3.0.1: {} - - scrollparent@2.1.0: {} - - select-hose@2.0.0: {} - - self-closing-tags@1.0.1: {} - - selfsigned@1.10.14: - dependencies: - node-forge: 0.10.0 - - semver@5.7.2: {} - semver@6.3.1: {} semver@7.8.0: {} - send@0.19.2(supports-color@5.5.0): - dependencies: - debug: 2.6.9(supports-color@5.5.0) - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.1 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - send@1.2.1: dependencies: debug: 4.4.3 @@ -21294,26 +10652,8 @@ snapshots: transitivePeerDependencies: - supports-color - serve-index@1.9.2(supports-color@5.5.0): - dependencies: - accepts: 1.3.8 - batch: 0.6.1 - debug: 2.6.9(supports-color@5.5.0) - escape-html: 1.0.3 - http-errors: 1.8.1 - mime-types: 2.1.35 - parseurl: 1.3.3 - transitivePeerDependencies: - - supports-color - - serve-static@1.16.3(supports-color@5.5.0): - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.19.2(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color + seq-queue@0.0.5: + optional: true serve-static@2.2.1: dependencies: @@ -21326,8 +10666,6 @@ snapshots: set-blocking@2.0.0: {} - set-cookie-parser@2.7.2: {} - set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -21344,25 +10682,12 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - set-getter@0.1.1: - dependencies: - to-object-path: 0.3.0 - set-proto@1.0.0: dependencies: dunder-proto: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 - set-value@2.0.1: - dependencies: - extend-shallow: 2.0.1 - is-extendable: 0.1.1 - is-plain-object: 2.0.4 - split-string: 3.1.0 - - setimmediate@1.0.5: {} - setprototypeof@1.2.0: {} sha.js@2.4.12: @@ -21371,16 +10696,10 @@ snapshots: safe-buffer: 5.2.1 to-buffer: 1.2.2 - shebang-command@1.2.0: - dependencies: - shebang-regex: 1.0.0 - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - shebang-regex@1.0.0: {} - shebang-regex@3.0.0: {} side-channel-list@1.0.1: @@ -21417,8 +10736,6 @@ snapshots: signal-exit@4.1.0: {} - signature_pad@2.3.2: {} - simple-concat@1.0.1: optional: true @@ -21443,109 +10760,8 @@ snapshots: ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 - smob@1.6.1: {} - - snapdragon-node@2.1.1: - dependencies: - define-property: 1.0.0 - isobject: 3.0.1 - snapdragon-util: 3.0.1 - - snapdragon-util@3.0.1: - dependencies: - kind-of: 3.2.2 - - snapdragon@0.8.2: - dependencies: - base: 0.11.2 - debug: 2.6.9(supports-color@5.5.0) - define-property: 0.2.5 - extend-shallow: 2.0.1 - map-cache: 0.2.2 - source-map: 0.5.7 - source-map-resolve: 0.5.3 - use: 3.1.1 - transitivePeerDependencies: - - supports-color - - snapdragon@0.8.2(supports-color@4.5.0): - dependencies: - base: 0.11.2 - debug: 2.6.9(supports-color@4.5.0) - define-property: 0.2.5 - extend-shallow: 2.0.1 - map-cache: 0.2.2 - source-map: 0.5.7 - source-map-resolve: 0.5.3 - use: 3.1.1 - transitivePeerDependencies: - - supports-color - optional: true - - snapdragon@0.8.2(supports-color@5.5.0): - dependencies: - base: 0.11.2 - debug: 2.6.9(supports-color@5.5.0) - define-property: 0.2.5 - extend-shallow: 2.0.1 - map-cache: 0.2.2 - source-map: 0.5.7 - source-map-resolve: 0.5.3 - use: 3.1.1 - transitivePeerDependencies: - - supports-color - - socket.io-client@4.8.3: - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.4.3(supports-color@5.5.0) - engine.io-client: 6.6.4 - socket.io-parser: 4.2.6 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - socket.io-parser@4.2.6: - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.4.3(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - - sockjs-client@1.1.5(supports-color@5.5.0): - dependencies: - debug: 2.6.9(supports-color@5.5.0) - eventsource: 0.1.6 - faye-websocket: 0.11.4 - inherits: 2.0.4 - json3: 3.3.3 - url-parse: 1.5.10 - transitivePeerDependencies: - - supports-color - - sockjs@0.3.19: - dependencies: - faye-websocket: 0.10.0 - uuid: 3.4.0 - - sonner@2.0.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - source-list-map@2.0.1: {} - source-map-js@1.2.1: {} - source-map-resolve@0.5.3: - dependencies: - atob: 2.1.2 - decode-uri-component: 0.2.2 - resolve-url: 0.2.1 - source-map-url: 0.4.1 - urix: 0.1.0 - source-map-support@0.5.13: dependencies: buffer-from: 1.1.2 @@ -21556,78 +10772,18 @@ snapshots: buffer-from: 1.1.2 source-map: 0.6.1 - source-map-url@0.4.1: {} - - source-map@0.5.7: {} - source-map@0.6.1: {} source-map@0.7.4: {} - source-map@0.7.6: {} - - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.23 - - spdx-exceptions@2.5.0: {} - - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.23 - - spdx-license-ids@3.0.23: {} - - spdy-transport@3.0.0(supports-color@5.5.0): - dependencies: - debug: 4.4.3(supports-color@5.5.0) - detect-node: 2.1.0 - hpack.js: 2.1.6 - obuf: 1.1.2 - readable-stream: 3.6.2 - wbuf: 1.7.3 - transitivePeerDependencies: - - supports-color - - spdy@4.0.2(supports-color@5.5.0): - dependencies: - debug: 4.4.3(supports-color@5.5.0) - handle-thing: 2.0.1 - http-deceiver: 1.2.7 - select-hose: 2.0.0 - spdy-transport: 3.0.0(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - - split-on-first@1.1.0: {} - - split-string@3.1.0: - dependencies: - extend-shallow: 3.0.2 - split2@4.2.0: {} sprintf-js@1.0.3: {} sql-highlight@6.1.0: {} - ssf@0.11.2: - dependencies: - frac: 1.1.2 - - sshpk@1.18.0: - dependencies: - asn1: 0.2.6 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 + sqlstring@2.3.3: + optional: true stack-utils@2.0.6: dependencies: @@ -21635,16 +10791,6 @@ snapshots: stackback@0.0.2: {} - stackblur-canvas@2.7.0: - optional: true - - static-extend@0.1.2: - dependencies: - define-property: 0.2.5 - object-copy: 0.1.0 - - statuses@1.5.0: {} - statuses@2.0.2: {} std-env@3.10.0: {} @@ -21654,23 +10800,8 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - stream-browserify@2.0.2: - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - - stream-http@2.8.3: - dependencies: - builtin-status-codes: 3.0.0 - inherits: 2.0.4 - readable-stream: 2.3.8 - to-arraybuffer: 1.0.1 - xtend: 4.0.2 - streamsearch@1.1.0: {} - strict-uri-encode@2.0.0: {} - string-argv@0.3.2: {} string-length@4.0.2: @@ -21678,17 +10809,6 @@ snapshots: char-regex: 1.0.2 strip-ansi: 6.0.1 - string-width@1.0.2: - dependencies: - code-point-at: 1.1.0 - is-fullwidth-code-point: 1.0.0 - strip-ansi: 3.0.1 - - string-width@2.1.1: - dependencies: - is-fullwidth-code-point: 2.0.0 - strip-ansi: 4.0.0 - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -21751,22 +10871,10 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - strip-ansi@3.0.1: - dependencies: - ansi-regex: 2.1.1 - - strip-ansi@4.0.0: - dependencies: - ansi-regex: 3.0.1 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -21775,45 +10883,20 @@ snapshots: dependencies: ansi-regex: 6.2.2 - strip-bom@2.0.0: - dependencies: - is-utf8: 0.2.1 - strip-bom@3.0.0: {} strip-bom@4.0.0: {} - strip-eof@1.0.0: {} - strip-final-newline@2.0.0: {} strip-final-newline@3.0.0: {} - strip-indent@1.0.1: - dependencies: - get-stdin: 4.0.1 - strip-json-comments@3.1.1: {} - striptags@3.2.0: {} - - strnum@1.1.2: {} - strtok3@10.3.5: dependencies: '@tokenizer/token': 0.3.0 - strtok3@7.1.1: - dependencies: - '@tokenizer/token': 0.3.0 - peek-readable: 5.4.2 - - style-object-to-css-string@1.1.3: {} - - stylis@4.2.0: {} - - success-symbol@0.1.0: {} - sucrase@3.35.1: dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -21846,14 +10929,6 @@ snapshots: transitivePeerDependencies: - supports-color - supports-color@4.5.0: - dependencies: - has-flag: 2.0.0 - - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -21864,11 +10939,6 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svg-arc-to-cubic-bezier@3.2.0: {} - - svg-pathdata@6.0.3: - optional: true - swagger-ui-dist@5.17.14: {} swagger-ui-dist@5.32.4: @@ -21884,18 +10954,6 @@ snapshots: symbol-tree@3.2.4: {} - tabbable@6.4.0: {} - - tailwind-merge@3.6.0: {} - - tailwind-scrollbar-hide@4.0.0(tailwindcss@4.3.0): - dependencies: - tailwindcss: 4.3.0 - - tailwindcss-animate@1.0.7(tailwindcss@4.3.0): - dependencies: - tailwindcss: 4.3.0 - tailwindcss@3.4.19(yaml@2.9.0): dependencies: '@alloc/quick-lru': 5.2.0 @@ -21924,20 +10982,8 @@ snapshots: - tsx - yaml - tailwindcss@4.3.0: {} - - tapable@0.2.9: {} - tapable@2.3.3: {} - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.5 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - tar@6.2.1: dependencies: chownr: 2.0.0 @@ -21962,22 +11008,6 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - tesseract.js-core@7.0.0: {} - - tesseract.js@7.0.0: - dependencies: - bmp-js: 0.1.0 - idb-keyval: 6.2.2 - is-url: 1.2.4 - node-fetch: 2.7.0 - opencollective-postinstall: 2.0.3 - regenerator-runtime: 0.13.11 - tesseract.js-core: 7.0.0 - wasm-feature-detect: 1.8.0 - zlibjs: 0.3.1 - transitivePeerDependencies: - - encoding - test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.6 @@ -21986,10 +11016,6 @@ snapshots: text-extensions@2.4.0: {} - text-segmentation@1.0.3: - dependencies: - utrie: 1.0.2 - text-table@0.2.0: {} thenify-all@1.6.0: @@ -22000,31 +11026,8 @@ snapshots: dependencies: any-promise: 1.3.0 - through2@2.0.5: - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - - through2@4.0.2: - dependencies: - readable-stream: 3.6.2 - through@2.3.8: {} - thunky@1.1.0: {} - - time-stamp@1.1.0: {} - - time-stamp@2.2.0: {} - - timers-browserify@2.0.12: - dependencies: - setimmediate: 1.0.5 - - tiny-inflate@1.0.3: {} - - tiny-invariant@1.3.3: {} - tinybench@2.9.0: {} tinyexec@0.3.2: {} @@ -22036,8 +11039,6 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - tinymce@7.9.2: {} - tinypool@1.1.1: {} tinyrainbow@1.2.0: {} @@ -22050,58 +11051,26 @@ snapshots: dependencies: tldts-core: 6.1.86 - tmp@0.2.5: {} - tmpl@1.0.5: {} - to-arraybuffer@1.0.1: {} - to-buffer@1.2.2: dependencies: isarray: 2.0.5 safe-buffer: 5.2.1 typed-array-buffer: 1.0.3 - to-gfm-code-block@0.1.1: {} - - to-object-path@0.3.0: - dependencies: - kind-of: 3.2.2 - - to-regex-range@2.1.1: - dependencies: - is-number: 3.0.0 - repeat-string: 1.6.1 - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - to-regex@3.0.2: - dependencies: - define-property: 2.0.2 - extend-shallow: 3.0.2 - regex-not: 1.0.2 - safe-regex: 1.1.0 - toidentifier@1.0.1: {} - token-types@5.0.1: - dependencies: - '@tokenizer/token': 0.3.0 - ieee754: 1.2.1 - token-types@6.1.2: dependencies: '@borewit/text-codec': 0.2.2 '@tokenizer/token': 0.3.0 ieee754: 1.2.1 - tough-cookie@2.5.0: - dependencies: - psl: 1.15.0 - punycode: 2.3.1 - tough-cookie@5.1.2: dependencies: tldts: 6.1.86 @@ -22112,22 +11081,6 @@ snapshots: dependencies: punycode: 2.3.1 - traverse@0.3.9: {} - - tree-changes@0.11.3: - dependencies: - '@gilbarbara/deep-equal': 0.3.1 - is-lite: 1.2.1 - - tree-changes@0.9.3: - dependencies: - '@gilbarbara/deep-equal': 0.1.2 - is-lite: 0.8.2 - - trim-canvas@0.1.2: {} - - trim-newlines@1.0.0: {} - ts-api-utils@2.5.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -22154,16 +11107,6 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.29.0) jest-util: 29.7.0 - ts-loader@9.5.7(typescript@5.9.3)(webpack@5.106.0): - dependencies: - chalk: 4.1.2 - enhanced-resolve: 5.21.3 - micromatch: 4.0.8 - semver: 7.8.0 - source-map: 0.7.6 - typescript: 5.9.3 - webpack: 5.106.0 - ts-node@10.9.2(@types/node@20.19.41)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -22204,12 +11147,6 @@ snapshots: tslib@2.8.1: {} - tty-browserify@0.0.0: {} - - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 - turbo@2.9.12: optionalDependencies: '@turbo/darwin-64': 2.9.12 @@ -22219,8 +11156,6 @@ snapshots: '@turbo/windows-64': 2.9.12 '@turbo/windows-arm64': 2.9.12 - tweetnacl@0.14.5: {} - type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -22244,8 +11179,6 @@ snapshots: media-typer: 1.1.0 mime-types: 3.0.2 - type@2.7.3: {} - typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -22281,24 +11214,7 @@ snapshots: typedarray@0.0.6: {} - typeof-article@0.1.1: - dependencies: - kind-of: 3.2.2 - - typeorm-extension@3.9.0(@faker-js/faker@10.4.0)(typeorm@0.3.29(babel-plugin-macros@3.1.0)(pg@8.20.0)(ts-node@10.9.2(@types/node@20.19.41)(typescript@5.9.3))): - dependencies: - '@faker-js/faker': 10.4.0 - consola: 3.4.2 - envix: 1.5.0 - locter: 2.2.1 - pascal-case: 3.1.2 - rapiq: 0.9.0 - reflect-metadata: 0.2.2 - smob: 1.6.1 - typeorm: 0.3.29(babel-plugin-macros@3.1.0)(pg@8.20.0)(ts-node@10.9.2(@types/node@20.19.41)(typescript@5.9.3)) - yargs: 18.0.0 - - typeorm@0.3.29(babel-plugin-macros@3.1.0)(pg@8.20.0)(ts-node@10.9.2(@types/node@20.19.41)(typescript@5.9.3)): + typeorm@0.3.29(babel-plugin-macros@3.1.0)(mysql2@3.15.3)(pg@8.20.0)(ts-node@10.9.2(@types/node@20.19.41)(typescript@5.9.3)): dependencies: '@sqltools/formatter': 1.2.5 ansis: 4.3.0 @@ -22316,6 +11232,7 @@ snapshots: uuid: 11.1.1 yargs: 17.7.2 optionalDependencies: + mysql2: 3.15.3 pg: 8.20.0 ts-node: 10.9.2(@types/node@20.19.41)(typescript@5.9.3) transitivePeerDependencies: @@ -22324,26 +11241,9 @@ snapshots: typescript@5.9.3: {} - uglify-js@2.8.29: - dependencies: - source-map: 0.5.7 - yargs: 3.10.0 - optionalDependencies: - uglify-to-browserify: 1.0.2 - uglify-js@3.19.3: optional: true - uglify-to-browserify@1.0.2: - optional: true - - uglifyjs-webpack-plugin@0.4.6(webpack@3.12.0): - dependencies: - source-map: 0.5.7 - uglify-js: 2.8.29 - webpack: 3.12.0 - webpack-sources: 1.4.3 - uid@2.0.2: dependencies: '@lukeed/csprng': 1.1.0 @@ -22361,147 +11261,33 @@ snapshots: undici-types@7.16.0: {} - unicode-properties@1.4.1: - dependencies: - base64-js: 1.5.1 - unicode-trie: 2.0.0 - - unicode-trie@2.0.0: - dependencies: - pako: 0.2.9 - tiny-inflate: 1.0.3 - unicorn-magic@0.1.0: {} - union-value@1.0.1: - dependencies: - arr-union: 3.1.0 - get-value: 2.0.6 - is-extendable: 0.1.1 - set-value: 2.0.1 - - universal-cookie@8.1.2: - dependencies: - cookie: 1.1.1 - universalify@2.0.1: {} unpipe@1.0.0: {} - unset-value@1.0.0: - dependencies: - has-value: 0.3.1 - isobject: 3.0.1 - - unzipper@0.10.14: - dependencies: - big-integer: 1.6.52 - binary: 0.3.0 - bluebird: 3.4.7 - buffer-indexof-polyfill: 1.0.2 - duplexer2: 0.1.4 - fstream: 1.0.12 - graceful-fs: 4.2.11 - listenercount: 1.0.1 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - - upath@1.2.0: {} - update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: browserslist: 4.28.2 escalade: 3.2.0 picocolors: 1.1.1 - uqr@0.1.2: {} - uri-js@4.4.1: dependencies: punycode: 2.3.1 - urix@0.1.0: {} - - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - - url@0.11.4: - dependencies: - punycode: 1.4.1 - qs: 6.15.1 - - use-callback-ref@1.3.3(@types/react@18.3.28)(react@18.3.1): - dependencies: - react: 18.3.1 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 18.3.28 - - use-composed-ref@1.4.0(@types/react@18.3.28)(react@18.3.1): - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.28 - - use-isomorphic-layout-effect@1.2.1(@types/react@18.3.28)(react@18.3.1): - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.28 - - use-latest@1.3.0(@types/react@18.3.28)(react@18.3.1): - dependencies: - react: 18.3.1 - use-isomorphic-layout-effect: 1.2.1(@types/react@18.3.28)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.28 - - use-sidecar@1.1.3(@types/react@18.3.28)(react@18.3.1): - dependencies: - detect-node-es: 1.1.0 - react: 18.3.1 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 18.3.28 - use-sync-external-store@1.6.0(react@18.3.1): dependencies: react: 18.3.1 - - use@3.1.1: {} + optional: true util-deprecate@1.0.2: {} - util@0.10.4: - dependencies: - inherits: 2.0.3 - - util@0.11.1: - dependencies: - inherits: 2.0.3 - - util@0.12.5: - dependencies: - inherits: 2.0.4 - is-arguments: 1.2.0 - is-generator-function: 1.1.2 - is-typed-array: 1.1.15 - which-typed-array: 1.1.20 - utils-merge@1.0.1: {} - utrie@1.0.2: - dependencies: - base64-arraybuffer: 1.0.2 - uuid@11.1.1: {} - uuid@3.4.0: {} - - uuid@8.3.2: {} - v8-compile-cache-lib@3.0.1: {} v8-to-istanbul@9.3.0: @@ -22510,53 +11296,10 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - validator@13.15.35: {} vary@1.1.2: {} - vaul@1.1.2(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - verror@1.10.0: - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.3.0 - - victory-vendor@37.3.6: - dependencies: - '@types/d3-array': 3.2.2 - '@types/d3-ease': 3.0.2 - '@types/d3-interpolate': 3.0.4 - '@types/d3-scale': 4.0.9 - '@types/d3-shape': 3.1.8 - '@types/d3-time': 3.0.4 - '@types/d3-timer': 3.0.2 - d3-array: 3.2.4 - d3-ease: 3.0.1 - d3-interpolate: 3.0.1 - d3-scale: 4.0.2 - d3-shape: 3.2.0 - d3-time: 3.1.0 - d3-timer: 3.0.1 - - vite-compatible-readable-stream@3.6.1: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - vite-node@2.1.9(@types/node@24.12.4)(lightningcss@1.32.0)(terser@5.47.1): dependencies: cac: 6.7.14 @@ -22622,12 +11365,6 @@ snapshots: - supports-color - terser - vm-browserify@1.1.2: {} - - void-elements@3.1.0: {} - - w3c-keyname@2.2.8: {} - w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 @@ -22636,128 +11373,23 @@ snapshots: dependencies: makeerror: 1.0.12 - warning-symbol@0.1.0: {} - - warning@4.0.3: - dependencies: - loose-envify: 1.4.0 - - wasm-feature-detect@1.8.0: {} - - watchpack-chokidar2@2.0.1(supports-color@4.5.0): - dependencies: - chokidar: 2.1.8(supports-color@4.5.0) - transitivePeerDependencies: - - supports-color - optional: true - - watchpack@1.7.5(supports-color@4.5.0): - dependencies: - graceful-fs: 4.2.11 - neo-async: 2.6.2 - optionalDependencies: - chokidar: 3.6.0 - watchpack-chokidar2: 2.0.1(supports-color@4.5.0) - transitivePeerDependencies: - - supports-color - watchpack@2.5.1: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - wbuf@1.7.3: - dependencies: - minimalistic-assert: 1.0.1 - wcwidth@1.0.1: dependencies: defaults: 1.0.4 - web-encoding@1.1.5: - dependencies: - util: 0.12.5 - optionalDependencies: - '@zxing/text-encoding': 0.9.0 - webidl-conversions@3.0.1: {} webidl-conversions@7.0.0: {} - webpack-dev-middleware@1.12.2(webpack@3.12.0): - dependencies: - memory-fs: 0.4.1 - mime: 1.6.0 - path-is-absolute: 1.0.1 - range-parser: 1.2.1 - time-stamp: 2.2.0 - webpack: 3.12.0 - - webpack-dev-server@2.11.5(webpack@3.12.0): - dependencies: - ansi-html: 0.0.7 - array-includes: 3.1.9 - bonjour: 3.5.1 - chokidar: 2.1.8(supports-color@5.5.0) - compression: 1.8.1(supports-color@5.5.0) - connect-history-api-fallback: 1.6.0 - debug: 3.2.7(supports-color@5.5.0) - del: 3.0.0 - express: 4.22.2(supports-color@5.5.0) - html-entities: 1.4.0 - http-proxy-middleware: 0.19.2(debug@3.2.7(supports-color@5.5.0))(supports-color@5.5.0) - import-local: 1.0.0 - internal-ip: 1.2.0 - ip: 1.1.9 - killable: 1.0.1 - loglevel: 1.9.2 - opn: 5.5.0 - portfinder: 1.0.38(supports-color@5.5.0) - selfsigned: 1.10.14 - serve-index: 1.9.2(supports-color@5.5.0) - sockjs: 0.3.19 - sockjs-client: 1.1.5(supports-color@5.5.0) - spdy: 4.0.2(supports-color@5.5.0) - strip-ansi: 3.0.1 - supports-color: 5.5.0 - webpack: 3.12.0 - webpack-dev-middleware: 1.12.2(webpack@3.12.0) - yargs: 6.6.0 - webpack-node-externals@3.0.0: {} - webpack-sources@1.4.3: - dependencies: - source-list-map: 2.0.1 - source-map: 0.6.1 - webpack-sources@3.4.1: {} - webpack@3.12.0: - dependencies: - acorn: 5.7.4 - acorn-dynamic-import: 2.0.2 - ajv: 6.15.0 - ajv-keywords: 3.5.2(ajv@6.15.0) - async: 2.6.4 - enhanced-resolve: 3.4.1 - escope: 3.6.0 - interpret: 1.4.0 - json-loader: 0.5.7 - json5: 0.5.1 - loader-runner: 2.4.0 - loader-utils: 1.4.2 - memory-fs: 0.4.1 - mkdirp: 0.5.6 - node-libs-browser: 2.2.1 - source-map: 0.5.7 - supports-color: 4.5.0 - tapable: 0.2.9 - uglifyjs-webpack-plugin: 0.4.6(webpack@3.12.0) - watchpack: 1.7.5(supports-color@4.5.0) - webpack-sources: 1.4.3 - yargs: 8.0.2 - webpack@5.106.0: dependencies: '@types/eslint-scope': 3.7.7 @@ -22799,14 +11431,6 @@ snapshots: - postcss - uglify-js - websocket-driver@0.7.4: - dependencies: - http-parser-js: 0.5.10 - safe-buffer: 5.2.1 - websocket-extensions: 0.1.4 - - websocket-extensions@0.1.4: {} - whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 @@ -22854,8 +11478,6 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-module@1.0.0: {} - which-module@2.0.1: {} which-typed-array@1.1.20: @@ -22868,10 +11490,6 @@ snapshots: gopd: 1.2.0 has-tostringtag: 1.0.2 - which@1.3.1: - dependencies: - isexe: 2.0.0 - which@2.0.2: dependencies: isexe: 2.0.0 @@ -22885,23 +11503,10 @@ snapshots: dependencies: string-width: 4.2.3 - window-size@0.1.0: {} - - wmf@1.0.2: {} - word-wrap@1.2.5: {} - word@0.3.0: {} - - wordwrap@0.0.2: {} - wordwrap@1.0.0: {} - wrap-ansi@2.1.0: - dependencies: - string-width: 1.0.2 - strip-ansi: 3.0.1 - wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -22933,50 +11538,25 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 - ws@8.18.3: {} - ws@8.20.0: {} - xlsx@0.18.5: - dependencies: - adler-32: 1.3.1 - cfb: 1.2.2 - codepage: 1.15.0 - crc-32: 1.2.2 - ssf: 0.11.2 - wmf: 1.0.2 - word: 0.3.0 - xml-name-validator@5.0.0: {} - xml2js@0.5.0: - dependencies: - sax: 1.6.0 - xmlbuilder: 11.0.1 - - xml@1.0.1: {} - - xmlbuilder@11.0.1: {} - xmlchars@2.2.0: {} - xmlhttprequest-ssl@2.1.2: {} - - xtend@4.0.2: {} - - y18n@3.2.2: {} + xtend@4.0.2: + optional: true y18n@4.0.3: {} y18n@5.0.8: {} - yallist@2.1.2: {} - yallist@3.1.1: {} yallist@4.0.0: {} - yaml@1.10.3: {} + yaml@1.10.3: + optional: true yaml@2.9.0: {} @@ -22987,16 +11567,6 @@ snapshots: yargs-parser@21.1.1: {} - yargs-parser@22.0.0: {} - - yargs-parser@4.2.1: - dependencies: - camelcase: 3.0.0 - - yargs-parser@7.0.0: - dependencies: - camelcase: 4.1.0 - yargs@15.4.1: dependencies: cliui: 6.0.0 @@ -23021,56 +11591,6 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yargs@18.0.0: - dependencies: - cliui: 9.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - string-width: 7.2.0 - y18n: 5.0.8 - yargs-parser: 22.0.0 - - yargs@3.10.0: - dependencies: - camelcase: 1.2.1 - cliui: 2.1.0 - decamelize: 1.2.0 - window-size: 0.1.0 - - yargs@6.6.0: - dependencies: - camelcase: 3.0.0 - cliui: 3.2.0 - decamelize: 1.2.0 - get-caller-file: 1.0.3 - os-locale: 1.4.0 - read-pkg-up: 1.0.1 - require-directory: 2.1.1 - require-main-filename: 1.0.1 - set-blocking: 2.0.0 - string-width: 1.0.2 - which-module: 1.0.0 - y18n: 3.2.2 - yargs-parser: 4.2.1 - - yargs@8.0.2: - dependencies: - camelcase: 4.1.0 - cliui: 3.2.0 - decamelize: 1.2.0 - get-caller-file: 1.0.3 - os-locale: 2.1.0 - read-pkg-up: 2.0.0 - require-directory: 2.1.1 - require-main-filename: 1.0.1 - set-blocking: 2.0.0 - string-width: 2.1.1 - which-module: 2.0.1 - y18n: 3.2.2 - yargs-parser: 7.0.0 - - year@0.2.1: {} - yn@3.1.1: {} yocto-queue@0.1.0: {} @@ -23079,18 +11599,6 @@ snapshots: yoctocolors-cjs@2.1.3: {} - yoga-layout@3.2.1: {} - - zip-stream@4.1.1: - dependencies: - archiver-utils: 3.0.4 - compress-commons: 4.1.2 - readable-stream: 3.6.2 - - zlibjs@0.3.1: {} - - zod@3.25.76: {} - zustand@5.0.13(@types/react@18.3.28)(immer@11.1.8)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)): optionalDependencies: '@types/react': 18.3.28