diff --git a/.circleci/config.yml b/.circleci/config.yml index c343878..1eb8a2a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -51,7 +51,7 @@ jobs: environment: DEPLOY_ENV: 'DEV' LOGICAL_ENV: 'dev' - APPNAME: 'tc-finance-api' + APPNAME: 'finance-api-v6' DEPLOYMENT_ENVIRONMENT: 'dev' steps: *build_and_deploy_steps @@ -60,7 +60,7 @@ jobs: environment: DEPLOY_ENV: 'PROD' LOGICAL_ENV: 'prod' - APPNAME: 'tc-finance-api' + APPNAME: 'finance-api-v6' DEPLOYMENT_ENVIRONMENT: 'prod' steps: *build_and_deploy_steps @@ -74,7 +74,6 @@ workflows: branches: only: - dev - - fix-nan-for-release-date - 'build-prod': context: org-global filters: diff --git a/.env.sample b/.env.sample index 370bca4..69d0c09 100644 --- a/.env.sample +++ b/.env.sample @@ -1,4 +1,5 @@ -TOPCODER_API_BASE_URL="https://api.topcoder-dev.com/v5" +TOPCODER_API_V5_BASE_URL="https://api.topcoder-dev.com/v5" +TOPCODER_API_V6_BASE_URL="https://api.topcoder-dev.com/v6" AUTH0_CERT="-----BEGIN RSA PUBLIC KEY----- MIIBCgKCAQEArAV0dmDkedFdlaQ6KQiqUv+UGshfMXx/4jJCLZ9802ynJqAvIt+Z V7EiPqjc2J1xVfJJEvQ9ZS5A2TFWAk16NUTU4LN+TkjEnqeg+LlUPWY3Y4RXa2OU @@ -15,4 +16,4 @@ DB_PASSWORD=randompassword DB_HOST=127.0.0.1 DB_PORT=5434 DB_NAME=walletdb -DATABASE_URL="postgresql://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?sslmode=disable" \ No newline at end of file +DATABASE_URL="postgresql://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?sslmode=disable" diff --git a/README.md b/README.md index 2371718..fd4c826 100644 --- a/README.md +++ b/README.md @@ -1,41 +1,386 @@ -## Description +# Topcoder Finance API -[Nest](https://github.com/nestjs/nest) framework TypeScript starter pack. +A comprehensive payment management system for Topcoder platform, handling winnings, withdrawals, and payment processing through integration with Trolley payment provider. -## Project setup +## Table of Contents + +- [Overview](#overview) +- [Technology Stack](#technology-stack) +- [Architecture](#architecture) +- [Quick Start](#quick-start) +- [Environment Setup](#environment-setup) +- [Database Setup](#database-setup) +- [Development](#development) +- [Testing](#testing) +- [API Documentation](#api-documentation) +- [Deployment](#deployment) +- [Additional Documentation](#additional-documentation) + +## Overview + +The Topcoder Finance API is a microservice built with NestJS that manages all financial operations for the Topcoder platform, including: + +- **Winnings Management**: Create, track, and manage member winnings from challenges and contests +- **Payment Processing**: Integration with Trolley for payment disbursements +- **Withdrawal System**: Allow members to withdraw their earnings +- **Payment Methods**: Support for multiple payment methods (Trolley, PayPal, Payoneer) +- **Tax Management**: Handle tax forms and compliance +- **Admin Operations**: Administrative tools for managing payments and auditing transactions +- **Webhook Handling**: Process real-time events from Trolley payment provider + +## Technology Stack + +### Core Framework & Language + +- **Node.js** v22.13.1+ +- **TypeScript** v5.9.3 +- **NestJS** v11.1.7 - Modern Node.js framework for building scalable server-side applications + +### Database & ORM + +- **PostgreSQL** v16 - Relational database for transaction data +- **Prisma** v6.18.0 - Type-safe ORM for database operations and migrations + +### Payment Integration + +- **Trolley (trolleyhq)** v1.1.0 - Payment provider SDK for international payouts + +### Authentication & Security + +- **Auth0** - JWT-based authentication for users and M2M services +- **jsonwebtoken** v9.0.2 - JWT token handling +- **jwks-rsa** v3.2.0 - RSA signature verification + +### Documentation & Validation + +- **Swagger/OpenAPI** (@nestjs/swagger v11.2.1) - API documentation +- **class-validator** v0.14.2 - DTO validation +- **class-transformer** v0.5.1 - Object transformation + +### Utilities + +- **Winston** v3.18.3 - Logging framework +- **csv/csv-stringify** v6.6.0 - CSV export functionality +- **lodash** v4.17.21 - Utility functions +- **nanoid** v5.1.6 - Unique ID generation + +### Development Tools + +- **ESLint** v9.38.0 - Code linting +- **Prettier** v3.6.2 - Code formatting +- **Jest** v30.2.0 - Testing framework +- **SWC** v1.13.5 - Fast TypeScript/JavaScript compiler + +### Infrastructure + +- **Docker** - Containerization +- **CircleCI** - CI/CD pipeline +- **AWS ECS Fargate** - Container orchestration + +## Architecture + +The application follows a modular architecture with clear separation of concerns: + +``` +src/ +├── api/ # API layer - Controllers and business logic +│ ├── admin/ # Admin operations (winnings management, auditing) +│ ├── payment-providers/ # Payment provider integrations (Trolley) +│ ├── repository/ # Data access layer +│ ├── user/ # User operations (profile, payment methods) +│ ├── wallet/ # Wallet operations (balance, transactions) +│ ├── webhooks/ # Webhook handlers (Trolley events) +│ ├── winnings/ # Winnings operations (CRUD, search) +│ └── withdrawal/ # Withdrawal operations +├── core/ # Core functionality +│ ├── auth/ # Authentication & authorization (guards, middleware) +│ └── request/ # Request context management +├── shared/ # Shared modules and services +│ ├── global/ # Global services (Prisma, Trolley, OTP, Logging) +│ ├── payments/ # Payment processing services +│ └── topcoder/ # Topcoder platform integration (Members, Challenges, Email) +├── config/ # Configuration management +├── dto/ # Data Transfer Objects +└── main.ts # Application entry point +``` + +### Key Components + +**Controllers**: Handle HTTP requests and responses + +- `AdminController` - Payment admin operations +- `WinningsController` - Winnings CRUD operations +- `WithdrawalController` - Withdrawal requests +- `WalletController` - User wallet operations +- `WebhooksController` - Trolley webhook events + +**Services**: Business logic implementation + +- `TrolleyService` (Global) - Core Trolley SDK integration +- `TrolleyService` (PaymentProviders) - User-facing Trolley operations +- `TrolleyService` (Webhooks) - Webhook event processing +- `WithdrawalService` - Withdrawal processing logic +- `AdminService` - Administrative operations +- `WalletService` - Wallet management + +**Repositories**: Data access patterns + +- `WinningsRepository` - Winnings data operations +- `PaymentMethodRepository` - Payment method management +- `TaxFormRepository` - Tax form operations +- `OriginRepository` - Origin/source tracking + +**Guards & Middleware**: + +- `AuthGuard` - JWT authentication validation +- `RolesGuard` - Role-based access control +- `TokenValidatorMiddleware` - Token parsing and validation +- `CreateRequestStoreMiddleware` - Request context storage + +For detailed architecture diagrams and data flow, see [ARCHITECTURE.md](./docs/ARCHITECTURE.md) + +## Quick Start + +### Prerequisites + +- Node.js v22.13.1+ (see `.nvmrc`) +- PostgreSQL v16 +- pnpm package manager +- Docker (optional, for containerized database) + +### Installation + +1. Clone the repository: ```bash -$ pnpm install +git clone +cd tc-finance-api ``` -## Compile and run the project +2. Install dependencies: ```bash -# development -$ pnpm run start +pnpm install +``` -# watch mode -$ pnpm run start:dev +3. Set up environment variables: -# production mode -$ pnpm run start:prod +```bash +cp .env.sample .env +# Edit .env with your configuration ``` -## Run tests +4. Start the database (Docker): ```bash -# unit tests -$ pnpm run test +docker-compose up -d +``` -# e2e tests -$ pnpm run test:e2e +5. Run database migrations: -# test coverage -$ pnpm run test:cov +```bash +npx prisma migrate dev ``` -## Database setup -[Prisma](https://www.prisma.io/docs/getting-started) is used to handle DB communication & data migration. -To run a local copy of the database, make sure to copy the contents of ".env.sample" into ".env", and setup your db credentials. -Afterwards, you can just run "npx prisma migrate dev". This will create all the necessary tables in the db. -If you don't have a local setup for postgres, you can use docker to stand up on. Run "docker-compose up -d". +6. Start the application: + +```bash +# Development mode with hot-reload +pnpm run start:dev + +# Production mode +pnpm run start:prod +``` + +The API will be available at `http://localhost:3000/v5/finance` + +## Environment Setup + +The application requires several environment variables to be configured. See [ENVIRONMENT_VARIABLES.md](./docs/ENVIRONMENT_VARIABLES.md) for a complete reference. + +### Critical Environment Variables + +**Database**: + +- `DATABASE_URL` - PostgreSQL connection string + +**Authentication**: + +- `AUTH0_CLIENT_ID` - Auth0 client ID for user authentication +- `AUTH0_M2M_CLIENT_ID`, `AUTH0_M2M_SECRET` - Auth0 M2M credentials +- `AUTH0_CERT` - RSA public key for JWT verification + +**Trolley Integration**: + +- `TROLLEY_ACCESS_KEY`, `TROLLEY_SECRET_KEY` - Trolley API credentials +- `TROLLEY_WH_HMAC` - Webhook signature validation secret +- `TROLLEY_WIDGET_BASE_URL` - Trolley widget URL + +**Topcoder Platform**: + +- `TOPCODER_API_BASE_URL` - Base URL for Topcoder APIs +- `TOPCODER_WALLET_URL` - Wallet frontend URL for CORS + +## Database Setup + +The application uses **PostgreSQL** with **Prisma ORM** for database operations. + +### Local Setup + +1. **Using Docker** (Recommended): + +```bash +docker-compose up -d +# PostgreSQL will be available on port 5434 +``` + +2. **Manual Setup**: + - Install PostgreSQL v16 + - Create database: `walletdb` + - Update `DATABASE_URL` in `.env` + +### Database Migrations + +```bash +# Generate Prisma client +npx prisma generate + +# Run migrations (development) +npx prisma migrate dev + +# Run migrations (production) +npx prisma migrate deploy + +# Reset database (destructive) +npx prisma migrate reset --force +``` + +### Database Schema + +The database includes tables for: + +- `winnings` - Member winnings/earnings +- `payment` - Individual payment records with installments +- `payment_releases` - Batched payment releases to Trolley +- `payment_method` - Supported payment methods +- `user_payment_methods` - User-linked payment methods +- `trolley_recipient` - Trolley recipient mappings +- `trolley_webhook_log` - Webhook event tracking +- `audit` - Audit trail for winnings changes +- `otp` - One-time passwords for sensitive operations +- Tax and verification-related tables + +For detailed schema documentation, see [DATABASE.md](./docs/DATABASE.md) + +## Development + +### Available Scripts + +```bash +# Start development server with hot-reload +pnpm run start:dev + +# Start in debug mode +pnpm run start:debug + +# Build for production +pnpm run build + +# Format code +pnpm run format + +# Lint code +pnpm run lint +``` + +### Code Structure + +The codebase follows NestJS best practices: + +- **Controllers**: HTTP request handling with decorators +- **Services**: Business logic (injectable) +- **Modules**: Feature grouping and dependency injection +- **DTOs**: Data validation with class-validator +- **Guards**: Route protection and authorization +- **Middleware**: Request preprocessing + +### Role-Based Access Control + +The API uses role-based access control with the following roles: + +- `User` - Regular authenticated users (withdrawals, view own data) +- `PaymentAdmin` - Full administrative access +- `PaymentEditor` - Edit payments and winnings +- `PaymentViewer` - Read-only access to payment data +- `M2M` - Machine-to-machine service access + +## Testing + +```bash +# Run unit tests +pnpm run test + +# Run tests in watch mode +pnpm run test:watch + +# Run e2e tests +pnpm run test:e2e + +# Generate coverage report +pnpm run test:cov +``` + +## API Documentation + +Interactive API documentation is available via Swagger UI when running the application: + +**Swagger UI**: `http://localhost:3000/v5/finance/api-docs` + +## Deployment + +### Docker Build + +```bash +# Build Docker image +docker build -t tc-finance-api:latest . + +# Build with database reset +docker build --build-arg RESET_DB_ARG=true -t tc-finance-api:latest . +``` + +### CI/CD Pipeline + +The application uses CircleCI for continuous deployment: + +- **Dev Environment**: Deploys from `dev` branch +- **Production**: Deploys from `master` branch +- **Target**: AWS ECS Fargate + +### Deployment Process + +1. Code is pushed to `dev` or `master` branch +2. CircleCI triggers build pipeline +3. Docker image is built with appropriate environment +4. Image is pushed to AWS ECR +5. ECS service is updated with new image +6. Database migrations run automatically on container start + +For detailed deployment documentation, see [DEPLOYMENT.md](./docs/DEPLOYMENT.md) + +## Additional Documentation + +- [ARCHITECTURE.md](./docs/ARCHITECTURE.md) - Detailed architecture and data flow diagrams +- [ENVIRONMENT_VARIABLES.md](./docs/ENVIRONMENT_VARIABLES.md) - Complete environment variable reference +- [DATABASE.md](./docs/DATABASE.md) - Database schema and usage patterns +- [DEPLOYMENT.md](./docs/DEPLOYMENT.md) - Build and deployment guide + +## Contributing + +1. Create a feature branch from `dev` +2. Make your changes following the code style +3. Run tests and linting +4. Submit a pull request to `dev` branch + +## Support + +For issues and questions, please contact the Topcoder platform team. diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 0000000..3e0c532 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,798 @@ +# Architecture Documentation + +## Table of Contents + +- [High-Level Architecture](#high-level-architecture) +- [System Components](#system-components) +- [Data Flow](#data-flow) +- [Sequence Diagrams](#sequence-diagrams) +- [Technology Stack](#technology-stack) +- [Integration Points](#integration-points) + +## High-Level Architecture + +The Topcoder Finance API follows a **layered architecture** pattern with clear separation of concerns: + +```mermaid +graph TB + subgraph External["External Systems"] + Trolley["Trolley
(Payments)"] + Auth0["Auth0
(JWT Auth)"] + TC["Topcoder Platform
(Members/Challenges)"] + end + + subgraph Controllers["API Layer - Controllers"] + AdminCtrl["Admin
Controller"] + WinningsCtrl["Winnings
Controller"] + WalletCtrl["Wallet
Controller"] + WebhooksCtrl["Webhooks
Controller"] + WithdrawalCtrl["Withdrawal
Controller"] + UserCtrl["User
Controller"] + PaymentProvCtrl["Payment Providers
Controller"] + end + + subgraph Services["Business Logic Layer - Services"] + AdminSvc["Admin
Service"] + WinningsSvc["Winnings
Service"] + WalletSvc["Wallet
Service"] + WithdrawalSvc["Withdrawal
Service"] + TrolleySvc["Trolley
Service"] + PaymentsSvc["Payments
Service"] + end + + subgraph Repositories["Data Access Layer - Repositories"] + WinningsRepo["Winnings
Repository"] + PaymentMethodRepo["Payment Method
Repository"] + TaxFormRepo["Tax Form
Repository"] + end + + subgraph DataLayer["Data Layer"] + Prisma["Prisma ORM
(Type-Safe)"] + DB[("PostgreSQL Database
winnings, payment,
audit, otp, tax_form,
trolley_*, user_payment")] + end + + Trolley -->|Webhooks| WebhooksCtrl + Auth0 -->|JWT| AdminCtrl + Auth0 -->|JWT| WinningsCtrl + Auth0 -->|JWT| WalletCtrl + Auth0 -->|JWT| WithdrawalCtrl + Auth0 -->|JWT| UserCtrl + Auth0 -->|JWT| PaymentProvCtrl + TC -->|API Calls| AdminSvc + TC -->|API Calls| WinningsSvc + + AdminCtrl --> AdminSvc + WinningsCtrl --> WinningsSvc + WalletCtrl --> WalletSvc + WithdrawalCtrl --> WithdrawalSvc + UserCtrl --> TrolleySvc + PaymentProvCtrl --> TrolleySvc + WebhooksCtrl --> TrolleySvc + + AdminSvc --> WinningsRepo + WinningsSvc --> WinningsRepo + WalletSvc --> WinningsRepo + WithdrawalSvc --> TrolleySvc + WithdrawalSvc --> PaymentsSvc + TrolleySvc --> Trolley + PaymentsSvc --> PaymentMethodRepo + + WinningsRepo --> Prisma + PaymentMethodRepo --> Prisma + TaxFormRepo --> Prisma + + Prisma --> DB + + style External fill:#e1f5ff + style Controllers fill:#fff4e6 + style Services fill:#f3e5f5 + style Repositories fill:#e8f5e9 + style DataLayer fill:#fce4ec +``` + +## System Components + +### 1. API Layer (Controllers) + +Controllers handle HTTP requests and route them to appropriate services: + +**AdminController** (`/v5/finance/admin`) + +- Payment administration operations +- Winnings search and export +- Audit log retrieval +- Requires: `PaymentAdmin`, `PaymentEditor`, or `PaymentViewer` roles + +**WinningsController** (`/v5/finance/winnings`) + +- User winnings CRUD operations +- View personal winnings history +- Requires: `User` role + +**WithdrawalController** (`/v5/finance/withdraw`) + +- Initiate withdrawal requests +- Validate OTP codes +- Process payment releases +- Requires: `User` role + +**WalletController** (`/v5/finance/wallet`) + +- Get wallet balance +- View transaction history +- Requires: `User` role + +**PaymentProvidersController** (`/v5/finance/payment-providers`) + +- Trolley portal URL generation +- Payment method management +- Requires: `User` role + +**WebhooksController** (`/v5/finance/webhooks`) + +- Receive Trolley webhook events +- Public endpoint with signature verification +- No authentication required (validated via HMAC) + +### 2. Business Logic Layer (Services) + +**AdminService** + +- Update winnings details +- Retrieve audit logs +- Manage payment statuses + +**WinningsService** + +- Create and manage winnings +- Query winnings data +- Apply business rules + +**WithdrawalService** + +- Process withdrawal requests +- Create Trolley payment batches +- Handle payment releases +- Calculate fees and taxes + +**WalletService** + +- Calculate available balance +- Aggregate payment data +- Track pending withdrawals + +**TrolleyService (Global)** + +- Core Trolley SDK wrapper +- API client management +- Payment batch operations +- Recipient management + +**TrolleyService (PaymentProviders)** + +- User-facing Trolley operations +- Recipient creation and linking +- Portal URL generation + +**TrolleyService (Webhooks)** + +- Webhook signature validation +- Event processing and routing +- Database logging + +**PaymentsService** + +- Payment processing logic +- Fee calculations +- Payment method validation + +### 3. Data Access Layer (Repositories) + +**WinningsRepository** + +- Complex winnings queries with filters +- Pagination and sorting +- Join operations with payments + +**PaymentMethodRepository** + +- Payment method CRUD +- User payment method associations + +**TaxFormRepository** + +- Tax form management +- Status tracking + +**OriginRepository** + +- Origin/source tracking +- Reference data + +### 4. Core Modules + +**Authentication & Authorization** + +- `AuthGuard` - JWT token validation +- `RolesGuard` - Role-based access control +- `TokenValidatorMiddleware` - Token parsing and extraction +- Supports both user JWT and M2M tokens + +**Request Context** + +- `CreateRequestStoreMiddleware` - Async local storage for request context +- Provides user info across the request lifecycle + +**Shared Services** + +- `PrismaService` - Database client +- `OtpService` - One-time password generation and validation +- `TopcoderMembersService` - Member API integration +- `TopcoderChallengesService` - Challenge API integration +- `TopcoderEmailService` - Email notifications +- `Logger` - Winston-based logging + +## Data Flow + +### 1. Withdrawal Request Flow + +```mermaid +sequenceDiagram + participant User as User
(Web UI) + participant WC as Withdrawal
Controller + participant WS as Withdrawal
Service + participant OTP as OTP
Service + participant Repo as Winnings
Repository + participant TS as Trolley
Service + participant Trolley as Trolley
(External) + participant DB as PostgreSQL + + User->>WC: 1. POST /withdraw
{winningsIds, memo, otpCode} + activate WC + WC->>WS: withdraw() + activate WS + + WS->>OTP: 2. verifyOtp() + activate OTP + OTP->>DB: Validate OTP + DB-->>OTP: OTP verified + OTP-->>WS: Valid + deactivate OTP + + WS->>Repo: 3. getReleasableWinnings() + activate Repo + Repo->>DB: Query winnings + DB-->>Repo: Winnings data + Repo-->>WS: Releasable winnings + deactivate Repo + + WS->>TS: 4. getPayeeRecipient() + activate TS + TS->>Trolley: 5. Search/Create recipient + Trolley-->>TS: Recipient ID + TS->>DB: Save recipient mapping + TS-->>WS: Recipient details + deactivate TS + + Note over WS: 6. Calculate net amount
(Apply fees & taxes) + + WS->>TS: 7. startBatchPayment() + activate TS + TS->>Trolley: Create batch + Trolley-->>TS: Batch ID + TS-->>WS: Batch ID + deactivate TS + + loop For each winning + WS->>TS: 8. createPayment() + activate TS + TS->>Trolley: Add payment to batch + Trolley-->>TS: Payment ID + TS-->>WS: Payment ID + deactivate TS + end + + WS->>DB: 9. Save payment_releases
Status: Pending + DB-->>WS: Saved + + WS->>TS: 10. startProcessingPayment() + activate TS + TS->>Trolley: Generate quote & process + Note over Trolley: 11. Process payment
(Async) + Trolley-->>TS: Processing + TS-->>WS: Success + deactivate TS + + WS->>DB: 12. Update payment status
Status: PROCESSING + DB-->>WS: Updated + + WS-->>WC: Withdrawal successful + deactivate WS + WC-->>User: 200 OK + deactivate WC +``` + +### 2. Webhook Event Processing Flow + +```mermaid +sequenceDiagram + participant Trolley as Trolley
(External) + participant WHC as Webhooks
Controller + participant TS as Trolley
Service
(Webhooks) + participant DB as PostgreSQL + participant Handler as Event
Handler + participant Email as Email
Service + + Trolley->>WHC: 1. POST /webhooks/trolley
Headers: signature, eventId
Body: {model, action, body} + activate WHC + + WHC->>TS: 2. validateSignature() + activate TS + TS-->>WHC: Valid HMAC signature + + WHC->>TS: 3. validateUnique() + TS->>DB: Check trolley_webhook_log + DB-->>TS: Event not processed + TS-->>WHC: Unique event + + WHC->>TS: handleEvent() + + TS->>DB: 4. Insert webhook log
Status: logged + DB-->>TS: Logged + + Note over TS: 5. Route to handler
based on model.action + + TS->>Handler: Invoke handler + activate Handler + + alt payment.updated + Handler->>DB: 6a. Update payment status + Handler->>DB: Update payment_releases + Handler->>Email: Send notification + else recipient.updated + Handler->>DB: 6b. Update trolley_recipient + else taxForm.updated + Handler->>DB: 6c. Update tax form status + end + + Handler-->>TS: Processing complete + deactivate Handler + + TS->>DB: 7. Update webhook log
Status: processed + DB-->>TS: Updated + + TS-->>WHC: Success + deactivate TS + WHC-->>Trolley: 200 OK + deactivate WHC +``` + +### 3. Authentication Flow + +```mermaid +sequenceDiagram + participant Client + participant Middleware as Token Validator
Middleware + participant AuthGuard as Auth
Guard + participant RolesGuard as Roles
Guard + participant Auth0 + participant API as Finance API
Endpoint + + Client->>Middleware: 1. Request with
Authorization: Bearer + activate Middleware + + Middleware->>Middleware: 2. Extract token
from header + + Middleware->>Auth0: 3. Verify signature
with Auth0 Cert (jwks-rsa) + Auth0-->>Middleware: Signature valid + + Middleware->>Middleware: 4. Check token type
(M2M or User) + Note over Middleware: Extract claims:
email, userId, scope, etc. + + Middleware-->>AuthGuard: Token parsed & verified + deactivate Middleware + + activate AuthGuard + AuthGuard->>AuthGuard: 5. Check authentication:
- Token verified?
- Public route?
- M2M scopes valid? + + alt Authentication Failed + AuthGuard-->>Client: 401 Unauthorized + else Authentication Passed + AuthGuard-->>RolesGuard: Authenticated + end + deactivate AuthGuard + + activate RolesGuard + RolesGuard->>RolesGuard: 6. Check authorization:
- User roles
- Route required roles
- Permissions match? + + alt Authorization Failed + RolesGuard-->>Client: 403 Forbidden + else Authorization Passed + RolesGuard->>API: Process request + activate API + API-->>Client: 200 OK + Response + deactivate API + end + deactivate RolesGuard +``` + +## Sequence Diagrams + +### Admin Winnings Search + +```mermaid +sequenceDiagram + participant Admin as Admin User + participant API as AdminController + participant Repo as WinningsRepository + participant DB as PostgreSQL + participant TC as TopcoderMembersService + + Admin->>API: POST /admin/winnings/search + Note over Admin,API: {filters, pagination} + + API->>Repo: searchWinnings(filters) + Repo->>DB: Query winnings with joins + DB-->>Repo: Winnings + Payment data + Repo-->>API: SearchWinningResult + + API->>TC: getHandlesByUserIds(winnerIds) + TC-->>API: Map of userId -> handle + + API-->>Admin: Winnings with user handles +``` + +### User Withdrawal Request + +```mermaid +sequenceDiagram + participant User + participant WC as WithdrawalController + participant WS as WithdrawalService + participant OTP as OtpService + participant TS as TrolleyService (Global) + participant Trolley as Trolley API + participant DB as PostgreSQL + + User->>WC: POST /withdraw {winningsIds, memo, otpCode} + WC->>WS: withdraw(userId, winningsIds, memo, otpCode) + + WS->>OTP: verifyOtp(email, otpCode) + OTP->>DB: Query otp table + DB-->>OTP: OTP record + OTP-->>WS: Valid/Invalid + + alt OTP Invalid + WS-->>User: Error: Invalid OTP + end + + WS->>DB: Query releasable winnings + DB-->>WS: Winnings list + + WS->>TS: getPayeeRecipient(user) + TS->>Trolley: Search/Create recipient + Trolley-->>TS: Recipient ID + TS->>DB: Save trolley_recipient + DB-->>TS: Success + TS-->>WS: Recipient details + + WS->>TS: startBatchPayment(description) + TS->>Trolley: Create batch + Trolley-->>TS: Batch ID + TS-->>WS: Batch ID + + loop For each winning + WS->>TS: createPayment(recipientId, batchId, amount) + TS->>Trolley: Create payment + Trolley-->>TS: Payment ID + TS-->>WS: Payment ID + end + + WS->>DB: Create payment_releases + DB-->>WS: Success + + WS->>TS: startProcessingPayment(batchId) + TS->>Trolley: Generate quote & process + Trolley-->>TS: Processing + TS-->>WS: Success + + WS->>DB: Update payment status + DB-->>WS: Success + + WS-->>WC: Withdrawal successful + WC-->>User: 200 OK +``` + +### Trolley Webhook Processing + +```mermaid +sequenceDiagram + participant Trolley + participant WHC as WebhooksController + participant TS as TrolleyService (Webhooks) + participant Handler as Event Handler + participant DB as PostgreSQL + participant Email as EmailService + + Trolley->>WHC: POST /webhooks/trolley + Note over Trolley,WHC: Headers: signature, eventId
Body: {model, action, body} + + WHC->>TS: validateSignature(headers, body) + TS-->>WHC: Valid + + WHC->>TS: validateUnique(headers) + TS->>DB: Check trolley_webhook_log + DB-->>TS: Event not processed + TS-->>WHC: Unique + + WHC->>TS: handleEvent(headers, payload) + + TS->>DB: Insert webhook log (status: logged) + DB-->>TS: Success + + TS->>Handler: Invoke handler for model.action + + alt payment.updated + Handler->>DB: Update payment status + Handler->>DB: Update payment_releases + Handler->>Email: Send notification + else recipient.updated + Handler->>DB: Update trolley_recipient + else taxForm.updated + Handler->>DB: Update tax form status + end + + Handler-->>TS: Processing complete + + TS->>DB: Update webhook log (status: processed) + DB-->>TS: Success + + TS-->>WHC: Success + WHC-->>Trolley: 200 OK +``` + +## Technology Stack + +### Backend Framework + +- **NestJS v11.1.7** - Modular, scalable Node.js framework + - Dependency Injection + - Decorators for routing, validation, guards + - Module-based architecture + +### Language + +- **TypeScript v5.9.3** - Type-safe JavaScript + - Strong typing for DTOs and entities + - Compile-time error checking + - Enhanced IDE support + +### Database Layer + +- **PostgreSQL v16** - Relational database + - ACID compliance + - Complex queries with joins + - Transactional support +- **Prisma v6.18.0** - Modern ORM + - Type-safe database client + - Schema migrations + - Query builder + - Database introspection + +### Authentication + +- **Auth0** - Identity platform + - JWT token-based authentication + - M2M (Machine-to-Machine) support + - RSA signature verification (jwks-rsa) +- **jsonwebtoken v9.0.2** - JWT handling + - Token parsing and validation + - Signature verification + +### Payment Integration + +- **Trolley SDK v1.1.0** - Payment provider + - Recipient management + - Batch payments + - Webhook events + - International payouts + +### API Documentation + +- **Swagger/OpenAPI** - Interactive API docs + - Auto-generated from decorators + - Try-it-out functionality + - Schema definitions + +### Validation + +- **class-validator v0.14.2** - DTO validation + - Decorator-based validation rules + - Automatic request validation +- **class-transformer v0.5.1** - Object transformation + - Plain object to class instance + - Type coercion + +### Logging + +- **Winston v3.18.3** - Logging framework + - Structured logging + - Multiple transports + - Log levels + +## Integration Points + +### 1. Trolley Payment Provider + +**Purpose**: Process international payments to members + +**Integration Type**: REST API + Webhooks + +**Key Operations**: + +- Create/manage recipients +- Create payment batches +- Process payments +- Handle webhook events + +**Authentication**: API Key + Secret (HMAC for webhooks) + +**Endpoints Used**: + +- `POST /recipients` - Create recipient +- `GET /recipients/search` - Find recipient +- `POST /batches` - Create payment batch +- `POST /batches/{id}/payments` - Add payment +- `POST /batches/{id}/generate-quote` - Generate quote +- `POST /batches/{id}/start-processing` - Start processing + +**Webhook Events**: + +- `payment.updated` - Payment status changed +- `recipient.updated` - Recipient info updated +- `taxForm.updated` - Tax form status changed +- `recipientAccount.created/updated` - Payment method added + +### 2. Auth0 Identity Platform + +**Purpose**: User authentication and authorization + +**Integration Type**: JWT token validation + +**Key Operations**: + +- Validate JWT signatures +- Extract user claims +- Verify M2M tokens +- Check scopes and roles + +**Authentication**: RSA Public Key (AUTH0_CERT) + +**Token Types**: + +- User JWT: Contains email, handle, userId +- M2M JWT: Contains scope and clientId + +### 3. Topcoder Platform APIs + +**Purpose**: Member and challenge data + +**Integration Type**: REST API (M2M) + +**Key Operations**: + +- Get member profile data +- Fetch user handles +- Update challenge payment status +- Send email notifications + +**Authentication**: Auth0 M2M token + +**APIs Used**: + +- Members API: `/v5/members/{handle}` +- Challenges API: `/v5/challenges/{id}` +- Email Service: Kafka bus messages + +### 4. Database (PostgreSQL) + +**Purpose**: Persistent data storage + +**Integration Type**: Prisma ORM + +**Key Tables**: + +- `winnings` - Member earnings +- `payment` - Payment records +- `payment_releases` - Batch releases +- `trolley_recipient` - Trolley mappings +- `user_payment_methods` - Payment methods +- `trolley_webhook_log` - Webhook tracking +- `audit` - Audit trail +- `otp` - One-time passwords + +**Connection**: Connection pooling via Prisma + +## Security Considerations + +### Authentication & Authorization + +- All endpoints require authentication +- Role-based access control (RBAC) +- JWT signature verification +- M2M token scope validation + +### Webhook Security + +- HMAC signature validation +- Replay attack prevention (event ID tracking) +- IP allowlisting (optional) + +### Data Protection + +- Sensitive data encrypted at rest +- HTTPS/TLS for all communications +- OTP for withdrawal operations +- Audit logging for all critical operations + +### Input Validation + +- DTO validation using class-validator +- SQL injection prevention via Prisma +- XSS protection via input sanitization +- Rate limiting (via infrastructure) + +## Scalability & Performance + +### Horizontal Scaling + +- Stateless API design +- No session storage +- Can run multiple instances + +### Database Optimization + +- Indexed columns for common queries +- Efficient joins via Prisma +- Connection pooling +- Read replicas (future) + +### Caching Strategy + +- No application-level caching currently +- Database query caching + +### Async Processing + +- Webhook processing is async +- Payment batch processing is async +- Email notifications are async (Kafka) + +## Error Handling + +### Application Errors + +- NestJS exception filters +- Structured error responses +- Error logging via Winston + +### External Service Failures + +- Retry logic for Trolley API +- Graceful degradation +- Error status tracking + +### Database Errors + +- Transaction rollback on failure +- Prisma error handling +- Connection retry logic + +## Monitoring & Observability + +### Logging + +- Winston structured logging +- Log levels: error, warn, info, debug +- Request/response logging +- Webhook event logging diff --git a/docs/DATABASE.md b/docs/DATABASE.md new file mode 100644 index 0000000..e201795 --- /dev/null +++ b/docs/DATABASE.md @@ -0,0 +1,140 @@ +# Database Documentation + +## Table of Contents + +- [Overview](#overview) +- [Technology Stack](#technology-stack) +- [Indexes](#indexes) +- [Migrations](#migrations) + +## Overview + +The Topcoder Finance API uses **PostgreSQL v16** as its relational database management system, with **Prisma v6.18.0** as the ORM layer for type-safe database access and schema migrations. + +### Key Features + +- **ACID Compliance**: Ensures data consistency and reliability +- **Type Safety**: Prisma provides full TypeScript type definitions +- **Migration Management**: Version-controlled schema changes +- **Connection Pooling**: Efficient database connection management +- **Transactional Support**: Complex operations with rollback capabilities + +## Technology Stack + +### PostgreSQL v16 + +- **Features Used**: + - UUID generation (`uuid_generate_v4()`) + - JSONB columns for flexible attributes + - Enum types for constrained values + - Timestamp with timezone support + - Composite indexes for query optimization + +### Prisma ORM v6.18.0 + +- **Features Used**: + - Schema-first approach + - Migration versioning + - Prisma Client generation + - Relation management + - Raw SQL support when needed + +## Indexes + +### Performance Indexes + +**winnings table**: + +```sql +CREATE INDEX idx_winnings_winner_id_only ON winnings(winner_id, winning_id); +CREATE INDEX idx_winnings_winner_created_at ON winnings(winner_id, created_at DESC); +CREATE INDEX idx_winnings_category_created_at ON winnings(category, created_at DESC); +CREATE INDEX idx_winnings_created_at ON winnings(created_at DESC); +``` + +**payment table**: + +```sql +CREATE INDEX idx_payment_winnings_id ON payment(winnings_id); +CREATE INDEX idx_payment_status_winnings ON payment(payment_status, winnings_id); +CREATE INDEX idx_payment_installment_number ON payment(installment_number); +CREATE INDEX idx_payment_win_inst_status ON payment(winnings_id, installment_number, payment_status); +CREATE INDEX idx_payment_installment_status_version ON payment( + installment_number, + payment_status, + winnings_id, + version DESC +); +CREATE INDEX idx_payment_winnings_installment ON payment(winnings_id, installment_number); +``` + +### Unique Indexes + +- `payment_method.payment_method_type` - Ensures unique method types +- `trolley_webhook_log.event_id` - Prevents duplicate processing +- `trolley_recipient.user_id` - One recipient per user +- `trolley_recipient.trolley_id` - Unique Trolley ID +- `user_payment_methods (user_id, payment_method_id)` - One method per user + +## Migrations + +### Migration Management + +Prisma manages database schema through migration files located in `prisma/migrations/`. + +**Key Commands**: + +```bash +# Create a new migration (development) +npx prisma migrate dev --name + +# Apply migrations (production) +npx prisma migrate deploy + +# Reset database (destructive!) +npx prisma migrate reset --force + +# View migration status +npx prisma migrate status + +# Generate Prisma Client +npx prisma generate +``` + +### Migration Workflow + +1. **Development**: + + ```bash + # Modify prisma/schema.prisma + # Generate migration + npx prisma migrate dev --name add_new_column + + # Migration file created in prisma/migrations/ + # Database updated + # Prisma Client regenerated + ``` + +2. **Production Deployment**: + + ```bash + # In CI/CD or startup script + npx prisma migrate deploy + + # Applies pending migrations + # Fails if database is out of sync + ``` + +3. **Rollback** (Manual): + - Prisma doesn't support automatic rollback + - Must manually revert by applying inverse operations + - Or restore from backup + +### Migration Best Practices + +1. **Always create migrations in development first** +2. **Test migrations on staging environment** +3. **Keep migrations small and focused** +4. **Never edit migration files after creation** +5. **Include both up and down logic in documentation** +6. **Back up production database before applying** diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md new file mode 100644 index 0000000..1a9ed01 --- /dev/null +++ b/docs/DEPLOYMENT.md @@ -0,0 +1,255 @@ +# Deployment Documentation + +## Table of Contents + +- [Overview](#overview) +- [Deployment Environments](#deployment-environments) +- [Build Process](#build-process) +- [CI/CD Pipeline](#cicd-pipeline) +- [Configuration Management](#configuration-management) +- [Monitoring and Health Checks](#monitoring-and-health-checks) + +## Overview + +The Topcoder Finance API uses a containerized deployment approach with Docker and AWS ECS Fargate, orchestrated through CircleCI for continuous integration and deployment. + +### Deployment Architecture + +``` +┌──────────────┐ ┌─────────────────┐ ┌──────────────┐ +│ GitHub │ │ CircleCI │ │ AWS │ +│ Repository │────────>│ CI/CD Jobs │────────>│ ECS Fargate │ +│ │ │ │ │ │ +│ ├─ dev │ │ ├─ Build │ │ ├─ Dev Env │ +│ └─ master │ │ ├─ Test │ │ └─ Prod Env │ +│ │ │ ├─ Push ECR │ │ │ +└──────────────┘ │ └─ Deploy │ └──────────────┘ + └─────────────────┘ + │ + │ + ┌────────┴──────────┐ + │ │ + ┌────▼─────┐ ┌─────▼────┐ + │ ECR │ │ ECS │ + │ Registry │ │ Service │ + └──────────┘ └──────────┘ +``` + +### Technology Stack + +- **Source Control**: GitHub +- **CI/CD**: CircleCI v2.1 +- **Container Registry**: AWS ECR (Elastic Container Registry) +- **Container Orchestration**: AWS ECS Fargate +- **Infrastructure**: AWS (VPC, ALB, RDS) +- **Configuration**: AWS Parameter Store / Secrets Manager + +## Deployment Environments + +### Development Environment + +**Branch**: `dev` + +**Infrastructure**: + +- Environment Name: `DEV` +- AWS Region: us-east-1 (typically) +- ECS Cluster: topcoder-dev-cluster +- Database: RDS PostgreSQL (Dev instance) + +**Configuration**: + +- `DEPLOYMENT_ENVIRONMENT=dev` +- `LOGICAL_ENV=dev` +- Auto-deploys on push to `dev` branch +- Database migrations run automatically +- Can reset database with pipeline parameter + +**Access**: + +- API: `https://api.topcoder-dev.com/v6/finance` +- Swagger: `https://api.topcoder-dev.com/v6/finance/api-docs` + +### Production Environment + +**Branch**: `master` + +**Infrastructure**: + +- Environment Name: `PROD` +- AWS Region: us-east-1 (typically) +- ECS Cluster: topcoder-prod-cluster +- Database: RDS PostgreSQL (Production instance with Multi-AZ) + +**Configuration**: + +- `DEPLOYMENT_ENVIRONMENT=prod` +- `LOGICAL_ENV=prod` +- Auto-deploys on push to `master` branch +- Database migrations run automatically (no reset) +- Blue-green deployment strategy + +**Access**: + +- API: `https://api.topcoder.com/v6/finance` +- Swagger: `https://api.topcoder.com/v6/finance/api-docs` (may be disabled) + +## Build Process + +### Local Build + +#### Development Build + +```bash +# Install dependencies +pnpm install + +# Generate Prisma client +npx prisma generate + +# Build TypeScript +pnpm run build + +# Output: dist/ directory +``` + +#### Docker Build + +```bash +# Build with default settings +docker build -t tc-finance-api:latest . + +# Build with database reset (for dev/testing) +docker build \ + --build-arg RESET_DB_ARG=true \ + --build-arg SEED_DATA_ARG=dev \ + -t tc-finance-api:dev . + +# Run locally +docker run -p 3000:3000 \ + --env-file .env \ + tc-finance-api:latest +``` + +### CI/CD Pipeline + +### CircleCI Configuration + +Location: `.circleci/config.yml` + +#### Pipeline Parameters + +```yaml +parameters: + reset-db: + type: boolean + default: false + description: 'Reset database on deployment (dev only)' +``` + +#### Jobs Overview + +``` +┌──────────────┐ +│ Git Push │ +│ (dev/master) │ +└──────┬───────┘ + │ + ▼ +┌──────────────────────┐ +│ CircleCI Triggers │ +└──────┬───────────────┘ + │ + ├─────────────────────────────────┐ + │ │ + ▼ ▼ +┌──────────────┐ ┌──────────────┐ +│ build-dev │ │ build-prod │ +│ │ │ │ +│ (dev branch) │ │(master branch)│ +└──────┬───────┘ └──────┬───────┘ + │ │ + ▼ ▼ +┌────────────────────────────────────────────┐ +│ Build & Deploy Steps │ +│ │ +│ 1. Checkout code │ +│ 2. Setup remote Docker │ +│ 3. Install dependencies (AWS CLI, etc) │ +│ 4. Install deploy scripts │ +│ 5. Build Docker image │ +│ 6. Push to ECR │ +│ 7. Deploy to ECS Fargate │ +└────────────────────────────────────────────┘ +``` + +#### Job Definition: build-prod + +Same structure as `build-dev` but with: + +- `DEPLOY_ENV: 'PROD'` +- `LOGICAL_ENV: 'prod'` +- `DEPLOYMENT_ENVIRONMENT: 'prod'` +- Triggers on `master` branch only + +### Secrets Management + +**Sensitive values** stored as SecureString: + +- Database credentials +- API keys (Trolley, Auth0) +- Certificates +- HMAC secrets + +**Access Control**: + +- IAM roles for ECS tasks +- Least privilege principle +- Audit logging enabled + +### Updating Configuration + +```bash +# Update parameter +aws ssm put-parameter \ + --name "/config/tc-finance-api/appvar/PROD/TROLLEY_SECRET_KEY" \ + --value "new-secret-value" \ + --type "SecureString" \ + --overwrite + +# Restart ECS service to pick up changes +aws ecs update-service \ + --cluster topcoder-prod-cluster \ + --service tc-finance-api \ + --force-new-deployment +``` + +## Monitoring and Health Checks + +### Health Check Endpoint + +**Endpoint**: `GET /v5/finance/health` + +**Response**: + +```json +{ + "status": "ok", + "timestamp": "2024-01-27T12:00:00.000Z" +} +``` + +### Application Logs + +**CloudWatch Logs**: + +- Log Group: `/ecs/tc-finance-api` +- Log Stream: `ecs/tc-finance-api/{task-id}` +- Retention: 30 days (configurable) + +**Log Levels**: + +- `error` - Errors requiring attention +- `warn` - Warnings and potential issues +- `info` - General information +- `debug` - Detailed debugging (dev only) diff --git a/docs/ENVIRONMENT_VARIABLES.md b/docs/ENVIRONMENT_VARIABLES.md new file mode 100644 index 0000000..e727297 --- /dev/null +++ b/docs/ENVIRONMENT_VARIABLES.md @@ -0,0 +1,286 @@ +# Environment Variables Documentation + +## Table of Contents + +- [Overview](#overview) +- [Required Variables](#required-variables) +- [Optional Variables](#optional-variables) +- [Setup Guide](#setup-guide) + +## Overview + +The Topcoder Finance API requires several environment variables for proper configuration. These variables control database connections, external service integrations, authentication, and application behavior. + +All environment variables should be defined in a `.env` file in the project root or set in the deployment environment. + +## Required Variables + +### Database Configuration + +#### `DATABASE_URL` + +- **Type**: String (Connection URL) +- **Required**: Yes +- **Description**: PostgreSQL database connection string +- **Format**: `postgresql://{username}:{password}@{host}:{port}/{database}?sslmode={mode}` +- **Example**: `postgresql://topcoderuser:password@localhost:5434/walletdb?sslmode=disable` +- **Notes**: + - Used by Prisma for database connections + - Include SSL mode for production environments + - Connection pooling is handled by Prisma + +### Auth0 Configuration + +#### `AUTH0_CLIENT_ID` + +- **Type**: String (UUID) +- **Required**: Yes +- **Description**: Auth0 client ID for user authentication +- **Notes**: Used to validate user JWT tokens +- **How to get**: Auth0 Dashboard → Applications → Your Application → Client ID + +#### `AUTH0_CERT` + +- **Type**: String (RSA Public Key) +- **Required**: Yes +- **Description**: RSA public key for JWT signature verification +- **Format**: PEM format with BEGIN/END markers +- **How to get**: Auth0 Dashboard → Applications → Advanced Settings → Certificates + +#### `AUTH0_M2M_CLIENT_ID` + +- **Type**: String (UUID) +- **Required**: Yes +- **Description**: Auth0 Machine-to-Machine client ID +- **Notes**: Used for M2M authentication with Topcoder APIs +- **How to get**: Auth0 Dashboard → Applications → Machine to Machine Application → Client ID + +#### `AUTH0_M2M_SECRET` + +- **Type**: String +- **Required**: Yes +- **Description**: Auth0 M2M client secret +- **Example**: `your-m2m-secret-here` +- **Notes**: Keep this secret secure, never commit to version control +- **How to get**: Auth0 Dashboard → Applications → Machine to Machine Application → Client Secret + +#### `AUTH0_M2M_AUDIENCE` + +- **Type**: String (URL) +- **Required**: Yes +- **Description**: Auth0 M2M API audience identifier +- **Example**: `https://m2m.topcoder-dev.com/` +- **Notes**: Identifies the API that the M2M token is for + +#### `AUTH0_M2M_TOKEN_URL` + +- **Type**: String (URL) +- **Required**: Yes +- **Description**: Auth0 token endpoint for M2M authentication +- **Example**: `https://topcoder-dev.auth0.com/oauth/token` +- **Format**: `https://{auth0-domain}/oauth/token` + +#### `AUTH0_M2M_GRANT_TYPE` + +- **Type**: String +- **Required**: Yes +- **Description**: OAuth2 grant type for M2M authentication +- **Example**: `client_credentials` +- **Default**: `client_credentials` +- **Notes**: Should always be `client_credentials` for M2M + +#### `AUTH0_TC_PROXY_URL` + +- **Type**: String (URL) +- **Required**: Yes +- **Description**: Topcoder Auth0 proxy URL +- **Example**: `https://topcoder-dev.auth0.com` +- **Notes**: Used for additional Auth0 operations + +### Trolley Configuration + +#### `TROLLEY_ACCESS_KEY` + +- **Type**: String +- **Required**: Yes +- **Description**: Trolley API access key +- **Notes**: + - Use sandbox keys for development + - Production keys for prod environment +- **How to get**: Trolley Dashboard → Settings → API Keys + +#### `TROLLEY_SECRET_KEY` + +- **Type**: String +- **Required**: Yes +- **Description**: Trolley API secret key +- **Notes**: Keep this secret secure +- **How to get**: Trolley Dashboard → Settings → API Keys + +#### `TROLLEY_WH_HMAC` + +- **Type**: String +- **Required**: Yes +- **Description**: HMAC secret for Trolley webhook signature validation +- **Notes**: + - Used to verify webhook authenticity + - Different from API keys +- **How to get**: Trolley Dashboard → Settings → Webhooks → Webhook Secret + +#### `TROLLEY_WIDGET_BASE_URL` + +- **Type**: String (URL) +- **Required**: Yes +- **Description**: Base URL for Trolley recipient portal widget +- **Example**: `https://trolley.link/recipient` +- **Format**: `https://trolley.link/recipient` or sandbox equivalent +- **Notes**: Used to generate portal access URLs for users + +### Topcoder Platform Configuration + +#### `TOPCODER_API_BASE_URL` + +- **Type**: String (URL) +- **Required**: Yes +- **Description**: Base URL for Topcoder platform APIs +- **Example**: `https://api.topcoder-dev.com/v5` +- **Format**: `https://api.{environment}/v5` +- **Notes**: + - Dev: `https://api.topcoder-dev.com/v5` + - Prod: `https://api.topcoder.com/v5` + +#### `TOPCODER_WALLET_URL` + +- **Type**: String (URL) +- **Required**: Yes +- **Description**: Topcoder wallet frontend URL +- **Example**: `https://wallet.topcoder.com` +- **Notes**: Used for CORS configuration +- **Default**: `https://wallet.topcoder.com` + +#### `TC_EMAIL_FROM_EMAIL` + +- **Type**: String (Email) +- **Required**: Yes +- **Description**: From email address for system emails +- **Example**: `noreply@topcoder.com` +- **Notes**: Must be a valid, verified email address + +## Optional Variables + +### Application Configuration + +#### `API_BASE` + +- **Type**: String +- **Required**: No +- **Description**: Base path for all API routes +- **Example**: `/v5/finance` +- **Default**: `/v5/finance` +- **Notes**: Prefix for all endpoints + +#### `PORT` + +- **Type**: Integer +- **Required**: No +- **Description**: Port number for the application server +- **Example**: `3000` +- **Default**: `3000` +- **Notes**: Must be available and not in use + +### Trolley Payment Configuration + +#### `TROLLEY_MINIMUM_PAYMENT_AMOUNT` + +- **Type**: Integer +- **Required**: No +- **Description**: Minimum payment amount in USD cents +- **Example**: `100` (= $1.00) +- **Default**: `0` +- **Notes**: Enforces minimum withdrawal amount + +#### `TROLLEY_PAYPAL_FEE_MAX_AMOUNT` + +- **Type**: Number (Decimal) +- **Required**: No +- **Description**: Maximum PayPal fee amount in USD +- **Example**: `20.00` +- **Default**: `0` +- **Notes**: Cap on PayPal fees + +#### `ACCEPT_CUSTOM_PAYMENTS_MEMO` + +- **Type**: Boolean +- **Required**: No +- **Description**: Allow custom memo text in payment requests +- **Example**: `true` +- **Default**: `false` +- **Values**: `true` or `false` +- **Notes**: When false, uses default memo + +### Email Configuration + +#### `TC_EMAIL_NOTIFICATIONS_TOPIC` + +- **Type**: String +- **Required**: No +- **Description**: Kafka topic for email notifications +- **Example**: `external.action.email` +- **Default**: `external.action.email` +- **Notes**: Used for Topcoder bus messaging + +#### `TC_EMAIL_FROM_NAME` + +- **Type**: String +- **Required**: No +- **Description**: Display name for system emails +- **Example**: `Topcoder` +- **Default**: `Topcoder` + +#### `SENDGRID_TEMPLATE_ID_PAYMENT_SETUP_NOTIFICATION` + +- **Type**: String +- **Required**: No +- **Description**: SendGrid template ID for payment setup emails +- **Example**: `d-919e01f1314e44439bc90971b55f7db7` +- **Default**: `d-919e01f1314e44439bc90971b55f7db7` +- **Notes**: Must match template in SendGrid + +#### `SENDGRID_TEMPLATE_ID_OTP_CODE` + +- **Type**: String +- **Required**: No +- **Description**: SendGrid template ID for OTP code emails +- **Example**: `d-2d0ab9f6c9cc4efba50080668a9c35c1` +- **Default**: `d-2d0ab9f6c9cc4efba50080668a9c35c1` +- **Notes**: Must match template in SendGrid + +### Security Configuration + +#### `OTP_CODE_VALIDITY_MINUTES` + +- **Type**: Number +- **Required**: No +- **Description**: OTP code validity duration in minutes +- **Example**: `5` +- **Default**: `5` +- **Range**: Recommended 1-10 minutes +- **Notes**: Balance security and user convenience + +## Setup Guide + +### 1. Initial Setup + +1. **Copy the sample environment file**: + + ```bash + cp .env.sample .env + ``` + +2. **Edit the `.env` file** with your configuration: + + ```bash + nano .env + # or + vim .env + ``` diff --git a/package.json b/package.json index eea75be..7afb820 100644 --- a/package.json +++ b/package.json @@ -21,56 +21,56 @@ "postinstall": "npx prisma generate" }, "dependencies": { - "@nestjs/common": "^11.0.1", - "@nestjs/core": "^11.0.1", - "@nestjs/platform-express": "^11.0.1", - "@nestjs/swagger": "^11.0.3", - "@prisma/client": "^6.5.0", + "@nestjs/common": "^11.1.7", + "@nestjs/core": "^11.1.7", + "@nestjs/platform-express": "^11.1.7", + "@nestjs/swagger": "^11.2.1", + "@prisma/client": "^6.18.0", "class-transformer": "^0.5.1", - "class-validator": "^0.14.1", + "class-validator": "^0.14.2", "cors": "^2.8.5", - "csv": "^6.3.11", - "csv-stringify": "^6.5.2", - "dotenv": "^16.5.0", + "csv": "^6.4.1", + "csv-stringify": "^6.6.0", + "dotenv": "^17.2.3", "json-stringify-safe": "^5.0.1", "jsonwebtoken": "^9.0.2", "jwks-rsa": "^3.2.0", "lodash": "^4.17.21", - "nanoid": "^5.1.5", + "nanoid": "^5.1.6", "reflect-metadata": "^0.2.2", - "rxjs": "^7.8.1", + "rxjs": "^7.8.2", "trolleyhq": "^1.1.0", - "winston": "^3.17.0" + "winston": "^3.18.3" }, "devDependencies": { - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "^9.18.0", - "@nestjs/cli": "^11.0.0", - "@nestjs/schematics": "^11.0.0", - "@nestjs/testing": "^11.0.1", - "@swc/cli": "^0.6.0", - "@swc/core": "^1.10.7", - "@types/express": "^5.0.0", - "@types/jest": "^29.5.14", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "^9.38.0", + "@nestjs/cli": "^11.0.10", + "@nestjs/schematics": "^11.0.9", + "@nestjs/testing": "^11.1.7", + "@swc/cli": "^0.7.8", + "@swc/core": "^1.13.5", + "@types/express": "^5.0.4", + "@types/jest": "^30.0.0", "@types/json-stringify-safe": "^5.0.3", - "@types/lodash": "^4.17.16", - "@types/node": "^22.13.1", - "@types/supertest": "^6.0.2", - "eslint": "^9.18.0", - "eslint-config-prettier": "^10.0.1", - "eslint-plugin-prettier": "^5.2.2", - "globals": "^15.14.0", - "jest": "^29.7.0", - "prettier": "^3.4.2", - "prisma": "^6.5.0", + "@types/lodash": "^4.17.20", + "@types/node": "^24.9.1", + "@types/supertest": "^6.0.3", + "eslint": "^9.38.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.4", + "globals": "^16.4.0", + "jest": "^30.2.0", + "prettier": "^3.6.2", + "prisma": "^6.18.0", "source-map-support": "^0.5.21", - "supertest": "^7.0.0", - "ts-jest": "^29.2.5", - "ts-loader": "^9.5.2", + "supertest": "^7.1.4", + "ts-jest": "^29.4.5", + "ts-loader": "^9.5.4", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "typescript": "^5.7.3", - "typescript-eslint": "^8.20.0" + "typescript": "^5.9.3", + "typescript-eslint": "^8.46.2" }, "jest": { "moduleFileExtensions": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bb6236d..d792356 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,38 +9,38 @@ importers: .: dependencies: '@nestjs/common': - specifier: ^11.0.1 - version: 11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) + specifier: ^11.1.7 + version: 11.1.7(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/core': - specifier: ^11.0.1 - version: 11.0.20(@nestjs/common@11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.0.20)(reflect-metadata@0.2.2)(rxjs@7.8.2) + specifier: ^11.1.7 + version: 11.1.7(@nestjs/common@11.1.7(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.7)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/platform-express': - specifier: ^11.0.1 - version: 11.0.20(@nestjs/common@11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.0.20) + specifier: ^11.1.7 + version: 11.1.7(@nestjs/common@11.1.7(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.7) '@nestjs/swagger': - specifier: ^11.0.3 - version: 11.1.4(@nestjs/common@11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.0.20)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2) + specifier: ^11.2.1 + version: 11.2.1(@nestjs/common@11.1.7(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.7)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2) '@prisma/client': - specifier: ^6.5.0 - version: 6.6.0(prisma@6.6.0(typescript@5.8.3))(typescript@5.8.3) + specifier: ^6.18.0 + version: 6.18.0(prisma@6.18.0(typescript@5.9.3))(typescript@5.9.3) class-transformer: specifier: ^0.5.1 version: 0.5.1 class-validator: - specifier: ^0.14.1 - version: 0.14.1 + specifier: ^0.14.2 + version: 0.14.2 cors: specifier: ^2.8.5 version: 2.8.5 csv: - specifier: ^6.3.11 - version: 6.3.11 + specifier: ^6.4.1 + version: 6.4.1 csv-stringify: - specifier: ^6.5.2 - version: 6.5.2 + specifier: ^6.6.0 + version: 6.6.0 dotenv: - specifier: ^16.5.0 - version: 16.5.0 + specifier: ^17.2.3 + version: 17.2.3 json-stringify-safe: specifier: ^5.0.1 version: 5.0.1 @@ -54,114 +54,119 @@ importers: specifier: ^4.17.21 version: 4.17.21 nanoid: - specifier: ^5.1.5 - version: 5.1.5 + specifier: ^5.1.6 + version: 5.1.6 reflect-metadata: specifier: ^0.2.2 version: 0.2.2 rxjs: - specifier: ^7.8.1 + specifier: ^7.8.2 version: 7.8.2 trolleyhq: specifier: ^1.1.0 version: 1.1.0 winston: - specifier: ^3.17.0 - version: 3.17.0 + specifier: ^3.18.3 + version: 3.18.3 devDependencies: '@eslint/eslintrc': - specifier: ^3.2.0 + specifier: ^3.3.1 version: 3.3.1 '@eslint/js': - specifier: ^9.18.0 - version: 9.24.0 + specifier: ^9.38.0 + version: 9.38.0 '@nestjs/cli': - specifier: ^11.0.0 - version: 11.0.6(@swc/cli@0.6.0(@swc/core@1.11.21)(chokidar@4.0.3))(@swc/core@1.11.21)(@types/node@22.14.1)(esbuild@0.25.2) + specifier: ^11.0.10 + version: 11.0.10(@swc/cli@0.7.8(@swc/core@1.13.5)(chokidar@4.0.3))(@swc/core@1.13.5)(@types/node@24.9.1) '@nestjs/schematics': - specifier: ^11.0.0 - version: 11.0.5(chokidar@4.0.3)(typescript@5.8.3) + specifier: ^11.0.9 + version: 11.0.9(chokidar@4.0.3)(typescript@5.9.3) '@nestjs/testing': - specifier: ^11.0.1 - version: 11.0.20(@nestjs/common@11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.0.20)(@nestjs/platform-express@11.0.20) + specifier: ^11.1.7 + version: 11.1.7(@nestjs/common@11.1.7(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.7)(@nestjs/platform-express@11.1.7) '@swc/cli': - specifier: ^0.6.0 - version: 0.6.0(@swc/core@1.11.21)(chokidar@4.0.3) + specifier: ^0.7.8 + version: 0.7.8(@swc/core@1.13.5)(chokidar@4.0.3) '@swc/core': - specifier: ^1.10.7 - version: 1.11.21 + specifier: ^1.13.5 + version: 1.13.5 '@types/express': - specifier: ^5.0.0 - version: 5.0.1 + specifier: ^5.0.4 + version: 5.0.4 '@types/jest': - specifier: ^29.5.14 - version: 29.5.14 + specifier: ^30.0.0 + version: 30.0.0 '@types/json-stringify-safe': specifier: ^5.0.3 version: 5.0.3 '@types/lodash': - specifier: ^4.17.16 - version: 4.17.16 + specifier: ^4.17.20 + version: 4.17.20 '@types/node': - specifier: ^22.13.1 - version: 22.14.1 + specifier: ^24.9.1 + version: 24.9.1 '@types/supertest': - specifier: ^6.0.2 + specifier: ^6.0.3 version: 6.0.3 eslint: - specifier: ^9.18.0 - version: 9.24.0 + specifier: ^9.38.0 + version: 9.38.0(jiti@2.6.1) eslint-config-prettier: - specifier: ^10.0.1 - version: 10.1.2(eslint@9.24.0) + specifier: ^10.1.8 + version: 10.1.8(eslint@9.38.0(jiti@2.6.1)) eslint-plugin-prettier: - specifier: ^5.2.2 - version: 5.2.6(@types/eslint@9.6.1)(eslint-config-prettier@10.1.2(eslint@9.24.0))(eslint@9.24.0)(prettier@3.5.3) + specifier: ^5.5.4 + version: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.38.0(jiti@2.6.1)))(eslint@9.38.0(jiti@2.6.1))(prettier@3.6.2) globals: - specifier: ^15.14.0 - version: 15.15.0 + specifier: ^16.4.0 + version: 16.4.0 jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@22.14.1)(ts-node@10.9.2(@swc/core@1.11.21)(@types/node@22.14.1)(typescript@5.8.3)) + specifier: ^30.2.0 + version: 30.2.0(@types/node@24.9.1)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.1)(typescript@5.9.3)) prettier: - specifier: ^3.4.2 - version: 3.5.3 + specifier: ^3.6.2 + version: 3.6.2 prisma: - specifier: ^6.5.0 - version: 6.6.0(typescript@5.8.3) + specifier: ^6.18.0 + version: 6.18.0(typescript@5.9.3) source-map-support: specifier: ^0.5.21 version: 0.5.21 supertest: - specifier: ^7.0.0 - version: 7.1.0 + specifier: ^7.1.4 + version: 7.1.4 ts-jest: - specifier: ^29.2.5 - version: 29.3.2(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.25.2)(jest@29.7.0(@types/node@22.14.1)(ts-node@10.9.2(@swc/core@1.11.21)(@types/node@22.14.1)(typescript@5.8.3)))(typescript@5.8.3) + specifier: ^29.4.5 + version: 29.4.5(@babel/core@7.28.5)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.5))(jest-util@30.2.0)(jest@30.2.0(@types/node@24.9.1)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.1)(typescript@5.9.3)))(typescript@5.9.3) ts-loader: - specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.98.0(@swc/core@1.11.21)(esbuild@0.25.2)) + specifier: ^9.5.4 + version: 9.5.4(typescript@5.9.3)(webpack@5.100.2(@swc/core@1.13.5)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.11.21)(@types/node@22.14.1)(typescript@5.8.3) + version: 10.9.2(@swc/core@1.13.5)(@types/node@24.9.1)(typescript@5.9.3) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 typescript: - specifier: ^5.7.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 typescript-eslint: - specifier: ^8.20.0 - version: 8.30.1(eslint@9.24.0)(typescript@5.8.3) + specifier: ^8.46.2 + version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) packages: - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} + '@angular-devkit/core@19.2.15': + resolution: {integrity: sha512-pU2RZYX6vhd7uLSdLwPnuBcr0mXJSjp3EgOXKsrlQFQZevc+Qs+2JdXgIElnOT/aDqtRtriDmLlSbtdE8n3ZbA==} + 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'} + peerDependencies: + chokidar: ^4.0.0 + peerDependenciesMeta: + chokidar: + optional: true - '@angular-devkit/core@19.2.6': - resolution: {integrity: sha512-WFgiYhrDMq83UNaGRAneIM7CYYdBozD+yYA9BjoU8AgBLKtrvn6S8ZcjKAk5heoHtY/u8pEb0mwDTz9gxFmJZQ==} + '@angular-devkit/core@19.2.17': + resolution: {integrity: sha512-Ah008x2RJkd0F+NLKqIpA34/vUGwjlprRCkvddjDopAWRzYn6xCkz1Tqwuhn0nR1Dy47wTLKYD999TYl5ONOAQ==} 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'} peerDependencies: chokidar: ^4.0.0 @@ -169,67 +174,75 @@ packages: chokidar: optional: true - '@angular-devkit/schematics-cli@19.2.6': - resolution: {integrity: sha512-OCLVk1YbTWfaZwpKPnd+9A34eMAZIRjntdugGvfw21ok9dUA8gICGDhfYATSfnU8/AbVQMTPK5sgG0xhUEm3UA==} + '@angular-devkit/schematics-cli@19.2.15': + resolution: {integrity: sha512-1ESFmFGMpGQmalDB3t2EtmWDGv6gOFYBMxmHO2f1KI/UDl8UmZnCGL4mD3EWo8Hv0YIsZ9wOH9Q7ZHNYjeSpzg==} 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'} hasBin: true - '@angular-devkit/schematics@19.2.6': - resolution: {integrity: sha512-YTAxNnT++5eflx19OUHmOWu597/TbTel+QARiZCv1xQw99+X8DCKKOUXtqBRd53CAHlREDI33Rn/JLY3NYgMLQ==} + '@angular-devkit/schematics@19.2.15': + resolution: {integrity: sha512-kNOJ+3vekJJCQKWihNmxBkarJzNW09kP5a9E1SRNiQVNOUEeSwcRR0qYotM65nx821gNzjjhJXnAZ8OazWldrg==} + 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'} + + '@angular-devkit/schematics@19.2.17': + resolution: {integrity: sha512-ADfbaBsrG8mBF6Mfs+crKA/2ykB8AJI50Cv9tKmZfwcUcyAdmTr+vVvhsBCfvUAEokigSsgqgpYxfkJVxhJYeg==} 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'} - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.8': - resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} engines: {node: '>=6.9.0'} - '@babel/core@7.26.10': - resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.27.0': - resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.27.0': - resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.26.5': - resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.0': - resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.0': - resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -254,8 +267,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.26.0': - resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -270,8 +283,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.25.9': - resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -318,27 +331,30 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.25.9': - resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/template@7.27.0': - resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.27.0': - resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.27.0': - resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@borewit/text-codec@0.1.1': + resolution: {integrity: sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==} + '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} @@ -351,223 +367,87 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@dabh/diagnostics@2.0.3': - resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} - - '@esbuild/aix-ppc64@0.25.2': - resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.25.2': - resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.25.2': - resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.25.2': - resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.25.2': - resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.2': - resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] + '@dabh/diagnostics@2.0.8': + resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} - '@esbuild/freebsd-arm64@0.25.2': - resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] + '@emnapi/core@1.6.0': + resolution: {integrity: sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==} - '@esbuild/freebsd-x64@0.25.2': - resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] + '@emnapi/runtime@1.6.0': + resolution: {integrity: sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==} - '@esbuild/linux-arm64@0.25.2': - resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@esbuild/linux-arm@0.25.2': - resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.25.2': - resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.25.2': - resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.25.2': - resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.25.2': - resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.2': - resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.25.2': - resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.25.2': - resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.25.2': - resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.2': - resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.25.2': - resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.2': - resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.25.2': - resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.25.2': - resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.25.2': - resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.25.2': - resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@eslint-community/eslint-utils@4.6.1': - resolution: {integrity: sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==} + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.20.0': - resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/config-helpers@0.2.1': - resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==} + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.12.0': - resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + '@eslint/config-helpers@0.4.1': + resolution: {integrity: sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.13.0': - resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} + '@eslint/core@0.16.0': + resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.24.0': - resolution: {integrity: sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==} + '@eslint/js@9.38.0': + resolution: {integrity: sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.8': - resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} + '@eslint/plugin-kit@0.4.0': + resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.2': - resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} - engines: {node: '>=18.18'} + '@inquirer/ansi@1.0.1': + resolution: {integrity: sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw==} + engines: {node: '>=18'} + + '@inquirer/checkbox@4.3.0': + resolution: {integrity: sha512-5+Q3PKH35YsnoPTh75LucALdAxom6xh5D1oeY561x4cqBuH24ZFVyFREPe14xgnrtmGu3EEt1dIi60wRVSnGCw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - '@inquirer/checkbox@4.1.5': - resolution: {integrity: sha512-swPczVU+at65xa5uPfNP9u3qx/alNwiaykiI/ExpsmMSQW55trmZcwhYWzw/7fj+n6Q8z1eENvR7vFfq9oPSAQ==} + '@inquirer/confirm@5.1.19': + resolution: {integrity: sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -575,8 +455,8 @@ packages: '@types/node': optional: true - '@inquirer/confirm@5.1.9': - resolution: {integrity: sha512-NgQCnHqFTjF7Ys2fsqK2WtnA8X1kHyInyG+nMIuHowVTIgIuS10T4AznI/PvbqSpJqjCUqNBlKGh1v3bwLFL4w==} + '@inquirer/core@10.3.0': + resolution: {integrity: sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -584,8 +464,8 @@ packages: '@types/node': optional: true - '@inquirer/core@10.1.10': - resolution: {integrity: sha512-roDaKeY1PYY0aCqhRmXihrHjoSW2A00pV3Ke5fTpMCkzcGF64R8e0lw3dK+eLEHwS4vB5RnW1wuQmvzoRul8Mw==} + '@inquirer/editor@4.2.21': + resolution: {integrity: sha512-MjtjOGjr0Kh4BciaFShYpZ1s9400idOdvQ5D7u7lE6VztPFoyLcVNE5dXBmEEIQq5zi4B9h2kU+q7AVBxJMAkQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -593,8 +473,8 @@ packages: '@types/node': optional: true - '@inquirer/editor@4.2.10': - resolution: {integrity: sha512-5GVWJ+qeI6BzR6TIInLP9SXhWCEcvgFQYmcRG6d6RIlhFjM5TyG18paTGBgRYyEouvCmzeco47x9zX9tQEofkw==} + '@inquirer/expand@4.0.21': + resolution: {integrity: sha512-+mScLhIcbPFmuvU3tAGBed78XvYHSvCl6dBiYMlzCLhpr0bzGzd8tfivMMeqND6XZiaZ1tgusbUHJEfc6YzOdA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -602,8 +482,8 @@ packages: '@types/node': optional: true - '@inquirer/expand@4.0.12': - resolution: {integrity: sha512-jV8QoZE1fC0vPe6TnsOfig+qwu7Iza1pkXoUJ3SroRagrt2hxiL+RbM432YAihNR7m7XnU0HWl/WQ35RIGmXHw==} + '@inquirer/external-editor@1.0.2': + resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -611,12 +491,12 @@ packages: '@types/node': optional: true - '@inquirer/figures@1.0.11': - resolution: {integrity: sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==} + '@inquirer/figures@1.0.14': + resolution: {integrity: sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==} engines: {node: '>=18'} - '@inquirer/input@4.1.9': - resolution: {integrity: sha512-mshNG24Ij5KqsQtOZMgj5TwEjIf+F2HOESk6bjMwGWgcH5UBe8UoljwzNFHqdMbGYbgAf6v2wU/X9CAdKJzgOA==} + '@inquirer/input@4.2.5': + resolution: {integrity: sha512-7GoWev7P6s7t0oJbenH0eQ0ThNdDJbEAEtVt9vsrYZ9FulIokvd823yLyhQlWHJPGce1wzP53ttfdCZmonMHyA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -624,8 +504,8 @@ packages: '@types/node': optional: true - '@inquirer/number@3.0.12': - resolution: {integrity: sha512-7HRFHxbPCA4e4jMxTQglHJwP+v/kpFsCf2szzfBHy98Wlc3L08HL76UDiA87TOdX5fwj2HMOLWqRWv9Pnn+Z5Q==} + '@inquirer/number@3.0.21': + resolution: {integrity: sha512-5QWs0KGaNMlhbdhOSCFfKsW+/dcAVC2g4wT/z2MCiZM47uLgatC5N20kpkDQf7dHx+XFct/MJvvNGy6aYJn4Pw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -633,8 +513,8 @@ packages: '@types/node': optional: true - '@inquirer/password@4.0.12': - resolution: {integrity: sha512-FlOB0zvuELPEbnBYiPaOdJIaDzb2PmJ7ghi/SVwIHDDSQ2K4opGBkF+5kXOg6ucrtSUQdLhVVY5tycH0j0l+0g==} + '@inquirer/password@4.0.21': + resolution: {integrity: sha512-xxeW1V5SbNFNig2pLfetsDb0svWlKuhmr7MPJZMYuDnCTkpVBI+X/doudg4pznc1/U+yYmWFFOi4hNvGgUo7EA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -651,8 +531,8 @@ packages: '@types/node': optional: true - '@inquirer/prompts@7.4.1': - resolution: {integrity: sha512-UlmM5FVOZF0gpoe1PT/jN4vk8JmpIWBlMvTL8M+hlvPmzN89K6z03+IFmyeu/oFCenwdwHDr2gky7nIGSEVvlA==} + '@inquirer/prompts@7.8.0': + resolution: {integrity: sha512-JHwGbQ6wjf1dxxnalDYpZwZxUEosT+6CPGD9Zh4sm9WXdtUp9XODCQD3NjSTmu+0OAyxWXNOqf0spjIymJa2Tw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -660,8 +540,8 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@4.0.12': - resolution: {integrity: sha512-wNPJZy8Oc7RyGISPxp9/MpTOqX8lr0r+lCCWm7hQra+MDtYRgINv1hxw7R+vKP71Bu/3LszabxOodfV/uTfsaA==} + '@inquirer/rawlist@4.1.9': + resolution: {integrity: sha512-AWpxB7MuJrRiSfTKGJ7Y68imYt8P9N3Gaa7ySdkFj1iWjr6WfbGAhdZvw/UnhFXTHITJzxGUI9k8IX7akAEBCg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -669,8 +549,8 @@ packages: '@types/node': optional: true - '@inquirer/search@3.0.12': - resolution: {integrity: sha512-H/kDJA3kNlnNIjB8YsaXoQI0Qccgf0Na14K1h8ExWhNmUg2E941dyFPrZeugihEa9AZNW5NdsD/NcvUME83OPQ==} + '@inquirer/search@3.2.0': + resolution: {integrity: sha512-a5SzB/qrXafDX1Z4AZW3CsVoiNxcIYCzYP7r9RzrfMpaLpB+yWi5U8BWagZyLmwR0pKbbL5umnGRd0RzGVI8bQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -678,8 +558,8 @@ packages: '@types/node': optional: true - '@inquirer/select@4.1.1': - resolution: {integrity: sha512-IUXzzTKVdiVNMA+2yUvPxWsSgOG4kfX93jOM4Zb5FgujeInotv5SPIJVeXQ+fO4xu7tW8VowFhdG5JRmmCyQ1Q==} + '@inquirer/select@4.4.0': + resolution: {integrity: sha512-kaC3FHsJZvVyIjYBs5Ih8y8Bj4P/QItQWrZW22WJax7zTN+ZPXVGuOM55vzbdCP9zKUiBd9iEJVdesujfF+cAA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -687,8 +567,8 @@ packages: '@types/node': optional: true - '@inquirer/type@3.0.6': - resolution: {integrity: sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==} + '@inquirer/type@3.0.9': + resolution: {integrity: sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -696,6 +576,14 @@ packages: '@types/node': optional: true + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -708,92 +596,106 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jest/console@29.7.0': - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/console@30.2.0': + resolution: {integrity: sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/core@29.7.0': - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/core@30.2.0': + resolution: {integrity: sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: node-notifier: optional: true - '@jest/environment@29.7.0': - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/diff-sequences@30.0.1': + resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/environment@30.2.0': + resolution: {integrity: sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect-utils@30.2.0': + resolution: {integrity: sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect-utils@29.7.0': - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/expect@30.2.0': + resolution: {integrity: sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect@29.7.0': - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/fake-timers@30.2.0': + resolution: {integrity: sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/fake-timers@29.7.0': - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/get-type@30.1.0': + resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/globals@29.7.0': - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/globals@30.2.0': + resolution: {integrity: sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/reporters@29.7.0': - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/pattern@30.0.1': + resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/reporters@30.2.0': + resolution: {integrity: sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: node-notifier: optional: true - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/schemas@30.0.5': + resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/source-map@29.6.3': - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/snapshot-utils@30.2.0': + resolution: {integrity: sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/test-result@29.7.0': - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/source-map@30.0.1': + resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/test-sequencer@29.7.0': - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/test-result@30.2.0': + resolution: {integrity: sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/transform@29.7.0': - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/test-sequencer@30.2.0': + resolution: {integrity: sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/types@29.6.3': - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/transform@30.2.0': + resolution: {integrity: sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} + '@jest/types@30.2.0': + resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -805,112 +707,121 @@ packages: '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} - '@napi-rs/nice-android-arm-eabi@1.0.1': - resolution: {integrity: sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==} + '@napi-rs/nice-android-arm-eabi@1.1.1': + resolution: {integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==} engines: {node: '>= 10'} cpu: [arm] os: [android] - '@napi-rs/nice-android-arm64@1.0.1': - resolution: {integrity: sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==} + '@napi-rs/nice-android-arm64@1.1.1': + resolution: {integrity: sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@napi-rs/nice-darwin-arm64@1.0.1': - resolution: {integrity: sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==} + '@napi-rs/nice-darwin-arm64@1.1.1': + resolution: {integrity: sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@napi-rs/nice-darwin-x64@1.0.1': - resolution: {integrity: sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ==} + '@napi-rs/nice-darwin-x64@1.1.1': + resolution: {integrity: sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@napi-rs/nice-freebsd-x64@1.0.1': - resolution: {integrity: sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw==} + '@napi-rs/nice-freebsd-x64@1.1.1': + resolution: {integrity: sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@napi-rs/nice-linux-arm-gnueabihf@1.0.1': - resolution: {integrity: sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q==} + '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': + resolution: {integrity: sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@napi-rs/nice-linux-arm64-gnu@1.0.1': - resolution: {integrity: sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA==} + '@napi-rs/nice-linux-arm64-gnu@1.1.1': + resolution: {integrity: sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@napi-rs/nice-linux-arm64-musl@1.0.1': - resolution: {integrity: sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw==} + '@napi-rs/nice-linux-arm64-musl@1.1.1': + resolution: {integrity: sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@napi-rs/nice-linux-ppc64-gnu@1.0.1': - resolution: {integrity: sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q==} + '@napi-rs/nice-linux-ppc64-gnu@1.1.1': + resolution: {integrity: sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==} engines: {node: '>= 10'} cpu: [ppc64] os: [linux] - '@napi-rs/nice-linux-riscv64-gnu@1.0.1': - resolution: {integrity: sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig==} + '@napi-rs/nice-linux-riscv64-gnu@1.1.1': + resolution: {integrity: sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] - '@napi-rs/nice-linux-s390x-gnu@1.0.1': - resolution: {integrity: sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg==} + '@napi-rs/nice-linux-s390x-gnu@1.1.1': + resolution: {integrity: sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==} engines: {node: '>= 10'} cpu: [s390x] os: [linux] - '@napi-rs/nice-linux-x64-gnu@1.0.1': - resolution: {integrity: sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA==} + '@napi-rs/nice-linux-x64-gnu@1.1.1': + resolution: {integrity: sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@napi-rs/nice-linux-x64-musl@1.0.1': - resolution: {integrity: sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ==} + '@napi-rs/nice-linux-x64-musl@1.1.1': + resolution: {integrity: sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@napi-rs/nice-win32-arm64-msvc@1.0.1': - resolution: {integrity: sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg==} + '@napi-rs/nice-openharmony-arm64@1.1.1': + resolution: {integrity: sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [openharmony] + + '@napi-rs/nice-win32-arm64-msvc@1.1.1': + resolution: {integrity: sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@napi-rs/nice-win32-ia32-msvc@1.0.1': - resolution: {integrity: sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw==} + '@napi-rs/nice-win32-ia32-msvc@1.1.1': + resolution: {integrity: sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@napi-rs/nice-win32-x64-msvc@1.0.1': - resolution: {integrity: sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==} + '@napi-rs/nice-win32-x64-msvc@1.1.1': + resolution: {integrity: sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@napi-rs/nice@1.0.1': - resolution: {integrity: sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==} + '@napi-rs/nice@1.1.1': + resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==} engines: {node: '>= 10'} - '@nestjs/cli@11.0.6': - resolution: {integrity: sha512-Xco8pTdWHCpTXPTYMkUGAE+C7JXvAv38oVUaQeL81o7UOAi39w8p456r+IjONN/7ekjzakWnqepDzuTtH5Xk5w==} + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + + '@nestjs/cli@11.0.10': + resolution: {integrity: sha512-4waDT0yGWANg0pKz4E47+nUrqIJv/UqrZ5wLPkCqc7oMGRMWKAaw1NDZ9rKsaqhqvxb2LfI5+uXOWr4yi94DOQ==} engines: {node: '>= 20.11'} hasBin: true peerDependencies: - '@swc/cli': ^0.1.62 || ^0.3.0 || ^0.4.0 || ^0.5.0 || ^0.6.0 + '@swc/cli': ^0.1.62 || ^0.3.0 || ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 '@swc/core': ^1.3.62 peerDependenciesMeta: '@swc/cli': @@ -918,11 +829,11 @@ packages: '@swc/core': optional: true - '@nestjs/common@11.0.20': - resolution: {integrity: sha512-/GH8NDCczjn6+6RNEtSNAts/nq/wQE8L1qZ9TRjqjNqEsZNE1vpFuRIhmcO2isQZ0xY5rySnpaRdrOAul3gQ3A==} + '@nestjs/common@11.1.7': + resolution: {integrity: sha512-lwlObwGgIlpXSXYOTpfzdCepUyWomz6bv9qzGzzvpgspUxkj0Uz0fUJcvD44V8Ps7QhKW3lZBoYbXrH25UZrbA==} peerDependencies: - class-transformer: '*' - class-validator: '*' + class-transformer: '>=0.4.1' + class-validator: '>=0.13.2' reflect-metadata: ^0.1.12 || ^0.2.0 rxjs: ^7.1.0 peerDependenciesMeta: @@ -931,8 +842,8 @@ packages: class-validator: optional: true - '@nestjs/core@11.0.20': - resolution: {integrity: sha512-yUkEzBGiRNSEThVl6vMCXgoA9sDGWoRbJsTLdYdCC7lg7PE1iXBnna1FiBfQjT995pm0fjyM1e3WsXmyWeJXbw==} + '@nestjs/core@11.1.7': + resolution: {integrity: sha512-TyXFOwjhHv/goSgJ8i20K78jwTM0iSpk9GBcC2h3mf4MxNy+znI8m7nWjfoACjTkb89cTwDQetfTHtSfGLLaiA==} engines: {node: '>= 20'} peerDependencies: '@nestjs/common': ^11.0.0 @@ -962,19 +873,19 @@ packages: class-validator: optional: true - '@nestjs/platform-express@11.0.20': - resolution: {integrity: sha512-h/Xq2x0Qi2cr9T64w9DfLejZws1M1hYu7n7XWuC4vxX00FlfOz1jSWGgaTo/Gjq6vtULfq34Gp5Fzf0w34XDyQ==} + '@nestjs/platform-express@11.1.7': + resolution: {integrity: sha512-5T+GLdvTiGPKB4/P4PM9ftKUKNHJy8ThEFhZA3vQnXVL7Vf0rDr07TfVTySVu+XTh85m1lpFVuyFM6u6wLNsRA==} peerDependencies: '@nestjs/common': ^11.0.0 '@nestjs/core': ^11.0.0 - '@nestjs/schematics@11.0.5': - resolution: {integrity: sha512-T50SCNyqCZ/fDssaOD7meBKLZ87ebRLaJqZTJPvJKjlib1VYhMOCwXYsr7bjMPmuPgiQHOwvppz77xN/m6GM7A==} + '@nestjs/schematics@11.0.9': + resolution: {integrity: sha512-0NfPbPlEaGwIT8/TCThxLzrlz3yzDNkfRNpbL7FiplKq3w4qXpJg0JYwqgMEJnLQZm3L/L/5XjoyfJHUO3qX9g==} peerDependencies: typescript: '>=4.8.2' - '@nestjs/swagger@11.1.4': - resolution: {integrity: sha512-px+ue6YeNyExL7Vg39HMJb3iPgFJD5oiOzUFS+4I0PhKNznMjSxMMZyDh1M8cuhqt4s3YvE7b0e/v6BgWdx/bQ==} + '@nestjs/swagger@11.2.1': + resolution: {integrity: sha512-1MS7xf0pzc1mofG53xrrtrurnziafPUHkqzRm4YUVPA/egeiMaSerQBD/feiAeQ2BnX0WiLsTX4HQFO0icvOjQ==} peerDependencies: '@fastify/static': ^8.0.0 '@nestjs/common': ^11.0.1 @@ -990,8 +901,8 @@ packages: class-validator: optional: true - '@nestjs/testing@11.0.20': - resolution: {integrity: sha512-3o+HWsVfA46tt81ctKuNj5ufL9srfmp3dQBCAIx9fzvjooEKwWl5L69AcvDh6JhdB79jhhM1lkSSU+1fBGbxgw==} + '@nestjs/testing@11.1.7': + resolution: {integrity: sha512-QbtrgSlc3QVo6RHNxTTlyhaiobLLy8kvhOlgWHsoXRknybuRs7vZg4k5mo3ye6pITGeT3CrWIRpZjUsh5Wps5Q==} peerDependencies: '@nestjs/common': ^11.0.0 '@nestjs/core': ^11.0.0 @@ -1003,6 +914,10 @@ packages: '@nestjs/platform-express': optional: true + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1020,12 +935,19 @@ packages: engines: {node: ^14.18.0 || >=16.10.0, npm: '>=5.10.0'} hasBin: true - '@pkgr/core@0.2.4': - resolution: {integrity: sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==} + '@paralleldrive/cuid2@2.3.1': + resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@prisma/client@6.6.0': - resolution: {integrity: sha512-vfp73YT/BHsWWOAuthKQ/1lBgESSqYqAWZEYyTdGXyFAHpmewwWL2Iz6ErIzkj4aHbuc6/cGSsE6ZY+pBO04Cg==} + '@prisma/client@6.18.0': + resolution: {integrity: sha512-jnL2I9gDnPnw4A+4h5SuNn8Gc+1mL1Z79U/3I9eE2gbxJG1oSA+62ByPW4xkeDgwE0fqMzzpAZ7IHxYnLZ4iQA==} engines: {node: '>=18.18'} peerDependencies: prisma: '*' @@ -1036,32 +958,29 @@ packages: typescript: optional: true - '@prisma/config@6.6.0': - resolution: {integrity: sha512-d8FlXRHsx72RbN8nA2QCRORNv5AcUnPXgtPvwhXmYkQSMF/j9cKaJg+9VcUzBRXGy9QBckNzEQDEJZdEOZ+ubA==} + '@prisma/config@6.18.0': + resolution: {integrity: sha512-rgFzspCpwsE+q3OF/xkp0fI2SJ3PfNe9LLMmuSVbAZ4nN66WfBiKqJKo/hLz3ysxiPQZf8h1SMf2ilqPMeWATQ==} - '@prisma/debug@6.6.0': - resolution: {integrity: sha512-DL6n4IKlW5k2LEXzpN60SQ1kP/F6fqaCgU/McgaYsxSf43GZ8lwtmXLke9efS+L1uGmrhtBUP4npV/QKF8s2ZQ==} + '@prisma/debug@6.18.0': + resolution: {integrity: sha512-PMVPMmxPj0ps1VY75DIrT430MoOyQx9hmm174k6cmLZpcI95rAPXOQ+pp8ANQkJtNyLVDxnxVJ0QLbrm/ViBcg==} - '@prisma/engines-version@6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a': - resolution: {integrity: sha512-JzRaQ5Em1fuEcbR3nUsMNYaIYrOT1iMheenjCvzZblJcjv/3JIuxXN7RCNT5i6lRkLodW5ojCGhR7n5yvnNKrw==} + '@prisma/engines-version@6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f': + resolution: {integrity: sha512-T7Af4QsJQnSgWN1zBbX+Cha5t4qjHRxoeoWpK4JugJzG/ipmmDMY5S+O0N1ET6sCBNVkf6lz+Y+ZNO9+wFU8pQ==} - '@prisma/engines@6.6.0': - resolution: {integrity: sha512-nC0IV4NHh7500cozD1fBoTwTD1ydJERndreIjpZr/S3mno3P6tm8qnXmIND5SwUkibNeSJMpgl4gAnlqJ/gVlg==} + '@prisma/engines@6.18.0': + resolution: {integrity: sha512-i5RzjGF/ex6AFgqEe2o1IW8iIxJGYVQJVRau13kHPYEL1Ck8Zvwuzamqed/1iIljs5C7L+Opiz5TzSsUebkriA==} - '@prisma/fetch-engine@6.6.0': - resolution: {integrity: sha512-Ohfo8gKp05LFLZaBlPUApM0M7k43a0jmo86YY35u1/4t+vuQH9mRGU7jGwVzGFY3v+9edeb/cowb1oG4buM1yw==} + '@prisma/fetch-engine@6.18.0': + resolution: {integrity: sha512-TdaBvTtBwP3IoqVYoGIYpD4mWlk0pJpjTJjir/xLeNWlwog7Sl3bD2J0jJ8+5+q/6RBg+acb9drsv5W6lqae7A==} - '@prisma/get-platform@6.6.0': - resolution: {integrity: sha512-3qCwmnT4Jh5WCGUrkWcc6VZaw0JY7eWN175/pcb5Z6FiLZZ3ygY93UX0WuV41bG51a6JN/oBH0uywJ90Y+V5eA==} + '@prisma/get-platform@6.18.0': + resolution: {integrity: sha512-uXNJCJGhxTCXo2B25Ta91Rk1/Nmlqg9p7G9GKh8TPhxvAyXCvMNQoogj4JLEUy+3ku8g59cpyQIKFhqY2xO2bg==} '@scarf/scarf@1.4.0': resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==} - '@sec-ant/readable-stream@0.4.1': - resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sinclair/typebox@0.34.41': + resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} '@sindresorhus/is@5.6.0': resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} @@ -1070,11 +989,17 @@ packages: '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - '@sinonjs/fake-timers@10.3.0': - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@sinonjs/fake-timers@13.0.5': + resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} + + '@so-ric/colorspace@1.1.6': + resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} + + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} - '@swc/cli@0.6.0': - resolution: {integrity: sha512-Q5FsI3Cw0fGMXhmsg7c08i4EmXCrcl+WnAxb6LYOLHw4JFFC3yzmx9LaXZ7QMbA+JZXbigU2TirI7RAfO0Qlnw==} + '@swc/cli@0.7.8': + resolution: {integrity: sha512-27Ov4rm0s2C6LLX+NDXfDVB69LGs8K94sXtFhgeUyQ4DBywZuCgTBu2loCNHRr8JhT9DeQvJM5j9FAu/THbo4w==} engines: {node: '>= 16.14.0'} hasBin: true peerDependencies: @@ -1084,68 +1009,68 @@ packages: chokidar: optional: true - '@swc/core-darwin-arm64@1.11.21': - resolution: {integrity: sha512-v6gjw9YFWvKulCw3ZA1dY+LGMafYzJksm1mD4UZFZ9b36CyHFowYVYug1ajYRIRqEvvfIhHUNV660zTLoVFR8g==} + '@swc/core-darwin-arm64@1.13.5': + resolution: {integrity: sha512-lKNv7SujeXvKn16gvQqUQI5DdyY8v7xcoO3k06/FJbHJS90zEwZdQiMNRiqpYw/orU543tPaWgz7cIYWhbopiQ==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.11.21': - resolution: {integrity: sha512-CUiTiqKlzskwswrx9Ve5NhNoab30L1/ScOfQwr1duvNlFvarC8fvQSgdtpw2Zh3MfnfNPpyLZnYg7ah4kbT9JQ==} + '@swc/core-darwin-x64@1.13.5': + resolution: {integrity: sha512-ILd38Fg/w23vHb0yVjlWvQBoE37ZJTdlLHa8LRCFDdX4WKfnVBiblsCU9ar4QTMNdeTBEX9iUF4IrbNWhaF1Ng==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.11.21': - resolution: {integrity: sha512-YyBTAFM/QPqt1PscD8hDmCLnqPGKmUZpqeE25HXY8OLjl2MUs8+O4KjwPZZ+OGxpdTbwuWFyMoxjcLy80JODvg==} + '@swc/core-linux-arm-gnueabihf@1.13.5': + resolution: {integrity: sha512-Q6eS3Pt8GLkXxqz9TAw+AUk9HpVJt8Uzm54MvPsqp2yuGmY0/sNaPPNVqctCX9fu/Nu8eaWUen0si6iEiCsazQ==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.11.21': - resolution: {integrity: sha512-DQD+ooJmwpNsh4acrftdkuwl5LNxxg8U4+C/RJNDd7m5FP9Wo4c0URi5U0a9Vk/6sQNh9aSGcYChDpqCDWEcBw==} + '@swc/core-linux-arm64-gnu@1.13.5': + resolution: {integrity: sha512-aNDfeN+9af+y+M2MYfxCzCy/VDq7Z5YIbMqRI739o8Ganz6ST+27kjQFd8Y/57JN/hcnUEa9xqdS3XY7WaVtSw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.11.21': - resolution: {integrity: sha512-y1L49+snt1a1gLTYPY641slqy55QotPdtRK9Y6jMi4JBQyZwxC8swWYlQWb+MyILwxA614fi62SCNZNznB3XSA==} + '@swc/core-linux-arm64-musl@1.13.5': + resolution: {integrity: sha512-9+ZxFN5GJag4CnYnq6apKTnnezpfJhCumyz0504/JbHLo+Ue+ZtJnf3RhyA9W9TINtLE0bC4hKpWi8ZKoETyOQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.11.21': - resolution: {integrity: sha512-NesdBXv4CvVEaFUlqKj+GA4jJMNUzK2NtKOrUNEtTbXaVyNiXjFCSaDajMTedEB0jTAd9ybB0aBvwhgkJUWkWA==} + '@swc/core-linux-x64-gnu@1.13.5': + resolution: {integrity: sha512-WD530qvHrki8Ywt/PloKUjaRKgstQqNGvmZl54g06kA+hqtSE2FTG9gngXr3UJxYu/cNAjJYiBifm7+w4nbHbA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.11.21': - resolution: {integrity: sha512-qFV60pwpKVOdmX67wqQzgtSrUGWX9Cibnp1CXyqZ9Mmt8UyYGvmGu7p6PMbTyX7vdpVUvWVRf8DzrW2//wmVHg==} + '@swc/core-linux-x64-musl@1.13.5': + resolution: {integrity: sha512-Luj8y4OFYx4DHNQTWjdIuKTq2f5k6uSXICqx+FSabnXptaOBAbJHNbHT/06JZh6NRUouaf0mYXN0mcsqvkhd7Q==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.11.21': - resolution: {integrity: sha512-DJJe9k6gXR/15ZZVLv1SKhXkFst8lYCeZRNHH99SlBodvu4slhh/MKQ6YCixINRhCwliHrpXPym8/5fOq8b7Ig==} + '@swc/core-win32-arm64-msvc@1.13.5': + resolution: {integrity: sha512-cZ6UpumhF9SDJvv4DA2fo9WIzlNFuKSkZpZmPG1c+4PFSEMy5DFOjBSllCvnqihCabzXzpn6ykCwBmHpy31vQw==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.11.21': - resolution: {integrity: sha512-TqEXuy6wedId7bMwLIr9byds+mKsaXVHctTN88R1UIBPwJA92Pdk0uxDgip0pEFzHB/ugU27g6d8cwUH3h2eIw==} + '@swc/core-win32-ia32-msvc@1.13.5': + resolution: {integrity: sha512-C5Yi/xIikrFUzZcyGj9L3RpKljFvKiDMtyDzPKzlsDrKIw2EYY+bF88gB6oGY5RGmv4DAX8dbnpRAqgFD0FMEw==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.11.21': - resolution: {integrity: sha512-BT9BNNbMxdpUM1PPAkYtviaV0A8QcXttjs2MDtOeSqqvSJaPtyM+Fof2/+xSwQDmDEFzbGCcn75M5+xy3lGqpA==} + '@swc/core-win32-x64-msvc@1.13.5': + resolution: {integrity: sha512-YrKdMVxbYmlfybCSbRtrilc6UA8GF5aPmGKBdPvjrarvsmf4i7ZHGCEnLtfOMd3Lwbs2WUZq3WdMbozYeLU93Q==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.11.21': - resolution: {integrity: sha512-/Y3BJLcwd40pExmdar8MH2UGGvCBrqNN7hauOMckrEX2Ivcbv3IMhrbGX4od1dnF880Ed8y/E9aStZCIQi0EGw==} + '@swc/core@1.13.5': + resolution: {integrity: sha512-WezcBo8a0Dg2rnR82zhwoR6aRNxeTGfK5QCD6TQ+kg3xx/zNT02s/0o+81h/3zhvFSB24NtqEr8FTw88O5W/JQ==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -1156,8 +1081,8 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/types@0.1.21': - resolution: {integrity: sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==} + '@swc/types@0.1.25': + resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} @@ -1182,6 +1107,9 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -1191,11 +1119,11 @@ packages: '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.7': - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} @@ -1209,29 +1137,26 @@ packages: '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - - '@types/express-serve-static-core@4.19.6': - resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/express-serve-static-core@5.0.6': - resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} + '@types/express-serve-static-core@4.19.7': + resolution: {integrity: sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==} - '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/express-serve-static-core@5.1.0': + resolution: {integrity: sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==} - '@types/express@5.0.1': - resolution: {integrity: sha512-UZUw8vjpWFXuDnjFTh7/5c2TWDlQqeXHi6hcN7F2XSVT5P+WmUnnbFS3KA6Jnc6IsEqI2qCVu2bK0R0J4A8ZQQ==} + '@types/express@4.17.24': + resolution: {integrity: sha512-Mbrt4SRlXSTWryOnHAh2d4UQ/E7n9lZyGSi6KgX+4hkuL9soYbLOVXVhnk/ODp12YsGc95f4pOvqywJ6kngUwg==} - '@types/graceful-fs@4.1.9': - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + '@types/express@5.0.4': + resolution: {integrity: sha512-g64dbryHk7loCIrsa0R3shBnEu5p6LPJ09bu9NG58+jz+cRUjFrc3Bz0kNQ7j9bXeCsrRDvNET1G54P/GJkAyA==} '@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -1242,8 +1167,8 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/jest@29.5.14': - resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} + '@types/jest@30.0.0': + resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -1251,11 +1176,11 @@ packages: '@types/json-stringify-safe@5.0.3': resolution: {integrity: sha512-oNOjRxLfPeYbBSQ60maucaFNqbslVOPU4WWs5t/sHvAh6tyo/CThXSG+E24tEzkgh/fzvxyDrYdOJufgeNy1sQ==} - '@types/jsonwebtoken@9.0.9': - resolution: {integrity: sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==} + '@types/jsonwebtoken@9.0.10': + resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} - '@types/lodash@4.17.16': - resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==} + '@types/lodash@4.17.20': + resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==} '@types/methods@1.1.4': resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} @@ -1266,20 +1191,26 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@22.14.1': - resolution: {integrity: sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==} + '@types/node@22.18.12': + resolution: {integrity: sha512-BICHQ67iqxQGFSzfCFTT7MRQ5XcBjG5aeKh5Ok38UBbPe5fxTyE+aHFxwVrGyr8GNlqFMLKD1D3P2K/1ks8tog==} - '@types/qs@6.9.18': - resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} + '@types/node@24.9.1': + resolution: {integrity: sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==} + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + '@types/send@0.17.6': + resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} + + '@types/send@1.2.1': + resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/serve-static@1.15.10': + resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==} '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -1293,62 +1224,172 @@ packages: '@types/triple-beam@1.3.5': resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} - '@types/validator@13.15.0': - resolution: {integrity: sha512-nh7nrWhLr6CBq9ldtw0wx+z9wKnnv/uTVLA9g/3/TcOYxbpOSZE+MhKPmWqU+K0NvThjhv12uD8MuqijB0WzEA==} + '@types/validator@13.15.3': + resolution: {integrity: sha512-7bcUmDyS6PN3EuD9SlGGOxM77F8WLVsrwkxyWxKnxzmXoequ6c7741QBrANq6htVRGOITJ7z72mTP6Z4XyuG+Q==} '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - '@types/yargs@17.0.33': - resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + '@types/yargs@17.0.34': + resolution: {integrity: sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==} - '@typescript-eslint/eslint-plugin@8.30.1': - resolution: {integrity: sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q==} + '@typescript-eslint/eslint-plugin@8.46.2': + resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + '@typescript-eslint/parser': ^8.46.2 eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.30.1': - resolution: {integrity: sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg==} + '@typescript-eslint/parser@8.46.2': + resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.30.1': - resolution: {integrity: sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==} + '@typescript-eslint/project-service@8.46.2': + resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@8.46.2': + resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.30.1': - resolution: {integrity: sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA==} + '@typescript-eslint/tsconfig-utils@8.46.2': + resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.46.2': + resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.30.1': - resolution: {integrity: sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==} + '@typescript-eslint/types@8.46.2': + resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.30.1': - resolution: {integrity: sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==} + '@typescript-eslint/typescript-estree@8.46.2': + resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.30.1': - resolution: {integrity: sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==} + '@typescript-eslint/utils@8.46.2': + resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.30.1': - resolution: {integrity: sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==} + '@typescript-eslint/visitor-keys@8.46.2': + resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.11.1': + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.11.1': + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + cpu: [x64] + os: [win32] + '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -1394,40 +1435,40 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - '@xhmikosr/archive-type@7.0.0': - resolution: {integrity: sha512-sIm84ZneCOJuiy3PpWR5bxkx3HaNt1pqaN+vncUBZIlPZCq8ASZH+hBVdu5H8znR7qYC6sKwx+ie2Q7qztJTxA==} - engines: {node: ^14.14.0 || >=16.0.0} + '@xhmikosr/archive-type@7.1.0': + resolution: {integrity: sha512-xZEpnGplg1sNPyEgFh0zbHxqlw5dtYg6viplmWSxUj12+QjU9SKu3U/2G73a15pEjLaOqTefNSZ1fOPUOT4Xgg==} + engines: {node: '>=18'} - '@xhmikosr/bin-check@7.0.3': - resolution: {integrity: sha512-4UnCLCs8DB+itHJVkqFp9Zjg+w/205/J2j2wNBsCEAm/BuBmtua2hhUOdAMQE47b1c7P9Xmddj0p+X1XVsfHsA==} + '@xhmikosr/bin-check@7.1.0': + resolution: {integrity: sha512-y1O95J4mnl+6MpVmKfMYXec17hMEwE/yeCglFNdx+QvLLtP0yN4rSYcbkXnth+lElBuKKek2NbvOfOGPpUXCvw==} engines: {node: '>=18'} - '@xhmikosr/bin-wrapper@13.0.5': - resolution: {integrity: sha512-DT2SAuHDeOw0G5bs7wZbQTbf4hd8pJ14tO0i4cWhRkIJfgRdKmMfkDilpaJ8uZyPA0NVRwasCNAmMJcWA67osw==} + '@xhmikosr/bin-wrapper@13.2.0': + resolution: {integrity: sha512-t9U9X0sDPRGDk5TGx4dv5xiOvniVJpXnfTuynVKwHgtib95NYEw4MkZdJqhoSiz820D9m0o6PCqOPMXz0N9fIw==} engines: {node: '>=18'} - '@xhmikosr/decompress-tar@8.0.1': - resolution: {integrity: sha512-dpEgs0cQKJ2xpIaGSO0hrzz3Kt8TQHYdizHsgDtLorWajuHJqxzot9Hbi0huRxJuAGG2qiHSQkwyvHHQtlE+fg==} + '@xhmikosr/decompress-tar@8.1.0': + resolution: {integrity: sha512-m0q8x6lwxenh1CrsTby0Jrjq4vzW/QU1OLhTHMQLEdHpmjR1lgahGz++seZI0bXF3XcZw3U3xHfqZSz+JPP2Gg==} engines: {node: '>=18'} - '@xhmikosr/decompress-tarbz2@8.0.2': - resolution: {integrity: sha512-p5A2r/AVynTQSsF34Pig6olt9CvRj6J5ikIhzUd3b57pUXyFDGtmBstcw+xXza0QFUh93zJsmY3zGeNDlR2AQQ==} + '@xhmikosr/decompress-tarbz2@8.1.0': + resolution: {integrity: sha512-aCLfr3A/FWZnOu5eqnJfme1Z1aumai/WRw55pCvBP+hCGnTFrcpsuiaVN5zmWTR53a8umxncY2JuYsD42QQEbw==} engines: {node: '>=18'} - '@xhmikosr/decompress-targz@8.0.1': - resolution: {integrity: sha512-mvy5AIDIZjQ2IagMI/wvauEiSNHhu/g65qpdM4EVoYHUJBAmkQWqcPJa8Xzi1aKVTmOA5xLJeDk7dqSjlHq8Mg==} + '@xhmikosr/decompress-targz@8.1.0': + resolution: {integrity: sha512-fhClQ2wTmzxzdz2OhSQNo9ExefrAagw93qaG1YggoIz/QpI7atSRa7eOHv4JZkpHWs91XNn8Hry3CwUlBQhfPA==} engines: {node: '>=18'} - '@xhmikosr/decompress-unzip@7.0.0': - resolution: {integrity: sha512-GQMpzIpWTsNr6UZbISawsGI0hJ4KA/mz5nFq+cEoPs12UybAqZWKbyIaZZyLbJebKl5FkLpsGBkrplJdjvUoSQ==} + '@xhmikosr/decompress-unzip@7.1.0': + resolution: {integrity: sha512-oqTYAcObqTlg8owulxFTqiaJkfv2SHsxxxz9Wg4krJAHVzGWlZsU8tAB30R6ow+aHrfv4Kub6WQ8u04NWVPUpA==} engines: {node: '>=18'} - '@xhmikosr/decompress@10.0.1': - resolution: {integrity: sha512-6uHnEEt5jv9ro0CDzqWlFgPycdE+H+kbJnwyxgZregIMLQ7unQSCNVsYG255FoqU8cP46DyggI7F7LohzEl8Ag==} + '@xhmikosr/decompress@10.2.0': + resolution: {integrity: sha512-MmDBvu0+GmADyQWHolcZuIWffgfnuTo4xpr2I/Qw5Ox0gt+e1Be7oYqJM4te5ylL6mzlcoicnHVDvP27zft8tg==} engines: {node: '>=18'} - '@xhmikosr/downloader@15.0.1': - resolution: {integrity: sha512-fiuFHf3Dt6pkX8HQrVBsK0uXtkgkVlhrZEh8b7VgoDqFf+zrgFBPyrwCqE/3nDwn3hLeNz+BsrS7q3mu13Lp1g==} + '@xhmikosr/downloader@15.2.0': + resolution: {integrity: sha512-lAqbig3uRGTt0sHNIM4vUG9HoM+mRl8K28WuYxyXLCUT6pyzl4Y4i0LZ3jMEsCYZ6zjPZbO9XkG91OSTd4si7g==} engines: {node: '>=18'} '@xhmikosr/os-filter-obj@3.0.0': @@ -1444,6 +1485,12 @@ packages: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} + acorn-import-phases@1.0.4: + resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} + engines: {node: '>=10.13.0'} + peerDependencies: + acorn: ^8.14.0 + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1453,8 +1500,8 @@ packages: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true @@ -1502,8 +1549,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} ansi-styles@4.3.0: @@ -1514,12 +1561,12 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} - ansis@3.17.0: - resolution: {integrity: sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==} + ansis@4.1.0: + resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} engines: {node: '>=14'} anymatch@3.1.3: @@ -1553,46 +1600,60 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - axios@1.8.4: - resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} + axios@1.12.2: + resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} - b4a@1.6.7: - resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + b4a@1.7.3: + resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true - babel-jest@29.7.0: - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + babel-jest@30.2.0: + resolution: {integrity: sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: - '@babel/core': ^7.8.0 + '@babel/core': ^7.11.0 || ^8.0.0-0 - babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} + babel-plugin-istanbul@7.0.1: + resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==} + engines: {node: '>=12'} - babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + babel-plugin-jest-hoist@30.2.0: + resolution: {integrity: sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - babel-preset-current-node-syntax@1.1.0: - resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + babel-preset-current-node-syntax@1.2.0: + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0 || ^8.0.0-0 - babel-preset-jest@29.6.3: - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + babel-preset-jest@30.2.0: + resolution: {integrity: sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.11.0 || ^8.0.0-beta.1 balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bare-events@2.5.4: - resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} + bare-events@2.8.1: + resolution: {integrity: sha512-oxSAxTS1hRfnyit2CL5QpAOS5ixfBjj6ex3yTNvXyY/kE719jQ/IjuESJBK2w5v4wwQRAHGseVJXx9QBYOtFGQ==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.8.20: + resolution: {integrity: sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ==} + hasBin: true + bin-version-check@5.1.0: resolution: {integrity: sha512-bYsvMqJ8yNGILLz1KP9zKLzQ6YpljV3ln1gqhuLkUtyfGi3qXKGuK2p+U4NAvjVFzDFiBBtOpCOSFNuYYEGZ5g==} engines: {node: '>=12'} @@ -1608,18 +1669,18 @@ packages: resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} engines: {node: '>=18'} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.24.4: - resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + browserslist@4.27.0: + resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1650,6 +1711,14 @@ 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 + cacheable-lookup@7.0.0: resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} engines: {node: '>=14.16'} @@ -1678,8 +1747,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001714: - resolution: {integrity: sha512-mtgapdwDLSSBnCI3JokHM7oEQBLxiJKVRtg10AxM1AyeiKcM96f0Mkbqeq+1AbiCtvMcHRulAAEMu693JrSWqg==} + caniuse-lite@1.0.30001751: + resolution: {integrity: sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -1689,8 +1758,8 @@ packages: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + chardet@2.1.0: + resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} @@ -1700,18 +1769,21 @@ packages: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + ci-info@4.3.1: + resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} engines: {node: '>=8'} - cjs-module-lexer@1.4.3: - resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + + cjs-module-lexer@2.1.0: + resolution: {integrity: sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==} class-transformer@0.5.1: resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} - class-validator@0.14.1: - resolution: {integrity: sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==} + class-validator@0.14.2: + resolution: {integrity: sha512-3kMVRF2io8N8pY1IFIXlho9r8IPUUIfHe2hYVtiebvAzU2XeQFXTv+XI4WX+TnXmtwXMDcjngcpkiPM0O9PvLw==} cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} @@ -1741,30 +1813,31 @@ packages: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + collect-v8-coverage@1.0.3: + resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-convert@3.1.2: + resolution: {integrity: sha512-UNqkvCDXstVck3kdowtOTWROIJQwafjOfXSmddoDrXo4cewMKmusCeF22Q24zvjR8nwWib/3S/dfyzPItPEiJg==} + engines: {node: '>=14.6'} color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + color-name@2.0.2: + resolution: {integrity: sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==} + engines: {node: '>=12.20'} - color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + color-string@2.1.2: + resolution: {integrity: sha512-RxmjYxbWemV9gKu4zPgiZagUxbH3RQpEIO77XoSSX0ivgABDZ+h8Zuash/EMFLTI4N9QgFPOJ6JQpPZKFxa+dA==} + engines: {node: '>=18'} - colorspace@1.1.4: - resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + color@5.0.2: + resolution: {integrity: sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==} + engines: {node: '>=18'} combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} @@ -1785,8 +1858,8 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} - comment-json@4.2.5: - resolution: {integrity: sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==} + comment-json@4.4.1: + resolution: {integrity: sha512-r1To31BQD5060QdkC+Iheai7gHwoSZobzunqkf2/kQ6xIAfJyrKNAFUwdKvkK7Qgu7pVTKQEa7ok7Ed3ycAJgg==} engines: {node: '>= 6'} component-emitter@1.3.1: @@ -1795,9 +1868,12 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} @@ -1845,11 +1921,6 @@ packages: typescript: optional: true - create-jest@29.7.0: - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -1857,21 +1928,21 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - csv-generate@4.4.2: - resolution: {integrity: sha512-W6nVsf+rz0J3yo9FOjeer7tmzBJKaTTxf7K0uw6GZgRocZYPVpuSWWa5/aoWWrjQZj4/oNIKTYapOM7hiNjVMA==} + csv-generate@4.5.0: + resolution: {integrity: sha512-aQr/vmOKyBSBHNwYhAoXw1+kUsPnMSwmYgpNoo36rIXoG1ecWILnvPGZeQ6oUjzrWknZAD3+jfpqYOBAl4x15A==} - csv-parse@5.6.0: - resolution: {integrity: sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q==} + csv-parse@6.1.0: + resolution: {integrity: sha512-CEE+jwpgLn+MmtCpVcPtiCZpVtB6Z2OKPTr34pycYYoL7sxdOkXDdQ4lRiw6ioC0q6BLqhc6cKweCVvral8yhw==} - csv-stringify@6.5.2: - resolution: {integrity: sha512-RFPahj0sXcmUyjrObAK+DOWtMvMIFV328n4qZJhgX3x2RqkQgOTU2mCUmiFR0CzM6AzChlRSUErjiJeEt8BaQA==} + csv-stringify@6.6.0: + resolution: {integrity: sha512-YW32lKOmIBgbxtu3g5SaiqWNwa/9ISQt2EcgOq0+RAIFufFp9is6tqNnKahqE5kuKvrnYAzs28r+s6pXJR8Vcw==} - csv@6.3.11: - resolution: {integrity: sha512-a8bhT76Q546jOElHcTrkzWY7Py925mfLO/jqquseH61ThOebYwOjLbWHBqdRB4K1VpU36sTyIei6Jwj7QdEZ7g==} + csv@6.4.1: + resolution: {integrity: sha512-ajGosmTGnTwYyGl8STqZDu7R6LkDf3xL39XiOmliV/GufQeVUxHzTKIm4NOBCwmEuujK7B6isxs4Uqt9GcRCvA==} engines: {node: '>= 0.1.90'} - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1883,8 +1954,8 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - dedent@1.5.3: - resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + dedent@1.7.0: + resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -1894,6 +1965,10 @@ packages: 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'} @@ -1901,14 +1976,17 @@ packages: defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - defaults@3.0.0: - resolution: {integrity: sha512-RsqXDEAALjfRTro+IFNKpcPCt0/Cy2FqHSIlnomiJp9YGadpQnrtbRpSgN2+np21qHcIKiva4fiOQGjS9/qR/A==} - engines: {node: '>=18'} + defaults@2.0.2: + resolution: {integrity: sha512-cuIw0PImdp76AOfgkjbW4VhQODRmNNcKR73vdCH5cLd/ifj7aamfoXvYgfGkEAjNJZ3ozMIy9Gu2LutUkGEPbA==} + engines: {node: '>=16'} defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -1917,6 +1995,9 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -1924,16 +2005,16 @@ packages: dezalgo@1.0.4: resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} - dotenv@16.5.0: - resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + + dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} engines: {node: '>=12'} dunder-proto@1.0.1: @@ -1949,13 +2030,11 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true + effect@3.18.4: + resolution: {integrity: sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==} - electron-to-chromium@1.5.138: - resolution: {integrity: sha512-FWlQc52z1dXqm+9cCJ2uyFgJkESd+16j6dBEjsgDNuHjBpuIzL8/lRc0uvh1k8RNI6waGo6tcy2DvwkTBJOLDg==} + electron-to-chromium@1.5.240: + resolution: {integrity: sha512-OBwbZjWgrCOH+g6uJsA2/7Twpas2OlepS9uvByJjR2datRDuKGYeD+nP8lBBks2qnB7bGJNHDUx7c/YLaT3QMQ==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -1967,6 +2046,10 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + empathic@2.0.0: + resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + engines: {node: '>=14'} + enabled@2.0.0: resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} @@ -1974,12 +2057,12 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - enhanced-resolve@5.18.1: - resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} @@ -1989,8 +2072,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@1.6.0: - resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} @@ -2000,16 +2083,6 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - esbuild-register@3.6.0: - resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} - peerDependencies: - esbuild: '>=0.12 <1' - - esbuild@0.25.2: - resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==} - engines: {node: '>=18'} - hasBin: true - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -2025,14 +2098,14 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-prettier@10.1.2: - resolution: {integrity: sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA==} + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true peerDependencies: eslint: '>=7.0.0' - eslint-plugin-prettier@5.2.6: - resolution: {integrity: sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==} + eslint-plugin-prettier@5.5.4: + resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' @@ -2049,20 +2122,20 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - eslint-scope@8.3.0: - resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.24.0: - resolution: {integrity: sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==} + eslint@9.38.0: + resolution: {integrity: sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -2071,8 +2144,8 @@ packages: jiti: optional: true - espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esprima@4.0.1: @@ -2104,6 +2177,9 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -2112,18 +2188,21 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} - exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + exit-x@0.2.2: + resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} engines: {node: '>= 0.8.0'} - expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + expect@30.2.0: + resolution: {integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} express@5.1.0: resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} engines: {node: '>= 18'} + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + ext-list@2.2.2: resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} engines: {node: '>=0.10.0'} @@ -2132,9 +2211,9 @@ packages: resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==} engines: {node: '>=4'} - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + 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==} @@ -2158,8 +2237,8 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -2167,6 +2246,15 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} @@ -2177,16 +2265,13 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - file-type@19.6.0: - resolution: {integrity: sha512-VZR5I7k5wkD0HgFnMsq5hOsSc710MJMu5Nc5QYsbe38NN5iPV/XTObYLc/cpttRTf6lX538+5uO1ZQRhYibiZQ==} + file-type@20.5.0: + resolution: {integrity: sha512-BfHZtG/l9iMm4Ecianu7P8HRD2tBHLtjXinm4X62XBOYzi7CYA7jyqfJzOvXHqzVrVPYqBo2/GvbARMaaJkKVg==} engines: {node: '>=18'} - file-type@20.4.1: - resolution: {integrity: sha512-hw9gNZXUfZ02Jo0uafWLaFVPter5/k2rfcrjFJJHX/77xtSDOfJuEFb6oKlFV86FLP1SuyHMW1PSk0U9M5tKkQ==} - engines: {node: '>=18'} - - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + file-type@21.0.0: + resolution: {integrity: sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg==} + engines: {node: '>=20'} filename-reserved-regex@3.0.0: resolution: {integrity: sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==} @@ -2226,8 +2311,8 @@ packages: fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -2250,12 +2335,13 @@ packages: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} - form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} - formidable@3.5.2: - resolution: {integrity: sha512-Jqc1btCy3QzRbJaICGwKcBfGWuLADRerLzDqi2NwSt/UkXLsHJw2TVResiaoBufHVHy9aSgClOHCeJsSsFLTbg==} + formidable@3.5.4: + resolution: {integrity: sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==} + engines: {node: '>=14.0.0'} forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} @@ -2269,8 +2355,8 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} - fs-monkey@1.0.6: - resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} + fs-monkey@1.1.0: + resolution: {integrity: sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==} fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -2307,9 +2393,9 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - get-stream@9.0.1: - resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} - engines: {node: '>=18'} + giget@2.0.0: + resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} + hasBin: true glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -2322,8 +2408,12 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@11.0.1: - resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@11.0.3: + resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} engines: {node: 20 || >=22} hasBin: true @@ -2331,16 +2421,12 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.15.0: - resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + globals@16.4.0: + resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} engines: {node: '>=18'} gopd@1.2.0: @@ -2357,14 +2443,15 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-own-prop@2.0.0: - resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} - engines: {node: '>=8'} - has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -2377,15 +2464,11 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hexoid@2.0.0: - resolution: {integrity: sha512-qlspKUK7IlSQv2o+5I7yhUd7TxlOG2Vr5LTa3ve2XSNVKAL/n/u/7KLvKmFNimomDIKvZFXWHv0T12mv7rT8Aw==} - engines: {node: '>=8'} - html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} @@ -2399,14 +2482,14 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} - 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'} + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -2414,6 +2497,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -2444,13 +2531,6 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2486,17 +2566,10 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-stream@4.0.1: - resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} - engines: {node: '>=18'} - is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -2504,10 +2577,6 @@ packages: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} - istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - istanbul-lib-instrument@6.0.3: resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} engines: {node: '>=10'} @@ -2516,38 +2585,36 @@ packages: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} iterare@1.2.1: resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} engines: {node: '>=6'} - jackspeak@4.1.0: - resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} - engines: {node: 20 || >=22} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jake@10.9.2: - resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} - engines: {node: '>=10'} - hasBin: true + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} - jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-changed-files@30.2.0: + resolution: {integrity: sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-circus@30.2.0: + resolution: {integrity: sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-cli@29.7.0: - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-cli@30.2.0: + resolution: {integrity: sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -2555,57 +2622,56 @@ packages: node-notifier: optional: true - jest-config@29.7.0: - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-config@30.2.0: + resolution: {integrity: sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@types/node': '*' + esbuild-register: '>=3.4.0' ts-node: '>=9.0.0' peerDependenciesMeta: '@types/node': optional: true + esbuild-register: + optional: true ts-node: optional: true - jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-diff@30.2.0: + resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-docblock@30.2.0: + resolution: {integrity: sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-each@30.2.0: + resolution: {integrity: sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-environment-node@30.2.0: + resolution: {integrity: sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-haste-map@30.2.0: + resolution: {integrity: sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-leak-detector@30.2.0: + resolution: {integrity: sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-matcher-utils@30.2.0: + resolution: {integrity: sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-message-util@30.2.0: + resolution: {integrity: sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-mock@30.2.0: + resolution: {integrity: sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-pnp-resolver@1.2.3: resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} @@ -2616,53 +2682,53 @@ packages: jest-resolve: optional: true - jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-regex-util@30.0.1: + resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-resolve-dependencies@30.2.0: + resolution: {integrity: sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-resolve@30.2.0: + resolution: {integrity: sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-runner@30.2.0: + resolution: {integrity: sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-runtime@30.2.0: + resolution: {integrity: sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-snapshot@30.2.0: + resolution: {integrity: sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-util@30.2.0: + resolution: {integrity: sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-validate@30.2.0: + resolution: {integrity: sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-watcher@30.2.0: + resolution: {integrity: sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} - jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-worker@30.2.0: + resolution: {integrity: sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest@29.7.0: - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest@30.2.0: + resolution: {integrity: sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -2670,6 +2736,10 @@ packages: node-notifier: optional: true + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + jose@4.15.9: resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} @@ -2715,15 +2785,15 @@ packages: jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} - jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + jwa@1.4.2: + resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} jwks-rsa@3.2.0: resolution: {integrity: sha512-PwchfHcQK/5PSydeKCs1ylNym0w/SSv8a62DgHJ//7x2ZclCoinlsjAfDxAAbpoTPybOum/Jgy+vkvMmKz89Ww==} @@ -2739,10 +2809,6 @@ packages: 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'} - kuler@2.0.0: resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} @@ -2754,8 +2820,8 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - libphonenumber-js@1.12.7: - resolution: {integrity: sha512-0nYZSNj/QEikyhcM5RZFXGlCB/mr4PVamnT1C2sKBnDDTYndrvbybYjvg+PMqAndQHlLbwQ3socolnL3WWTUFA==} + libphonenumber-js@1.12.25: + resolution: {integrity: sha512-u90tUu/SEF8b+RaDKCoW7ZNFDakyBtFlX1ex3J+VH+ElWes/UaitJLt/w4jGu8uAE41lltV/s+kMVtywcMEg7g==} limiter@1.1.5: resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} @@ -2763,12 +2829,12 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - load-esm@1.0.2: - resolution: {integrity: sha512-nVAvWk/jeyrWyXEAs84mpQCYccxRqgKY4OznLuJhJCa0XsPSfdOIr2zvBZEj3IHEHbX97jjscKRRV539bW0Gpw==} + load-esm@1.0.3: + resolution: {integrity: sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==} engines: {node: '>=13.2.0'} - loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + loader-runner@4.3.1: + resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} engines: {node: '>=6.11.5'} locate-path@5.0.0: @@ -2824,8 +2890,11 @@ packages: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lru-cache@11.1.0: - resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.2.2: + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -2919,17 +2988,13 @@ packages: resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} engines: {node: 20 || >=22} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -2948,19 +3013,24 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - multer@1.4.5-lts.2: - resolution: {integrity: sha512-VzGiVigcG9zUAoCNU+xShztrlr1auZOlurXynNvO9GiWD1/mTBbUljOKY+qMeazBqXgRnjzeEgJI/wyjJUHg9A==} - engines: {node: '>= 6.0.0'} + multer@2.0.2: + resolution: {integrity: sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==} + engines: {node: '>= 10.16.0'} mute-stream@2.0.0: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} engines: {node: ^18.17.0 || >=20.5.0} - nanoid@5.1.5: - resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} + nanoid@5.1.6: + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} engines: {node: ^18 || >=20} hasBin: true + napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -2977,24 +3047,32 @@ packages: node-emoji@1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.26: + resolution: {integrity: sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==} normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - normalize-url@8.0.1: - resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + normalize-url@8.1.0: + resolution: {integrity: sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==} engines: {node: '>=14.16'} npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} + nypm@0.6.2: + resolution: {integrity: sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==} + engines: {node: ^14.16.0 || >=16.10.0} + hasBin: true + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -3003,6 +3081,9 @@ packages: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} + 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'} @@ -3025,10 +3106,6 @@ packages: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - p-cancelable@3.0.0: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} @@ -3080,32 +3157,30 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} path-scurry@2.0.0: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} engines: {node: 20 || >=22} - path-to-regexp@8.2.0: - resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} - engines: {node: '>=16'} + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - peek-readable@5.4.2: - resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} - engines: {node: '>=14.16'} - - peek-readable@7.0.0: - resolution: {integrity: sha512-nri2TO5JE3/mRryik9LlHFT53cgHfRK0Lt0BAZQXku/AW3E6XLt2GaY8siWi7dvW/m1z0ecn+J+bpDa9ZN3IsQ==} - engines: {node: '>=18'} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -3117,6 +3192,10 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -3128,6 +3207,9 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -3140,17 +3222,17 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier@3.5.3: - resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} hasBin: true - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@30.2.0: + resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - prisma@6.6.0: - resolution: {integrity: sha512-SYCUykz+1cnl6Ugd8VUvtTQq5+j1Q7C0CtzKPjQ8JyA2ALh0EEJkMCS+KgdnvKW1lrxjtjCyJSHOOT236mENYg==} + prisma@6.18.0: + resolution: {integrity: sha512-bXWy3vTk8mnRmT+SLyZBQoC2vtV9Z8u7OHvEu+aULYxwiop/CPiFZ+F56KsNRNf35jw+8wcu8pmLsjxpBxAO9g==} engines: {node: '>=18.18'} hasBin: true peerDependencies: @@ -3159,13 +3241,6 @@ packages: typescript: optional: true - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -3180,6 +3255,9 @@ packages: pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + pure-rand@7.0.1: + resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} + qs@6.14.0: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} @@ -3198,16 +3276,16 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - raw-body@3.0.0: - resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} - engines: {node: '>= 0.8'} + raw-body@3.0.1: + resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==} + engines: {node: '>= 0.10'} + + rc9@2.1.2: + resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - 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'} @@ -3219,10 +3297,6 @@ packages: reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} - repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -3246,15 +3320,6 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve.exports@2.0.3: - resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} - engines: {node: '>=10'} - - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} - hasBin: true - responselike@3.0.0: resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} engines: {node: '>=14.16'} @@ -3280,9 +3345,6 @@ packages: rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -3297,8 +3359,8 @@ packages: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} - schema-utils@4.3.0: - resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} seek-bzip@2.0.0: @@ -3317,8 +3379,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true @@ -3367,12 +3429,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -3399,6 +3455,10 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -3413,15 +3473,19 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - stream-transform@3.3.3: - resolution: {integrity: sha512-dALXrXe+uq4aO5oStdHKlfCM/b3NBdouigvxVPxCdrMRAU6oHh3KNss20VbTPQNQmjAHzZGKGe66vgwegFEIog==} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + stream-transform@3.4.0: + resolution: {integrity: sha512-QO3OGhKyeIV8p6eRQdG+W6WounFw519zk690hHCNfhgfP9bylVS+NTXsuBc7n+RsGn31UgFPGrWYIgoAbArKEw==} streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - streamx@2.22.0: - resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} + streamx@2.23.0: + resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} @@ -3435,9 +3499,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - 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==} @@ -3445,8 +3506,8 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} strip-bom@3.0.0: @@ -3468,20 +3529,16 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strtok3@10.2.2: - resolution: {integrity: sha512-Xt18+h4s7Z8xyZ0tmBoRmzxcop97R4BAh+dXouUDCYn+Em+1P3qpkUfI5ueWLT8ynC5hZ+q4iPEmGG1urvQGBg==} + strtok3@10.3.4: + resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} engines: {node: '>=18'} - strtok3@9.1.1: - resolution: {integrity: sha512-FhwotcEqjr241ZbjFzjlIYg6c5/L/s4yBGWSMvJ9UoExiSqL+FnFA/CaeZx17WGaZMS/4SOZp8wH18jSS4R4lw==} - engines: {node: '>=16'} - - superagent@9.0.2: - resolution: {integrity: sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==} + superagent@10.2.3: + resolution: {integrity: sha512-y/hkYGeXAj7wUMjxRbB21g/l6aAEituGXM9Rwl4o20+SX3e8YOSV6BxFXl+dL3Uk0mjSL3kCbNkwURm8/gEDig==} engines: {node: '>=14.18.0'} - supertest@7.1.0: - resolution: {integrity: sha512-5QeSO8hSrKghtcWEoPiO036fxH0Ii2wVQfFZSP0oqQhmjk8bOLhDFXr4JrvaFmPuEWUoq4znY3uSi8UzLKxGqw==} + supertest@7.1.4: + resolution: {integrity: sha512-tjLPs7dVyqgItVFirHYqe2T+MfWc2VOBQ8QFKKbWTA3PU7liZR8zoSpAi/C1k1ilm9RsXIKYf197oap9wXGVYg==} engines: {node: '>=14.18.0'} supports-color@7.2.0: @@ -3492,23 +3549,19 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - swagger-ui-dist@5.21.0: - resolution: {integrity: sha512-E0K3AB6HvQd8yQNSMR7eE5bk+323AUxjtCz/4ZNKiahOlPhPJxqn3UPIGs00cyY/dhrTDJ61L7C/a8u6zhGrZg==} + swagger-ui-dist@5.29.4: + resolution: {integrity: sha512-gJFDz/gyLOCQtWwAgqs6Rk78z9ONnqTnlW11gimG9nLap8drKa3AJBKpzIQMIjl5PD2Ix+Tn+mc/tfoT2tgsng==} symbol-observable@4.0.0: resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} engines: {node: '>=0.10'} - synckit@0.11.4: - resolution: {integrity: sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ==} + synckit@0.11.11: + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} engines: {node: ^14.18.0 || >=16.0.0} - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} tar-stream@3.1.7: @@ -3530,8 +3583,8 @@ packages: uglify-js: optional: true - terser@5.39.0: - resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} + terser@5.44.0: + resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} engines: {node: '>=10'} hasBin: true @@ -3548,9 +3601,12 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -3563,8 +3619,8 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - token-types@6.0.0: - resolution: {integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==} + token-types@6.1.1: + resolution: {integrity: sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ==} engines: {node: '>=14.16'} tree-kill@1.2.2: @@ -3584,17 +3640,18 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-jest@29.3.2: - resolution: {integrity: sha512-bJJkrWc6PjFVz5g2DGCNUo8z7oFEYaz1xP1NpeDU7KNLMWPpEyV8Chbpkn8xjzgRDpQhnGMyvyldoL7h8JXyug==} + ts-jest@29.4.5: + resolution: {integrity: sha512-HO3GyiWn2qvTQA4kTgjDcXiMwYQt68a1Y8+JuLRVpdIzm+UOLSHgl/XqR4c6nzJkq5rOkjc02O2I7P7l/Yof0Q==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/transform': ^29.0.0 - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 + '@jest/transform': ^29.0.0 || ^30.0.0 + '@jest/types': ^29.0.0 || ^30.0.0 + babel-jest: ^29.0.0 || ^30.0.0 esbuild: '*' - jest: ^29.0.0 + jest: ^29.0.0 || ^30.0.0 + jest-util: ^29.0.0 || ^30.0.0 typescript: '>=4.3 <6' peerDependenciesMeta: '@babel/core': @@ -3607,9 +3664,11 @@ packages: optional: true esbuild: optional: true + jest-util: + optional: true - ts-loader@9.5.2: - resolution: {integrity: sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==} + ts-loader@9.5.4: + resolution: {integrity: sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ==} engines: {node: '>=12.0.0'} peerDependencies: typescript: '*' @@ -3652,8 +3711,8 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - type-fest@4.40.0: - resolution: {integrity: sha512-ABHZ2/tS2JkvH1PEjxFDTUWC8dB5OsIGZP4IFLhR293GqT5Y5qB1WwL2kMPYhQW9DVgVD8Hd7I8gjwPIf5GFkw==} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} type-is@1.6.18: @@ -3667,29 +3726,34 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript-eslint@8.30.1: - resolution: {integrity: sha512-D7lC0kcehVH7Mb26MRQi64LMyRJsj3dToJxM1+JVTl53DQSV5/7oUGWQLcKl1C1KnoVHxMMU2FNQMffr7F3Row==} + typescript-eslint@8.46.2: + resolution: {integrity: sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - typescript@5.7.3: - resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + uid@2.0.2: resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} engines: {node: '>=8'} - uint8array-extras@1.4.0: - resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==} + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} engines: {node: '>=18'} unbzip2-stream@1.4.3: @@ -3698,6 +3762,9 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -3706,8 +3773,11 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + unrs-resolver@1.11.1: + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + + update-browserslist-db@1.1.4: + resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -3725,8 +3795,8 @@ packages: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} - validator@13.15.0: - resolution: {integrity: sha512-36B2ryl4+oL5QxZ3AzD0t5SsMNGvTtQHpjgFO5tbNxfXbMFkY822ktCDe1MnlqV3301QQI9SLHDNJokDI+Z9pA==} + validator@13.15.20: + resolution: {integrity: sha512-KxPOq3V2LmfQPP4eqf3Mq/zrT0Dqp2Vmx2Bn285LwVahLc+CsxOM0crBHczm8ijlcjZ0Q5Xd6LW3z3odTPnlrw==} engines: {node: '>= 0.10'} vary@1.1.2: @@ -3736,8 +3806,8 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - watchpack@2.4.2: - resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} + watchpack@2.4.4: + resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} engines: {node: '>=10.13.0'} wcwidth@1.0.1: @@ -3747,12 +3817,12 @@ packages: resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} engines: {node: '>=6'} - webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + webpack-sources@3.3.3: + resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} engines: {node: '>=10.13.0'} - webpack@5.98.0: - resolution: {integrity: sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==} + webpack@5.100.2: + resolution: {integrity: sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -3770,14 +3840,17 @@ packages: resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} engines: {node: '>= 12.0.0'} - winston@3.17.0: - resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} + winston@3.18.3: + resolution: {integrity: sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==} engines: {node: '>= 12.0.0'} word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -3793,9 +3866,9 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} @@ -3831,18 +3904,24 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yoctocolors-cjs@2.1.2: - resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} snapshots: - '@ampproject/remapping@2.3.0': + '@angular-devkit/core@19.2.15(chokidar@4.0.3)': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + jsonc-parser: 3.3.1 + picomatch: 4.0.2 + rxjs: 7.8.1 + source-map: 0.7.4 + optionalDependencies: + chokidar: 4.0.3 - '@angular-devkit/core@19.2.6(chokidar@4.0.3)': + '@angular-devkit/core@19.2.17(chokidar@4.0.3)': dependencies: ajv: 8.17.1 ajv-formats: 3.0.1(ajv@8.17.1) @@ -3853,11 +3932,11 @@ snapshots: optionalDependencies: chokidar: 4.0.3 - '@angular-devkit/schematics-cli@19.2.6(@types/node@22.14.1)(chokidar@4.0.3)': + '@angular-devkit/schematics-cli@19.2.15(@types/node@24.9.1)(chokidar@4.0.3)': dependencies: - '@angular-devkit/core': 19.2.6(chokidar@4.0.3) - '@angular-devkit/schematics': 19.2.6(chokidar@4.0.3) - '@inquirer/prompts': 7.3.2(@types/node@22.14.1) + '@angular-devkit/core': 19.2.15(chokidar@4.0.3) + '@angular-devkit/schematics': 19.2.15(chokidar@4.0.3) + '@inquirer/prompts': 7.3.2(@types/node@24.9.1) ansi-colors: 4.1.3 symbol-observable: 4.0.0 yargs-parser: 21.1.1 @@ -3865,9 +3944,9 @@ snapshots: - '@types/node' - chokidar - '@angular-devkit/schematics@19.2.6(chokidar@4.0.3)': + '@angular-devkit/schematics@19.2.15(chokidar@4.0.3)': dependencies: - '@angular-devkit/core': 19.2.6(chokidar@4.0.3) + '@angular-devkit/core': 19.2.15(chokidar@4.0.3) jsonc-parser: 3.3.1 magic-string: 0.30.17 ora: 5.4.1 @@ -3875,193 +3954,207 @@ snapshots: transitivePeerDependencies: - chokidar - '@babel/code-frame@7.26.2': + '@angular-devkit/schematics@19.2.17(chokidar@4.0.3)': dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@angular-devkit/core': 19.2.17(chokidar@4.0.3) + jsonc-parser: 3.3.1 + magic-string: 0.30.17 + ora: 5.4.1 + rxjs: 7.8.1 + transitivePeerDependencies: + - chokidar + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.26.8': {} + '@babel/compat-data@7.28.5': {} - '@babel/core@7.26.10': + '@babel/core@7.28.5': dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helpers': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.27.0': + '@babel/generator@7.28.5': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.27.0': + '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.26.8 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.4 + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.27.0 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-module-imports@7.25.9': + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/helper-plugin-utils@7.26.5': {} + '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.28.5': {} - '@babel/helper-validator-option@7.25.9': {} + '@babel/helper-validator-option@7.27.1': {} - '@babel/helpers@7.27.0': + '@babel/helpers@7.28.4': dependencies: - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 - '@babel/parser@7.27.0': + '@babel/parser@7.28.5': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.28.5 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.10)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.10)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.10)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.10)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.10)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.10)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.10)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.10)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.10)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/template@7.27.0': + '@babel/template@7.27.2': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 - '@babel/traverse@7.27.0': + '@babel/traverse@7.28.5': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 - debug: 4.4.0 - globals: 11.12.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + debug: 4.4.3 transitivePeerDependencies: - supports-color - '@babel/types@7.27.0': + '@babel/types@7.28.5': dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@bcoe/v8-coverage@0.2.3': {} + '@borewit/text-codec@0.1.1': {} + '@colors/colors@1.5.0': optional: true @@ -4071,117 +4164,56 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@dabh/diagnostics@2.0.3': + '@dabh/diagnostics@2.0.8': dependencies: - colorspace: 1.1.4 + '@so-ric/colorspace': 1.1.6 enabled: 2.0.0 kuler: 2.0.0 - '@esbuild/aix-ppc64@0.25.2': - optional: true - - '@esbuild/android-arm64@0.25.2': - optional: true - - '@esbuild/android-arm@0.25.2': - optional: true - - '@esbuild/android-x64@0.25.2': - optional: true - - '@esbuild/darwin-arm64@0.25.2': - optional: true - - '@esbuild/darwin-x64@0.25.2': - optional: true - - '@esbuild/freebsd-arm64@0.25.2': - optional: true - - '@esbuild/freebsd-x64@0.25.2': - optional: true - - '@esbuild/linux-arm64@0.25.2': - optional: true - - '@esbuild/linux-arm@0.25.2': - optional: true - - '@esbuild/linux-ia32@0.25.2': - optional: true - - '@esbuild/linux-loong64@0.25.2': - optional: true - - '@esbuild/linux-mips64el@0.25.2': - optional: true - - '@esbuild/linux-ppc64@0.25.2': - optional: true - - '@esbuild/linux-riscv64@0.25.2': - optional: true - - '@esbuild/linux-s390x@0.25.2': - optional: true - - '@esbuild/linux-x64@0.25.2': - optional: true - - '@esbuild/netbsd-arm64@0.25.2': - optional: true - - '@esbuild/netbsd-x64@0.25.2': - optional: true - - '@esbuild/openbsd-arm64@0.25.2': - optional: true - - '@esbuild/openbsd-x64@0.25.2': - optional: true - - '@esbuild/sunos-x64@0.25.2': - optional: true - - '@esbuild/win32-arm64@0.25.2': + '@emnapi/core@1.6.0': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 optional: true - '@esbuild/win32-ia32@0.25.2': + '@emnapi/runtime@1.6.0': + dependencies: + tslib: 2.8.1 optional: true - '@esbuild/win32-x64@0.25.2': + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 optional: true - '@eslint-community/eslint-utils@4.6.1(eslint@9.24.0)': + '@eslint-community/eslint-utils@4.9.0(eslint@9.38.0(jiti@2.6.1))': dependencies: - eslint: 9.24.0 + eslint: 9.38.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.1': {} + '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.20.0': + '@eslint/config-array@0.21.1': dependencies: - '@eslint/object-schema': 2.1.6 - debug: 4.4.0 + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.2.1': {} - - '@eslint/core@0.12.0': + '@eslint/config-helpers@0.4.1': dependencies: - '@types/json-schema': 7.0.15 + '@eslint/core': 0.16.0 - '@eslint/core@0.13.0': + '@eslint/core@0.16.0': dependencies: '@types/json-schema': 7.0.15 '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.0 - espree: 10.3.0 + debug: 4.4.3 + espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 @@ -4191,164 +4223,177 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.24.0': {} + '@eslint/js@9.38.0': {} - '@eslint/object-schema@2.1.6': {} + '@eslint/object-schema@2.1.7': {} - '@eslint/plugin-kit@0.2.8': + '@eslint/plugin-kit@0.4.0': dependencies: - '@eslint/core': 0.13.0 + '@eslint/core': 0.16.0 levn: 0.4.1 '@humanfs/core@0.19.1': {} - '@humanfs/node@0.16.6': + '@humanfs/node@0.16.7': dependencies: '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/retry': 0.4.3 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/retry@0.3.1': {} + '@humanwhocodes/retry@0.4.3': {} - '@humanwhocodes/retry@0.4.2': {} + '@inquirer/ansi@1.0.1': {} - '@inquirer/checkbox@4.1.5(@types/node@22.14.1)': + '@inquirer/checkbox@4.3.0(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.10(@types/node@22.14.1) - '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.6(@types/node@22.14.1) - ansi-escapes: 4.3.2 - yoctocolors-cjs: 2.1.2 + '@inquirer/ansi': 1.0.1 + '@inquirer/core': 10.3.0(@types/node@24.9.1) + '@inquirer/figures': 1.0.14 + '@inquirer/type': 3.0.9(@types/node@24.9.1) + yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.14.1 + '@types/node': 24.9.1 - '@inquirer/confirm@5.1.9(@types/node@22.14.1)': + '@inquirer/confirm@5.1.19(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.10(@types/node@22.14.1) - '@inquirer/type': 3.0.6(@types/node@22.14.1) + '@inquirer/core': 10.3.0(@types/node@24.9.1) + '@inquirer/type': 3.0.9(@types/node@24.9.1) optionalDependencies: - '@types/node': 22.14.1 + '@types/node': 24.9.1 - '@inquirer/core@10.1.10(@types/node@22.14.1)': + '@inquirer/core@10.3.0(@types/node@24.9.1)': dependencies: - '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.6(@types/node@22.14.1) - ansi-escapes: 4.3.2 + '@inquirer/ansi': 1.0.1 + '@inquirer/figures': 1.0.14 + '@inquirer/type': 3.0.9(@types/node@24.9.1) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.2 + yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.14.1 + '@types/node': 24.9.1 - '@inquirer/editor@4.2.10(@types/node@22.14.1)': + '@inquirer/editor@4.2.21(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.10(@types/node@22.14.1) - '@inquirer/type': 3.0.6(@types/node@22.14.1) - external-editor: 3.1.0 + '@inquirer/core': 10.3.0(@types/node@24.9.1) + '@inquirer/external-editor': 1.0.2(@types/node@24.9.1) + '@inquirer/type': 3.0.9(@types/node@24.9.1) optionalDependencies: - '@types/node': 22.14.1 + '@types/node': 24.9.1 - '@inquirer/expand@4.0.12(@types/node@22.14.1)': + '@inquirer/expand@4.0.21(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.10(@types/node@22.14.1) - '@inquirer/type': 3.0.6(@types/node@22.14.1) - yoctocolors-cjs: 2.1.2 + '@inquirer/core': 10.3.0(@types/node@24.9.1) + '@inquirer/type': 3.0.9(@types/node@24.9.1) + yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.14.1 + '@types/node': 24.9.1 - '@inquirer/figures@1.0.11': {} + '@inquirer/external-editor@1.0.2(@types/node@24.9.1)': + dependencies: + chardet: 2.1.0 + iconv-lite: 0.7.0 + optionalDependencies: + '@types/node': 24.9.1 - '@inquirer/input@4.1.9(@types/node@22.14.1)': + '@inquirer/figures@1.0.14': {} + + '@inquirer/input@4.2.5(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.10(@types/node@22.14.1) - '@inquirer/type': 3.0.6(@types/node@22.14.1) + '@inquirer/core': 10.3.0(@types/node@24.9.1) + '@inquirer/type': 3.0.9(@types/node@24.9.1) optionalDependencies: - '@types/node': 22.14.1 + '@types/node': 24.9.1 - '@inquirer/number@3.0.12(@types/node@22.14.1)': + '@inquirer/number@3.0.21(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.10(@types/node@22.14.1) - '@inquirer/type': 3.0.6(@types/node@22.14.1) + '@inquirer/core': 10.3.0(@types/node@24.9.1) + '@inquirer/type': 3.0.9(@types/node@24.9.1) optionalDependencies: - '@types/node': 22.14.1 + '@types/node': 24.9.1 - '@inquirer/password@4.0.12(@types/node@22.14.1)': + '@inquirer/password@4.0.21(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.10(@types/node@22.14.1) - '@inquirer/type': 3.0.6(@types/node@22.14.1) - ansi-escapes: 4.3.2 + '@inquirer/ansi': 1.0.1 + '@inquirer/core': 10.3.0(@types/node@24.9.1) + '@inquirer/type': 3.0.9(@types/node@24.9.1) optionalDependencies: - '@types/node': 22.14.1 - - '@inquirer/prompts@7.3.2(@types/node@22.14.1)': - dependencies: - '@inquirer/checkbox': 4.1.5(@types/node@22.14.1) - '@inquirer/confirm': 5.1.9(@types/node@22.14.1) - '@inquirer/editor': 4.2.10(@types/node@22.14.1) - '@inquirer/expand': 4.0.12(@types/node@22.14.1) - '@inquirer/input': 4.1.9(@types/node@22.14.1) - '@inquirer/number': 3.0.12(@types/node@22.14.1) - '@inquirer/password': 4.0.12(@types/node@22.14.1) - '@inquirer/rawlist': 4.0.12(@types/node@22.14.1) - '@inquirer/search': 3.0.12(@types/node@22.14.1) - '@inquirer/select': 4.1.1(@types/node@22.14.1) + '@types/node': 24.9.1 + + '@inquirer/prompts@7.3.2(@types/node@24.9.1)': + dependencies: + '@inquirer/checkbox': 4.3.0(@types/node@24.9.1) + '@inquirer/confirm': 5.1.19(@types/node@24.9.1) + '@inquirer/editor': 4.2.21(@types/node@24.9.1) + '@inquirer/expand': 4.0.21(@types/node@24.9.1) + '@inquirer/input': 4.2.5(@types/node@24.9.1) + '@inquirer/number': 3.0.21(@types/node@24.9.1) + '@inquirer/password': 4.0.21(@types/node@24.9.1) + '@inquirer/rawlist': 4.1.9(@types/node@24.9.1) + '@inquirer/search': 3.2.0(@types/node@24.9.1) + '@inquirer/select': 4.4.0(@types/node@24.9.1) optionalDependencies: - '@types/node': 22.14.1 - - '@inquirer/prompts@7.4.1(@types/node@22.14.1)': - dependencies: - '@inquirer/checkbox': 4.1.5(@types/node@22.14.1) - '@inquirer/confirm': 5.1.9(@types/node@22.14.1) - '@inquirer/editor': 4.2.10(@types/node@22.14.1) - '@inquirer/expand': 4.0.12(@types/node@22.14.1) - '@inquirer/input': 4.1.9(@types/node@22.14.1) - '@inquirer/number': 3.0.12(@types/node@22.14.1) - '@inquirer/password': 4.0.12(@types/node@22.14.1) - '@inquirer/rawlist': 4.0.12(@types/node@22.14.1) - '@inquirer/search': 3.0.12(@types/node@22.14.1) - '@inquirer/select': 4.1.1(@types/node@22.14.1) + '@types/node': 24.9.1 + + '@inquirer/prompts@7.8.0(@types/node@24.9.1)': + dependencies: + '@inquirer/checkbox': 4.3.0(@types/node@24.9.1) + '@inquirer/confirm': 5.1.19(@types/node@24.9.1) + '@inquirer/editor': 4.2.21(@types/node@24.9.1) + '@inquirer/expand': 4.0.21(@types/node@24.9.1) + '@inquirer/input': 4.2.5(@types/node@24.9.1) + '@inquirer/number': 3.0.21(@types/node@24.9.1) + '@inquirer/password': 4.0.21(@types/node@24.9.1) + '@inquirer/rawlist': 4.1.9(@types/node@24.9.1) + '@inquirer/search': 3.2.0(@types/node@24.9.1) + '@inquirer/select': 4.4.0(@types/node@24.9.1) optionalDependencies: - '@types/node': 22.14.1 + '@types/node': 24.9.1 - '@inquirer/rawlist@4.0.12(@types/node@22.14.1)': + '@inquirer/rawlist@4.1.9(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.10(@types/node@22.14.1) - '@inquirer/type': 3.0.6(@types/node@22.14.1) - yoctocolors-cjs: 2.1.2 + '@inquirer/core': 10.3.0(@types/node@24.9.1) + '@inquirer/type': 3.0.9(@types/node@24.9.1) + yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.14.1 + '@types/node': 24.9.1 - '@inquirer/search@3.0.12(@types/node@22.14.1)': + '@inquirer/search@3.2.0(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.10(@types/node@22.14.1) - '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.6(@types/node@22.14.1) - yoctocolors-cjs: 2.1.2 + '@inquirer/core': 10.3.0(@types/node@24.9.1) + '@inquirer/figures': 1.0.14 + '@inquirer/type': 3.0.9(@types/node@24.9.1) + yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.14.1 + '@types/node': 24.9.1 - '@inquirer/select@4.1.1(@types/node@22.14.1)': + '@inquirer/select@4.4.0(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.10(@types/node@22.14.1) - '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.6(@types/node@22.14.1) - ansi-escapes: 4.3.2 - yoctocolors-cjs: 2.1.2 + '@inquirer/ansi': 1.0.1 + '@inquirer/core': 10.3.0(@types/node@24.9.1) + '@inquirer/figures': 1.0.14 + '@inquirer/type': 3.0.9(@types/node@24.9.1) + yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.14.1 + '@types/node': 24.9.1 - '@inquirer/type@3.0.6(@types/node@22.14.1)': + '@inquirer/type@3.0.9(@types/node@24.9.1)': optionalDependencies: - '@types/node': 22.14.1 + '@types/node': 24.9.1 + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 @@ -4363,390 +4408,422 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jest/console@29.7.0': + '@jest/console@30.2.0': dependencies: - '@jest/types': 29.6.3 - '@types/node': 22.14.1 + '@jest/types': 30.2.0 + '@types/node': 22.18.12 chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 + jest-message-util: 30.2.0 + jest-util: 30.2.0 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.11.21)(@types/node@22.14.1)(typescript@5.8.3))': + '@jest/core@30.2.0(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.1)(typescript@5.9.3))': dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.14.1 + '@jest/console': 30.2.0 + '@jest/pattern': 30.0.1 + '@jest/reporters': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 22.18.12 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 + ci-info: 4.3.1 + exit-x: 0.2.2 graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.14.1)(ts-node@10.9.2(@swc/core@1.11.21)(@types/node@22.14.1)(typescript@5.8.3)) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 + jest-changed-files: 30.2.0 + jest-config: 30.2.0(@types/node@22.18.12)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.1)(typescript@5.9.3)) + jest-haste-map: 30.2.0 + jest-message-util: 30.2.0 + jest-regex-util: 30.0.1 + jest-resolve: 30.2.0 + jest-resolve-dependencies: 30.2.0 + jest-runner: 30.2.0 + jest-runtime: 30.2.0 + jest-snapshot: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 + jest-watcher: 30.2.0 micromatch: 4.0.8 - pretty-format: 29.7.0 + pretty-format: 30.2.0 slash: 3.0.0 - strip-ansi: 6.0.1 transitivePeerDependencies: - babel-plugin-macros + - esbuild-register - supports-color - ts-node - '@jest/environment@29.7.0': + '@jest/diff-sequences@30.0.1': {} + + '@jest/environment@30.2.0': dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.14.1 - jest-mock: 29.7.0 + '@jest/fake-timers': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 22.18.12 + jest-mock: 30.2.0 - '@jest/expect-utils@29.7.0': + '@jest/expect-utils@30.2.0': dependencies: - jest-get-type: 29.6.3 + '@jest/get-type': 30.1.0 - '@jest/expect@29.7.0': + '@jest/expect@30.2.0': dependencies: - expect: 29.7.0 - jest-snapshot: 29.7.0 + expect: 30.2.0 + jest-snapshot: 30.2.0 transitivePeerDependencies: - supports-color - '@jest/fake-timers@29.7.0': + '@jest/fake-timers@30.2.0': dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 22.14.1 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 + '@jest/types': 30.2.0 + '@sinonjs/fake-timers': 13.0.5 + '@types/node': 22.18.12 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 + jest-util: 30.2.0 - '@jest/globals@29.7.0': + '@jest/get-type@30.1.0': {} + + '@jest/globals@30.2.0': dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/types': 29.6.3 - jest-mock: 29.7.0 + '@jest/environment': 30.2.0 + '@jest/expect': 30.2.0 + '@jest/types': 30.2.0 + jest-mock: 30.2.0 transitivePeerDependencies: - supports-color - '@jest/reporters@29.7.0': + '@jest/pattern@30.0.1': + dependencies: + '@types/node': 22.18.12 + jest-regex-util: 30.0.1 + + '@jest/reporters@30.2.0': dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 22.14.1 + '@jest/console': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@jridgewell/trace-mapping': 0.3.31 + '@types/node': 22.18.12 chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 + collect-v8-coverage: 1.0.3 + exit-x: 0.2.2 + glob: 10.4.5 graceful-fs: 4.2.11 istanbul-lib-coverage: 3.2.2 istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.2.0 + jest-message-util: 30.2.0 + jest-util: 30.2.0 + jest-worker: 30.2.0 slash: 3.0.0 string-length: 4.0.2 - strip-ansi: 6.0.1 v8-to-istanbul: 9.3.0 transitivePeerDependencies: - supports-color - '@jest/schemas@29.6.3': + '@jest/schemas@30.0.5': dependencies: - '@sinclair/typebox': 0.27.8 + '@sinclair/typebox': 0.34.41 - '@jest/source-map@29.6.3': + '@jest/snapshot-utils@30.2.0': dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jest/types': 30.2.0 + chalk: 4.1.2 + graceful-fs: 4.2.11 + natural-compare: 1.4.0 + + '@jest/source-map@30.0.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.31 callsites: 3.1.0 graceful-fs: 4.2.11 - '@jest/test-result@29.7.0': + '@jest/test-result@30.2.0': dependencies: - '@jest/console': 29.7.0 - '@jest/types': 29.6.3 + '@jest/console': 30.2.0 + '@jest/types': 30.2.0 '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 + collect-v8-coverage: 1.0.3 - '@jest/test-sequencer@29.7.0': + '@jest/test-sequencer@30.2.0': dependencies: - '@jest/test-result': 29.7.0 + '@jest/test-result': 30.2.0 graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 + jest-haste-map: 30.2.0 slash: 3.0.0 - '@jest/transform@29.7.0': + '@jest/transform@30.2.0': dependencies: - '@babel/core': 7.26.10 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - babel-plugin-istanbul: 6.1.1 + '@babel/core': 7.28.5 + '@jest/types': 30.2.0 + '@jridgewell/trace-mapping': 0.3.31 + babel-plugin-istanbul: 7.0.1 chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 + jest-haste-map: 30.2.0 + jest-regex-util: 30.0.1 + jest-util: 30.2.0 micromatch: 4.0.8 pirates: 4.0.7 slash: 3.0.0 - write-file-atomic: 4.0.2 + write-file-atomic: 5.0.1 transitivePeerDependencies: - supports-color - '@jest/types@29.6.3': + '@jest/types@30.2.0': dependencies: - '@jest/schemas': 29.6.3 + '@jest/pattern': 30.0.1 + '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.14.1 - '@types/yargs': 17.0.33 + '@types/node': 22.18.12 + '@types/yargs': 17.0.34 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.8': + '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/set-array@1.2.1': {} + '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/source-map@0.3.6': + '@jridgewell/source-map@0.3.11': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 '@lukeed/csprng@1.1.0': {} '@microsoft/tsdoc@0.15.1': {} - '@napi-rs/nice-android-arm-eabi@1.0.1': + '@napi-rs/nice-android-arm-eabi@1.1.1': optional: true - '@napi-rs/nice-android-arm64@1.0.1': + '@napi-rs/nice-android-arm64@1.1.1': optional: true - '@napi-rs/nice-darwin-arm64@1.0.1': + '@napi-rs/nice-darwin-arm64@1.1.1': optional: true - '@napi-rs/nice-darwin-x64@1.0.1': + '@napi-rs/nice-darwin-x64@1.1.1': optional: true - '@napi-rs/nice-freebsd-x64@1.0.1': + '@napi-rs/nice-freebsd-x64@1.1.1': optional: true - '@napi-rs/nice-linux-arm-gnueabihf@1.0.1': + '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': optional: true - '@napi-rs/nice-linux-arm64-gnu@1.0.1': + '@napi-rs/nice-linux-arm64-gnu@1.1.1': optional: true - '@napi-rs/nice-linux-arm64-musl@1.0.1': + '@napi-rs/nice-linux-arm64-musl@1.1.1': optional: true - '@napi-rs/nice-linux-ppc64-gnu@1.0.1': + '@napi-rs/nice-linux-ppc64-gnu@1.1.1': optional: true - '@napi-rs/nice-linux-riscv64-gnu@1.0.1': + '@napi-rs/nice-linux-riscv64-gnu@1.1.1': optional: true - '@napi-rs/nice-linux-s390x-gnu@1.0.1': + '@napi-rs/nice-linux-s390x-gnu@1.1.1': optional: true - '@napi-rs/nice-linux-x64-gnu@1.0.1': + '@napi-rs/nice-linux-x64-gnu@1.1.1': optional: true - '@napi-rs/nice-linux-x64-musl@1.0.1': + '@napi-rs/nice-linux-x64-musl@1.1.1': optional: true - '@napi-rs/nice-win32-arm64-msvc@1.0.1': + '@napi-rs/nice-openharmony-arm64@1.1.1': optional: true - '@napi-rs/nice-win32-ia32-msvc@1.0.1': + '@napi-rs/nice-win32-arm64-msvc@1.1.1': optional: true - '@napi-rs/nice-win32-x64-msvc@1.0.1': + '@napi-rs/nice-win32-ia32-msvc@1.1.1': optional: true - '@napi-rs/nice@1.0.1': + '@napi-rs/nice-win32-x64-msvc@1.1.1': + optional: true + + '@napi-rs/nice@1.1.1': optionalDependencies: - '@napi-rs/nice-android-arm-eabi': 1.0.1 - '@napi-rs/nice-android-arm64': 1.0.1 - '@napi-rs/nice-darwin-arm64': 1.0.1 - '@napi-rs/nice-darwin-x64': 1.0.1 - '@napi-rs/nice-freebsd-x64': 1.0.1 - '@napi-rs/nice-linux-arm-gnueabihf': 1.0.1 - '@napi-rs/nice-linux-arm64-gnu': 1.0.1 - '@napi-rs/nice-linux-arm64-musl': 1.0.1 - '@napi-rs/nice-linux-ppc64-gnu': 1.0.1 - '@napi-rs/nice-linux-riscv64-gnu': 1.0.1 - '@napi-rs/nice-linux-s390x-gnu': 1.0.1 - '@napi-rs/nice-linux-x64-gnu': 1.0.1 - '@napi-rs/nice-linux-x64-musl': 1.0.1 - '@napi-rs/nice-win32-arm64-msvc': 1.0.1 - '@napi-rs/nice-win32-ia32-msvc': 1.0.1 - '@napi-rs/nice-win32-x64-msvc': 1.0.1 + '@napi-rs/nice-android-arm-eabi': 1.1.1 + '@napi-rs/nice-android-arm64': 1.1.1 + '@napi-rs/nice-darwin-arm64': 1.1.1 + '@napi-rs/nice-darwin-x64': 1.1.1 + '@napi-rs/nice-freebsd-x64': 1.1.1 + '@napi-rs/nice-linux-arm-gnueabihf': 1.1.1 + '@napi-rs/nice-linux-arm64-gnu': 1.1.1 + '@napi-rs/nice-linux-arm64-musl': 1.1.1 + '@napi-rs/nice-linux-ppc64-gnu': 1.1.1 + '@napi-rs/nice-linux-riscv64-gnu': 1.1.1 + '@napi-rs/nice-linux-s390x-gnu': 1.1.1 + '@napi-rs/nice-linux-x64-gnu': 1.1.1 + '@napi-rs/nice-linux-x64-musl': 1.1.1 + '@napi-rs/nice-openharmony-arm64': 1.1.1 + '@napi-rs/nice-win32-arm64-msvc': 1.1.1 + '@napi-rs/nice-win32-ia32-msvc': 1.1.1 + '@napi-rs/nice-win32-x64-msvc': 1.1.1 + optional: true + + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.6.0 + '@emnapi/runtime': 1.6.0 + '@tybys/wasm-util': 0.10.1 optional: true - '@nestjs/cli@11.0.6(@swc/cli@0.6.0(@swc/core@1.11.21)(chokidar@4.0.3))(@swc/core@1.11.21)(@types/node@22.14.1)(esbuild@0.25.2)': + '@nestjs/cli@11.0.10(@swc/cli@0.7.8(@swc/core@1.13.5)(chokidar@4.0.3))(@swc/core@1.13.5)(@types/node@24.9.1)': dependencies: - '@angular-devkit/core': 19.2.6(chokidar@4.0.3) - '@angular-devkit/schematics': 19.2.6(chokidar@4.0.3) - '@angular-devkit/schematics-cli': 19.2.6(@types/node@22.14.1)(chokidar@4.0.3) - '@inquirer/prompts': 7.4.1(@types/node@22.14.1) - '@nestjs/schematics': 11.0.5(chokidar@4.0.3)(typescript@5.7.3) - ansis: 3.17.0 + '@angular-devkit/core': 19.2.15(chokidar@4.0.3) + '@angular-devkit/schematics': 19.2.15(chokidar@4.0.3) + '@angular-devkit/schematics-cli': 19.2.15(@types/node@24.9.1)(chokidar@4.0.3) + '@inquirer/prompts': 7.8.0(@types/node@24.9.1) + '@nestjs/schematics': 11.0.9(chokidar@4.0.3)(typescript@5.8.3) + ansis: 4.1.0 chokidar: 4.0.3 cli-table3: 0.6.5 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.11.21)(esbuild@0.25.2)) - glob: 11.0.1 + fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.8.3)(webpack@5.100.2(@swc/core@1.13.5)) + glob: 11.0.3 node-emoji: 1.11.0 ora: 5.4.1 tree-kill: 1.2.2 tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.2.0 - typescript: 5.7.3 - webpack: 5.98.0(@swc/core@1.11.21)(esbuild@0.25.2) + typescript: 5.8.3 + webpack: 5.100.2(@swc/core@1.13.5) webpack-node-externals: 3.0.0 optionalDependencies: - '@swc/cli': 0.6.0(@swc/core@1.11.21)(chokidar@4.0.3) - '@swc/core': 1.11.21 + '@swc/cli': 0.7.8(@swc/core@1.13.5)(chokidar@4.0.3) + '@swc/core': 1.13.5 transitivePeerDependencies: - '@types/node' - esbuild - uglify-js - webpack-cli - '@nestjs/common@11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)': + '@nestjs/common@11.1.7(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2)': dependencies: - file-type: 20.4.1 + file-type: 21.0.0 iterare: 1.2.1 - load-esm: 1.0.2 + load-esm: 1.0.3 reflect-metadata: 0.2.2 rxjs: 7.8.2 tslib: 2.8.1 uid: 2.0.2 optionalDependencies: class-transformer: 0.5.1 - class-validator: 0.14.1 + class-validator: 0.14.2 transitivePeerDependencies: - supports-color - '@nestjs/core@11.0.20(@nestjs/common@11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.0.20)(reflect-metadata@0.2.2)(rxjs@7.8.2)': + '@nestjs/core@11.1.7(@nestjs/common@11.1.7(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.7)(reflect-metadata@0.2.2)(rxjs@7.8.2)': dependencies: - '@nestjs/common': 11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/common': 11.1.7(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nuxt/opencollective': 0.4.1 fast-safe-stringify: 2.1.1 iterare: 1.2.1 - path-to-regexp: 8.2.0 + path-to-regexp: 8.3.0 reflect-metadata: 0.2.2 rxjs: 7.8.2 tslib: 2.8.1 uid: 2.0.2 optionalDependencies: - '@nestjs/platform-express': 11.0.20(@nestjs/common@11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.0.20) + '@nestjs/platform-express': 11.1.7(@nestjs/common@11.1.7(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.7) - '@nestjs/mapped-types@2.1.0(@nestjs/common@11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)': + '@nestjs/mapped-types@2.1.0(@nestjs/common@11.1.7(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)': dependencies: - '@nestjs/common': 11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/common': 11.1.7(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) reflect-metadata: 0.2.2 optionalDependencies: class-transformer: 0.5.1 - class-validator: 0.14.1 + class-validator: 0.14.2 - '@nestjs/platform-express@11.0.20(@nestjs/common@11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.0.20)': + '@nestjs/platform-express@11.1.7(@nestjs/common@11.1.7(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.7)': dependencies: - '@nestjs/common': 11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 11.0.20(@nestjs/common@11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.0.20)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/common': 11.1.7(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.7(@nestjs/common@11.1.7(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.7)(reflect-metadata@0.2.2)(rxjs@7.8.2) cors: 2.8.5 express: 5.1.0 - multer: 1.4.5-lts.2 - path-to-regexp: 8.2.0 + multer: 2.0.2 + path-to-regexp: 8.3.0 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@nestjs/schematics@11.0.5(chokidar@4.0.3)(typescript@5.7.3)': + '@nestjs/schematics@11.0.9(chokidar@4.0.3)(typescript@5.8.3)': dependencies: - '@angular-devkit/core': 19.2.6(chokidar@4.0.3) - '@angular-devkit/schematics': 19.2.6(chokidar@4.0.3) - comment-json: 4.2.5 + '@angular-devkit/core': 19.2.17(chokidar@4.0.3) + '@angular-devkit/schematics': 19.2.17(chokidar@4.0.3) + comment-json: 4.4.1 jsonc-parser: 3.3.1 pluralize: 8.0.0 - typescript: 5.7.3 + typescript: 5.8.3 transitivePeerDependencies: - chokidar - '@nestjs/schematics@11.0.5(chokidar@4.0.3)(typescript@5.8.3)': + '@nestjs/schematics@11.0.9(chokidar@4.0.3)(typescript@5.9.3)': dependencies: - '@angular-devkit/core': 19.2.6(chokidar@4.0.3) - '@angular-devkit/schematics': 19.2.6(chokidar@4.0.3) - comment-json: 4.2.5 + '@angular-devkit/core': 19.2.17(chokidar@4.0.3) + '@angular-devkit/schematics': 19.2.17(chokidar@4.0.3) + comment-json: 4.4.1 jsonc-parser: 3.3.1 pluralize: 8.0.0 - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - chokidar - '@nestjs/swagger@11.1.4(@nestjs/common@11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.0.20)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)': + '@nestjs/swagger@11.2.1(@nestjs/common@11.1.7(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.7)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)': dependencies: '@microsoft/tsdoc': 0.15.1 - '@nestjs/common': 11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 11.0.20(@nestjs/common@11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.0.20)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/mapped-types': 2.1.0(@nestjs/common@11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2) + '@nestjs/common': 11.1.7(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.7(@nestjs/common@11.1.7(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.7)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/mapped-types': 2.1.0(@nestjs/common@11.1.7(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2) js-yaml: 4.1.0 lodash: 4.17.21 - path-to-regexp: 8.2.0 + path-to-regexp: 8.3.0 reflect-metadata: 0.2.2 - swagger-ui-dist: 5.21.0 + swagger-ui-dist: 5.29.4 optionalDependencies: class-transformer: 0.5.1 - class-validator: 0.14.1 + class-validator: 0.14.2 - '@nestjs/testing@11.0.20(@nestjs/common@11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.0.20)(@nestjs/platform-express@11.0.20)': + '@nestjs/testing@11.1.7(@nestjs/common@11.1.7(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.7)(@nestjs/platform-express@11.1.7)': dependencies: - '@nestjs/common': 11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/core': 11.0.20(@nestjs/common@11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.0.20)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/common': 11.1.7(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.7(@nestjs/common@11.1.7(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.7)(reflect-metadata@0.2.2)(rxjs@7.8.2) tslib: 2.8.1 optionalDependencies: - '@nestjs/platform-express': 11.0.20(@nestjs/common@11.0.20(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.0.20) + '@nestjs/platform-express': 11.1.7(@nestjs/common@11.1.7(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.7) + + '@noble/hashes@1.8.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -4764,46 +4841,53 @@ snapshots: dependencies: consola: 3.4.2 - '@pkgr/core@0.2.4': {} + '@paralleldrive/cuid2@2.3.1': + dependencies: + '@noble/hashes': 1.8.0 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.2.9': {} - '@prisma/client@6.6.0(prisma@6.6.0(typescript@5.8.3))(typescript@5.8.3)': + '@prisma/client@6.18.0(prisma@6.18.0(typescript@5.9.3))(typescript@5.9.3)': optionalDependencies: - prisma: 6.6.0(typescript@5.8.3) - typescript: 5.8.3 + prisma: 6.18.0(typescript@5.9.3) + typescript: 5.9.3 - '@prisma/config@6.6.0': + '@prisma/config@6.18.0': dependencies: - esbuild: 0.25.2 - esbuild-register: 3.6.0(esbuild@0.25.2) + c12: 3.1.0 + deepmerge-ts: 7.1.5 + effect: 3.18.4 + empathic: 2.0.0 transitivePeerDependencies: - - supports-color + - magicast - '@prisma/debug@6.6.0': {} + '@prisma/debug@6.18.0': {} - '@prisma/engines-version@6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a': {} + '@prisma/engines-version@6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f': {} - '@prisma/engines@6.6.0': + '@prisma/engines@6.18.0': dependencies: - '@prisma/debug': 6.6.0 - '@prisma/engines-version': 6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a - '@prisma/fetch-engine': 6.6.0 - '@prisma/get-platform': 6.6.0 + '@prisma/debug': 6.18.0 + '@prisma/engines-version': 6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f + '@prisma/fetch-engine': 6.18.0 + '@prisma/get-platform': 6.18.0 - '@prisma/fetch-engine@6.6.0': + '@prisma/fetch-engine@6.18.0': dependencies: - '@prisma/debug': 6.6.0 - '@prisma/engines-version': 6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a - '@prisma/get-platform': 6.6.0 + '@prisma/debug': 6.18.0 + '@prisma/engines-version': 6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f + '@prisma/get-platform': 6.18.0 - '@prisma/get-platform@6.6.0': + '@prisma/get-platform@6.18.0': dependencies: - '@prisma/debug': 6.6.0 + '@prisma/debug': 6.18.0 '@scarf/scarf@1.4.0': {} - '@sec-ant/readable-stream@0.4.1': {} - - '@sinclair/typebox@0.27.8': {} + '@sinclair/typebox@0.34.41': {} '@sindresorhus/is@5.6.0': {} @@ -4811,74 +4895,85 @@ snapshots: dependencies: type-detect: 4.0.8 - '@sinonjs/fake-timers@10.3.0': + '@sinonjs/fake-timers@13.0.5': dependencies: '@sinonjs/commons': 3.0.1 - '@swc/cli@0.6.0(@swc/core@1.11.21)(chokidar@4.0.3)': + '@so-ric/colorspace@1.1.6': dependencies: - '@swc/core': 1.11.21 + color: 5.0.2 + text-hex: 1.0.0 + + '@standard-schema/spec@1.0.0': {} + + '@swc/cli@0.7.8(@swc/core@1.13.5)(chokidar@4.0.3)': + dependencies: + '@swc/core': 1.13.5 '@swc/counter': 0.1.3 - '@xhmikosr/bin-wrapper': 13.0.5 + '@xhmikosr/bin-wrapper': 13.2.0 commander: 8.3.0 - fast-glob: 3.3.3 minimatch: 9.0.5 piscina: 4.9.2 - semver: 7.7.1 + semver: 7.7.3 slash: 3.0.0 - source-map: 0.7.4 + source-map: 0.7.6 + tinyglobby: 0.2.15 optionalDependencies: chokidar: 4.0.3 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + - supports-color - '@swc/core-darwin-arm64@1.11.21': + '@swc/core-darwin-arm64@1.13.5': optional: true - '@swc/core-darwin-x64@1.11.21': + '@swc/core-darwin-x64@1.13.5': optional: true - '@swc/core-linux-arm-gnueabihf@1.11.21': + '@swc/core-linux-arm-gnueabihf@1.13.5': optional: true - '@swc/core-linux-arm64-gnu@1.11.21': + '@swc/core-linux-arm64-gnu@1.13.5': optional: true - '@swc/core-linux-arm64-musl@1.11.21': + '@swc/core-linux-arm64-musl@1.13.5': optional: true - '@swc/core-linux-x64-gnu@1.11.21': + '@swc/core-linux-x64-gnu@1.13.5': optional: true - '@swc/core-linux-x64-musl@1.11.21': + '@swc/core-linux-x64-musl@1.13.5': optional: true - '@swc/core-win32-arm64-msvc@1.11.21': + '@swc/core-win32-arm64-msvc@1.13.5': optional: true - '@swc/core-win32-ia32-msvc@1.11.21': + '@swc/core-win32-ia32-msvc@1.13.5': optional: true - '@swc/core-win32-x64-msvc@1.11.21': + '@swc/core-win32-x64-msvc@1.13.5': optional: true - '@swc/core@1.11.21': + '@swc/core@1.13.5': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.21 + '@swc/types': 0.1.25 optionalDependencies: - '@swc/core-darwin-arm64': 1.11.21 - '@swc/core-darwin-x64': 1.11.21 - '@swc/core-linux-arm-gnueabihf': 1.11.21 - '@swc/core-linux-arm64-gnu': 1.11.21 - '@swc/core-linux-arm64-musl': 1.11.21 - '@swc/core-linux-x64-gnu': 1.11.21 - '@swc/core-linux-x64-musl': 1.11.21 - '@swc/core-win32-arm64-msvc': 1.11.21 - '@swc/core-win32-ia32-msvc': 1.11.21 - '@swc/core-win32-x64-msvc': 1.11.21 + '@swc/core-darwin-arm64': 1.13.5 + '@swc/core-darwin-x64': 1.13.5 + '@swc/core-linux-arm-gnueabihf': 1.13.5 + '@swc/core-linux-arm64-gnu': 1.13.5 + '@swc/core-linux-arm64-musl': 1.13.5 + '@swc/core-linux-x64-gnu': 1.13.5 + '@swc/core-linux-x64-musl': 1.13.5 + '@swc/core-win32-arm64-msvc': 1.13.5 + '@swc/core-win32-ia32-msvc': 1.13.5 + '@swc/core-win32-x64-msvc': 1.13.5 '@swc/counter@0.1.3': {} - '@swc/types@0.1.21': + '@swc/types@0.1.25': dependencies: '@swc/counter': 0.1.3 @@ -4888,9 +4983,9 @@ snapshots: '@tokenizer/inflate@0.2.7': dependencies: - debug: 4.4.0 + debug: 4.4.3 fflate: 0.8.2 - token-types: 6.0.0 + token-types: 6.1.1 transitivePeerDependencies: - supports-color @@ -4904,84 +4999,85 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.7 + '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.28.5 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 - '@types/babel__traverse@7.20.7': + '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.28.5 - '@types/body-parser@1.19.5': + '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.14.1 + '@types/node': 22.18.12 '@types/connect@3.4.38': dependencies: - '@types/node': 22.14.1 + '@types/node': 22.18.12 '@types/cookiejar@2.1.5': {} '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/eslint@9.6.1': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 - '@types/estree@1.0.7': {} + '@types/estree@1.0.8': {} - '@types/express-serve-static-core@4.19.6': + '@types/express-serve-static-core@4.19.7': dependencies: - '@types/node': 22.14.1 - '@types/qs': 6.9.18 + '@types/node': 22.18.12 + '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 + '@types/send': 1.2.1 - '@types/express-serve-static-core@5.0.6': + '@types/express-serve-static-core@5.1.0': dependencies: - '@types/node': 22.14.1 - '@types/qs': 6.9.18 + '@types/node': 22.18.12 + '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 - - '@types/express@4.17.21': - dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.6 - '@types/qs': 6.9.18 - '@types/serve-static': 1.15.7 + '@types/send': 1.2.1 - '@types/express@5.0.1': + '@types/express@4.17.24': dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 5.0.6 - '@types/serve-static': 1.15.7 + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 4.19.7 + '@types/qs': 6.14.0 + '@types/serve-static': 1.15.10 - '@types/graceful-fs@4.1.9': + '@types/express@5.0.4': dependencies: - '@types/node': 22.14.1 + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 5.1.0 + '@types/serve-static': 1.15.10 '@types/http-cache-semantics@4.0.4': {} - '@types/http-errors@2.0.4': {} + '@types/http-errors@2.0.5': {} '@types/istanbul-lib-coverage@2.0.6': {} @@ -4993,21 +5089,21 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 - '@types/jest@29.5.14': + '@types/jest@30.0.0': dependencies: - expect: 29.7.0 - pretty-format: 29.7.0 + expect: 30.2.0 + pretty-format: 30.2.0 '@types/json-schema@7.0.15': {} '@types/json-stringify-safe@5.0.3': {} - '@types/jsonwebtoken@9.0.9': + '@types/jsonwebtoken@9.0.10': dependencies: '@types/ms': 2.1.0 - '@types/node': 22.14.1 + '@types/node': 22.18.12 - '@types/lodash@4.17.16': {} + '@types/lodash@4.17.20': {} '@types/methods@1.1.4': {} @@ -5015,24 +5111,32 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@22.14.1': + '@types/node@22.18.12': dependencies: undici-types: 6.21.0 - '@types/qs@6.9.18': {} + '@types/node@24.9.1': + dependencies: + undici-types: 7.16.0 + + '@types/qs@6.14.0': {} '@types/range-parser@1.2.7': {} - '@types/send@0.17.4': + '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.14.1 + '@types/node': 22.18.12 + + '@types/send@1.2.1': + dependencies: + '@types/node': 22.18.12 - '@types/serve-static@1.15.7': + '@types/serve-static@1.15.10': dependencies: - '@types/http-errors': 2.0.4 - '@types/node': 22.14.1 - '@types/send': 0.17.4 + '@types/http-errors': 2.0.5 + '@types/node': 22.18.12 + '@types/send': 0.17.6 '@types/stack-utils@2.0.3': {} @@ -5040,8 +5144,8 @@ snapshots: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 22.14.1 - form-data: 4.0.2 + '@types/node': 22.18.12 + form-data: 4.0.4 '@types/supertest@6.0.3': dependencies: @@ -5050,90 +5154,167 @@ snapshots: '@types/triple-beam@1.3.5': {} - '@types/validator@13.15.0': {} + '@types/validator@13.15.3': {} '@types/yargs-parser@21.0.3': {} - '@types/yargs@17.0.33': + '@types/yargs@17.0.34': dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0)(typescript@5.8.3))(eslint@9.24.0)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.30.1(eslint@9.24.0)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.30.1 - '@typescript-eslint/type-utils': 8.30.1(eslint@9.24.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.30.1(eslint@9.24.0)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.30.1 - eslint: 9.24.0 + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/type-utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.2 + eslint: 9.38.0(jiti@2.6.1) graphemer: 1.4.0 - ignore: 5.3.2 + ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.2 + debug: 4.4.3 + eslint: 9.38.0(jiti@2.6.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.30.1(eslint@9.24.0)(typescript@5.8.3)': + '@typescript-eslint/project-service@8.46.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.30.1 - '@typescript-eslint/types': 8.30.1 - '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.30.1 - debug: 4.4.0 - eslint: 9.24.0 - typescript: 5.8.3 + '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) + '@typescript-eslint/types': 8.46.2 + debug: 4.4.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.30.1': + '@typescript-eslint/scope-manager@8.46.2': dependencies: - '@typescript-eslint/types': 8.30.1 - '@typescript-eslint/visitor-keys': 8.30.1 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/visitor-keys': 8.46.2 - '@typescript-eslint/type-utils@8.30.1(eslint@9.24.0)(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.30.1(eslint@9.24.0)(typescript@5.8.3) - debug: 4.4.0 - eslint: 9.24.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.38.0(jiti@2.6.1) + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.30.1': {} + '@typescript-eslint/types@8.46.2': {} - '@typescript-eslint/typescript-estree@8.30.1(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.30.1 - '@typescript-eslint/visitor-keys': 8.30.1 - debug: 4.4.0 + '@typescript-eslint/project-service': 8.46.2(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/visitor-keys': 8.46.2 + debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.30.1(eslint@9.24.0)(typescript@5.8.3)': + '@typescript-eslint/utils@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.6.1(eslint@9.24.0) - '@typescript-eslint/scope-manager': 8.30.1 - '@typescript-eslint/types': 8.30.1 - '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) - eslint: 9.24.0 - typescript: 5.8.3 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + eslint: 9.38.0(jiti@2.6.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.30.1': + '@typescript-eslint/visitor-keys@8.46.2': + dependencies: + '@typescript-eslint/types': 8.46.2 + eslint-visitor-keys: 4.2.1 + + '@ungap/structured-clone@1.3.0': {} + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + optional: true + + '@unrs/resolver-binding-android-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': dependencies: - '@typescript-eslint/types': 8.30.1 - eslint-visitor-keys: 4.2.0 + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + optional: true '@webassemblyjs/ast@1.14.1': dependencies: @@ -5211,69 +5392,96 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@xhmikosr/archive-type@7.0.0': + '@xhmikosr/archive-type@7.1.0': dependencies: - file-type: 19.6.0 + file-type: 20.5.0 + transitivePeerDependencies: + - supports-color - '@xhmikosr/bin-check@7.0.3': + '@xhmikosr/bin-check@7.1.0': dependencies: execa: 5.1.1 isexe: 2.0.0 - '@xhmikosr/bin-wrapper@13.0.5': + '@xhmikosr/bin-wrapper@13.2.0': dependencies: - '@xhmikosr/bin-check': 7.0.3 - '@xhmikosr/downloader': 15.0.1 + '@xhmikosr/bin-check': 7.1.0 + '@xhmikosr/downloader': 15.2.0 '@xhmikosr/os-filter-obj': 3.0.0 bin-version-check: 5.1.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + - supports-color - '@xhmikosr/decompress-tar@8.0.1': + '@xhmikosr/decompress-tar@8.1.0': dependencies: - file-type: 19.6.0 + file-type: 20.5.0 is-stream: 2.0.1 tar-stream: 3.1.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + - supports-color - '@xhmikosr/decompress-tarbz2@8.0.2': + '@xhmikosr/decompress-tarbz2@8.1.0': dependencies: - '@xhmikosr/decompress-tar': 8.0.1 - file-type: 19.6.0 + '@xhmikosr/decompress-tar': 8.1.0 + file-type: 20.5.0 is-stream: 2.0.1 seek-bzip: 2.0.0 unbzip2-stream: 1.4.3 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + - supports-color - '@xhmikosr/decompress-targz@8.0.1': + '@xhmikosr/decompress-targz@8.1.0': dependencies: - '@xhmikosr/decompress-tar': 8.0.1 - file-type: 19.6.0 + '@xhmikosr/decompress-tar': 8.1.0 + file-type: 20.5.0 is-stream: 2.0.1 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + - supports-color - '@xhmikosr/decompress-unzip@7.0.0': + '@xhmikosr/decompress-unzip@7.1.0': dependencies: - file-type: 19.6.0 + file-type: 20.5.0 get-stream: 6.0.1 yauzl: 3.2.0 + transitivePeerDependencies: + - supports-color - '@xhmikosr/decompress@10.0.1': + '@xhmikosr/decompress@10.2.0': dependencies: - '@xhmikosr/decompress-tar': 8.0.1 - '@xhmikosr/decompress-tarbz2': 8.0.2 - '@xhmikosr/decompress-targz': 8.0.1 - '@xhmikosr/decompress-unzip': 7.0.0 + '@xhmikosr/decompress-tar': 8.1.0 + '@xhmikosr/decompress-tarbz2': 8.1.0 + '@xhmikosr/decompress-targz': 8.1.0 + '@xhmikosr/decompress-unzip': 7.1.0 graceful-fs: 4.2.11 - make-dir: 4.0.0 strip-dirs: 3.0.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + - supports-color - '@xhmikosr/downloader@15.0.1': + '@xhmikosr/downloader@15.2.0': dependencies: - '@xhmikosr/archive-type': 7.0.0 - '@xhmikosr/decompress': 10.0.1 + '@xhmikosr/archive-type': 7.1.0 + '@xhmikosr/decompress': 10.2.0 content-disposition: 0.5.4 - defaults: 3.0.0 + defaults: 2.0.2 ext-name: 5.0.0 - file-type: 19.6.0 + file-type: 20.5.0 filenamify: 6.0.0 get-stream: 6.0.1 got: 13.0.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + - supports-color '@xhmikosr/os-filter-obj@3.0.0': dependencies: @@ -5288,15 +5496,19 @@ snapshots: mime-types: 3.0.1 negotiator: 1.0.0 - acorn-jsx@5.3.2(acorn@8.14.1): + acorn-import-phases@1.0.4(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.14.1 + acorn: 8.15.0 acorn-walk@8.3.4: dependencies: - acorn: 8.14.1 + acorn: 8.15.0 - acorn@8.14.1: {} + acorn@8.15.0: {} ajv-formats@2.1.1(ajv@8.17.1): optionalDependencies: @@ -5325,7 +5537,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.6 + fast-uri: 3.1.0 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -5337,7 +5549,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} + ansi-regex@6.2.2: {} ansi-styles@4.3.0: dependencies: @@ -5345,9 +5557,9 @@ snapshots: ansi-styles@5.2.0: {} - ansi-styles@6.2.1: {} + ansi-styles@6.2.3: {} - ansis@3.17.0: {} + ansis@4.1.0: {} anymatch@3.1.3: dependencies: @@ -5374,82 +5586,80 @@ snapshots: asynckit@0.4.0: {} - axios@1.8.4: + axios@1.12.2: dependencies: - follow-redirects: 1.15.9 - form-data: 4.0.2 + follow-redirects: 1.15.11 + form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - b4a@1.6.7: {} + b4a@1.7.3: {} - babel-jest@29.7.0(@babel/core@7.26.10): + babel-jest@30.2.0(@babel/core@7.28.5): dependencies: - '@babel/core': 7.26.10 - '@jest/transform': 29.7.0 + '@babel/core': 7.28.5 + '@jest/transform': 30.2.0 '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.26.10) + babel-plugin-istanbul: 7.0.1 + babel-preset-jest: 30.2.0(@babel/core@7.28.5) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color - babel-plugin-istanbul@6.1.1: + babel-plugin-istanbul@7.0.1: dependencies: - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 + istanbul-lib-instrument: 6.0.3 test-exclude: 6.0.0 transitivePeerDependencies: - supports-color - babel-plugin-jest-hoist@29.6.3: + babel-plugin-jest-hoist@30.2.0: dependencies: - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.7 - - babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.10): - dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.10) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.10) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.10) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.10) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.10) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.10) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.10) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.10) - - babel-preset-jest@29.6.3(@babel/core@7.26.10): - dependencies: - '@babel/core': 7.26.10 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.10) + + babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.5): + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.5) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.5) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.5) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.5) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.5) + + babel-preset-jest@30.2.0(@babel/core@7.28.5): + dependencies: + '@babel/core': 7.28.5 + babel-plugin-jest-hoist: 30.2.0 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.5) balanced-match@1.0.2: {} - bare-events@2.5.4: - optional: true + bare-events@2.8.1: {} base64-js@1.5.1: {} + baseline-browser-mapping@2.8.20: {} + bin-version-check@5.1.0: dependencies: bin-version: 6.0.0 - semver: 7.7.1 + semver: 7.7.3 semver-truncate: 3.0.0 bin-version@6.0.0: @@ -5467,22 +5677,22 @@ snapshots: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 4.4.0 + debug: 4.4.3 http-errors: 2.0.0 iconv-lite: 0.6.3 on-finished: 2.4.1 qs: 6.14.0 - raw-body: 3.0.0 + raw-body: 3.0.1 type-is: 2.0.1 transitivePeerDependencies: - supports-color - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -5490,12 +5700,13 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.24.4: + browserslist@4.27.0: dependencies: - caniuse-lite: 1.0.30001714 - electron-to-chromium: 1.5.138 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.24.4) + baseline-browser-mapping: 2.8.20 + caniuse-lite: 1.0.30001751 + electron-to-chromium: 1.5.240 + node-releases: 2.0.26 + update-browserslist-db: 1.1.4(browserslist@4.27.0) bs-logger@0.2.6: dependencies: @@ -5522,16 +5733,31 @@ snapshots: bytes@3.1.2: {} + c12@3.1.0: + dependencies: + chokidar: 4.0.3 + confbox: 0.2.2 + defu: 6.1.4 + dotenv: 16.6.1 + exsolve: 1.0.7 + 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.0 + rc9: 2.1.2 + cacheable-lookup@7.0.0: {} cacheable-request@10.2.14: dependencies: '@types/http-cache-semantics': 4.0.4 get-stream: 6.0.1 - http-cache-semantics: 4.1.1 + http-cache-semantics: 4.2.0 keyv: 4.5.4 mimic-response: 4.0.0 - normalize-url: 8.0.1 + normalize-url: 8.1.0 responselike: 3.0.0 call-bind-apply-helpers@1.0.2: @@ -5550,7 +5776,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001714: {} + caniuse-lite@1.0.30001751: {} chalk@4.1.2: dependencies: @@ -5559,7 +5785,7 @@ snapshots: char-regex@1.0.2: {} - chardet@0.7.0: {} + chardet@2.1.0: {} chokidar@4.0.3: dependencies: @@ -5567,17 +5793,21 @@ snapshots: chrome-trace-event@1.0.4: {} - ci-info@3.9.0: {} + ci-info@4.3.1: {} + + citty@0.1.6: + dependencies: + consola: 3.4.2 - cjs-module-lexer@1.4.3: {} + cjs-module-lexer@2.1.0: {} class-transformer@0.5.1: {} - class-validator@0.14.1: + class-validator@0.14.2: dependencies: - '@types/validator': 13.15.0 - libphonenumber-js: 1.12.7 - validator: 13.15.0 + '@types/validator': 13.15.3 + libphonenumber-js: 1.12.25 + validator: 13.15.20 cli-cursor@3.1.0: dependencies: @@ -5603,34 +5833,28 @@ snapshots: co@4.6.0: {} - collect-v8-coverage@1.0.2: {} - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 + collect-v8-coverage@1.0.3: {} color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} + color-convert@3.1.2: + dependencies: + color-name: 2.0.2 color-name@1.1.4: {} - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 + color-name@2.0.2: {} - color@3.2.1: + color-string@2.1.2: dependencies: - color-convert: 1.9.3 - color-string: 1.9.1 + color-name: 2.0.2 - colorspace@1.1.4: + color@5.0.2: dependencies: - color: 3.2.1 - text-hex: 1.0.0 + color-convert: 3.1.2 + color-string: 2.1.2 combined-stream@1.0.8: dependencies: @@ -5644,25 +5868,25 @@ snapshots: commander@8.3.0: {} - comment-json@4.2.5: + comment-json@4.4.1: dependencies: array-timsort: 1.0.3 core-util-is: 1.0.3 esprima: 4.0.1 - has-own-prop: 2.0.0 - repeat-string: 1.6.1 component-emitter@1.3.1: {} concat-map@0.0.1: {} - concat-stream@1.6.2: + concat-stream@2.0.0: dependencies: buffer-from: 1.1.2 inherits: 2.0.4 - readable-stream: 2.3.8 + readable-stream: 3.6.2 typedarray: 0.0.6 + confbox@0.2.2: {} + consola@3.4.2: {} content-disposition@0.5.4: @@ -5690,29 +5914,14 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig@8.3.6(typescript@5.7.3): + cosmiconfig@8.3.6(typescript@5.8.3): dependencies: import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.7.3 - - create-jest@29.7.0(@types/node@22.14.1)(ts-node@10.9.2(@swc/core@1.11.21)(@types/node@22.14.1)(typescript@5.8.3)): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.14.1)(ts-node@10.9.2(@swc/core@1.11.21)(@types/node@22.14.1)(typescript@5.8.3)) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node + typescript: 5.8.3 create-require@1.1.1: {} @@ -5722,20 +5931,20 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - csv-generate@4.4.2: {} + csv-generate@4.5.0: {} - csv-parse@5.6.0: {} + csv-parse@6.1.0: {} - csv-stringify@6.5.2: {} + csv-stringify@6.6.0: {} - csv@6.3.11: + csv@6.4.1: dependencies: - csv-generate: 4.4.2 - csv-parse: 5.6.0 - csv-stringify: 6.5.2 - stream-transform: 3.3.3 + csv-generate: 4.5.0 + csv-parse: 6.1.0 + csv-stringify: 6.6.0 + stream-transform: 3.4.0 - debug@4.4.0: + debug@4.4.3: dependencies: ms: 2.1.3 @@ -5743,24 +5952,30 @@ snapshots: dependencies: mimic-response: 3.1.0 - dedent@1.5.3: {} + dedent@1.7.0: {} deep-is@0.1.4: {} + deepmerge-ts@7.1.5: {} + deepmerge@4.3.1: {} defaults@1.0.4: dependencies: clone: 1.0.4 - defaults@3.0.0: {} + defaults@2.0.2: {} defer-to-connect@2.0.1: {} + defu@6.1.4: {} + delayed-stream@1.0.0: {} depd@2.0.0: {} + destr@2.0.5: {} + detect-newline@3.1.0: {} dezalgo@1.0.4: @@ -5768,11 +5983,11 @@ snapshots: asap: 2.0.6 wrappy: 1.0.2 - diff-sequences@29.6.3: {} - diff@4.0.2: {} - dotenv@16.5.0: {} + dotenv@16.6.1: {} + + dotenv@17.2.3: {} dunder-proto@1.0.1: dependencies: @@ -5788,11 +6003,12 @@ snapshots: ee-first@1.1.1: {} - ejs@3.1.10: + effect@3.18.4: dependencies: - jake: 10.9.2 + '@standard-schema/spec': 1.0.0 + fast-check: 3.23.2 - electron-to-chromium@1.5.138: {} + electron-to-chromium@1.5.240: {} emittery@0.13.1: {} @@ -5800,16 +6016,18 @@ snapshots: emoji-regex@9.2.2: {} + empathic@2.0.0: {} + enabled@2.0.0: {} encodeurl@2.0.0: {} - enhanced-resolve@5.18.1: + enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.1 + tapable: 2.3.0 - error-ex@1.3.2: + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 @@ -5817,7 +6035,7 @@ snapshots: es-errors@1.3.0: {} - es-module-lexer@1.6.0: {} + es-module-lexer@1.7.0: {} es-object-atoms@1.1.1: dependencies: @@ -5830,41 +6048,6 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - esbuild-register@3.6.0(esbuild@0.25.2): - dependencies: - debug: 4.4.0 - esbuild: 0.25.2 - transitivePeerDependencies: - - supports-color - - esbuild@0.25.2: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.2 - '@esbuild/android-arm': 0.25.2 - '@esbuild/android-arm64': 0.25.2 - '@esbuild/android-x64': 0.25.2 - '@esbuild/darwin-arm64': 0.25.2 - '@esbuild/darwin-x64': 0.25.2 - '@esbuild/freebsd-arm64': 0.25.2 - '@esbuild/freebsd-x64': 0.25.2 - '@esbuild/linux-arm': 0.25.2 - '@esbuild/linux-arm64': 0.25.2 - '@esbuild/linux-ia32': 0.25.2 - '@esbuild/linux-loong64': 0.25.2 - '@esbuild/linux-mips64el': 0.25.2 - '@esbuild/linux-ppc64': 0.25.2 - '@esbuild/linux-riscv64': 0.25.2 - '@esbuild/linux-s390x': 0.25.2 - '@esbuild/linux-x64': 0.25.2 - '@esbuild/netbsd-arm64': 0.25.2 - '@esbuild/netbsd-x64': 0.25.2 - '@esbuild/openbsd-arm64': 0.25.2 - '@esbuild/openbsd-x64': 0.25.2 - '@esbuild/sunos-x64': 0.25.2 - '@esbuild/win32-arm64': 0.25.2 - '@esbuild/win32-ia32': 0.25.2 - '@esbuild/win32-x64': 0.25.2 - escalade@3.2.0: {} escape-html@1.0.3: {} @@ -5873,57 +6056,56 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.2(eslint@9.24.0): + eslint-config-prettier@10.1.8(eslint@9.38.0(jiti@2.6.1)): dependencies: - eslint: 9.24.0 + eslint: 9.38.0(jiti@2.6.1) - eslint-plugin-prettier@5.2.6(@types/eslint@9.6.1)(eslint-config-prettier@10.1.2(eslint@9.24.0))(eslint@9.24.0)(prettier@3.5.3): + eslint-plugin-prettier@5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.38.0(jiti@2.6.1)))(eslint@9.38.0(jiti@2.6.1))(prettier@3.6.2): dependencies: - eslint: 9.24.0 - prettier: 3.5.3 + eslint: 9.38.0(jiti@2.6.1) + prettier: 3.6.2 prettier-linter-helpers: 1.0.0 - synckit: 0.11.4 + synckit: 0.11.11 optionalDependencies: '@types/eslint': 9.6.1 - eslint-config-prettier: 10.1.2(eslint@9.24.0) + eslint-config-prettier: 10.1.8(eslint@9.38.0(jiti@2.6.1)) eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@8.3.0: + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.0: {} + eslint-visitor-keys@4.2.1: {} - eslint@9.24.0: + eslint@9.38.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.6.1(eslint@9.24.0) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.20.0 - '@eslint/config-helpers': 0.2.1 - '@eslint/core': 0.12.0 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.1 + '@eslint/core': 0.16.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.24.0 - '@eslint/plugin-kit': 0.2.8 - '@humanfs/node': 0.16.6 + '@eslint/js': 9.38.0 + '@eslint/plugin-kit': 0.4.0 + '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.2 - '@types/estree': 1.0.7 - '@types/json-schema': 7.0.15 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint-scope: 8.3.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -5938,14 +6120,16 @@ snapshots: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 transitivePeerDependencies: - supports-color - espree@10.3.0: + espree@10.4.0: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) - eslint-visitor-keys: 4.2.0 + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 esprima@4.0.1: {} @@ -5965,6 +6149,12 @@ snapshots: etag@1.8.1: {} + events-universal@1.0.1: + dependencies: + bare-events: 2.8.1 + transitivePeerDependencies: + - bare-abort-controller + events@3.3.0: {} execa@5.1.1: @@ -5979,15 +6169,16 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - exit@0.1.2: {} + exit-x@0.2.2: {} - expect@29.7.0: + expect@30.2.0: dependencies: - '@jest/expect-utils': 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 + '@jest/expect-utils': 30.2.0 + '@jest/get-type': 30.1.0 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 + jest-util: 30.2.0 express@5.1.0: dependencies: @@ -5997,7 +6188,7 @@ snapshots: content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.0 + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -6015,12 +6206,14 @@ snapshots: router: 2.2.0 send: 1.2.0 serve-static: 2.2.0 - statuses: 2.0.1 + statuses: 2.0.2 type-is: 2.0.1 vary: 1.1.2 transitivePeerDependencies: - supports-color + exsolve@1.0.7: {} + ext-list@2.2.2: dependencies: mime-db: 1.54.0 @@ -6030,11 +6223,9 @@ snapshots: ext-list: 2.2.2 sort-keys-length: 1.0.1 - external-editor@3.1.0: + fast-check@3.23.2: dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 + pure-rand: 6.1.0 fast-deep-equal@3.1.3: {} @@ -6056,7 +6247,7 @@ snapshots: fast-safe-stringify@2.1.1: {} - fast-uri@3.0.6: {} + fast-uri@3.1.0: {} fastq@1.19.1: dependencies: @@ -6066,6 +6257,10 @@ snapshots: dependencies: bser: 2.1.1 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + fecha@4.2.3: {} fflate@0.8.2: {} @@ -6074,25 +6269,23 @@ snapshots: dependencies: flat-cache: 4.0.1 - file-type@19.6.0: - dependencies: - get-stream: 9.0.1 - strtok3: 9.1.1 - token-types: 6.0.0 - uint8array-extras: 1.4.0 - - file-type@20.4.1: + file-type@20.5.0: dependencies: '@tokenizer/inflate': 0.2.7 - strtok3: 10.2.2 - token-types: 6.0.0 - uint8array-extras: 1.4.0 + strtok3: 10.3.4 + token-types: 6.1.1 + uint8array-extras: 1.5.0 transitivePeerDependencies: - supports-color - filelist@1.0.4: + file-type@21.0.0: dependencies: - minimatch: 5.1.6 + '@tokenizer/inflate': 0.2.7 + strtok3: 10.3.4 + token-types: 6.1.1 + uint8array-extras: 1.5.0 + transitivePeerDependencies: + - supports-color filename-reserved-regex@3.0.0: {} @@ -6106,12 +6299,12 @@ snapshots: finalhandler@2.1.0: dependencies: - debug: 4.4.0 + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color @@ -6138,43 +6331,44 @@ snapshots: fn.name@1.1.0: {} - follow-redirects@1.15.9: {} + follow-redirects@1.15.11: {} foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@9.1.0(typescript@5.7.3)(webpack@5.98.0(@swc/core@1.11.21)(esbuild@0.25.2)): + fork-ts-checker-webpack-plugin@9.1.0(typescript@5.8.3)(webpack@5.100.2(@swc/core@1.13.5)): dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 chalk: 4.1.2 chokidar: 4.0.3 - cosmiconfig: 8.3.6(typescript@5.7.3) + cosmiconfig: 8.3.6(typescript@5.8.3) deepmerge: 4.3.1 fs-extra: 10.1.0 memfs: 3.5.3 minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.7.1 - tapable: 2.2.1 - typescript: 5.7.3 - webpack: 5.98.0(@swc/core@1.11.21)(esbuild@0.25.2) + semver: 7.7.3 + tapable: 2.3.0 + typescript: 5.8.3 + webpack: 5.100.2(@swc/core@1.13.5) form-data-encoder@2.1.4: {} - form-data@4.0.2: + form-data@4.0.4: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 - formidable@3.5.2: + formidable@3.5.4: dependencies: + '@paralleldrive/cuid2': 2.3.1 dezalgo: 1.0.4 - hexoid: 2.0.0 once: 1.4.0 forwarded@0.2.0: {} @@ -6184,10 +6378,10 @@ snapshots: fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 - fs-monkey@1.0.6: {} + fs-monkey@1.1.0: {} fs.realpath@1.0.0: {} @@ -6222,10 +6416,14 @@ snapshots: get-stream@6.0.1: {} - get-stream@9.0.1: + giget@2.0.0: dependencies: - '@sec-ant/readable-stream': 0.4.1 - is-stream: 4.0.1 + citty: 0.1.6 + consola: 3.4.2 + defu: 6.1.4 + node-fetch-native: 1.6.7 + nypm: 0.6.2 + pathe: 2.0.3 glob-parent@5.1.2: dependencies: @@ -6237,11 +6435,20 @@ snapshots: glob-to-regexp@0.4.1: {} - glob@11.0.1: + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@11.0.3: dependencies: foreground-child: 3.3.1 - jackspeak: 4.1.0 - minimatch: 10.0.1 + jackspeak: 4.1.1 + minimatch: 10.0.3 minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 2.0.0 @@ -6255,11 +6462,9 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - globals@11.12.0: {} - globals@14.0.0: {} - globals@15.15.0: {} + globals@16.4.0: {} gopd@1.2.0: {} @@ -6281,9 +6486,16 @@ snapshots: graphemer@1.4.0: {} - has-flag@4.0.0: {} + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 - has-own-prop@2.0.0: {} + has-flag@4.0.0: {} has-symbols@1.1.0: {} @@ -6295,11 +6507,9 @@ snapshots: dependencies: function-bind: 1.1.2 - hexoid@2.0.0: {} - html-escaper@2.0.2: {} - http-cache-semantics@4.1.1: {} + http-cache-semantics@4.2.0: {} http-errors@2.0.0: dependencies: @@ -6316,11 +6526,11 @@ snapshots: human-signals@2.1.0: {} - iconv-lite@0.4.24: + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.6.3: + iconv-lite@0.7.0: dependencies: safer-buffer: 2.1.2 @@ -6328,6 +6538,8 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.5: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -6355,12 +6567,6 @@ snapshots: is-arrayish@0.2.1: {} - is-arrayish@0.3.2: {} - - is-core-module@2.16.1: - dependencies: - hasown: 2.0.2 - is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -6381,33 +6587,19 @@ snapshots: is-stream@2.0.1: {} - is-stream@4.0.1: {} - is-unicode-supported@0.1.0: {} - isarray@1.0.0: {} - isexe@2.0.0: {} istanbul-lib-coverage@3.2.2: {} - istanbul-lib-instrument@5.2.1: - dependencies: - '@babel/core': 7.26.10 - '@babel/parser': 7.27.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.26.10 - '@babel/parser': 7.27.0 + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.1 + semver: 7.7.3 transitivePeerDependencies: - supports-color @@ -6417,347 +6609,384 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@4.0.1: + istanbul-lib-source-maps@5.0.6: dependencies: - debug: 4.4.0 + '@jridgewell/trace-mapping': 0.3.31 + debug: 4.4.3 istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 transitivePeerDependencies: - supports-color - istanbul-reports@3.1.7: + istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 iterare@1.2.1: {} - jackspeak@4.1.0: + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 - jake@10.9.2: + jackspeak@4.1.1: dependencies: - async: 3.2.6 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 + '@isaacs/cliui': 8.0.2 - jest-changed-files@29.7.0: + jest-changed-files@30.2.0: dependencies: execa: 5.1.1 - jest-util: 29.7.0 + jest-util: 30.2.0 p-limit: 3.1.0 - jest-circus@29.7.0: + jest-circus@30.2.0: dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.14.1 + '@jest/environment': 30.2.0 + '@jest/expect': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 22.18.12 chalk: 4.1.2 co: 4.6.0 - dedent: 1.5.3 + dedent: 1.7.0 is-generator-fn: 2.1.0 - jest-each: 29.7.0 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 + jest-each: 30.2.0 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-runtime: 30.2.0 + jest-snapshot: 30.2.0 + jest-util: 30.2.0 p-limit: 3.1.0 - pretty-format: 29.7.0 - pure-rand: 6.1.0 + pretty-format: 30.2.0 + pure-rand: 7.0.1 slash: 3.0.0 stack-utils: 2.0.6 transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@22.14.1)(ts-node@10.9.2(@swc/core@1.11.21)(@types/node@22.14.1)(typescript@5.8.3)): + jest-cli@30.2.0(@types/node@24.9.1)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.1)(typescript@5.9.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.11.21)(@types/node@22.14.1)(typescript@5.8.3)) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 + '@jest/core': 30.2.0(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.1)(typescript@5.9.3)) + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.14.1)(ts-node@10.9.2(@swc/core@1.11.21)(@types/node@22.14.1)(typescript@5.8.3)) - exit: 0.1.2 + exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.14.1)(ts-node@10.9.2(@swc/core@1.11.21)(@types/node@22.14.1)(typescript@5.8.3)) - jest-util: 29.7.0 - jest-validate: 29.7.0 + jest-config: 30.2.0(@types/node@24.9.1)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.1)(typescript@5.9.3)) + jest-util: 30.2.0 + jest-validate: 30.2.0 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' - babel-plugin-macros + - esbuild-register - supports-color - ts-node - jest-config@29.7.0(@types/node@22.14.1)(ts-node@10.9.2(@swc/core@1.11.21)(@types/node@22.14.1)(typescript@5.8.3)): + jest-config@30.2.0(@types/node@22.18.12)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.1)(typescript@5.9.3)): dependencies: - '@babel/core': 7.26.10 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.10) + '@babel/core': 7.28.5 + '@jest/get-type': 30.1.0 + '@jest/pattern': 30.0.1 + '@jest/test-sequencer': 30.2.0 + '@jest/types': 30.2.0 + babel-jest: 30.2.0(@babel/core@7.28.5) chalk: 4.1.2 - ci-info: 3.9.0 + ci-info: 4.3.1 deepmerge: 4.3.1 - glob: 7.2.3 + glob: 10.4.5 + graceful-fs: 4.2.11 + jest-circus: 30.2.0 + jest-docblock: 30.2.0 + jest-environment-node: 30.2.0 + jest-regex-util: 30.0.1 + jest-resolve: 30.2.0 + jest-runner: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 30.2.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.18.12 + ts-node: 10.9.2(@swc/core@1.13.5)(@types/node@24.9.1)(typescript@5.9.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@30.2.0(@types/node@24.9.1)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.1)(typescript@5.9.3)): + dependencies: + '@babel/core': 7.28.5 + '@jest/get-type': 30.1.0 + '@jest/pattern': 30.0.1 + '@jest/test-sequencer': 30.2.0 + '@jest/types': 30.2.0 + babel-jest: 30.2.0(@babel/core@7.28.5) + chalk: 4.1.2 + ci-info: 4.3.1 + deepmerge: 4.3.1 + glob: 10.4.5 graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 + jest-circus: 30.2.0 + jest-docblock: 30.2.0 + jest-environment-node: 30.2.0 + jest-regex-util: 30.0.1 + jest-resolve: 30.2.0 + jest-runner: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 micromatch: 4.0.8 parse-json: 5.2.0 - pretty-format: 29.7.0 + pretty-format: 30.2.0 slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 22.14.1 - ts-node: 10.9.2(@swc/core@1.11.21)(@types/node@22.14.1)(typescript@5.8.3) + '@types/node': 24.9.1 + ts-node: 10.9.2(@swc/core@1.13.5)(@types/node@24.9.1)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-diff@29.7.0: + jest-diff@30.2.0: dependencies: + '@jest/diff-sequences': 30.0.1 + '@jest/get-type': 30.1.0 chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 + pretty-format: 30.2.0 - jest-docblock@29.7.0: + jest-docblock@30.2.0: dependencies: detect-newline: 3.1.0 - jest-each@29.7.0: + jest-each@30.2.0: dependencies: - '@jest/types': 29.6.3 + '@jest/get-type': 30.1.0 + '@jest/types': 30.2.0 chalk: 4.1.2 - jest-get-type: 29.6.3 - jest-util: 29.7.0 - pretty-format: 29.7.0 + jest-util: 30.2.0 + pretty-format: 30.2.0 - jest-environment-node@29.7.0: + jest-environment-node@30.2.0: dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.14.1 - jest-mock: 29.7.0 - jest-util: 29.7.0 + '@jest/environment': 30.2.0 + '@jest/fake-timers': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 22.18.12 + jest-mock: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 - jest-get-type@29.6.3: {} - - jest-haste-map@29.7.0: + jest-haste-map@30.2.0: dependencies: - '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.9 - '@types/node': 22.14.1 + '@jest/types': 30.2.0 + '@types/node': 22.18.12 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - jest-worker: 29.7.0 + jest-regex-util: 30.0.1 + jest-util: 30.2.0 + jest-worker: 30.2.0 micromatch: 4.0.8 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 - jest-leak-detector@29.7.0: + jest-leak-detector@30.2.0: dependencies: - jest-get-type: 29.6.3 - pretty-format: 29.7.0 + '@jest/get-type': 30.1.0 + pretty-format: 30.2.0 - jest-matcher-utils@29.7.0: + jest-matcher-utils@30.2.0: dependencies: + '@jest/get-type': 30.1.0 chalk: 4.1.2 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 + jest-diff: 30.2.0 + pretty-format: 30.2.0 - jest-message-util@29.7.0: + jest-message-util@30.2.0: dependencies: - '@babel/code-frame': 7.26.2 - '@jest/types': 29.6.3 + '@babel/code-frame': 7.27.1 + '@jest/types': 30.2.0 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 micromatch: 4.0.8 - pretty-format: 29.7.0 + pretty-format: 30.2.0 slash: 3.0.0 stack-utils: 2.0.6 - jest-mock@29.7.0: + jest-mock@30.2.0: dependencies: - '@jest/types': 29.6.3 - '@types/node': 22.14.1 - jest-util: 29.7.0 + '@jest/types': 30.2.0 + '@types/node': 22.18.12 + jest-util: 30.2.0 - jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + jest-pnp-resolver@1.2.3(jest-resolve@30.2.0): optionalDependencies: - jest-resolve: 29.7.0 + jest-resolve: 30.2.0 - jest-regex-util@29.6.3: {} + jest-regex-util@30.0.1: {} - jest-resolve-dependencies@29.7.0: + jest-resolve-dependencies@30.2.0: dependencies: - jest-regex-util: 29.6.3 - jest-snapshot: 29.7.0 + jest-regex-util: 30.0.1 + jest-snapshot: 30.2.0 transitivePeerDependencies: - supports-color - jest-resolve@29.7.0: + jest-resolve@30.2.0: dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - resolve: 1.22.10 - resolve.exports: 2.0.3 + jest-haste-map: 30.2.0 + jest-pnp-resolver: 1.2.3(jest-resolve@30.2.0) + jest-util: 30.2.0 + jest-validate: 30.2.0 slash: 3.0.0 + unrs-resolver: 1.11.1 - jest-runner@29.7.0: + jest-runner@30.2.0: dependencies: - '@jest/console': 29.7.0 - '@jest/environment': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.14.1 + '@jest/console': 30.2.0 + '@jest/environment': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 22.18.12 chalk: 4.1.2 emittery: 0.13.1 + exit-x: 0.2.2 graceful-fs: 4.2.11 - jest-docblock: 29.7.0 - jest-environment-node: 29.7.0 - jest-haste-map: 29.7.0 - jest-leak-detector: 29.7.0 - jest-message-util: 29.7.0 - jest-resolve: 29.7.0 - jest-runtime: 29.7.0 - jest-util: 29.7.0 - jest-watcher: 29.7.0 - jest-worker: 29.7.0 + jest-docblock: 30.2.0 + jest-environment-node: 30.2.0 + jest-haste-map: 30.2.0 + jest-leak-detector: 30.2.0 + jest-message-util: 30.2.0 + jest-resolve: 30.2.0 + jest-runtime: 30.2.0 + jest-util: 30.2.0 + jest-watcher: 30.2.0 + jest-worker: 30.2.0 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color - jest-runtime@29.7.0: + jest-runtime@30.2.0: dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/globals': 29.7.0 - '@jest/source-map': 29.6.3 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.14.1 + '@jest/environment': 30.2.0 + '@jest/fake-timers': 30.2.0 + '@jest/globals': 30.2.0 + '@jest/source-map': 30.0.1 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 22.18.12 chalk: 4.1.2 - cjs-module-lexer: 1.4.3 - collect-v8-coverage: 1.0.2 - glob: 7.2.3 + cjs-module-lexer: 2.1.0 + collect-v8-coverage: 1.0.3 + glob: 10.4.5 graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 + jest-haste-map: 30.2.0 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 + jest-regex-util: 30.0.1 + jest-resolve: 30.2.0 + jest-snapshot: 30.2.0 + jest-util: 30.2.0 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - jest-snapshot@29.7.0: - dependencies: - '@babel/core': 7.26.10 - '@babel/generator': 7.27.0 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) - '@babel/types': 7.27.0 - '@jest/expect-utils': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.10) + jest-snapshot@30.2.0: + dependencies: + '@babel/core': 7.28.5 + '@babel/generator': 7.28.5 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) + '@babel/types': 7.28.5 + '@jest/expect-utils': 30.2.0 + '@jest/get-type': 30.1.0 + '@jest/snapshot-utils': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.5) chalk: 4.1.2 - expect: 29.7.0 + expect: 30.2.0 graceful-fs: 4.2.11 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - natural-compare: 1.4.0 - pretty-format: 29.7.0 - semver: 7.7.1 + jest-diff: 30.2.0 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-util: 30.2.0 + pretty-format: 30.2.0 + semver: 7.7.3 + synckit: 0.11.11 transitivePeerDependencies: - supports-color - jest-util@29.7.0: + jest-util@30.2.0: dependencies: - '@jest/types': 29.6.3 - '@types/node': 22.14.1 + '@jest/types': 30.2.0 + '@types/node': 22.18.12 chalk: 4.1.2 - ci-info: 3.9.0 + ci-info: 4.3.1 graceful-fs: 4.2.11 - picomatch: 2.3.1 + picomatch: 4.0.2 - jest-validate@29.7.0: + jest-validate@30.2.0: dependencies: - '@jest/types': 29.6.3 + '@jest/get-type': 30.1.0 + '@jest/types': 30.2.0 camelcase: 6.3.0 chalk: 4.1.2 - jest-get-type: 29.6.3 leven: 3.1.0 - pretty-format: 29.7.0 + pretty-format: 30.2.0 - jest-watcher@29.7.0: + jest-watcher@30.2.0: dependencies: - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.14.1 + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 22.18.12 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 - jest-util: 29.7.0 + jest-util: 30.2.0 string-length: 4.0.2 jest-worker@27.5.1: dependencies: - '@types/node': 22.14.1 + '@types/node': 22.18.12 merge-stream: 2.0.0 supports-color: 8.1.1 - jest-worker@29.7.0: + jest-worker@30.2.0: dependencies: - '@types/node': 22.14.1 - jest-util: 29.7.0 + '@types/node': 22.18.12 + '@ungap/structured-clone': 1.3.0 + jest-util: 30.2.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@22.14.1)(ts-node@10.9.2(@swc/core@1.11.21)(@types/node@22.14.1)(typescript@5.8.3)): + jest@30.2.0(@types/node@24.9.1)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.1)(typescript@5.9.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.11.21)(@types/node@22.14.1)(typescript@5.8.3)) - '@jest/types': 29.6.3 + '@jest/core': 30.2.0(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.1)(typescript@5.9.3)) + '@jest/types': 30.2.0 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.14.1)(ts-node@10.9.2(@swc/core@1.11.21)(@types/node@22.14.1)(typescript@5.8.3)) + jest-cli: 30.2.0(@types/node@24.9.1)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.1)(typescript@5.9.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros + - esbuild-register - supports-color - ts-node + jiti@2.6.1: {} + jose@4.15.9: {} js-tokens@4.0.0: {} @@ -6789,7 +7018,7 @@ snapshots: jsonc-parser@3.3.1: {} - jsonfile@6.1.0: + jsonfile@6.2.0: dependencies: universalify: 2.0.1 optionalDependencies: @@ -6806,9 +7035,9 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.7.1 + semver: 7.7.3 - jwa@1.4.1: + jwa@1.4.2: dependencies: buffer-equal-constant-time: 1.0.1 ecdsa-sig-formatter: 1.0.11 @@ -6816,9 +7045,9 @@ snapshots: jwks-rsa@3.2.0: dependencies: - '@types/express': 4.17.21 - '@types/jsonwebtoken': 9.0.9 - debug: 4.4.0 + '@types/express': 4.17.24 + '@types/jsonwebtoken': 9.0.10 + debug: 4.4.3 jose: 4.15.9 limiter: 1.1.5 lru-memoizer: 2.3.0 @@ -6827,7 +7056,7 @@ snapshots: jws@3.2.2: dependencies: - jwa: 1.4.1 + jwa: 1.4.2 safe-buffer: 5.2.1 keyv@4.5.4: @@ -6836,8 +7065,6 @@ snapshots: kind-of@6.0.3: {} - kleur@3.0.3: {} - kuler@2.0.0: {} leven@3.1.0: {} @@ -6847,15 +7074,15 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - libphonenumber-js@1.12.7: {} + libphonenumber-js@1.12.25: {} limiter@1.1.5: {} lines-and-columns@1.2.4: {} - load-esm@1.0.2: {} + load-esm@1.0.3: {} - loader-runner@4.3.0: {} + loader-runner@4.3.1: {} locate-path@5.0.0: dependencies: @@ -6903,7 +7130,9 @@ snapshots: lowercase-keys@3.0.0: {} - lru-cache@11.1.0: {} + lru-cache@10.4.3: {} + + lru-cache@11.2.2: {} lru-cache@5.1.1: dependencies: @@ -6920,11 +7149,11 @@ snapshots: magic-string@0.30.17: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 make-dir@4.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.3 make-error@1.3.6: {} @@ -6940,7 +7169,7 @@ snapshots: memfs@3.5.3: dependencies: - fs-monkey: 1.0.6 + fs-monkey: 1.1.0 merge-descriptors@2.0.0: {} @@ -6975,21 +7204,17 @@ snapshots: mimic-response@4.0.0: {} - minimatch@10.0.1: + minimatch@10.0.3: dependencies: - brace-expansion: 2.0.1 + '@isaacs/brace-expansion': 5.0.0 minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 - - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.1 + brace-expansion: 1.1.12 minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimist@1.2.8: {} @@ -7001,11 +7226,11 @@ snapshots: ms@2.1.3: {} - multer@1.4.5-lts.2: + multer@2.0.2: dependencies: append-field: 1.0.0 busboy: 1.6.0 - concat-stream: 1.6.2 + concat-stream: 2.0.0 mkdirp: 0.5.6 object-assign: 4.1.1 type-is: 1.6.18 @@ -7013,7 +7238,9 @@ snapshots: mute-stream@2.0.0: {} - nanoid@5.1.5: {} + nanoid@5.1.6: {} + + napi-postinstall@0.3.4: {} natural-compare@1.4.0: {} @@ -7027,22 +7254,34 @@ snapshots: dependencies: lodash: 4.17.21 + node-fetch-native@1.6.7: {} + node-int64@0.4.0: {} - node-releases@2.0.19: {} + node-releases@2.0.26: {} normalize-path@3.0.0: {} - normalize-url@8.0.1: {} + normalize-url@8.1.0: {} npm-run-path@4.0.1: dependencies: path-key: 3.1.1 + nypm@0.6.2: + dependencies: + citty: 0.1.6 + consola: 3.4.2 + pathe: 2.0.3 + pkg-types: 2.3.0 + tinyexec: 1.0.1 + object-assign@4.1.1: {} object-inspect@1.13.4: {} + ohash@2.0.11: {} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 @@ -7080,8 +7319,6 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 - os-tmpdir@1.0.2: {} - p-cancelable@3.0.0: {} p-limit@2.3.0: @@ -7110,8 +7347,8 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.26.2 - error-ex: 1.3.2 + '@babel/code-frame': 7.27.1 + error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -7123,39 +7360,50 @@ snapshots: path-key@3.1.1: {} - path-parse@1.0.7: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 path-scurry@2.0.0: dependencies: - lru-cache: 11.1.0 + lru-cache: 11.2.2 minipass: 7.1.2 - path-to-regexp@8.2.0: {} + path-to-regexp@8.3.0: {} path-type@4.0.0: {} - peek-readable@5.4.2: {} - - peek-readable@7.0.0: {} + pathe@2.0.3: {} pend@1.2.0: {} + perfect-debounce@1.0.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} picomatch@4.0.2: {} + picomatch@4.0.3: {} + pirates@4.0.7: {} piscina@4.9.2: optionalDependencies: - '@napi-rs/nice': 1.0.1 + '@napi-rs/nice': 1.1.1 pkg-dir@4.2.0: dependencies: find-up: 4.1.0 + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.7 + pathe: 2.0.3 + pluralize@8.0.0: {} prelude-ls@1.2.1: {} @@ -7164,30 +7412,22 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier@3.5.3: {} + prettier@3.6.2: {} - pretty-format@29.7.0: + pretty-format@30.2.0: dependencies: - '@jest/schemas': 29.6.3 + '@jest/schemas': 30.0.5 ansi-styles: 5.2.0 react-is: 18.3.1 - prisma@6.6.0(typescript@5.8.3): + prisma@6.18.0(typescript@5.9.3): dependencies: - '@prisma/config': 6.6.0 - '@prisma/engines': 6.6.0 + '@prisma/config': 6.18.0 + '@prisma/engines': 6.18.0 optionalDependencies: - fsevents: 2.3.3 - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - - supports-color - - process-nextick-args@2.0.1: {} - - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 + - magicast proxy-addr@2.0.7: dependencies: @@ -7200,6 +7440,8 @@ snapshots: pure-rand@6.1.0: {} + pure-rand@7.0.1: {} + qs@6.14.0: dependencies: side-channel: 1.1.0 @@ -7214,24 +7456,19 @@ snapshots: range-parser@1.2.1: {} - raw-body@3.0.0: + raw-body@3.0.1: dependencies: bytes: 3.1.2 http-errors: 2.0.0 - iconv-lite: 0.6.3 + iconv-lite: 0.7.0 unpipe: 1.0.0 - react-is@18.3.1: {} - - readable-stream@2.3.8: + rc9@2.1.2: 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 + defu: 6.1.4 + destr: 2.0.5 + + react-is@18.3.1: {} readable-stream@3.6.2: dependencies: @@ -7243,8 +7480,6 @@ snapshots: reflect-metadata@0.2.2: {} - repeat-string@1.6.1: {} - require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -7259,14 +7494,6 @@ snapshots: resolve-from@5.0.0: {} - resolve.exports@2.0.3: {} - - resolve@1.22.10: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - responselike@3.0.0: dependencies: lowercase-keys: 3.0.0 @@ -7280,11 +7507,11 @@ snapshots: router@2.2.0: dependencies: - debug: 4.4.0 + debug: 4.4.3 depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 - path-to-regexp: 8.2.0 + path-to-regexp: 8.3.0 transitivePeerDependencies: - supports-color @@ -7300,8 +7527,6 @@ snapshots: dependencies: tslib: 2.8.1 - safe-buffer@5.1.2: {} - safe-buffer@5.2.1: {} safe-stable-stringify@2.5.0: {} @@ -7314,7 +7539,7 @@ snapshots: ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - schema-utils@4.3.0: + schema-utils@4.3.3: dependencies: '@types/json-schema': 7.0.15 ajv: 8.17.1 @@ -7329,15 +7554,15 @@ snapshots: semver-truncate@3.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.3 semver@6.3.1: {} - semver@7.7.1: {} + semver@7.7.3: {} send@1.2.0: dependencies: - debug: 4.4.0 + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -7347,7 +7572,7 @@ snapshots: ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color @@ -7404,12 +7629,6 @@ snapshots: signal-exit@4.1.0: {} - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 - - sisteransi@1.0.5: {} - slash@3.0.0: {} sort-keys-length@1.0.1: @@ -7434,6 +7653,8 @@ snapshots: source-map@0.7.4: {} + source-map@0.7.6: {} + sprintf-js@1.0.3: {} stack-trace@0.0.10: {} @@ -7444,16 +7665,20 @@ snapshots: statuses@2.0.1: {} - stream-transform@3.3.3: {} + statuses@2.0.2: {} + + stream-transform@3.4.0: {} streamsearch@1.1.0: {} - streamx@2.22.0: + streamx@2.23.0: dependencies: + events-universal: 1.0.1 fast-fifo: 1.3.2 text-decoder: 1.2.3 - optionalDependencies: - bare-events: 2.5.4 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a string-length@4.0.2: dependencies: @@ -7470,11 +7695,7 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 + strip-ansi: 7.1.2 string_decoder@1.3.0: dependencies: @@ -7484,9 +7705,9 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: + strip-ansi@7.1.2: dependencies: - ansi-regex: 6.1.0 + ansi-regex: 6.2.2 strip-bom@3.0.0: {} @@ -7501,34 +7722,28 @@ snapshots: strip-json-comments@3.1.1: {} - strtok3@10.2.2: + strtok3@10.3.4: dependencies: '@tokenizer/token': 0.3.0 - peek-readable: 7.0.0 - strtok3@9.1.1: - dependencies: - '@tokenizer/token': 0.3.0 - peek-readable: 5.4.2 - - superagent@9.0.2: + superagent@10.2.3: dependencies: component-emitter: 1.3.1 cookiejar: 2.1.4 - debug: 4.4.0 + debug: 4.4.3 fast-safe-stringify: 2.1.1 - form-data: 4.0.2 - formidable: 3.5.2 + form-data: 4.0.4 + formidable: 3.5.4 methods: 1.1.2 mime: 2.6.0 qs: 6.14.0 transitivePeerDependencies: - supports-color - supertest@7.1.0: + supertest@7.1.4: dependencies: methods: 1.1.2 - superagent: 9.0.2 + superagent: 10.2.3 transitivePeerDependencies: - supports-color @@ -7540,43 +7755,42 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-preserve-symlinks-flag@1.0.0: {} - - swagger-ui-dist@5.21.0: + swagger-ui-dist@5.29.4: dependencies: '@scarf/scarf': 1.4.0 symbol-observable@4.0.0: {} - synckit@0.11.4: + synckit@0.11.11: dependencies: - '@pkgr/core': 0.2.4 - tslib: 2.8.1 + '@pkgr/core': 0.2.9 - tapable@2.2.1: {} + tapable@2.3.0: {} tar-stream@3.1.7: dependencies: - b4a: 1.6.7 + b4a: 1.7.3 fast-fifo: 1.3.2 - streamx: 2.22.0 + streamx: 2.23.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - terser-webpack-plugin@5.3.14(@swc/core@1.11.21)(esbuild@0.25.2)(webpack@5.98.0(@swc/core@1.11.21)(esbuild@0.25.2)): + terser-webpack-plugin@5.3.14(@swc/core@1.13.5)(webpack@5.100.2(@swc/core@1.13.5)): dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 - schema-utils: 4.3.0 + schema-utils: 4.3.3 serialize-javascript: 6.0.2 - terser: 5.39.0 - webpack: 5.98.0(@swc/core@1.11.21)(esbuild@0.25.2) + terser: 5.44.0 + webpack: 5.100.2(@swc/core@1.13.5) optionalDependencies: - '@swc/core': 1.11.21 - esbuild: 0.25.2 + '@swc/core': 1.13.5 - terser@5.39.0: + terser@5.44.0: dependencies: - '@jridgewell/source-map': 0.3.6 - acorn: 8.14.1 + '@jridgewell/source-map': 0.3.11 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -7588,15 +7802,20 @@ snapshots: text-decoder@1.2.3: dependencies: - b4a: 1.6.7 + b4a: 1.7.3 + transitivePeerDependencies: + - react-native-b4a text-hex@1.0.0: {} through@2.3.8: {} - tmp@0.0.33: + tinyexec@1.0.1: {} + + tinyglobby@0.2.15: dependencies: - os-tmpdir: 1.0.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 tmpl@1.0.5: {} @@ -7606,8 +7825,9 @@ snapshots: toidentifier@1.0.1: {} - token-types@6.0.0: + token-types@6.1.1: dependencies: + '@borewit/text-codec': 0.1.1 '@tokenizer/token': 0.3.0 ieee754: 1.2.1 @@ -7617,70 +7837,69 @@ snapshots: trolleyhq@1.1.0: dependencies: - axios: 1.8.4 + axios: 1.12.2 transitivePeerDependencies: - debug - ts-api-utils@2.1.0(typescript@5.8.3): + ts-api-utils@2.1.0(typescript@5.9.3): dependencies: - typescript: 5.8.3 + typescript: 5.9.3 - ts-jest@29.3.2(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.25.2)(jest@29.7.0(@types/node@22.14.1)(ts-node@10.9.2(@swc/core@1.11.21)(@types/node@22.14.1)(typescript@5.8.3)))(typescript@5.8.3): + ts-jest@29.4.5(@babel/core@7.28.5)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.5))(jest-util@30.2.0)(jest@30.2.0(@types/node@24.9.1)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.1)(typescript@5.9.3)))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 - ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.14.1)(ts-node@10.9.2(@swc/core@1.11.21)(@types/node@22.14.1)(typescript@5.8.3)) - jest-util: 29.7.0 + handlebars: 4.7.8 + jest: 30.2.0(@types/node@24.9.1)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.1)(typescript@5.9.3)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.7.1 - type-fest: 4.40.0 - typescript: 5.8.3 + semver: 7.7.3 + type-fest: 4.41.0 + typescript: 5.9.3 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.26.10 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.10) - esbuild: 0.25.2 + '@babel/core': 7.28.5 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + babel-jest: 30.2.0(@babel/core@7.28.5) + jest-util: 30.2.0 - ts-loader@9.5.2(typescript@5.8.3)(webpack@5.98.0(@swc/core@1.11.21)(esbuild@0.25.2)): + ts-loader@9.5.4(typescript@5.9.3)(webpack@5.100.2(@swc/core@1.13.5)): dependencies: chalk: 4.1.2 - enhanced-resolve: 5.18.1 + enhanced-resolve: 5.18.3 micromatch: 4.0.8 - semver: 7.7.1 - source-map: 0.7.4 - typescript: 5.8.3 - webpack: 5.98.0(@swc/core@1.11.21)(esbuild@0.25.2) + semver: 7.7.3 + source-map: 0.7.6 + typescript: 5.9.3 + webpack: 5.100.2(@swc/core@1.13.5) - ts-node@10.9.2(@swc/core@1.11.21)(@types/node@22.14.1)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.13.5)(@types/node@24.9.1)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.14.1 - acorn: 8.14.1 + '@types/node': 24.9.1 + acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.8.3 + typescript: 5.9.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.11.21 + '@swc/core': 1.13.5 tsconfig-paths-webpack-plugin@4.2.0: dependencies: chalk: 4.1.2 - enhanced-resolve: 5.18.1 - tapable: 2.2.1 + enhanced-resolve: 5.18.3 + tapable: 2.3.0 tsconfig-paths: 4.2.0 tsconfig-paths@4.2.0: @@ -7699,7 +7918,7 @@ snapshots: type-fest@0.21.3: {} - type-fest@4.40.0: {} + type-fest@4.41.0: {} type-is@1.6.18: dependencies: @@ -7714,25 +7933,29 @@ snapshots: typedarray@0.0.6: {} - typescript-eslint@8.30.1(eslint@9.24.0)(typescript@5.8.3): + typescript-eslint@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0)(typescript@5.8.3))(eslint@9.24.0)(typescript@5.8.3) - '@typescript-eslint/parser': 8.30.1(eslint@9.24.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.30.1(eslint@9.24.0)(typescript@5.8.3) - eslint: 9.24.0 - typescript: 5.8.3 + '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.38.0(jiti@2.6.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - typescript@5.7.3: {} - typescript@5.8.3: {} + typescript@5.9.3: {} + + uglify-js@3.19.3: + optional: true + uid@2.0.2: dependencies: '@lukeed/csprng': 1.1.0 - uint8array-extras@1.4.0: {} + uint8array-extras@1.5.0: {} unbzip2-stream@1.4.3: dependencies: @@ -7741,13 +7964,39 @@ snapshots: undici-types@6.21.0: {} + undici-types@7.16.0: {} + universalify@2.0.1: {} unpipe@1.0.0: {} - update-browserslist-db@1.1.3(browserslist@4.24.4): + unrs-resolver@1.11.1: dependencies: - browserslist: 4.24.4 + napi-postinstall: 0.3.4 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 + '@unrs/resolver-binding-android-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-x64': 1.11.1 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 + + update-browserslist-db@1.1.4(browserslist@4.27.0): + dependencies: + browserslist: 4.27.0 escalade: 3.2.0 picocolors: 1.1.1 @@ -7761,11 +8010,11 @@ snapshots: v8-to-istanbul@9.3.0: dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.31 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - validator@13.15.0: {} + validator@13.15.20: {} vary@1.1.2: {} @@ -7773,7 +8022,7 @@ snapshots: dependencies: makeerror: 1.0.12 - watchpack@2.4.2: + watchpack@2.4.4: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 @@ -7784,33 +8033,35 @@ snapshots: webpack-node-externals@3.0.0: {} - webpack-sources@3.2.3: {} + webpack-sources@3.3.3: {} - webpack@5.98.0(@swc/core@1.11.21)(esbuild@0.25.2): + webpack@5.100.2(@swc/core@1.13.5): dependencies: '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.14.1 - browserslist: 4.24.4 + acorn: 8.15.0 + acorn-import-phases: 1.0.4(acorn@8.15.0) + browserslist: 4.27.0 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.1 - es-module-lexer: 1.6.0 + enhanced-resolve: 5.18.3 + es-module-lexer: 1.7.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 + loader-runner: 4.3.1 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(@swc/core@1.11.21)(esbuild@0.25.2)(webpack@5.98.0(@swc/core@1.11.21)(esbuild@0.25.2)) - watchpack: 2.4.2 - webpack-sources: 3.2.3 + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.14(@swc/core@1.13.5)(webpack@5.100.2(@swc/core@1.13.5)) + watchpack: 2.4.4 + webpack-sources: 3.3.3 transitivePeerDependencies: - '@swc/core' - esbuild @@ -7826,10 +8077,10 @@ snapshots: readable-stream: 3.6.2 triple-beam: 1.4.1 - winston@3.17.0: + winston@3.18.3: dependencies: '@colors/colors': 1.6.0 - '@dabh/diagnostics': 2.0.3 + '@dabh/diagnostics': 2.0.8 async: 3.2.6 is-stream: 2.0.1 logform: 2.7.0 @@ -7842,6 +8093,8 @@ snapshots: word-wrap@1.2.5: {} + wordwrap@1.0.0: {} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -7856,16 +8109,16 @@ snapshots: wrap-ansi@8.1.0: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 5.1.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrappy@1.0.2: {} - write-file-atomic@4.0.2: + write-file-atomic@5.0.1: dependencies: imurmurhash: 0.1.4 - signal-exit: 3.0.7 + signal-exit: 4.1.0 xtend@4.0.2: {} @@ -7896,4 +8149,4 @@ snapshots: yocto-queue@0.1.0: {} - yoctocolors-cjs@2.1.2: {} + yoctocolors-cjs@2.1.3: {} diff --git a/prisma/migrations/20250929082539_remove_rewards_table/migration.sql b/prisma/migrations/20250929082539_remove_rewards_table/migration.sql new file mode 100644 index 0000000..2162985 --- /dev/null +++ b/prisma/migrations/20250929082539_remove_rewards_table/migration.sql @@ -0,0 +1,11 @@ +/* + Warnings: + + - You are about to drop the `reward` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- DropForeignKey +ALTER TABLE "reward" DROP CONSTRAINT "reward_winnings_id_fkey"; + +-- DropTable +DROP TABLE "reward"; diff --git a/prisma/migrations/20250929082731_drop_payoneer_paypal_payment_methods/migration.sql b/prisma/migrations/20250929082731_drop_payoneer_paypal_payment_methods/migration.sql new file mode 100644 index 0000000..9041bde --- /dev/null +++ b/prisma/migrations/20250929082731_drop_payoneer_paypal_payment_methods/migration.sql @@ -0,0 +1,18 @@ +/* + Warnings: + + - You are about to drop the `payoneer_payment_method` table. If the table is not empty, all the data it contains will be lost. + - You are about to drop the `paypal_payment_method` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- DropForeignKey +ALTER TABLE "payoneer_payment_method" DROP CONSTRAINT "fk_payoneer_user_payment_method"; + +-- DropForeignKey +ALTER TABLE "paypal_payment_method" DROP CONSTRAINT "fk_paypal_user_payment_method"; + +-- DropTable +DROP TABLE "payoneer_payment_method"; + +-- DropTable +DROP TABLE "paypal_payment_method"; diff --git a/prisma/migrations/20251020100641_challenge-processing-lock/migration.sql b/prisma/migrations/20251020100641_challenge-processing-lock/migration.sql new file mode 100644 index 0000000..5a54934 --- /dev/null +++ b/prisma/migrations/20251020100641_challenge-processing-lock/migration.sql @@ -0,0 +1,6 @@ +CREATE TABLE "challenge_lock" ( + "id" SERIAL PRIMARY KEY, + "external_id" VARCHAR(255) NOT NULL UNIQUE, + "lock_time" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "error" TEXT +); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index d073e89..4ae854a 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -103,45 +103,11 @@ model payment_releases { payment_method payment_method @relation(fields: [payment_method_id], references: [payment_method_id], onDelete: NoAction, onUpdate: NoAction) } -model payoneer_payment_method { - id Int @id @default(autoincrement()) - user_payment_method_id String? @db.Uuid - user_id String @unique @db.VarChar(80) - payee_id String @db.VarChar(50) - payoneer_id String? @db.VarChar(50) - user_payment_methods user_payment_methods? @relation(fields: [user_payment_method_id], references: [id], onDelete: Cascade, onUpdate: NoAction, map: "fk_payoneer_user_payment_method") -} - -model paypal_payment_method { - id Int @id @default(autoincrement()) - user_payment_method_id String? @db.Uuid - user_id String @unique @db.VarChar(80) - email String? @db.VarChar(150) - payer_id String? @db.VarChar(50) - country_code String? @db.VarChar(2) - user_payment_methods user_payment_methods? @relation(fields: [user_payment_method_id], references: [id], onDelete: Cascade, onUpdate: NoAction, map: "fk_paypal_user_payment_method") -} - -model reward { - reward_id String @id @default(dbgenerated("uuid_generate_v4()")) @db.Uuid - winnings_id String @db.Uuid - points Int? - title String? @db.VarChar(255) - description String? - reference Json? - attributes Json? - created_at DateTime? @default(now()) @db.Timestamp(6) - updated_at DateTime? @default(now()) @db.Timestamp(6) - winnings winnings @relation(fields: [winnings_id], references: [winning_id], onDelete: NoAction, onUpdate: NoAction) -} - model user_payment_methods { id String @id @default(dbgenerated("uuid_generate_v4()")) @db.Uuid user_id String @db.VarChar(80) payment_method_id Int status payment_method_status? @default(OTP_PENDING) - payoneer_payment_method payoneer_payment_method[] - paypal_payment_method paypal_payment_method[] trolley_payment_method trolley_recipient[] payment_method payment_method @relation(fields: [payment_method_id], references: [payment_method_id], onDelete: NoAction, onUpdate: NoAction, map: "fk_user_payment_method") @@ -172,7 +138,6 @@ model winnings { updated_at DateTime? @default(now()) @db.Timestamp(6) audit audit[] payment payment[] - reward reward[] origin origin? @relation(fields: [origin_id], references: [origin_id], onDelete: NoAction, onUpdate: NoAction) @@index([category, created_at(sort: Desc)], map: "idx_winnings_category_created_at") @@ -223,6 +188,13 @@ model trolley_recipient_payment_method { trolley_recipient trolley_recipient @relation(fields: [trolley_recipient_id], references: [id], onDelete: Cascade, onUpdate: NoAction, map: "fk_trolley_recipient_trolley_recipient_payment_method") } +model challenge_lock { + id Int @id @default(autoincrement()) + external_id String @unique @db.VarChar(255) + lock_time DateTime @default(now()) @db.Timestamp(6) + error String? @db.Text +} + enum verification_status { ACTIVE INACTIVE diff --git a/src/api/admin/admin.service.ts b/src/api/admin/admin.service.ts index 120951c..1d47f7c 100644 --- a/src/api/admin/admin.service.ts +++ b/src/api/admin/admin.service.ts @@ -13,10 +13,7 @@ import { ResponseDto } from 'src/dto/api-response.dto'; import { PaymentStatus } from 'src/dto/payment.dto'; import { WinningAuditDto, AuditPayoutDto } from './dto/audit.dto'; import { WinningUpdateRequestDto } from './dto/winnings.dto'; -import { - AdminPaymentUpdateData, - TopcoderChallengesService, -} from 'src/shared/topcoder/challenges.service'; +import { TopcoderChallengesService } from 'src/shared/topcoder/challenges.service'; import { Logger } from 'src/shared/global'; function formatDate(date = new Date()) { @@ -317,31 +314,6 @@ export class AdminService { } }); - transactions.push(async () => { - const winning = await this.getWinningById(winningsId); - if (!winning) { - this.logger.error( - `Error updating legacy system for winning ${winningsId}. Winning not found!`, - ); - throw new Error( - `Error updating legacy system for winning ${winningsId}. Winning not found!`, - ); - } - - const payoutData: AdminPaymentUpdateData = { - userId: +winning.winner_id, - status: body.paymentStatus, - amount: body.paymentAmount, - releaseDate: - body.releaseDate && formatDate(new Date(body.releaseDate)), - }; - - await this.tcChallengesService.updateLegacyPayments( - winning.external_id as string, - payoutData, - ); - }); - // Run all transaction tasks in a single prisma transaction await this.prisma.$transaction(async (tx) => { for (const transaction of transactions) { diff --git a/src/api/api.module.ts b/src/api/api.module.ts index 2da3f93..2933211 100644 --- a/src/api/api.module.ts +++ b/src/api/api.module.ts @@ -17,6 +17,8 @@ import { WinningsModule } from './winnings/winnings.module'; import { UserModule } from './user/user.module'; import { WalletModule } from './wallet/wallet.module'; import { WithdrawalModule } from './withdrawal/withdrawal.module'; +import { ChallengesModule } from './challenges/challenges.module'; +import { ChallengePaymentsModule } from './challenge-payments/challenge-payments.module'; @Module({ imports: [ @@ -26,9 +28,11 @@ import { WithdrawalModule } from './withdrawal/withdrawal.module'; WebhooksModule, AdminModule, WinningsModule, + ChallengePaymentsModule, UserModule, WalletModule, WithdrawalModule, + ChallengesModule, ], controllers: [HealthCheckController], providers: [ diff --git a/src/api/challenge-payments/challenge-payments.controller.ts b/src/api/challenge-payments/challenge-payments.controller.ts new file mode 100644 index 0000000..d88e6f9 --- /dev/null +++ b/src/api/challenge-payments/challenge-payments.controller.ts @@ -0,0 +1,43 @@ +import { + Controller, + Get, + Param, + Query, + Req, +} from '@nestjs/common'; +import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger'; +import { AllowedM2mScope, Roles, User } from 'src/core/auth/decorators'; +import { M2mScope, Role } from 'src/core/auth/auth.constants'; +import { UserInfo } from 'src/dto/user.type'; +import { ChallengePaymentsService } from './challenge-payments.service'; + +@ApiTags('Payments') +@Controller('/challenge-payments') +@ApiBearerAuth() +export class ChallengePaymentsController { + constructor( + private readonly challengePaymentsService: ChallengePaymentsService, + ) {} + + @Get('/:challengeId') + @AllowedM2mScope(M2mScope.ReadPayments, M2mScope.CreatePayments) + @Roles(Role.PaymentAdmin, Role.PaymentEditor, Role.PaymentViewer, Role.User) + @ApiOperation({ + summary: + 'List payments (winnings) for a challenge with role-aware filtering', + }) + async getChallengePayments( + @Param('challengeId') challengeId: string, + @Query('winnerOnly') winnerOnly: string | undefined, + @User() user: UserInfo, + @Req() req: any, + ) { + return this.challengePaymentsService.listChallengePayments({ + challengeId, + requestUserId: user?.id, + isMachineToken: Boolean(req?.m2mTokenScope), + winnerOnly: (winnerOnly || '').toLowerCase() === 'true', + auth0User: req?.auth0User, + }); + } +} diff --git a/src/api/challenge-payments/challenge-payments.module.ts b/src/api/challenge-payments/challenge-payments.module.ts new file mode 100644 index 0000000..f7381c2 --- /dev/null +++ b/src/api/challenge-payments/challenge-payments.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { ChallengePaymentsController } from './challenge-payments.controller'; +import { ChallengePaymentsService } from './challenge-payments.service'; +import { TopcoderModule } from 'src/shared/topcoder/topcoder.module'; + +@Module({ + imports: [TopcoderModule], + controllers: [ChallengePaymentsController], + providers: [ChallengePaymentsService], +}) +export class ChallengePaymentsModule {} diff --git a/src/api/challenge-payments/challenge-payments.service.ts b/src/api/challenge-payments/challenge-payments.service.ts new file mode 100644 index 0000000..828762a --- /dev/null +++ b/src/api/challenge-payments/challenge-payments.service.ts @@ -0,0 +1,300 @@ +import { + Injectable, + UnauthorizedException, +} from '@nestjs/common'; +import { PrismaService } from 'src/shared/global/prisma.service'; +import { TopcoderM2MService } from 'src/shared/topcoder/topcoder-m2m.service'; +import { Logger } from 'src/shared/global'; +import { ENV_CONFIG } from 'src/config'; +import { ChallengeResource, ResourceRole } from '../challenges/models/challenge'; +import { Prisma, winnings, payment } from '@prisma/client'; + +type Auth0User = Record; + +interface ListPaymentsParams { + challengeId: string; + requestUserId?: string; + isMachineToken: boolean; + winnerOnly: boolean; + auth0User?: Auth0User; +} + +interface SerializedPaymentDetail { + id: string; + netAmount: string; + grossAmount: string; + totalAmount: string; + installmentNumber: number; + status: string; + currency: string; + datePaid: string | null; +} + +interface SerializedWinning { + id: string; + type: string; + handle: string; + winnerId: string; + origin: string; + category: string; + title?: string; + description: string; + externalId: string; + attributes: Record; + details: SerializedPaymentDetail[]; + createdAt: string; + releaseDate: string; + datePaid: string | null; +} + +interface PaginatedResponse { + winnings: SerializedWinning[]; + pagination: { + totalItems: number; + totalPages: number; + pageSize: number; + currentPage: number; + }; +} + +const PRIVILEGED_ROLES = new Set([ + 'payment admin', + 'payment editor', + 'payment viewer', + 'administrator', +]); + +@Injectable() +export class ChallengePaymentsService { + private readonly logger = new Logger(ChallengePaymentsService.name); + private readonly tcApiBase = ENV_CONFIG.TOPCODER_API_V6_BASE_URL; + + constructor( + private readonly prisma: PrismaService, + private readonly topcoderM2M: TopcoderM2MService, + ) {} + + async listChallengePayments(params: ListPaymentsParams): Promise { + const { + challengeId, + requestUserId, + isMachineToken, + winnerOnly, + auth0User, + } = params; + + if (!isMachineToken && !requestUserId) { + throw new UnauthorizedException('Authenticated user is missing required identifier'); + } + + let allowAllForChallenge = isMachineToken || this.hasPrivilegedRole(auth0User); + let winnerFilter: string | undefined; + + if (!allowAllForChallenge && requestUserId) { + if (winnerOnly) { + winnerFilter = requestUserId; + } + + try { + const isCopilot = await this.isCopilotForChallenge(challengeId, requestUserId); + if (isCopilot) { + allowAllForChallenge = true; + } + } catch (error) { + this.logger.warn( + `Failed to verify copilot status for user ${requestUserId} on challenge ${challengeId}`, + error instanceof Error ? error.message : error, + ); + } + + if (!allowAllForChallenge) { + winnerFilter = requestUserId; + } + } + + const winnings = await this.fetchWinnings(challengeId, allowAllForChallenge ? undefined : winnerFilter); + return this.serializeResponse(challengeId, winnings); + } + + private hasPrivilegedRole(auth0User?: Auth0User): boolean { + if (!auth0User) { + return false; + } + + const roles = this.extractRoles(auth0User); + return roles.some((role) => PRIVILEGED_ROLES.has(role.toLowerCase())); + } + + private extractRoles(auth0User: Auth0User): string[] { + const roles: string[] = []; + + Object.entries(auth0User).forEach(([key, value]) => { + if (!key.match(/\/roles$/i)) { + return; + } + + if (Array.isArray(value)) { + value.forEach((role) => { + if (role) { + roles.push(String(role)); + } + }); + } else if (value) { + roles.push(String(value)); + } + }); + + const claimRoles = auth0User['roles']; + if (Array.isArray(claimRoles)) { + claimRoles + .filter(Boolean) + .forEach((role) => roles.push(String(role))); + } else if (typeof claimRoles === 'string') { + roles.push(claimRoles); + } + + return roles; + } + + private async isCopilotForChallenge( + challengeId: string, + userId: string, + ): Promise { + const resourcesUrl = `${this.tcApiBase}/resources?challengeId=${challengeId}&memberId=${userId}`; + const resourceRolesUrl = `${this.tcApiBase}/resource-roles`; + + const [resources, resourceRoles] = await Promise.all([ + this.topcoderM2M.m2mFetch(resourcesUrl), + this.topcoderM2M.m2mFetch(resourceRolesUrl), + ]); + + if (!Array.isArray(resources) || resources.length === 0) { + return false; + } + + const copilotRoleIds = new Set( + resourceRoles + ?.filter((role) => + role?.name ? role.name.toLowerCase().includes('copilot') : false, + ) + .map((role) => role.id), + ); + + if (copilotRoleIds.size === 0) { + return false; + } + + return resources.some((resource) => + copilotRoleIds.has(resource.roleId), + ); + } + + private async fetchWinnings( + challengeId: string, + winnerId?: string, + ): Promise<(winnings & { payment: payment[] })[]> { + const where: Prisma.winningsWhereInput = { + external_id: challengeId, + type: 'PAYMENT', + }; + + if (winnerId) { + where.winner_id = winnerId; + } + + return this.prisma.winnings.findMany({ + where, + include: { + payment: { + orderBy: [ + { installment_number: 'asc' }, + { created_at: 'asc' }, + ], + }, + }, + orderBy: [{ created_at: 'desc' }], + }); + } + + private serializeResponse( + challengeId: string, + winnings: Array, + ): PaginatedResponse { + const serialized: SerializedWinning[] = winnings.map((winning) => { + const firstPayment = winning.payment?.[0]; + const details = (winning.payment || []).map((detail) => + this.serializePayment(detail), + ); + + return { + id: winning.winning_id, + type: 'PAYMENT', + handle: '', + winnerId: winning.winner_id, + origin: '', + category: winning.category ?? 'CONTEST_PAYMENT', + title: winning.title ?? undefined, + description: winning.description ?? '', + externalId: winning.external_id ?? challengeId, + attributes: { url: '' }, + details, + createdAt: + this.toIsoString(winning.created_at) ?? + this.toIsoString(new Date()), + releaseDate: + this.toIsoString(firstPayment?.release_date ?? null) ?? + this.toIsoString(new Date()), + datePaid: this.toIsoString( + (firstPayment?.date_paid as Date | null) ?? null, + ), + }; + }); + + return { + winnings: serialized, + pagination: { + totalItems: serialized.length, + totalPages: 1, + pageSize: serialized.length, + currentPage: 1, + }, + }; + } + + private serializePayment(detail: payment): SerializedPaymentDetail { + return { + id: detail.payment_id, + netAmount: this.decimalToString(detail.net_amount), + grossAmount: this.decimalToString(detail.gross_amount), + totalAmount: this.decimalToString(detail.total_amount), + installmentNumber: detail.installment_number ?? 1, + status: detail.payment_status ?? 'OWED', + currency: detail.currency ?? 'USD', + datePaid: this.toIsoString(detail.date_paid), + }; + } + + private decimalToString(value?: Prisma.Decimal | null): string { + if (value === null || value === undefined) { + return '0'; + } + + if (typeof value === 'object' && 'toString' in value) { + return value.toString(); + } + + return String(value); + } + + private toIsoString(value?: Date | null): string | null { + if (!value) { + return null; + } + + try { + return new Date(value).toISOString(); + } catch { + return null; + } + } +} diff --git a/src/api/challenges/challenges.controller.ts b/src/api/challenges/challenges.controller.ts new file mode 100644 index 0000000..702ccb7 --- /dev/null +++ b/src/api/challenges/challenges.controller.ts @@ -0,0 +1,68 @@ +import { Controller, Post, Param, HttpCode, HttpStatus, BadRequestException } from '@nestjs/common'; +import { isUUID } from 'class-validator'; +import { + ApiOperation, + ApiParam, + ApiTags, + ApiResponse, + ApiBearerAuth, +} from '@nestjs/swagger'; +import { UserInfo } from 'src/dto/user.type'; +import { M2mScope } from 'src/core/auth/auth.constants'; +import { AllowedM2mScope, M2M, User } from 'src/core/auth/decorators'; +import { ResponseDto, ResponseStatusType } from 'src/dto/api-response.dto'; +import { ChallengesService } from './challenges.service'; + +@ApiTags('Challenges') +@Controller('/challenges') +@ApiBearerAuth() +export class ChallengesController { + constructor( + private readonly challengesService: ChallengesService, + ) {} + + @Post('/:challengeId') + @M2M() + @AllowedM2mScope(M2mScope.CreatePayments) + @ApiOperation({ + summary: 'Create winning with payments.', + description: 'User must have "create:payments" scope to access.', + }) + @ApiParam({ + name: 'challengeId', + description: 'The ID of the challenge', + example: '2ccba36d-8db7-49da-94c9-b6c5b7bf47fb', + }) + @ApiResponse({ + status: 201, + description: 'Create winnings successfully.', + type: ResponseDto, + }) + @HttpCode(HttpStatus.CREATED) + async createWinnings( + @Param('challengeId') challengeId: string, + @User() user: UserInfo, + ): Promise> { + if (!isUUID(challengeId)) { + throw new BadRequestException('Invalid challengeId provided! Uuid expected!'); + } + + const result = new ResponseDto(); + + try { + await this.challengesService.generateChallengePayments( + challengeId, + user.id, + ); + result.status = ResponseStatusType.SUCCESS; + } catch (e) { + result.error = { + ...e, + message: e.message, + }; + result.status = ResponseStatusType.ERROR; + } + + return result; + } +} diff --git a/src/api/challenges/challenges.module.ts b/src/api/challenges/challenges.module.ts new file mode 100644 index 0000000..3f0dc62 --- /dev/null +++ b/src/api/challenges/challenges.module.ts @@ -0,0 +1,16 @@ +import { Module } from '@nestjs/common'; +import { TopcoderModule } from 'src/shared/topcoder/topcoder.module'; +import { ChallengesService } from './challenges.service'; +import { ChallengesController } from './challenges.controller'; +import { WinningsModule } from '../winnings/winnings.module'; +import { WinningsRepository } from '../repository/winnings.repo'; + +@Module({ + imports: [TopcoderModule, WinningsModule], + controllers: [ChallengesController], + providers: [ + ChallengesService, + WinningsRepository, + ], +}) +export class ChallengesModule {} diff --git a/src/api/challenges/challenges.service.ts b/src/api/challenges/challenges.service.ts new file mode 100644 index 0000000..30c82cb --- /dev/null +++ b/src/api/challenges/challenges.service.ts @@ -0,0 +1,525 @@ +import { + includes, + isEmpty, + find, + camelCase, + groupBy, + orderBy, + uniqBy, +} from 'lodash'; +import { ConflictException, Injectable } from '@nestjs/common'; +import { isUUID } from 'class-validator'; +import { ENV_CONFIG } from 'src/config'; +import { Logger } from 'src/shared/global'; +import { + Challenge, + ChallengeResource, + ChallengeReview, + Prize, + ResourceRole, + Winner, +} from './models'; +import { BillingAccountsService } from 'src/shared/topcoder/billing-accounts.service'; +import { TopcoderM2MService } from 'src/shared/topcoder/topcoder-m2m.service'; +import { ChallengeStatuses } from 'src/dto/challenge.dto'; +import { WinningsService } from '../winnings/winnings.service'; +import { + WinningRequestDto, + WinningsCategory, + WinningsType, +} from 'src/dto/winning.dto'; +import { WinningsRepository } from '../repository/winnings.repo'; +import { PrismaService } from 'src/shared/global/prisma.service'; + +interface PaymentPayload { + handle: string; + amount: number; + userId: string; + type: WinningsCategory; + description?: string; +} + +const placeToOrdinal = (place: number) => { + if (place === 1) return '1st'; + if (place === 2) return '2nd'; + if (place === 3) return '3rd'; + + return `${place}th`; +}; + +const { TOPCODER_API_V6_BASE_URL: TC_API_BASE, TGBillingAccounts } = ENV_CONFIG; + +@Injectable() +export class ChallengesService { + private readonly logger = new Logger(ChallengesService.name); + + constructor( + private readonly prisma: PrismaService, + private readonly m2MService: TopcoderM2MService, + private readonly baService: BillingAccountsService, + private readonly winningsService: WinningsService, + private readonly winningsRepo: WinningsRepository, + ) {} + + async getChallenge(challengeId: string) { + if (!isUUID(challengeId)) { + throw new BadRequestException('Invalid challengeId provided! Uuid expected!'); + } + + // Use the URL constructor to avoid path traversal/SSRF risks. + const baseUrl = TC_API_BASE.endsWith('/') ? TC_API_BASE.slice(0, -1) : TC_API_BASE; + const requestUrl = new URL(`/challenges/${challengeId}`, baseUrl).toString(); + + try { + const challenge = await this.m2MService.m2mFetch(requestUrl); + return challenge; + } catch (e) { + this.logger.error( + `Challenge ${challengeId} details couldn't be fetched!`, + e, + ); + } + } + + async getChallengeReviews(challengeId: string) { + const requestUrl = `${TC_API_BASE}/reviews?challengeId=${challengeId}&status=COMPLETED&thin=true&perPage=9999`; + + try { + const resposne = await this.m2MService.m2mFetch<{ + data: ChallengeReview[]; + }>(requestUrl); + return resposne.data; + } catch (e) { + this.logger.error( + `Challenge reviews couldn't be fetched for challenge ${challengeId}!`, + e.message, + e.status, + ); + } + } + + async getChallengeResources(challengeId: string) { + try { + const resources = await this.m2MService.m2mFetch( + `${TC_API_BASE}/resources?challengeId=${challengeId}`, + ); + const resourceRoles = await this.m2MService.m2mFetch( + `${TC_API_BASE}/resource-roles`, + ); + + const rolesMap = resourceRoles.reduce( + (map, role) => { + map[role.id] = camelCase(role.name); + return map; + }, + {} as { [key: string]: string }, + ); + + return groupBy(resources, (r) => rolesMap[r.roleId]) as { + [role: string]: ChallengeResource[]; + }; + } catch (e) { + this.logger.error( + `Challenge resources for challenge ${challengeId} couldn't be fetched!`, + e, + ); + } + } + + generateWinnersPayments( + challenge: Challenge, + winners: Winner[], + prizes: Prize[], + type?: WinningsCategory, + ): PaymentPayload[] { + const isCancelledFailedReview = + challenge.status.toLowerCase() === + ChallengeStatuses.CancelledFailedReview.toLowerCase(); + + if (isCancelledFailedReview) { + return []; + } + + return winners.map((winner) => ({ + handle: winner.handle, + amount: prizes[winner.placement - 1].value, + userId: winner.userId.toString(), + type: + type ?? + (challenge.task.isTask + ? WinningsCategory.TASK_PAYMENT + : WinningsCategory.CONTEST_PAYMENT), + description: + challenge.type === 'Task' + ? challenge.name + : `${challenge.name} - ${type === WinningsCategory.CONTEST_CHECKPOINT_PAYMENT ? 'Checkpoint ' : ''}${placeToOrdinal(winner.placement)} Place`, + })); + } + + generateCheckpointWinnersPayments(challenge: Challenge): PaymentPayload[] { + const { prizeSets, checkpointWinners } = challenge; + + // generate placement payments + const checkpointPrizes = orderBy( + find(prizeSets, { type: 'CHECKPOINT' })?.prizes, + 'value', + 'desc', + ); + + if ((checkpointPrizes?.length ?? 0) < (checkpointWinners?.length ?? 0)) { + throw new Error( + 'Task has incorrect number of checkpoint prizes! There are more checkpoint winners than checkpoint prizes!', + ); + } + + if (!checkpointPrizes?.length) { + return []; + } + + return this.generateWinnersPayments( + challenge, + checkpointWinners, + checkpointPrizes, + WinningsCategory.CONTEST_CHECKPOINT_PAYMENT, + ); + } + + generatePlacementWinnersPayments(challenge: Challenge): PaymentPayload[] { + const { prizeSets, winners } = challenge; + + // generate placement payments + const placementPrizes = orderBy( + find(prizeSets, { type: 'PLACEMENT' })?.prizes, + 'value', + 'desc', + ); + + if (placementPrizes.length < winners.length) { + throw new Error( + 'Task has incorrect number of placement prizes! There are more winners than prizes!', + ); + } + + return this.generateWinnersPayments(challenge, winners, placementPrizes); + } + + generateCopilotPayment( + challenge: Challenge, + copilots: ChallengeResource[], + ): PaymentPayload[] { + const isCancelledFailedReview = + challenge.status.toLowerCase() === + ChallengeStatuses.CancelledFailedReview.toLowerCase(); + + const copilotPrizes = + find(challenge.prizeSets, { type: 'COPILOT' })?.prizes ?? []; + + if (!copilotPrizes.length || isCancelledFailedReview) { + return []; + } + + if (!copilots?.length) { + throw new Error('Task has a copilot prize but no copilot assigned!'); + } + + return copilots.map((copilot) => ({ + handle: copilot.memberHandle, + amount: copilotPrizes[0].value, + userId: copilot.memberId.toString(), + type: WinningsCategory.COPILOT_PAYMENT, + description: `${challenge.name} - Copilot payment`, + })); + } + + async generateReviewersPayments( + challenge: Challenge, + reviewers: ChallengeResource[], + ): Promise { + const placementPrizes = orderBy( + find(challenge.prizeSets, { type: 'PLACEMENT' })?.prizes, + 'value', + 'desc', + ); + + // generate reviewer payments + const firstPlacePrize = placementPrizes?.[0]?.value ?? 0; + const hasMemberReviewers = find(challenge.reviewers, { + isMemberReview: true, + }); + + const challengeReviews = await this.getChallengeReviews(challenge.id); + + if ( + !hasMemberReviewers || + !reviewers?.length || + !challengeReviews?.length + ) { + return []; + } + + // For each challenge resource reviewer (can be main reviewer, approver, screener, etc) + // we get the reviewer's reviews + // and group them by phaseId + // based on the phaseId, we're fetching the correct challenge reviewer type (which has assigned payments coefficients) + // then we create the reviewe's payments for each phase based on the number of reviews done on each phase and the type of challenge reviewer assigned + return reviewers + .map((reviewer) => { + // Find all reviews that were performed by this reviewer (case-insensitive match) + const reviews = challengeReviews + .filter( + (r) => + r.reviewerHandle.toLowerCase() === + reviewer.memberHandle.toLowerCase(), + ) + .map((r) => { + const challengePhase = find(challenge.phases, { id: r.phaseId }); + + if (!challengePhase) { + throw new Error( + `Failed to find challenge phase for review phase: ${r.phaseName} (${r.phaseId})`, + ); + } + + return { + ...r, + // Find the corresponding phase object in the challenge definition using its id + phaseId: challengePhase?.phaseId, + }; + }); + + // Group the reviews by their associated phaseId + return Object.entries(groupBy(reviews, 'phaseId')).map( + ([phaseId, phaseReviews]) => { + // Find the reviewer entry in the challenge's reviewer list for this phase + // (be sure to exclude ai reviews) + const challengeReviewer = find(challenge.reviewers, { + isMemberReview: true, + phaseId, + }); + + if (!challengeReviewer) { + throw new Error( + `Failed to find challenge reviewer for phase: ${phaseReviews[0].phaseName} (${phaseId})`, + ); + } + + return { + handle: reviewer.memberHandle, + userId: reviewer.memberId.toString(), + amount: Math.ceil( + (challengeReviewer.fixedAmount ?? 0) + + (challengeReviewer.baseCoefficient ?? 0) * firstPlacePrize + + (challengeReviewer.incrementalCoefficient ?? 0) * + firstPlacePrize * + phaseReviews.length, + ), + type: WinningsCategory.REVIEW_BOARD_PAYMENT, + description: `${challenge.name} - ${phaseReviews[0].phaseName}`, + }; + }, + ); + }) + .flat(); + } + + async getChallengePayments(challenge: Challenge) { + this.logger.log( + `Generating payments for challenge ${challenge.name} (${challenge.id}).`, + ); + + const challengeResources = await this.getChallengeResources(challenge.id); + + if (!challengeResources || isEmpty(challengeResources)) { + throw new Error('Missing challenge resources!'); + } + + const winnersPayments = this.generatePlacementWinnersPayments(challenge); + const checkpointPayments = + this.generateCheckpointWinnersPayments(challenge); + const copilotPayments = this.generateCopilotPayment( + challenge, + challengeResources.copilot, + ); + + let reviewersPayments: PaymentPayload[] = []; + try { + reviewersPayments = await this.generateReviewersPayments( + challenge, + uniqBy( + [ + ...(challengeResources.iterativeReviewer ?? []), + ...(challengeResources.reviewer ?? []), + ...(challengeResources.checkpointScreener ?? []), + ...(challengeResources.checkpointReviewer ?? []), + ...(challengeResources.screener ?? []), + ...(challengeResources.approver ?? []), + ], + 'memberId', + ), + ); + } catch (error) { + this.logger.error( + `Failed to generate reviewers payments for challenge ${challenge.id}!`, + error.message, + ); + } + + const payments: PaymentPayload[] = [ + ...winnersPayments, + ...checkpointPayments, + ...copilotPayments, + ...reviewersPayments, + ]; + + const totalAmount = payments.reduce( + (sum, payment) => sum + payment.amount, + 0, + ); + return payments.map((payment) => ({ + winnerId: payment.userId.toString(), + type: WinningsType.PAYMENT, + origin: 'Topcoder', + category: payment.type, + title: challenge.name, + description: payment.description || challenge.name, + externalId: challenge.id, + details: [ + { + totalAmount: payment.amount, + grossAmount: payment.amount, + installmentNumber: 1, + currency: 'USD', + billingAccount: `${challenge.billing.billingAccountId}`, + challengeFee: totalAmount * challenge.billing.markup, + }, + ], + attributes: { + billingAccountId: challenge.billing.billingAccountId, + payroll: includes( + TGBillingAccounts, + parseInt(challenge.billing.billingAccountId), + ), + }, + })); + } + + private async createPayments(challenge: Challenge, userId: string) { + const existingPayments = ( + await this.winningsRepo.searchWinnings({ + externalIds: [challenge.id], + } as WinningRequestDto) + )?.data?.winnings; + + if (existingPayments?.length > 0) { + this.logger.log( + `Payments already exist for challenge ${challenge.id}, skipping payment generation`, + ); + throw new Error( + `Payments already exist for challenge ${challenge.id}, skipping payment generation`, + ); + } + + const paymentTypes = [ + ...new Set( + challenge.prizeSets + .map((set) => set.prizes.map((prize) => prize.type)) + .flat(), + ), + ]; + const isRewardsPayment = paymentTypes.some((type) => type !== 'USD'); + + if (isRewardsPayment) { + this.logger.log( + `Rewards system detected: ${paymentTypes.join(', ')}. Skipping payments generation for challenge ${challenge.name} (${challenge.id}).`, + ); + return; + } + + const payments = await this.getChallengePayments(challenge); + const totalAmount = payments.reduce( + (sum, payment) => sum + payment.details[0].totalAmount, + 0, + ); + + const baValidation = { + challengeId: challenge.id, + billingAccountId: +challenge.billing.billingAccountId, + markup: challenge.billing.markup, + status: challenge.status, + totalPrizesInCents: totalAmount * 100, + }; + + if (challenge.billing?.clientBillingRate != null) { + baValidation.markup = challenge.billing.clientBillingRate; + } + + await Promise.all( + payments.map(async (p) => { + try { + await this.winningsService.createWinningWithPayments(p, userId); + } catch (e) { + this.logger.log( + `Failed to create winnings payment for user ${p.winnerId}!`, + e, + ); + } + }), + ); + + this.logger.log('Task Completed. locking consumed budget', baValidation); + await this.baService.lockConsumeAmount(baValidation); + } + + async generateChallengePayments(challengeId: string, userId: string) { + const challenge = await this.getChallenge(challengeId); + + if (!challenge) { + throw new Error('Challenge not found!'); + } + + const allowedStatuses = [ + ChallengeStatuses.Completed.toLowerCase(), + ChallengeStatuses.CancelledFailedReview.toLowerCase(), + ]; + + if (!allowedStatuses.includes(challenge.status.toLowerCase())) { + throw new Error("Challenge isn't in a payable status!"); + } + + // need to read for update (LOCK the rows) + try { + await this.prisma.challenge_lock.create({ + data: { external_id: challenge.id }, + }); + } catch (err: any) { + if (err.code === 'P2002') { + this.logger.log(`Challenge Lock already acquired for ${challenge.id}`); + // P2002 = unique constraint failed → lock already exists + throw new ConflictException( + `Challenge Lock already acquired for ${challenge.id}`, + ); + } + throw err; + } + + try { + await this.createPayments(challenge, userId); + } catch (error) { + if (error.message.includes('Lock already acquired')) { + throw new ConflictException( + 'Another payment operation is in progress.', + ); + } else { + throw error; + } + } finally { + await this.prisma.challenge_lock + .deleteMany({ + where: { external_id: challenge.id }, + }) + .catch(() => { + // swallow errors if lock was already released + }); + } + } +} diff --git a/src/api/challenges/models/challenge.ts b/src/api/challenges/models/challenge.ts new file mode 100644 index 0000000..635b057 --- /dev/null +++ b/src/api/challenges/models/challenge.ts @@ -0,0 +1,162 @@ +export interface Challenge { + id: string; + name: string; + description: string; + descriptionFormat: string; + projectId: number; + typeId: string; + trackId: string; + timelineTemplateId: string; + currentPhaseNames: string[]; + wiproAllowed: boolean; + tags: string[]; + groups: string[]; + submissionStartDate: string; + submissionEndDate: string; + registrationStartDate: string; + registrationEndDate: string; + startDate: string; + status: string; + createdBy: string; + updatedBy: string; + metadata: MetadataItem[]; + phases: ChallengePhase[]; + discussions: Discussion[]; + events: any[]; // You can replace `any` with the appropriate structure if available + prizeSets: PrizeSet[]; + reviewers: Reviewer[]; // Replace with type if available + terms: any[]; // Replace with type if available + skills: Skill[]; + attachments: any[]; // Replace with type if available + track: string; + type: string; + legacy: Legacy; + billing: Billing; + task: Task; + created: string; + updated: string; + overview: PrizeOverview; + winners: Winner[]; + checkpointWinners: Winner[]; + numOfSubmissions: number; + numOfCheckpointSubmissions: number; + numOfRegistrants: number; +} + +export interface MetadataItem { + name: string; + value: string; +} + +export interface ChallengePhase { + id: string; + phaseId: string; + name: string; + description: string; + isOpen: boolean; + duration: number; + scheduledStartDate: string; + scheduledEndDate: string; + predecessor?: string; + constraints: any[]; // Replace with constraint type if needed +} + +export interface Discussion { + name: string; + type: string; + provider: string; + id: string; + options: any[]; // Replace with option type if needed +} + +export interface PrizeSet { + type: string; + prizes: Prize[]; +} + +export interface Prize { + type: string; + value: number; +} + +export interface Skill { + id: string; + name: string; + category: SkillCategory; +} + +export interface SkillCategory { + id: string; + name: string; +} + +export interface Legacy { + reviewType: string; + confidentialityType: string; + directProjectId: number; + isTask: boolean; + useSchedulingAPI: boolean; + pureV5Task: boolean; + pureV5: boolean; + selfService: boolean; +} + +export interface Billing { + billingAccountId: string; + markup: number; + clientBillingRate?: number; +} + +export interface Task { + isTask: boolean; + isAssigned: boolean; +} + +export interface PrizeOverview { + totalPrizes: number; + type: string; +} + +export interface Winner { + userId: number; + handle: string; + placement: number; +} + +export interface Reviewer { + scorecardId: string; + isMemberReview: boolean; + memberReviewerCount?: number; + phaseId: string; + baseCoefficient?: number; + incrementalCoefficient?: number; + fixedAmount?: number; +} + +export interface ChallengeResource { + memberId: string; + memberHandle: string; + roleId: string; +} + +export interface ResourceRole { + id: string; + name: string; +} + +export interface ChallengeReview { + id: string; + resourceId: string; + phaseId: string; + submissionId: string; + scorecardId: string; + committed: boolean; + finalScore: number; + initialScore: number; + typeId: string; + status: string; + reviewDate: string; + reviewerHandle: string; + phaseName: string; + submitterHandle: string; +} diff --git a/src/api/challenges/models/index.ts b/src/api/challenges/models/index.ts new file mode 100644 index 0000000..6b0a158 --- /dev/null +++ b/src/api/challenges/models/index.ts @@ -0,0 +1 @@ +export * from './challenge'; diff --git a/src/api/repository/identity-verification.repo.ts b/src/api/repository/identity-verification.repo.ts index 4c1fd92..6985aa6 100644 --- a/src/api/repository/identity-verification.repo.ts +++ b/src/api/repository/identity-verification.repo.ts @@ -1,5 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { verification_status } from '@prisma/client'; +import { Prisma, verification_status } from '@prisma/client'; import { PrismaService } from 'src/shared/global/prisma.service'; @Injectable() @@ -12,14 +12,18 @@ export class IdentityVerificationRepository { * @param userId - The unique identifier of the user. * @returns A promise that resolves to `true` if the user has at least one active identity verification association, otherwise `false`. */ - async completedIdentityVerification(userId: string): Promise { - const count = - await this.prisma.user_identity_verification_associations.count({ - where: { - user_id: userId, - verification_status: verification_status.ACTIVE, - }, - }); + async completedIdentityVerification( + userId: string, + tx?: Prisma.TransactionClient, + ): Promise { + const count = await ( + tx || this.prisma + ).user_identity_verification_associations.count({ + where: { + user_id: userId, + verification_status: verification_status.ACTIVE, + }, + }); return count > 0; } diff --git a/src/api/repository/paymentMethod.repo.ts b/src/api/repository/paymentMethod.repo.ts index bf61af1..92a292f 100644 --- a/src/api/repository/paymentMethod.repo.ts +++ b/src/api/repository/paymentMethod.repo.ts @@ -1,5 +1,9 @@ import { Injectable } from '@nestjs/common'; -import { payment_method_status, user_payment_methods } from '@prisma/client'; +import { + payment_method_status, + Prisma, + user_payment_methods, +} from '@prisma/client'; import { PrismaService } from 'src/shared/global/prisma.service'; @Injectable() @@ -14,14 +18,16 @@ export class PaymentMethodRepository { */ async getConnectedPaymentMethod( userId: string, + tx?: Prisma.TransactionClient, ): Promise { - const connectedUserPaymentMethod = - await this.prisma.user_payment_methods.findFirst({ - where: { - user_id: userId, - status: payment_method_status.CONNECTED, - }, - }); + const connectedUserPaymentMethod = await ( + tx || this.prisma + ).user_payment_methods.findFirst({ + where: { + user_id: userId, + status: payment_method_status.CONNECTED, + }, + }); return connectedUserPaymentMethod; } diff --git a/src/api/repository/taxForm.repo.ts b/src/api/repository/taxForm.repo.ts index 59df1db..fb39884 100644 --- a/src/api/repository/taxForm.repo.ts +++ b/src/api/repository/taxForm.repo.ts @@ -1,5 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { tax_form_status } from '@prisma/client'; +import { Prisma, tax_form_status } from '@prisma/client'; import { PrismaService } from 'src/shared/global/prisma.service'; @Injectable() @@ -12,8 +12,11 @@ export class TaxFormRepository { * @param userId user id * @returns true if user has active tax form */ - async hasActiveTaxForm(userId: string): Promise { - const count = await this.prisma.user_tax_form_associations.count({ + async hasActiveTaxForm( + userId: string, + tx?: Prisma.TransactionClient, + ): Promise { + const count = await (tx || this.prisma).user_tax_form_associations.count({ where: { user_id: userId, tax_form_status: tax_form_status.ACTIVE, diff --git a/src/api/repository/winnings.repo.ts b/src/api/repository/winnings.repo.ts index 2095d02..7710ab3 100644 --- a/src/api/repository/winnings.repo.ts +++ b/src/api/repository/winnings.repo.ts @@ -25,7 +25,7 @@ export class WinningsRepository { constructor(private readonly prisma: PrismaService) {} - private generateFilterDate(date: DateFilterType) { + private generateFilterDate(date?: DateFilterType) { let filterDate: object | undefined; const currentDay = new Date(new Date().setHours(0, 0, 0, 0)); @@ -54,11 +54,11 @@ export class WinningsRepository { } private getWinningsQueryFilters( - type: string, - status: string, - winnerIds: string[] | undefined, - externalIds: string[] | undefined, - date: DateFilterType, + type?: string, + status?: string, + winnerIds?: string[], + externalIds?: string[], + date?: DateFilterType, ): Prisma.winningsFindManyArgs['where'] { return { winner_id: winnerIds @@ -99,7 +99,7 @@ export class WinningsRepository { } private getOrderByWithWinnerId( - sortBy: string, + sortBy: string | undefined, sortOrder: 'asc' | 'desc', externalIds?: boolean, ) { @@ -162,7 +162,7 @@ export class WinningsRepository { winnerIds = [searchProps.winnerId]; } else if (searchProps.winnerIds) { winnerIds = [...searchProps.winnerIds]; - } else if (searchProps.externalIds?.length > 0) { + } else if ((searchProps.externalIds?.length ?? 0) > 0) { externalIds = searchProps.externalIds; } diff --git a/src/api/winnings/winnings.module.ts b/src/api/winnings/winnings.module.ts index c463ca0..69210a8 100644 --- a/src/api/winnings/winnings.module.ts +++ b/src/api/winnings/winnings.module.ts @@ -19,5 +19,8 @@ import { IdentityVerificationRepository } from '../repository/identity-verificat PaymentMethodRepository, IdentityVerificationRepository, ], + exports: [ + WinningsService, + ] }) export class WinningsModule {} diff --git a/src/api/winnings/winnings.service.ts b/src/api/winnings/winnings.service.ts index 903fd96..32e70e3 100644 --- a/src/api/winnings/winnings.service.ts +++ b/src/api/winnings/winnings.service.ts @@ -56,7 +56,7 @@ export class WinningsService { } this.logger.debug( - `Member info retrieved successfully for user handle: ${userId}`, + `Member info retrieved successfully for user: ${userId}`, { member }, ); @@ -88,8 +88,13 @@ export class WinningsService { } } - private async setPayrollPaymentMethod(userId: string) { - const payrollPaymentMethod = await this.prisma.payment_method.findFirst({ + private async setPayrollPaymentMethod( + userId: string, + tx?: Prisma.TransactionClient, + ) { + const payrollPaymentMethod = await ( + tx || this.prisma + ).payment_method.findFirst({ where: { payment_method_type: 'Wipro Payroll', }, @@ -101,7 +106,7 @@ export class WinningsService { } if ( - await this.prisma.user_payment_methods.findFirst({ + await (tx || this.prisma).user_payment_methods.findFirst({ where: { user_id: userId, payment_method_id: payrollPaymentMethod.payment_method_id, @@ -142,7 +147,7 @@ export class WinningsService { const result = new ResponseDto(); this.logger.debug( - `Creating winning with payments for user ${userId}`, + `Creating winning with payments for user ${body.winnerId}`, body, ); @@ -180,13 +185,18 @@ export class WinningsService { const hasActiveTaxForm = await this.taxFormRepo.hasActiveTaxForm( body.winnerId, + tx, ); const hasConnectedPaymentMethod = Boolean( - await this.paymentMethodRepo.getConnectedPaymentMethod(body.winnerId), + await this.paymentMethodRepo.getConnectedPaymentMethod( + body.winnerId, + tx, + ), ); const isIdentityVerified = await this.identityVerificationRepo.completedIdentityVerification( - userId, + body.winnerId, + tx, ); for (const detail of body.details || []) { @@ -213,7 +223,7 @@ export class WinningsService { `Payroll payment detected. Setting payment status to PAID for user ${body.winnerId}`, ); paymentModel.payment_status = PaymentStatus.PAID; - await this.setPayrollPaymentMethod(body.winnerId); + await this.setPayrollPaymentMethod(body.winnerId, tx); } winningModel.payment.create.push(paymentModel); @@ -223,7 +233,7 @@ export class WinningsService { } this.logger.debug('Attempting to create winning with nested payments.'); - const createdWinning = await this.prisma.winnings.create({ + const createdWinning = await tx.winnings.create({ data: winningModel as any, }); diff --git a/src/api/withdrawal/withdrawal.service.ts b/src/api/withdrawal/withdrawal.service.ts index 3add106..10dc186 100644 --- a/src/api/withdrawal/withdrawal.service.ts +++ b/src/api/withdrawal/withdrawal.service.ts @@ -11,10 +11,7 @@ import { } from '@prisma/client'; import { TrolleyService } from 'src/shared/global/trolley.service'; import { PaymentsService } from 'src/shared/payments'; -import { - TopcoderChallengesService, - WithdrawUpdateData, -} from 'src/shared/topcoder/challenges.service'; +import { TopcoderChallengesService } from 'src/shared/topcoder/challenges.service'; import { TopcoderMembersService } from 'src/shared/topcoder/members.service'; import { BasicMemberInfo, BASIC_MEMBER_FIELDS } from 'src/shared/topcoder'; import { Logger } from 'src/shared/global'; @@ -34,16 +31,6 @@ interface ReleasableWinningRow { datePaid: Date; } -function formatDate(date = new Date()) { - const pad = (n, z = 2) => String(n).padStart(z, '0'); - - return ( - `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ` + - `${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}.` + - `${pad(date.getMilliseconds(), 3)}` - ); -} - @Injectable() export class WithdrawalService { private readonly logger = new Logger(WithdrawalService.name); @@ -403,26 +390,6 @@ export class WithdrawalService { throw new Error(errorMsg); } - - try { - for (const winning of winnings) { - const payoutData: WithdrawUpdateData = { - userId: +userId, - status: 'Paid', - datePaid: formatDate(new Date()), - }; - - await this.tcChallengesService.updateLegacyPayments( - winning.externalId as string, - payoutData, - ); - } - } catch (error) { - this.logger.error( - `Failed to update legacy payment while withdrawing for challenge ${error?.message ?? error}`, - error, - ); - } } catch (error) { if (error.code === 'P2010' && error.meta?.code === '55P03') { this.logger.error( diff --git a/src/config/config.env.ts b/src/config/config.env.ts index fc47a24..eb3aa4f 100644 --- a/src/config/config.env.ts +++ b/src/config/config.env.ts @@ -13,14 +13,16 @@ import { export class ConfigEnv { @IsString() @IsOptional() - API_BASE = '/v5/finance'; + API_BASE = '/v6/finance'; - @IsInt() @IsOptional() PORT = 3000; @IsString() - TOPCODER_API_BASE_URL!: string; + TOPCODER_API_V5_BASE_URL!: string; + + @IsString() + TOPCODER_API_V6_BASE_URL!: string; @IsString() AUTH0_M2M_AUDIENCE!: string; @@ -110,4 +112,7 @@ export class ConfigEnv { @IsString() SENDGRID_TEMPLATE_ID_OTP_CODE: string = 'd-2d0ab9f6c9cc4efba50080668a9c35c1'; + + @IsInt({ each: true }) + TGBillingAccounts = [80000062, 80002800]; } diff --git a/src/dto/challenge.dto.ts b/src/dto/challenge.dto.ts new file mode 100644 index 0000000..791ddc3 --- /dev/null +++ b/src/dto/challenge.dto.ts @@ -0,0 +1,17 @@ +export const ChallengeStatuses = { + New: 'New', + Active: 'Active', + Draft: 'Draft', + Approved: 'Approved', + Canceled: 'Canceled', + Completed: 'Completed', + Deleted: 'Deleted', + CancelledFailedReview: 'CANCELLED_FAILED_REVIEW', + CancelledFailedScreening: 'CANCELLED_FAILED_SCREENING', + CancelledZeroSubmissions: 'CANCELLED_ZERO_SUBMISSIONS', + CancelledWinnerUnresponsive: 'CANCELLED_WINNER_UNRESPONSIVE', + CancelledClientRequest: 'CANCELLED_CLIENT_REQUEST', + CancelledRequirementsInfeasible: 'CANCELLED_REQUIREMENTS_INFEASIBLE', + CancelledZeroRegistrations: 'CANCELLED_ZERO_REGISTRATIONS', + CancelledPaymentFailed: 'CANCELLED_PAYMENT_FAILED', +}; diff --git a/src/dto/sort-pagination.dto.ts b/src/dto/sort-pagination.dto.ts index 8fad58e..a1fafe7 100644 --- a/src/dto/sort-pagination.dto.ts +++ b/src/dto/sort-pagination.dto.ts @@ -34,7 +34,7 @@ export class SortPagination { @IsOptional() @IsInt() @Min(1) - limit: number = 10; + limit?: number = 10; @ApiProperty({ description: 'The offset parameter for pagination', @@ -43,7 +43,7 @@ export class SortPagination { @IsOptional() @IsInt() @Min(0) - offset: number = 0; + offset?: number = 0; @ApiProperty({ description: 'The sortBy parameter for sorting', @@ -51,7 +51,7 @@ export class SortPagination { }) @IsOptional() @IsIn(OrderBy) - sortBy: string; + sortBy?: string; @ApiProperty({ description: 'The sort order', @@ -60,5 +60,5 @@ export class SortPagination { }) @IsOptional() @IsEnum(SortOrder) - sortOrder: SortOrder = SortOrder.ASC; + sortOrder?: SortOrder = SortOrder.ASC; } diff --git a/src/dto/winning.dto.ts b/src/dto/winning.dto.ts index 3e7110c..f0fbdfb 100644 --- a/src/dto/winning.dto.ts +++ b/src/dto/winning.dto.ts @@ -127,7 +127,7 @@ export class WinningRequestDto extends SortPagination { @IsOptional() @IsString() @IsNotEmpty() - winnerId: string; + winnerId?: string; @ApiProperty({ description: 'The array of the winner ids', @@ -138,7 +138,7 @@ export class WinningRequestDto extends SortPagination { @ArrayNotEmpty() @IsString({ each: true }) @IsNotEmpty({ each: true }) - winnerIds: string[]; + winnerIds?: string[]; @ApiProperty({ description: 'The array of the external ids', @@ -149,7 +149,7 @@ export class WinningRequestDto extends SortPagination { @ArrayNotEmpty() @IsString({ each: true }) @IsNotEmpty({ each: true }) - externalIds: string[]; + externalIds?: string[]; @ApiProperty({ description: 'The type of winnings category', @@ -158,7 +158,7 @@ export class WinningRequestDto extends SortPagination { }) @IsOptional() @IsEnum(WinningsCategory) - type: WinningsCategory; + type?: WinningsCategory; @ApiProperty({ description: 'The payment status', @@ -167,7 +167,7 @@ export class WinningRequestDto extends SortPagination { }) @IsOptional() @IsEnum(PaymentStatus) - status: PaymentStatus; + status?: PaymentStatus; @ApiProperty({ description: 'The filter date', @@ -176,7 +176,7 @@ export class WinningRequestDto extends SortPagination { }) @IsOptional() @IsEnum(DateFilterType) - date: DateFilterType; + date?: DateFilterType; } export class WinningCreateRequestDto { diff --git a/src/main.ts b/src/main.ts index 57a2450..37ad4f6 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,18 +3,12 @@ import { NestFactory } from '@nestjs/core'; import { NestExpressApplication } from '@nestjs/platform-express'; import { ValidationPipe } from '@nestjs/common'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; -import { ApiModule } from './api/api.module'; import { AppModule } from './app.module'; -import { PaymentProvidersModule } from './api/payment-providers/payment-providers.module'; -import { WebhooksModule } from './api/webhooks/webhooks.module'; import { ENV_CONFIG } from './config'; -import { AdminModule } from './api/admin/admin.module'; -import { UserModule } from './api/user/user.module'; -import { WalletModule } from './api/wallet/wallet.module'; -import { WinningsModule } from './api/winnings/winnings.module'; -import { WithdrawalModule } from './api/withdrawal/withdrawal.module'; import { Logger } from 'src/shared/global'; +const API_DOCS_URL = `${ENV_CONFIG.API_BASE}/api-docs`; + async function bootstrap() { const app = await NestFactory.create(AppModule, { rawBody: true, @@ -83,19 +77,8 @@ async function bootstrap() { in: 'header', }) .build(); - const document = SwaggerModule.createDocument(app, config, { - include: [ - ApiModule, - AdminModule, - UserModule, - WinningsModule, - WithdrawalModule, - WalletModule, - PaymentProvidersModule, - WebhooksModule, - ], - }); - SwaggerModule.setup('/v5/finance/api-docs', app, document); + const document = SwaggerModule.createDocument(app, config); + SwaggerModule.setup(API_DOCS_URL, app, document); // Add an event handler to log uncaught promise rejections and prevent the server from crashing process.on('unhandledRejection', (reason, promise) => { @@ -110,6 +93,8 @@ async function bootstrap() { }); await app.listen(ENV_CONFIG.PORT ?? 3000); + logger.log(`Application is running on: ${await app.getUrl()}`); + logger.log(`Swagger docs available at: ${await app.getUrl()}${API_DOCS_URL}`); } void bootstrap(); diff --git a/src/shared/topcoder/billing-accounts.service.ts b/src/shared/topcoder/billing-accounts.service.ts new file mode 100644 index 0000000..b0ca3bd --- /dev/null +++ b/src/shared/topcoder/billing-accounts.service.ts @@ -0,0 +1,164 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { isNumber, includes } from 'lodash'; +import { ENV_CONFIG } from 'src/config'; +import { ChallengeStatuses } from 'src/dto/challenge.dto'; +import { TopcoderM2MService } from './topcoder-m2m.service'; + +const { TOPCODER_API_V6_BASE_URL, TGBillingAccounts } = ENV_CONFIG; + +interface LockAmountDTO { + challengeId: string; + lockAmount: number; +} +interface ConsumeAmountDTO { + challengeId: string; + consumeAmount: number; + markup?: number; +} + +export interface BAValidation { + challengeId?: string; + billingAccountId?: number; + markup?: number; + prevStatus?: string; + status?: string; + prevTotalPrizesInCents?: number; + totalPrizesInCents: number; +} + +@Injectable() +export class BillingAccountsService { + private readonly logger = new Logger(BillingAccountsService.name); + + constructor(private readonly m2MService: TopcoderM2MService) {} + + async lockAmount(billingAccountId: number, dto: LockAmountDTO) { + this.logger.log('BA validation lock amount:', billingAccountId, dto); + + try { + return await this.m2MService.m2mFetch( + `${TOPCODER_API_V6_BASE_URL}/billing-accounts/${billingAccountId}/lock-amount`, + { + method: 'PATCH', + body: JSON.stringify({ param: dto }), + }, + ); + } catch (err: any) { + this.logger.error( + err.response?.data?.result?.content ?? + 'Failed to lock challenge amount', + ); + throw new Error( + `Budget Error: Requested amount $${dto.lockAmount} exceeds available budget for Billing Account #${billingAccountId}. + Please contact the Topcoder Project Manager for further assistance.`, + ); + } + } + + async consumeAmount(billingAccountId: number, dto: ConsumeAmountDTO) { + this.logger.log('BA validation consume amount:', billingAccountId, dto); + + try { + return await this.m2MService.m2mFetch( + `${TOPCODER_API_V6_BASE_URL}/billing-accounts/${billingAccountId}/consume-amount`, + { + method: 'PATCH', + body: JSON.stringify({ param: dto }), + }, + ); + } catch (err: any) { + this.logger.error( + err.response?.data?.result?.content ?? + 'Failed to consume challenge amount', + err, + ); + throw new Error('Failed to consume challenge amount'); + } + } + + async lockConsumeAmount( + baValidation: BAValidation, + rollback: boolean = false, + ): Promise { + const billingAccountId = baValidation.billingAccountId + ? +baValidation.billingAccountId + : undefined; + if (!isNumber(billingAccountId)) { + this.logger.warn( + "Challenge doesn't have billing account id:", + baValidation, + ); + return; + } + if (includes(TGBillingAccounts, billingAccountId)) { + this.logger.info( + 'Ignore BA validation for Topgear account:', + billingAccountId, + ); + return; + } + + this.logger.log('BA validation:', baValidation); + + const status = baValidation.status?.toLowerCase(); + if ( + status === ChallengeStatuses.Active.toLowerCase() || + status === ChallengeStatuses.Approved.toLowerCase() + ) { + // Update lock amount + const currAmount = baValidation.totalPrizesInCents / 100; + const prevAmount = (baValidation.prevTotalPrizesInCents ?? 0) / 100; + + await this.lockAmount(billingAccountId, { + challengeId: baValidation.challengeId!, + lockAmount: + (rollback ? prevAmount : currAmount) * (1 + baValidation.markup!), + }); + } else if (status === ChallengeStatuses.Completed.toLowerCase()) { + // Note an already completed challenge could still be updated with prizes + const currAmount = baValidation.totalPrizesInCents / 100; + const prevAmount = + baValidation.prevStatus === ChallengeStatuses.Completed + ? (baValidation.prevTotalPrizesInCents ?? 0) / 100 + : 0; + + if (currAmount !== prevAmount) { + await this.consumeAmount(billingAccountId, { + challengeId: baValidation.challengeId!, + consumeAmount: + (rollback ? prevAmount : currAmount) * (1 + baValidation.markup!), + markup: baValidation.markup, + }); + } + } else if ( + [ + ChallengeStatuses.Deleted, + ChallengeStatuses.Canceled, + ChallengeStatuses.CancelledFailedReview, + ChallengeStatuses.CancelledFailedScreening, + ChallengeStatuses.CancelledZeroSubmissions, + ChallengeStatuses.CancelledWinnerUnresponsive, + ChallengeStatuses.CancelledClientRequest, + ChallengeStatuses.CancelledRequirementsInfeasible, + ChallengeStatuses.CancelledZeroRegistrations, + ChallengeStatuses.CancelledPaymentFailed, + ].some((t) => t.toLowerCase() === status) + ) { + if ( + baValidation.prevStatus?.toLowerCase() === + ChallengeStatuses.Active.toLowerCase() + ) { + // Challenge canceled, unlock previous locked amount + const currAmount = 0; + const prevAmount = (baValidation.prevTotalPrizesInCents ?? 0) / 100; + + if (currAmount !== prevAmount) { + await this.lockAmount(billingAccountId, { + challengeId: baValidation.challengeId!, + lockAmount: rollback ? prevAmount : 0, + }); + } + } + } + } +} diff --git a/src/shared/topcoder/bus.service.ts b/src/shared/topcoder/bus.service.ts index 8397eec..e24c105 100644 --- a/src/shared/topcoder/bus.service.ts +++ b/src/shared/topcoder/bus.service.ts @@ -3,7 +3,7 @@ import { ENV_CONFIG } from 'src/config'; import { TopcoderM2MService } from './topcoder-m2m.service'; import { Logger } from '../global'; -const { TOPCODER_API_BASE_URL } = ENV_CONFIG; +const { TOPCODER_API_V5_BASE_URL: TC_API_BASE } = ENV_CONFIG; @Injectable() export class TopcoderBusService { @@ -43,7 +43,7 @@ export class TopcoderBusService { try { const headers = await this.getHeaders(); - const response = await fetch(`${TOPCODER_API_BASE_URL}/bus/events`, { + const response = await fetch(`${TC_API_BASE}/bus/events`, { method: 'POST', headers, body: JSON.stringify({ diff --git a/src/shared/topcoder/challenges.service.ts b/src/shared/topcoder/challenges.service.ts index fb087df..063a2de 100644 --- a/src/shared/topcoder/challenges.service.ts +++ b/src/shared/topcoder/challenges.service.ts @@ -1,11 +1,7 @@ import { Injectable } from '@nestjs/common'; import { TopcoderM2MService } from './topcoder-m2m.service'; -import { ENV_CONFIG } from 'src/config'; -import { payment_status } from '@prisma/client'; import { Logger } from 'src/shared/global'; -const { TOPCODER_API_BASE_URL } = ENV_CONFIG; - export interface WithdrawUpdateData { userId: number; status: string; @@ -18,77 +14,9 @@ export interface AdminPaymentUpdateData { amount: number; releaseDate: string; } - -const mapStatus = (payoutData: WithdrawUpdateData | AdminPaymentUpdateData) => { - return { - ...payoutData, - status: { - [payment_status.CANCELLED]: 'Cancelled', - [payment_status.FAILED]: 'Failed', - [payment_status.ON_HOLD]: 'OnHold', - [payment_status.ON_HOLD_ADMIN]: 'OnHoldAdmin', - [payment_status.OWED]: 'Owed', - [payment_status.PAID]: 'Paid', - [payment_status.PROCESSING]: 'Processing', - [payment_status.RETURNED]: 'Returned', - }[payoutData.status], - }; -}; - @Injectable() export class TopcoderChallengesService { private readonly logger = new Logger(TopcoderChallengesService.name); constructor(private readonly m2MService: TopcoderM2MService) {} - - async updateLegacyPayments( - challengeId: string, - payoutData: WithdrawUpdateData | AdminPaymentUpdateData, - ) { - const requestData = mapStatus(payoutData); - - let m2mToken: string | undefined; - try { - m2mToken = await this.m2MService.getToken(); - } catch (e) { - this.logger.error( - 'Failed to fetch m2m token for fetching member details!', - e.message ?? e, - ); - } - const requestUrl = `${TOPCODER_API_BASE_URL}/challenges/${challengeId}/legacy-payment`; - - this.logger.debug( - `Updating legacy payment for challenge ${challengeId} with data: ${JSON.stringify(requestData, null, 2)}`, - ); - - try { - const response = await fetch(requestUrl, { - method: 'PATCH', - body: JSON.stringify(requestData), - headers: { - Authorization: `Bearer ${m2mToken}`, - 'Content-Type': 'application/json', - }, - }); - - const jsonResponse: { [key: string]: string } = await response.json(); - - if (response.status > 299) { - throw new Error(jsonResponse.message ?? JSON.stringify(jsonResponse)); - } - - this.logger.debug( - `Response from updating legacy payment for challenge ${challengeId}: ${JSON.stringify(jsonResponse, null, 2)}`, - ); - - return jsonResponse; - } catch (e) { - this.logger.error( - `Failed to update legacy payment for challenge ${challengeId}! Error: ${e?.message ?? e}`, - e, - ); - throw e; - } - } } diff --git a/src/shared/topcoder/members.service.ts b/src/shared/topcoder/members.service.ts index c0bc57f..a7ad113 100644 --- a/src/shared/topcoder/members.service.ts +++ b/src/shared/topcoder/members.service.ts @@ -5,7 +5,7 @@ import { TopcoderM2MService } from './topcoder-m2m.service'; import { ENV_CONFIG } from 'src/config'; import { Logger } from 'src/shared/global'; -const { TOPCODER_API_BASE_URL } = ENV_CONFIG; +const { TOPCODER_API_V6_BASE_URL: TC_API_BASE } = ENV_CONFIG; @Injectable() export class TopcoderMembersService { @@ -27,7 +27,7 @@ export class TopcoderMembersService { // Split the unique user IDs into chunks of 100 to comply with API request limits const requests = chunk(uniqUserIds, 30).map((chunk) => { - const requestUrl = `${TOPCODER_API_BASE_URL}/members?${chunk.map((id) => `userIds[]=${id}`).join('&')}&fields=handle,userId`; + const requestUrl = `${TC_API_BASE}/members?${chunk.map((id) => `userIds[]=${id}`).join('&')}&fields=handle,userId`; return fetch(requestUrl).then( async (response) => (await response.json()) as { handle: string; userId: string }, @@ -77,7 +77,7 @@ export class TopcoderMembersService { e.message ?? e, ); } - const requestUrl = `${TOPCODER_API_BASE_URL}/members/${handle}${fields ? `?fields=${fields.join(',')}` : ''}`; + const requestUrl = `${TC_API_BASE}/members/${handle}${fields ? `?fields=${fields.join(',')}` : ''}`; try { const response = await fetch(requestUrl, { diff --git a/src/shared/topcoder/topcoder-m2m.service.ts b/src/shared/topcoder/topcoder-m2m.service.ts index cd6fcc6..d36d1f1 100644 --- a/src/shared/topcoder/topcoder-m2m.service.ts +++ b/src/shared/topcoder/topcoder-m2m.service.ts @@ -33,6 +33,7 @@ export class TopcoderM2MService { client_secret: ENV_CONFIG.AUTH0_M2M_SECRET, audience: ENV_CONFIG.AUTH0_M2M_AUDIENCE, grant_type: ENV_CONFIG.AUTH0_M2M_GRANT_TYPE, + // fresh_token: true, }), }); @@ -63,4 +64,50 @@ export class TopcoderM2MService { return undefined; } } + + async m2mFetch(url: string | URL, options = {} as RequestInit) { + let m2mToken: string | undefined; + try { + m2mToken = await this.getToken(); + } catch (e) { + this.logger.error( + 'Failed to fetch m2m token!', + e.message ?? e, + ); + } + + if (!m2mToken) { + throw new Error('Failed to fetch m2m token for m2m call!') + } + + // Initialize headers, ensuring Authorization is added + const headers = new Headers(options.headers || {}); + headers.set('Authorization', `Bearer ${m2mToken}`); + + if (!headers.get('Content-Type')) { + headers.set('Content-Type', 'application/json'); + } + + const finalOptions: RequestInit = { + ...options, + headers, + }; + + const response = await fetch(url, finalOptions); + + if (!response.ok) { + // Optional: You could throw a custom error here + throw new Error(`HTTP error! Status: ${response.status}`); + } + + const contentType = response.headers.get('content-type'); + + // Try to parse JSON if content-type is application/json + if (contentType && contentType.includes('application/json')) { + return response.json() as Promise; + } + + // If not JSON, return text + return response.text() as unknown as T; + } } diff --git a/src/shared/topcoder/topcoder.module.ts b/src/shared/topcoder/topcoder.module.ts index 3071b22..2dc37f8 100644 --- a/src/shared/topcoder/topcoder.module.ts +++ b/src/shared/topcoder/topcoder.module.ts @@ -4,6 +4,7 @@ import { TopcoderM2MService } from './topcoder-m2m.service'; import { TopcoderChallengesService } from './challenges.service'; import { TopcoderBusService } from './bus.service'; import { TopcoderEmailService } from './tc-email.service'; +import { BillingAccountsService } from './billing-accounts.service'; @Module({ providers: [ @@ -12,12 +13,15 @@ import { TopcoderEmailService } from './tc-email.service'; TopcoderM2MService, TopcoderBusService, TopcoderEmailService, + BillingAccountsService, ], exports: [ TopcoderChallengesService, TopcoderMembersService, + TopcoderM2MService, TopcoderBusService, TopcoderEmailService, + BillingAccountsService, ], }) export class TopcoderModule {}